/ include / Metal / MTLIndirectCommandEncoder.hpp
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  }