yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
f65d756bf
master
1// metal-command-encoder.h 2#pragma once 3 4#include "metal-base.h" 5#include "metal-pipeline-state.h" 6#include "metal-render-pass.h" 7 8namespace gfx 9{ 10 11using namespace Slang ; 12 13namespace metal 14{ 15 16class PipelineCommandEncoder :public ComObject 17{ 18public : 19CommandBufferImpl * m_commandBuffer ; 20MTL ::CommandBuffer * m_metalCommandBuffer ; 21RefPtr < PipelineStateImpl > m_currentPipeline ; 22 23void init (CommandBufferImpl * commandBuffer ); 24void endEncodingImpl (); 25 26Result setPipelineStateImpl (IPipelineState * state ,IShaderObject ** outRootObject ); 27}; 28 29class ResourceCommandEncoder :public IResourceCommandEncoder ,public PipelineCommandEncoder 30{ 31public : 32virtual void * getInterface (SlangUUID const & guid ) 33 { 34if (guid == GfxGUID ::IID_IResourceCommandEncoder || guid == ISlangUnknown ::getTypeGuid ()) 35return this ; 36return nullptr ; 37 } 38virtual SLANG_NO_THROW SlangResult SLANG_MCALL 39queryInterface (SlangUUID const & uuid ,void ** outObject )override 40 { 41if (auto ptr = getInterface (uuid )) 42 { 43* outObject = ptr ; 44return SLANG_OK ; 45 } 46return SLANG_E_NO_INTERFACE ; 47 } 48virtual SLANG_NO_THROW uint32_t SLANG_MCALL addRef ()override {return 1 ; } 49virtual SLANG_NO_THROW uint32_t SLANG_MCALL release ()override {return 1 ; } 50 51virtual SLANG_NO_THROW void SLANG_MCALL endEncoding ()override ; 52 53virtual SLANG_NO_THROW void SLANG_MCALL 54writeTimestamp ( IQueryPool * queryPool, GfxIndex index) override; 55 56virtual SLANG_NO_THROW void SLANG_MCALL copyBuffer ( 57IBufferResource * dst, 58Offset dstOffset, 59IBufferResource * src, 60Offset srcOffset, 61Size size) override; 62 63virtual SLANG_NO_THROW void SLANG_MCALL copyTexture ( 64ITextureResource * dst, 65ResourceState dstState, 66SubresourceRange dstSubresource, 67ITextureResource ::Offset3D dstOffset, 68ITextureResource * src, 69ResourceState srcState, 70SubresourceRange srcSubresource, 71ITextureResource ::Offset3D srcOffset, 72ITextureResource ::Extents extent) override; 73 74virtual SLANG_NO_THROW void SLANG_MCALL copyTextureToBuffer ( 75IBufferResource * dst, 76Offset dstOffset, 77Size dstSize, 78Size dstRowStride, 79ITextureResource * src, 80ResourceState srcState, 81SubresourceRange srcSubresource, 82ITextureResource ::Offset3D srcOffset, 83ITextureResource ::Extents extent) override; 84 85virtual SLANG_NO_THROW void SLANG_MCALL 86uploadBufferData ( IBufferResource * buffer, Offset offset, Size size, void * data) override; 87 88virtual SLANG_NO_THROW void SLANG_MCALL uploadTextureData ( 89ITextureResource * dst, 90SubresourceRange subResourceRange, 91ITextureResource ::Offset3D offset, 92ITextureResource ::Extents extend, 93ITextureResource ::SubresourceData * subResourceData, 94GfxCount subResourceDataCount) override; 95 96virtual SLANG_NO_THROW void SLANG_MCALL bufferBarrier ( 97GfxCount count, 98IBufferResource * const * buffers, 99ResourceState src, 100ResourceState dst) override; 101 102virtual SLANG_NO_THROW void SLANG_MCALL textureBarrier ( 103GfxCount count, 104ITextureResource * const * textures, 105ResourceState src, 106ResourceState dst) override; 107 108virtual SLANG_NO_THROW void SLANG_MCALL textureSubresourceBarrier ( 109ITextureResource * texture, 110SubresourceRange subresourceRange, 111ResourceState src, 112ResourceState dst) override; 113 114void _clearColorImage ( TextureResourceViewImpl * viewImpl, ClearValue * clearValue); 115 116void _clearDepthImage ( 117TextureResourceViewImpl * viewImpl, 118ClearValue * clearValue, 119ClearResourceViewFlags ::Enum flags); 120 121virtual SLANG_NO_THROW void SLANG_MCALL clearResourceView ( 122IResourceView * view, 123ClearValue * clearValue, 124ClearResourceViewFlags ::Enum flags) override; 125 126virtual SLANG_NO_THROW void SLANG_MCALL resolveResource ( 127ITextureResource * source, 128ResourceState sourceState, 129SubresourceRange sourceRange, 130ITextureResource * dest, 131ResourceState destState, 132SubresourceRange destRange) override; 133 134virtual SLANG_NO_THROW void SLANG_MCALL resolveQuery ( 135IQueryPool * queryPool, 136GfxIndex index, 137GfxCount count, 138IBufferResource * buffer, 139Offset offset) override; 140 141 142virtual SLANG_NO_THROW void SLANG_MCALL 143beginDebugEvent ( const char * name, float rgbColor[ 3 ]) override; 144virtual SLANG_NO_THROW void SLANG_MCALL endDebugEvent () override; 145}; 146 147class RenderCommandEncoder : public IRenderCommandEncoder, public ResourceCommandEncoder 148{ 149SLANG_GFX_FORWARD_RESOURCE_COMMAND_ENCODER_IMPL ( ResourceCommandEncoder ) 150virtual void * getInterface ( SlangUUID const & uuid) override 151{ 152if ( uuid == GfxGUID::IID_IResourceCommandEncoder || 153uuid == GfxGUID::IID_IRenderCommandEncoder || uuid == ISlangUnknown:: getTypeGuid ()) 154{ 155return this; 156} 157return nullptr; 158} 159 160public : 161RefPtr < RenderPassLayoutImpl > m_renderPassLayout; 162RefPtr < FramebufferImpl > m_framebuffer; 163NS ::SharedPtr < MTL ::RenderPassDescriptor > m_renderPassDesc; 164 165ShortList < MTL ::Viewport, 16 > m_viewports; 166ShortList < MTL ::ScissorRect, 16 > m_scissorRects; 167MTL ::PrimitiveType m_primitiveType = MTL ::PrimitiveTypeTriangle; 168 169ShortList < MTL ::Buffer * , 16 > m_vertexBuffers; 170ShortList < NS ::UInteger, 16 > m_vertexBufferOffsets; 171 172MTL ::Buffer * m_indexBuffer = nullptr ; 173NS ::UInteger m_indexBufferOffset = 0 ; 174MTL ::IndexType m_indexBufferType = MTL ::IndexTypeUInt16; 175 176uint32_t m_stencilReferenceValue = 0 ; 177 178public : 179void beginPass ( IRenderPassLayout * renderPass, IFramebuffer * framebuffer); 180 181virtual SLANG_NO_THROW void SLANG_MCALL endEncoding () override; 182 183virtual SLANG_NO_THROW Result SLANG_MCALL 184bindPipeline ( IPipelineState * pipelineState, IShaderObject ** outRootObject) override; 185 186virtual SLANG_NO_THROW Result SLANG_MCALL 187bindPipelineWithRootObject ( IPipelineState * pipelineState, IShaderObject * rootObject) override; 188 189virtual SLANG_NO_THROW void SLANG_MCALL 190setViewports ( GfxCount count, const Viewport * viewports) override; 191 192virtual SLANG_NO_THROW void SLANG_MCALL 193setScissorRects ( GfxCount count, const ScissorRect * rects) override; 194 195virtual SLANG_NO_THROW void SLANG_MCALL 196setPrimitiveTopology ( PrimitiveTopology topology) override; 197 198virtual SLANG_NO_THROW void SLANG_MCALL setVertexBuffers ( 199GfxIndex startSlot, 200GfxCount slotCount, 201IBufferResource * const * buffers, 202const Offset * offsets) override; 203 204virtual SLANG_NO_THROW void SLANG_MCALL 205setIndexBuffer ( IBufferResource * buffer, Format indexFormat, Offset offset = 0 ) override; 206 207virtual SLANG_NO_THROW void SLANG_MCALL setStencilReference ( uint32_t referenceValue) override; 208 209virtual SLANG_NO_THROW Result SLANG_MCALL setSamplePositions ( 210GfxCount samplesPerPixel, 211GfxCount pixelCount, 212const SamplePosition * samplePositions) override; 213 214Result prepareDraw ( MTL ::RenderCommandEncoder *& encoder); 215 216virtual SLANG_NO_THROW Result SLANG_MCALL 217draw ( GfxCount vertexCount, GfxIndex startVertex = 0 ) override; 218virtual SLANG_NO_THROW Result SLANG_MCALL 219drawIndexed ( GfxCount indexCount, GfxIndex startIndex = 0 , GfxIndex baseVertex = 0 ) override; 220 221virtual SLANG_NO_THROW Result SLANG_MCALL drawIndirect ( 222GfxCount maxDrawCount, 223IBufferResource * argBuffer, 224Offset argOffset, 225IBufferResource * countBuffer, 226Offset countOffset) override; 227 228virtual SLANG_NO_THROW Result SLANG_MCALL drawIndexedIndirect ( 229GfxCount maxDrawCount, 230IBufferResource * argBuffer, 231Offset argOffset, 232IBufferResource * countBuffer, 233Offset countOffset) override; 234 235virtual SLANG_NO_THROW Result SLANG_MCALL drawInstanced ( 236GfxCount vertexCount, 237GfxCount instanceCount, 238GfxIndex startVertex, 239GfxIndex startInstanceLocation) override; 240 241virtual SLANG_NO_THROW Result SLANG_MCALL drawIndexedInstanced ( 242GfxCount indexCount, 243GfxCount instanceCount, 244GfxIndex startIndexLocation, 245GfxIndex baseVertexLocation, 246GfxIndex startInstanceLocation) override; 247 248virtual SLANG_NO_THROW Result SLANG_MCALL drawMeshTasks ( int x, int y, int z) override; 249}; 250 251class ComputeCommandEncoder : public IComputeCommandEncoder, public ResourceCommandEncoder 252{ 253public: 254SLANG_GFX_FORWARD_RESOURCE_COMMAND_ENCODER_IMPL ( ResourceCommandEncoder ) 255virtual void * getInterface ( SlangUUID const & uuid) override 256{ 257if ( uuid == GfxGUID::IID_IResourceCommandEncoder || 258uuid == GfxGUID::IID_IComputeCommandEncoder || uuid == ISlangUnknown:: getTypeGuid ()) 259{ 260return this; 261} 262return nullptr; 263} 264 265virtual SLANG_NO_THROW void SLANG_MCALL endEncoding () override; 266 267virtual SLANG_NO_THROW Result SLANG_MCALL 268bindPipeline ( IPipelineState * pipelineState, IShaderObject ** outRootObject) override; 269 270virtual SLANG_NO_THROW Result SLANG_MCALL 271bindPipelineWithRootObject ( IPipelineState * pipelineState, IShaderObject * rootObject) override; 272 273virtual SLANG_NO_THROW Result SLANG_MCALL dispatchCompute ( int x, int y, int z) override; 274 275virtual SLANG_NO_THROW Result SLANG_MCALL 276dispatchComputeIndirect ( IBufferResource * argBuffer, Offset offset) override; 277}; 278 279class RayTracingCommandEncoder : public IRayTracingCommandEncoder, public ResourceCommandEncoder 280{ 281public: 282SLANG_GFX_FORWARD_RESOURCE_COMMAND_ENCODER_IMPL ( ResourceCommandEncoder ) 283virtual void * getInterface ( SlangUUID const & uuid) override 284{ 285if ( uuid == GfxGUID::IID_IResourceCommandEncoder || 286uuid == GfxGUID::IID_IRayTracingCommandEncoder || uuid == ISlangUnknown:: getTypeGuid ()) 287{ 288return this; 289} 290return nullptr; 291} 292 293public : 294void _memoryBarrier ( 295int count, 296IAccelerationStructure * const * structures, 297AccessFlag srcAccess, 298AccessFlag destAccess); 299 300void _queryAccelerationStructureProperties ( 301GfxCount accelerationStructureCount, 302IAccelerationStructure * const * accelerationStructures, 303GfxCount queryCount, 304AccelerationStructureQueryDesc * queryDescs); 305 306virtual SLANG_NO_THROW void SLANG_MCALL buildAccelerationStructure( 307const IAccelerationStructure ::BuildDesc & desc, 308GfxCount propertyQueryCount, 309AccelerationStructureQueryDesc * queryDescs) override; 310 311virtual SLANG_NO_THROW void SLANG_MCALL copyAccelerationStructure ( 312IAccelerationStructure * dest, 313IAccelerationStructure * src, 314AccelerationStructureCopyMode mode) override; 315 316virtual SLANG_NO_THROW void SLANG_MCALL queryAccelerationStructureProperties ( 317GfxCount accelerationStructureCount, 318IAccelerationStructure * const * accelerationStructures, 319GfxCount queryCount, 320AccelerationStructureQueryDesc * queryDescs) override; 321 322virtual SLANG_NO_THROW void SLANG_MCALL 323serializeAccelerationStructure ( DeviceAddress dest, IAccelerationStructure * source) override; 324 325virtual SLANG_NO_THROW void SLANG_MCALL 326deserializeAccelerationStructure ( IAccelerationStructure * dest, DeviceAddress source) override; 327 328virtual SLANG_NO_THROW Result SLANG_MCALL 329bindPipeline ( IPipelineState * pipeline, IShaderObject ** outRootObject) override; 330 331virtual SLANG_NO_THROW Result SLANG_MCALL 332bindPipelineWithRootObject ( IPipelineState * pipelineState, IShaderObject * rootObject) override; 333 334virtual SLANG_NO_THROW Result SLANG_MCALL dispatchRays ( 335GfxIndex raygenShaderIndex, 336IShaderTable * shaderTable, 337GfxCount width, 338GfxCount height, 339GfxCount depth) override; 340 341virtual SLANG_NO_THROW void SLANG_MCALL endEncoding () override; 342}; 343 344} // namespace metal 345} // namespace gfx