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