MTLIndirectCommandEncoder.hpp
1 //------------------------------------------------------------------------------------------------------------------------------------------------------------- 2 // 3 // Metal/MTLIndirectCommandEncoder.hpp 4 // 5 // Copyright 2020-2024 Apple Inc. 6 // 7 // Licensed under the Apache License, Version 2.0 (the "License"); 8 // you may not use this file except in compliance with the License. 9 // You may obtain a copy of the License at 10 // 11 // http://www.apache.org/licenses/LICENSE-2.0 12 // 13 // Unless required by applicable law or agreed to in writing, software 14 // distributed under the License is distributed on an "AS IS" BASIS, 15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 // See the License for the specific language governing permissions and 17 // limitations under the License. 18 // 19 //------------------------------------------------------------------------------------------------------------------------------------------------------------- 20 21 #pragma once 22 23 #include "MTLDefines.hpp" 24 #include "MTLHeaderBridge.hpp" 25 #include "MTLPrivate.hpp" 26 27 #include <Foundation/Foundation.hpp> 28 29 #include "MTLRenderCommandEncoder.hpp" 30 #include "MTLStageInputOutputDescriptor.hpp" 31 #include "MTLTypes.hpp" 32 33 namespace MTL 34 { 35 class IndirectRenderCommand : public NS::Referencing<IndirectRenderCommand> 36 { 37 public: 38 void setRenderPipelineState(const class RenderPipelineState* pipelineState); 39 40 void setVertexBuffer(const class Buffer* buffer, NS::UInteger offset, NS::UInteger index); 41 42 void setFragmentBuffer(const class Buffer* buffer, NS::UInteger offset, NS::UInteger index); 43 44 void setVertexBuffer(const class Buffer* buffer, NS::UInteger offset, NS::UInteger stride, NS::UInteger index); 45 46 void drawPatches(NS::UInteger numberOfPatchControlPoints, NS::UInteger patchStart, NS::UInteger patchCount, const class Buffer* patchIndexBuffer, NS::UInteger patchIndexBufferOffset, NS::UInteger instanceCount, NS::UInteger baseInstance, const class Buffer* buffer, NS::UInteger offset, NS::UInteger instanceStride); 47 48 void drawIndexedPatches(NS::UInteger numberOfPatchControlPoints, NS::UInteger patchStart, NS::UInteger patchCount, const class Buffer* patchIndexBuffer, NS::UInteger patchIndexBufferOffset, const class Buffer* controlPointIndexBuffer, NS::UInteger controlPointIndexBufferOffset, NS::UInteger instanceCount, NS::UInteger baseInstance, const class Buffer* buffer, NS::UInteger offset, NS::UInteger instanceStride); 49 50 void drawPrimitives(MTL::PrimitiveType primitiveType, NS::UInteger vertexStart, NS::UInteger vertexCount, NS::UInteger instanceCount, NS::UInteger baseInstance); 51 52 void drawIndexedPrimitives(MTL::PrimitiveType primitiveType, NS::UInteger indexCount, MTL::IndexType indexType, const class Buffer* indexBuffer, NS::UInteger indexBufferOffset, NS::UInteger instanceCount, NS::Integer baseVertex, NS::UInteger baseInstance); 53 54 void setObjectThreadgroupMemoryLength(NS::UInteger length, NS::UInteger index); 55 56 void setObjectBuffer(const class Buffer* buffer, NS::UInteger offset, NS::UInteger index); 57 58 void setMeshBuffer(const class Buffer* buffer, NS::UInteger offset, NS::UInteger index); 59 60 void drawMeshThreadgroups(MTL::Size threadgroupsPerGrid, MTL::Size threadsPerObjectThreadgroup, MTL::Size threadsPerMeshThreadgroup); 61 62 void drawMeshThreads(MTL::Size threadsPerGrid, MTL::Size threadsPerObjectThreadgroup, MTL::Size threadsPerMeshThreadgroup); 63 64 void setBarrier(); 65 66 void clearBarrier(); 67 68 void reset(); 69 }; 70 71 class IndirectComputeCommand : public NS::Referencing<IndirectComputeCommand> 72 { 73 public: 74 void setComputePipelineState(const class ComputePipelineState* pipelineState); 75 76 void setKernelBuffer(const class Buffer* buffer, NS::UInteger offset, NS::UInteger index); 77 78 void setKernelBuffer(const class Buffer* buffer, NS::UInteger offset, NS::UInteger stride, NS::UInteger index); 79 80 void concurrentDispatchThreadgroups(MTL::Size threadgroupsPerGrid, MTL::Size threadsPerThreadgroup); 81 82 void concurrentDispatchThreads(MTL::Size threadsPerGrid, MTL::Size threadsPerThreadgroup); 83 84 void setBarrier(); 85 86 void clearBarrier(); 87 88 void setImageblockWidth(NS::UInteger width, NS::UInteger height); 89 90 void reset(); 91 92 void setThreadgroupMemoryLength(NS::UInteger length, NS::UInteger index); 93 94 void setStageInRegion(MTL::Region region); 95 }; 96 97 } 98 99 // method: setRenderPipelineState: 100 _MTL_INLINE void MTL::IndirectRenderCommand::setRenderPipelineState(const MTL::RenderPipelineState* pipelineState) 101 { 102 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setRenderPipelineState_), pipelineState); 103 } 104 105 // method: setVertexBuffer:offset:atIndex: 106 _MTL_INLINE void MTL::IndirectRenderCommand::setVertexBuffer(const MTL::Buffer* buffer, NS::UInteger offset, NS::UInteger index) 107 { 108 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setVertexBuffer_offset_atIndex_), buffer, offset, index); 109 } 110 111 // method: setFragmentBuffer:offset:atIndex: 112 _MTL_INLINE void MTL::IndirectRenderCommand::setFragmentBuffer(const MTL::Buffer* buffer, NS::UInteger offset, NS::UInteger index) 113 { 114 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setFragmentBuffer_offset_atIndex_), buffer, offset, index); 115 } 116 117 // method: setVertexBuffer:offset:attributeStride:atIndex: 118 _MTL_INLINE void MTL::IndirectRenderCommand::setVertexBuffer(const MTL::Buffer* buffer, NS::UInteger offset, NS::UInteger stride, NS::UInteger index) 119 { 120 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setVertexBuffer_offset_attributeStride_atIndex_), buffer, offset, stride, index); 121 } 122 123 // method: drawPatches:patchStart:patchCount:patchIndexBuffer:patchIndexBufferOffset:instanceCount:baseInstance:tessellationFactorBuffer:tessellationFactorBufferOffset:tessellationFactorBufferInstanceStride: 124 _MTL_INLINE void MTL::IndirectRenderCommand::drawPatches(NS::UInteger numberOfPatchControlPoints, NS::UInteger patchStart, NS::UInteger patchCount, const MTL::Buffer* patchIndexBuffer, NS::UInteger patchIndexBufferOffset, NS::UInteger instanceCount, NS::UInteger baseInstance, const MTL::Buffer* buffer, NS::UInteger offset, NS::UInteger instanceStride) 125 { 126 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(drawPatches_patchStart_patchCount_patchIndexBuffer_patchIndexBufferOffset_instanceCount_baseInstance_tessellationFactorBuffer_tessellationFactorBufferOffset_tessellationFactorBufferInstanceStride_), numberOfPatchControlPoints, patchStart, patchCount, patchIndexBuffer, patchIndexBufferOffset, instanceCount, baseInstance, buffer, offset, instanceStride); 127 } 128 129 // method: drawIndexedPatches:patchStart:patchCount:patchIndexBuffer:patchIndexBufferOffset:controlPointIndexBuffer:controlPointIndexBufferOffset:instanceCount:baseInstance:tessellationFactorBuffer:tessellationFactorBufferOffset:tessellationFactorBufferInstanceStride: 130 _MTL_INLINE void MTL::IndirectRenderCommand::drawIndexedPatches(NS::UInteger numberOfPatchControlPoints, NS::UInteger patchStart, NS::UInteger patchCount, const MTL::Buffer* patchIndexBuffer, NS::UInteger patchIndexBufferOffset, const MTL::Buffer* controlPointIndexBuffer, NS::UInteger controlPointIndexBufferOffset, NS::UInteger instanceCount, NS::UInteger baseInstance, const MTL::Buffer* buffer, NS::UInteger offset, NS::UInteger instanceStride) 131 { 132 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(drawIndexedPatches_patchStart_patchCount_patchIndexBuffer_patchIndexBufferOffset_controlPointIndexBuffer_controlPointIndexBufferOffset_instanceCount_baseInstance_tessellationFactorBuffer_tessellationFactorBufferOffset_tessellationFactorBufferInstanceStride_), numberOfPatchControlPoints, patchStart, patchCount, patchIndexBuffer, patchIndexBufferOffset, controlPointIndexBuffer, controlPointIndexBufferOffset, instanceCount, baseInstance, buffer, offset, instanceStride); 133 } 134 135 // method: drawPrimitives:vertexStart:vertexCount:instanceCount:baseInstance: 136 _MTL_INLINE void MTL::IndirectRenderCommand::drawPrimitives(MTL::PrimitiveType primitiveType, NS::UInteger vertexStart, NS::UInteger vertexCount, NS::UInteger instanceCount, NS::UInteger baseInstance) 137 { 138 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(drawPrimitives_vertexStart_vertexCount_instanceCount_baseInstance_), primitiveType, vertexStart, vertexCount, instanceCount, baseInstance); 139 } 140 141 // method: drawIndexedPrimitives:indexCount:indexType:indexBuffer:indexBufferOffset:instanceCount:baseVertex:baseInstance: 142 _MTL_INLINE void MTL::IndirectRenderCommand::drawIndexedPrimitives(MTL::PrimitiveType primitiveType, NS::UInteger indexCount, MTL::IndexType indexType, const MTL::Buffer* indexBuffer, NS::UInteger indexBufferOffset, NS::UInteger instanceCount, NS::Integer baseVertex, NS::UInteger baseInstance) 143 { 144 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(drawIndexedPrimitives_indexCount_indexType_indexBuffer_indexBufferOffset_instanceCount_baseVertex_baseInstance_), primitiveType, indexCount, indexType, indexBuffer, indexBufferOffset, instanceCount, baseVertex, baseInstance); 145 } 146 147 // method: setObjectThreadgroupMemoryLength:atIndex: 148 _MTL_INLINE void MTL::IndirectRenderCommand::setObjectThreadgroupMemoryLength(NS::UInteger length, NS::UInteger index) 149 { 150 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setObjectThreadgroupMemoryLength_atIndex_), length, index); 151 } 152 153 // method: setObjectBuffer:offset:atIndex: 154 _MTL_INLINE void MTL::IndirectRenderCommand::setObjectBuffer(const MTL::Buffer* buffer, NS::UInteger offset, NS::UInteger index) 155 { 156 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setObjectBuffer_offset_atIndex_), buffer, offset, index); 157 } 158 159 // method: setMeshBuffer:offset:atIndex: 160 _MTL_INLINE void MTL::IndirectRenderCommand::setMeshBuffer(const MTL::Buffer* buffer, NS::UInteger offset, NS::UInteger index) 161 { 162 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setMeshBuffer_offset_atIndex_), buffer, offset, index); 163 } 164 165 // method: drawMeshThreadgroups:threadsPerObjectThreadgroup:threadsPerMeshThreadgroup: 166 _MTL_INLINE void MTL::IndirectRenderCommand::drawMeshThreadgroups(MTL::Size threadgroupsPerGrid, MTL::Size threadsPerObjectThreadgroup, MTL::Size threadsPerMeshThreadgroup) 167 { 168 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(drawMeshThreadgroups_threadsPerObjectThreadgroup_threadsPerMeshThreadgroup_), threadgroupsPerGrid, threadsPerObjectThreadgroup, threadsPerMeshThreadgroup); 169 } 170 171 // method: drawMeshThreads:threadsPerObjectThreadgroup:threadsPerMeshThreadgroup: 172 _MTL_INLINE void MTL::IndirectRenderCommand::drawMeshThreads(MTL::Size threadsPerGrid, MTL::Size threadsPerObjectThreadgroup, MTL::Size threadsPerMeshThreadgroup) 173 { 174 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(drawMeshThreads_threadsPerObjectThreadgroup_threadsPerMeshThreadgroup_), threadsPerGrid, threadsPerObjectThreadgroup, threadsPerMeshThreadgroup); 175 } 176 177 // method: setBarrier 178 _MTL_INLINE void MTL::IndirectRenderCommand::setBarrier() 179 { 180 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setBarrier)); 181 } 182 183 // method: clearBarrier 184 _MTL_INLINE void MTL::IndirectRenderCommand::clearBarrier() 185 { 186 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(clearBarrier)); 187 } 188 189 // method: reset 190 _MTL_INLINE void MTL::IndirectRenderCommand::reset() 191 { 192 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(reset)); 193 } 194 195 // method: setComputePipelineState: 196 _MTL_INLINE void MTL::IndirectComputeCommand::setComputePipelineState(const MTL::ComputePipelineState* pipelineState) 197 { 198 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setComputePipelineState_), pipelineState); 199 } 200 201 // method: setKernelBuffer:offset:atIndex: 202 _MTL_INLINE void MTL::IndirectComputeCommand::setKernelBuffer(const MTL::Buffer* buffer, NS::UInteger offset, NS::UInteger index) 203 { 204 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setKernelBuffer_offset_atIndex_), buffer, offset, index); 205 } 206 207 // method: setKernelBuffer:offset:attributeStride:atIndex: 208 _MTL_INLINE void MTL::IndirectComputeCommand::setKernelBuffer(const MTL::Buffer* buffer, NS::UInteger offset, NS::UInteger stride, NS::UInteger index) 209 { 210 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setKernelBuffer_offset_attributeStride_atIndex_), buffer, offset, stride, index); 211 } 212 213 // method: concurrentDispatchThreadgroups:threadsPerThreadgroup: 214 _MTL_INLINE void MTL::IndirectComputeCommand::concurrentDispatchThreadgroups(MTL::Size threadgroupsPerGrid, MTL::Size threadsPerThreadgroup) 215 { 216 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(concurrentDispatchThreadgroups_threadsPerThreadgroup_), threadgroupsPerGrid, threadsPerThreadgroup); 217 } 218 219 // method: concurrentDispatchThreads:threadsPerThreadgroup: 220 _MTL_INLINE void MTL::IndirectComputeCommand::concurrentDispatchThreads(MTL::Size threadsPerGrid, MTL::Size threadsPerThreadgroup) 221 { 222 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(concurrentDispatchThreads_threadsPerThreadgroup_), threadsPerGrid, threadsPerThreadgroup); 223 } 224 225 // method: setBarrier 226 _MTL_INLINE void MTL::IndirectComputeCommand::setBarrier() 227 { 228 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setBarrier)); 229 } 230 231 // method: clearBarrier 232 _MTL_INLINE void MTL::IndirectComputeCommand::clearBarrier() 233 { 234 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(clearBarrier)); 235 } 236 237 // method: setImageblockWidth:height: 238 _MTL_INLINE void MTL::IndirectComputeCommand::setImageblockWidth(NS::UInteger width, NS::UInteger height) 239 { 240 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setImageblockWidth_height_), width, height); 241 } 242 243 // method: reset 244 _MTL_INLINE void MTL::IndirectComputeCommand::reset() 245 { 246 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(reset)); 247 } 248 249 // method: setThreadgroupMemoryLength:atIndex: 250 _MTL_INLINE void MTL::IndirectComputeCommand::setThreadgroupMemoryLength(NS::UInteger length, NS::UInteger index) 251 { 252 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setThreadgroupMemoryLength_atIndex_), length, index); 253 } 254 255 // method: setStageInRegion: 256 _MTL_INLINE void MTL::IndirectComputeCommand::setStageInRegion(MTL::Region region) 257 { 258 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setStageInRegion_), region); 259 }