/*
 * MVKCommandTypePools.def
 *
 * Copyright (c) 2015-2020 The Brenwill Workshop Ltd. (http://www.brenwill.com)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


// To use this file, define a macro MVK_CMD_TYPE_POOL(cmdType), then #include this file.
// If the last entry needs to be different (for example to avoid a dangling ',' at the
// end of an initializer list, also define a macro MVK_CMD_TYPE_POOL_LAST(cmdType).

// MVK_TMPLT_DECL is used to support adding a "template<>" prefix when this file is used
// to define function implementations for a concrete implementation of a class template

// To add a new command type, simply add an MVK_CMD_TYPE_POOL() line below.
// The last line in the list must be MVK_CMD_TYPE_POOL_LAST().
// If the command is a concrete implementation of a template class, include the
// MVK_TMPLT_DECL prefix.

#ifndef MVK_TMPLT_DECL
#	define MVK_TMPLT_DECL
#endif

#ifndef MVK_CMD_TYPE_POOL
#	error MVK_CMD_TYPE_POOL must be defined before including this file
#endif

#ifndef MVK_CMD_TYPE_POOL_LAST
#	define MVK_CMD_TYPE_POOL_LAST(cmdType) MVK_CMD_TYPE_POOL(cmdType)
#endif

MVK_CMD_TYPE_POOL(PipelineBarrier)
MVK_CMD_TYPE_POOL(BindPipeline)
MVK_CMD_TYPE_POOL(BeginRenderPass)
MVK_CMD_TYPE_POOL(NextSubpass)
MVK_CMD_TYPE_POOL(EndRenderPass)
MVK_CMD_TYPE_POOL(ExecuteCommands)
MVK_CMD_TYPE_POOL(BindDescriptorSets)
MVK_TMPLT_DECL MVK_CMD_TYPE_POOL(SetViewport1)
MVK_TMPLT_DECL MVK_CMD_TYPE_POOL(SetViewportMulti)
MVK_TMPLT_DECL MVK_CMD_TYPE_POOL(SetScissor1)
MVK_TMPLT_DECL MVK_CMD_TYPE_POOL(SetScissorMulti)
MVK_CMD_TYPE_POOL(SetLineWidth)
MVK_CMD_TYPE_POOL(SetDepthBias)
MVK_CMD_TYPE_POOL(SetBlendConstants)
MVK_CMD_TYPE_POOL(SetDepthBounds)
MVK_CMD_TYPE_POOL(SetStencilCompareMask)
MVK_CMD_TYPE_POOL(SetStencilWriteMask)
MVK_CMD_TYPE_POOL(SetStencilReference)
MVK_CMD_TYPE_POOL(BindVertexBuffers)
MVK_CMD_TYPE_POOL(BindIndexBuffer)
MVK_CMD_TYPE_POOL(Draw)
MVK_CMD_TYPE_POOL(DrawIndexed)
MVK_CMD_TYPE_POOL(DrawIndirect)
MVK_CMD_TYPE_POOL(DrawIndexedIndirect)
MVK_CMD_TYPE_POOL(CopyImage)
MVK_CMD_TYPE_POOL(BlitImage)
MVK_CMD_TYPE_POOL(ResolveImage)
MVK_CMD_TYPE_POOL(FillBuffer)
MVK_CMD_TYPE_POOL(UpdateBuffer)
MVK_CMD_TYPE_POOL(CopyBuffer)
MVK_CMD_TYPE_POOL(BufferImageCopy)
MVK_CMD_TYPE_POOL(ClearAttachments)
MVK_CMD_TYPE_POOL(ClearImage)
MVK_CMD_TYPE_POOL(BeginQuery)
MVK_CMD_TYPE_POOL(EndQuery)
MVK_CMD_TYPE_POOL(WriteTimestamp)
MVK_CMD_TYPE_POOL(ResetQueryPool)
MVK_CMD_TYPE_POOL(CopyQueryPoolResults)
MVK_CMD_TYPE_POOL(PushConstants)
MVK_CMD_TYPE_POOL(Dispatch)
MVK_CMD_TYPE_POOL(DispatchIndirect)
MVK_CMD_TYPE_POOL(PushDescriptorSet)
MVK_CMD_TYPE_POOL(PushDescriptorSetWithTemplate)
MVK_CMD_TYPE_POOL(DebugMarkerBegin)
MVK_CMD_TYPE_POOL(DebugMarkerEnd)
MVK_CMD_TYPE_POOL(DebugMarkerInsert)
MVK_CMD_TYPE_POOL(SetResetEvent)
MVK_CMD_TYPE_POOL_LAST(WaitEvents)

#undef MVK_CMD_TYPE_POOL
#undef MVK_CMD_TYPE_POOL_LAST
#undef MVK_TMPLT_DECL
