/*
 * 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

#define MVK_CMD_TYPE_POOLS_FROM_THRESHOLD(cmdType, threshold)	\
	MVK_TMPLT_DECL MVK_CMD_TYPE_POOL(cmdType ##threshold)		\
	MVK_TMPLT_DECL MVK_CMD_TYPE_POOL(cmdType ##Multi)

#define MVK_CMD_TYPE_POOLS_FROM_TWO_THRESHOLDS(cmdType, threshold1, threshold2)	\
	MVK_TMPLT_DECL MVK_CMD_TYPE_POOL(cmdType ##threshold1)						\
	MVK_TMPLT_DECL MVK_CMD_TYPE_POOL(cmdType ##threshold2)						\
	MVK_TMPLT_DECL MVK_CMD_TYPE_POOL(cmdType ##Multi)


MVK_CMD_TYPE_POOLS_FROM_TWO_THRESHOLDS(PipelineBarrier, 1, 4)
MVK_CMD_TYPE_POOL(BindPipeline)
MVK_CMD_TYPE_POOLS_FROM_TWO_THRESHOLDS(BeginRenderPass, 1, 2)
MVK_CMD_TYPE_POOL(NextSubpass)
MVK_CMD_TYPE_POOL(EndRenderPass)
MVK_CMD_TYPE_POOLS_FROM_THRESHOLD(ExecuteCommands, 1)
MVK_CMD_TYPE_POOL(BindDescriptorSets)
MVK_CMD_TYPE_POOLS_FROM_THRESHOLD(SetViewport, 1)
MVK_CMD_TYPE_POOLS_FROM_THRESHOLD(SetScissor, 1)
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_POOLS_FROM_TWO_THRESHOLDS(BindVertexBuffers, 1, 2)
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_POOLS_FROM_THRESHOLD(WaitEvents, 1)
MVK_CMD_TYPE_POOL(SetEvent)
MVK_CMD_TYPE_POOL_LAST(ResetEvent)

#undef MVK_CMD_TYPE_POOL
#undef MVK_CMD_TYPE_POOL_LAST
#undef MVK_TMPLT_DECL
