/*
 * MVKCommandTypePools.def
 *
 * Copyright (c) 2015-2021 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_2_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)

#define MVK_CMD_TYPE_POOLS_FROM_3_THRESHOLDS(cmdType, threshold1, threshold2, threshold3)	\
	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 ##threshold3)									\
	MVK_TMPLT_DECL MVK_CMD_TYPE_POOL(cmdType ##Multi)


MVK_CMD_TYPE_POOLS_FROM_2_THRESHOLDS(PipelineBarrier, 1, 4)
MVK_CMD_TYPE_POOL(BindGraphicsPipeline)
MVK_CMD_TYPE_POOL(BindComputePipeline)
MVK_CMD_TYPE_POOLS_FROM_2_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_POOLS_FROM_2_THRESHOLDS(BindDescriptorSetsStatic, 1, 4)
MVK_CMD_TYPE_POOLS_FROM_THRESHOLD(BindDescriptorSetsDynamic, 4)
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_2_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_POOLS_FROM_THRESHOLD(CopyImage, 1)
MVK_CMD_TYPE_POOLS_FROM_THRESHOLD(BlitImage, 1)
MVK_CMD_TYPE_POOLS_FROM_THRESHOLD(ResolveImage, 1)
MVK_CMD_TYPE_POOL(FillBuffer)
MVK_CMD_TYPE_POOL(UpdateBuffer)
MVK_CMD_TYPE_POOLS_FROM_THRESHOLD(CopyBuffer, 1)
MVK_CMD_TYPE_POOLS_FROM_3_THRESHOLDS(BufferImageCopy, 1, 4, 8)
MVK_CMD_TYPE_POOLS_FROM_THRESHOLD(ClearSingleAttachment, 1)
MVK_CMD_TYPE_POOLS_FROM_THRESHOLD(ClearMultiAttachments, 1)
MVK_CMD_TYPE_POOLS_FROM_THRESHOLD(ClearColorImage, 1)
MVK_CMD_TYPE_POOLS_FROM_THRESHOLD(ClearDepthStencilImage, 1)
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_POOLS_FROM_2_THRESHOLDS(PushConstants, 64, 128)
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
