MTLAccelerationStructureCommandEncoder.hpp
1 //------------------------------------------------------------------------------------------------------------------------------------------------------------- 2 // 3 // Metal/MTLAccelerationStructureCommandEncoder.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 "MTLAccelerationStructureCommandEncoder.hpp" 30 #include "MTLArgument.hpp" 31 #include "MTLCommandEncoder.hpp" 32 33 namespace MTL 34 { 35 _MTL_OPTIONS(NS::UInteger, AccelerationStructureRefitOptions) { 36 AccelerationStructureRefitOptionVertexData = 1, 37 AccelerationStructureRefitOptionPerPrimitiveData = 2, 38 }; 39 40 class AccelerationStructureCommandEncoder : public NS::Referencing<AccelerationStructureCommandEncoder, CommandEncoder> 41 { 42 public: 43 void buildAccelerationStructure(const class AccelerationStructure* accelerationStructure, const class AccelerationStructureDescriptor* descriptor, const class Buffer* scratchBuffer, NS::UInteger scratchBufferOffset); 44 45 void refitAccelerationStructure(const class AccelerationStructure* sourceAccelerationStructure, const class AccelerationStructureDescriptor* descriptor, const class AccelerationStructure* destinationAccelerationStructure, const class Buffer* scratchBuffer, NS::UInteger scratchBufferOffset); 46 47 void refitAccelerationStructure(const class AccelerationStructure* sourceAccelerationStructure, const class AccelerationStructureDescriptor* descriptor, const class AccelerationStructure* destinationAccelerationStructure, const class Buffer* scratchBuffer, NS::UInteger scratchBufferOffset, MTL::AccelerationStructureRefitOptions options); 48 49 void copyAccelerationStructure(const class AccelerationStructure* sourceAccelerationStructure, const class AccelerationStructure* destinationAccelerationStructure); 50 51 void writeCompactedAccelerationStructureSize(const class AccelerationStructure* accelerationStructure, const class Buffer* buffer, NS::UInteger offset); 52 53 void writeCompactedAccelerationStructureSize(const class AccelerationStructure* accelerationStructure, const class Buffer* buffer, NS::UInteger offset, MTL::DataType sizeDataType); 54 55 void copyAndCompactAccelerationStructure(const class AccelerationStructure* sourceAccelerationStructure, const class AccelerationStructure* destinationAccelerationStructure); 56 57 void updateFence(const class Fence* fence); 58 59 void waitForFence(const class Fence* fence); 60 61 void useResource(const class Resource* resource, MTL::ResourceUsage usage); 62 63 void useResources(const class Resource* const resources[], NS::UInteger count, MTL::ResourceUsage usage); 64 65 void useHeap(const class Heap* heap); 66 67 void useHeaps(const class Heap* const heaps[], NS::UInteger count); 68 69 void sampleCountersInBuffer(const class CounterSampleBuffer* sampleBuffer, NS::UInteger sampleIndex, bool barrier); 70 }; 71 72 class AccelerationStructurePassSampleBufferAttachmentDescriptor : public NS::Copying<AccelerationStructurePassSampleBufferAttachmentDescriptor> 73 { 74 public: 75 static class AccelerationStructurePassSampleBufferAttachmentDescriptor* alloc(); 76 77 class AccelerationStructurePassSampleBufferAttachmentDescriptor* init(); 78 79 class CounterSampleBuffer* sampleBuffer() const; 80 void setSampleBuffer(const class CounterSampleBuffer* sampleBuffer); 81 82 NS::UInteger startOfEncoderSampleIndex() const; 83 void setStartOfEncoderSampleIndex(NS::UInteger startOfEncoderSampleIndex); 84 85 NS::UInteger endOfEncoderSampleIndex() const; 86 void setEndOfEncoderSampleIndex(NS::UInteger endOfEncoderSampleIndex); 87 }; 88 89 class AccelerationStructurePassSampleBufferAttachmentDescriptorArray : public NS::Referencing<AccelerationStructurePassSampleBufferAttachmentDescriptorArray> 90 { 91 public: 92 static class AccelerationStructurePassSampleBufferAttachmentDescriptorArray* alloc(); 93 94 class AccelerationStructurePassSampleBufferAttachmentDescriptorArray* init(); 95 96 class AccelerationStructurePassSampleBufferAttachmentDescriptor* object(NS::UInteger attachmentIndex); 97 98 void setObject(const class AccelerationStructurePassSampleBufferAttachmentDescriptor* attachment, NS::UInteger attachmentIndex); 99 }; 100 101 class AccelerationStructurePassDescriptor : public NS::Copying<AccelerationStructurePassDescriptor> 102 { 103 public: 104 static class AccelerationStructurePassDescriptor* alloc(); 105 106 class AccelerationStructurePassDescriptor* init(); 107 108 static class AccelerationStructurePassDescriptor* accelerationStructurePassDescriptor(); 109 110 class AccelerationStructurePassSampleBufferAttachmentDescriptorArray* sampleBufferAttachments() const; 111 }; 112 113 } 114 115 // method: buildAccelerationStructure:descriptor:scratchBuffer:scratchBufferOffset: 116 _MTL_INLINE void MTL::AccelerationStructureCommandEncoder::buildAccelerationStructure(const MTL::AccelerationStructure* accelerationStructure, const MTL::AccelerationStructureDescriptor* descriptor, const MTL::Buffer* scratchBuffer, NS::UInteger scratchBufferOffset) 117 { 118 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(buildAccelerationStructure_descriptor_scratchBuffer_scratchBufferOffset_), accelerationStructure, descriptor, scratchBuffer, scratchBufferOffset); 119 } 120 121 // method: refitAccelerationStructure:descriptor:destination:scratchBuffer:scratchBufferOffset: 122 _MTL_INLINE void MTL::AccelerationStructureCommandEncoder::refitAccelerationStructure(const MTL::AccelerationStructure* sourceAccelerationStructure, const MTL::AccelerationStructureDescriptor* descriptor, const MTL::AccelerationStructure* destinationAccelerationStructure, const MTL::Buffer* scratchBuffer, NS::UInteger scratchBufferOffset) 123 { 124 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(refitAccelerationStructure_descriptor_destination_scratchBuffer_scratchBufferOffset_), sourceAccelerationStructure, descriptor, destinationAccelerationStructure, scratchBuffer, scratchBufferOffset); 125 } 126 127 // method: refitAccelerationStructure:descriptor:destination:scratchBuffer:scratchBufferOffset:options: 128 _MTL_INLINE void MTL::AccelerationStructureCommandEncoder::refitAccelerationStructure(const MTL::AccelerationStructure* sourceAccelerationStructure, const MTL::AccelerationStructureDescriptor* descriptor, const MTL::AccelerationStructure* destinationAccelerationStructure, const MTL::Buffer* scratchBuffer, NS::UInteger scratchBufferOffset, MTL::AccelerationStructureRefitOptions options) 129 { 130 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(refitAccelerationStructure_descriptor_destination_scratchBuffer_scratchBufferOffset_options_), sourceAccelerationStructure, descriptor, destinationAccelerationStructure, scratchBuffer, scratchBufferOffset, options); 131 } 132 133 // method: copyAccelerationStructure:toAccelerationStructure: 134 _MTL_INLINE void MTL::AccelerationStructureCommandEncoder::copyAccelerationStructure(const MTL::AccelerationStructure* sourceAccelerationStructure, const MTL::AccelerationStructure* destinationAccelerationStructure) 135 { 136 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(copyAccelerationStructure_toAccelerationStructure_), sourceAccelerationStructure, destinationAccelerationStructure); 137 } 138 139 // method: writeCompactedAccelerationStructureSize:toBuffer:offset: 140 _MTL_INLINE void MTL::AccelerationStructureCommandEncoder::writeCompactedAccelerationStructureSize(const MTL::AccelerationStructure* accelerationStructure, const MTL::Buffer* buffer, NS::UInteger offset) 141 { 142 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(writeCompactedAccelerationStructureSize_toBuffer_offset_), accelerationStructure, buffer, offset); 143 } 144 145 // method: writeCompactedAccelerationStructureSize:toBuffer:offset:sizeDataType: 146 _MTL_INLINE void MTL::AccelerationStructureCommandEncoder::writeCompactedAccelerationStructureSize(const MTL::AccelerationStructure* accelerationStructure, const MTL::Buffer* buffer, NS::UInteger offset, MTL::DataType sizeDataType) 147 { 148 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(writeCompactedAccelerationStructureSize_toBuffer_offset_sizeDataType_), accelerationStructure, buffer, offset, sizeDataType); 149 } 150 151 // method: copyAndCompactAccelerationStructure:toAccelerationStructure: 152 _MTL_INLINE void MTL::AccelerationStructureCommandEncoder::copyAndCompactAccelerationStructure(const MTL::AccelerationStructure* sourceAccelerationStructure, const MTL::AccelerationStructure* destinationAccelerationStructure) 153 { 154 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(copyAndCompactAccelerationStructure_toAccelerationStructure_), sourceAccelerationStructure, destinationAccelerationStructure); 155 } 156 157 // method: updateFence: 158 _MTL_INLINE void MTL::AccelerationStructureCommandEncoder::updateFence(const MTL::Fence* fence) 159 { 160 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(updateFence_), fence); 161 } 162 163 // method: waitForFence: 164 _MTL_INLINE void MTL::AccelerationStructureCommandEncoder::waitForFence(const MTL::Fence* fence) 165 { 166 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(waitForFence_), fence); 167 } 168 169 // method: useResource:usage: 170 _MTL_INLINE void MTL::AccelerationStructureCommandEncoder::useResource(const MTL::Resource* resource, MTL::ResourceUsage usage) 171 { 172 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(useResource_usage_), resource, usage); 173 } 174 175 // method: useResources:count:usage: 176 _MTL_INLINE void MTL::AccelerationStructureCommandEncoder::useResources(const MTL::Resource* const resources[], NS::UInteger count, MTL::ResourceUsage usage) 177 { 178 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(useResources_count_usage_), resources, count, usage); 179 } 180 181 // method: useHeap: 182 _MTL_INLINE void MTL::AccelerationStructureCommandEncoder::useHeap(const MTL::Heap* heap) 183 { 184 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(useHeap_), heap); 185 } 186 187 // method: useHeaps:count: 188 _MTL_INLINE void MTL::AccelerationStructureCommandEncoder::useHeaps(const MTL::Heap* const heaps[], NS::UInteger count) 189 { 190 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(useHeaps_count_), heaps, count); 191 } 192 193 // method: sampleCountersInBuffer:atSampleIndex:withBarrier: 194 _MTL_INLINE void MTL::AccelerationStructureCommandEncoder::sampleCountersInBuffer(const MTL::CounterSampleBuffer* sampleBuffer, NS::UInteger sampleIndex, bool barrier) 195 { 196 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(sampleCountersInBuffer_atSampleIndex_withBarrier_), sampleBuffer, sampleIndex, barrier); 197 } 198 199 // static method: alloc 200 _MTL_INLINE MTL::AccelerationStructurePassSampleBufferAttachmentDescriptor* MTL::AccelerationStructurePassSampleBufferAttachmentDescriptor::alloc() 201 { 202 return NS::Object::alloc<MTL::AccelerationStructurePassSampleBufferAttachmentDescriptor>(_MTL_PRIVATE_CLS(MTLAccelerationStructurePassSampleBufferAttachmentDescriptor)); 203 } 204 205 // method: init 206 _MTL_INLINE MTL::AccelerationStructurePassSampleBufferAttachmentDescriptor* MTL::AccelerationStructurePassSampleBufferAttachmentDescriptor::init() 207 { 208 return NS::Object::init<MTL::AccelerationStructurePassSampleBufferAttachmentDescriptor>(); 209 } 210 211 // property: sampleBuffer 212 _MTL_INLINE MTL::CounterSampleBuffer* MTL::AccelerationStructurePassSampleBufferAttachmentDescriptor::sampleBuffer() const 213 { 214 return Object::sendMessage<MTL::CounterSampleBuffer*>(this, _MTL_PRIVATE_SEL(sampleBuffer)); 215 } 216 217 _MTL_INLINE void MTL::AccelerationStructurePassSampleBufferAttachmentDescriptor::setSampleBuffer(const MTL::CounterSampleBuffer* sampleBuffer) 218 { 219 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setSampleBuffer_), sampleBuffer); 220 } 221 222 // property: startOfEncoderSampleIndex 223 _MTL_INLINE NS::UInteger MTL::AccelerationStructurePassSampleBufferAttachmentDescriptor::startOfEncoderSampleIndex() const 224 { 225 return Object::sendMessage<NS::UInteger>(this, _MTL_PRIVATE_SEL(startOfEncoderSampleIndex)); 226 } 227 228 _MTL_INLINE void MTL::AccelerationStructurePassSampleBufferAttachmentDescriptor::setStartOfEncoderSampleIndex(NS::UInteger startOfEncoderSampleIndex) 229 { 230 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setStartOfEncoderSampleIndex_), startOfEncoderSampleIndex); 231 } 232 233 // property: endOfEncoderSampleIndex 234 _MTL_INLINE NS::UInteger MTL::AccelerationStructurePassSampleBufferAttachmentDescriptor::endOfEncoderSampleIndex() const 235 { 236 return Object::sendMessage<NS::UInteger>(this, _MTL_PRIVATE_SEL(endOfEncoderSampleIndex)); 237 } 238 239 _MTL_INLINE void MTL::AccelerationStructurePassSampleBufferAttachmentDescriptor::setEndOfEncoderSampleIndex(NS::UInteger endOfEncoderSampleIndex) 240 { 241 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setEndOfEncoderSampleIndex_), endOfEncoderSampleIndex); 242 } 243 244 // static method: alloc 245 _MTL_INLINE MTL::AccelerationStructurePassSampleBufferAttachmentDescriptorArray* MTL::AccelerationStructurePassSampleBufferAttachmentDescriptorArray::alloc() 246 { 247 return NS::Object::alloc<MTL::AccelerationStructurePassSampleBufferAttachmentDescriptorArray>(_MTL_PRIVATE_CLS(MTLAccelerationStructurePassSampleBufferAttachmentDescriptorArray)); 248 } 249 250 // method: init 251 _MTL_INLINE MTL::AccelerationStructurePassSampleBufferAttachmentDescriptorArray* MTL::AccelerationStructurePassSampleBufferAttachmentDescriptorArray::init() 252 { 253 return NS::Object::init<MTL::AccelerationStructurePassSampleBufferAttachmentDescriptorArray>(); 254 } 255 256 // method: objectAtIndexedSubscript: 257 _MTL_INLINE MTL::AccelerationStructurePassSampleBufferAttachmentDescriptor* MTL::AccelerationStructurePassSampleBufferAttachmentDescriptorArray::object(NS::UInteger attachmentIndex) 258 { 259 return Object::sendMessage<MTL::AccelerationStructurePassSampleBufferAttachmentDescriptor*>(this, _MTL_PRIVATE_SEL(objectAtIndexedSubscript_), attachmentIndex); 260 } 261 262 // method: setObject:atIndexedSubscript: 263 _MTL_INLINE void MTL::AccelerationStructurePassSampleBufferAttachmentDescriptorArray::setObject(const MTL::AccelerationStructurePassSampleBufferAttachmentDescriptor* attachment, NS::UInteger attachmentIndex) 264 { 265 Object::sendMessage<void>(this, _MTL_PRIVATE_SEL(setObject_atIndexedSubscript_), attachment, attachmentIndex); 266 } 267 268 // static method: alloc 269 _MTL_INLINE MTL::AccelerationStructurePassDescriptor* MTL::AccelerationStructurePassDescriptor::alloc() 270 { 271 return NS::Object::alloc<MTL::AccelerationStructurePassDescriptor>(_MTL_PRIVATE_CLS(MTLAccelerationStructurePassDescriptor)); 272 } 273 274 // method: init 275 _MTL_INLINE MTL::AccelerationStructurePassDescriptor* MTL::AccelerationStructurePassDescriptor::init() 276 { 277 return NS::Object::init<MTL::AccelerationStructurePassDescriptor>(); 278 } 279 280 // static method: accelerationStructurePassDescriptor 281 _MTL_INLINE MTL::AccelerationStructurePassDescriptor* MTL::AccelerationStructurePassDescriptor::accelerationStructurePassDescriptor() 282 { 283 return Object::sendMessage<MTL::AccelerationStructurePassDescriptor*>(_MTL_PRIVATE_CLS(MTLAccelerationStructurePassDescriptor), _MTL_PRIVATE_SEL(accelerationStructurePassDescriptor)); 284 } 285 286 // property: sampleBufferAttachments 287 _MTL_INLINE MTL::AccelerationStructurePassSampleBufferAttachmentDescriptorArray* MTL::AccelerationStructurePassDescriptor::sampleBufferAttachments() const 288 { 289 return Object::sendMessage<MTL::AccelerationStructurePassSampleBufferAttachmentDescriptorArray*>(this, _MTL_PRIVATE_SEL(sampleBufferAttachments)); 290 }