yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
b118451e3
master
1// debug-command-encoder.cpp 2#include "debug-command-encoder.h" 3 4#include "debug-buffer.h" 5#include "debug-command-buffer.h" 6#include "debug-helper-functions.h" 7#include "debug-pipeline-state.h" 8#include "debug-query.h" 9#include "debug-resource-views.h" 10#include "debug-texture.h" 11 12namespace gfx 13{ 14using namespace Slang ; 15 16namespace debug 17{ 18 19void DebugComputeCommandEncoder ::endEncoding () 20{ 21SLANG_GFX_API_FUNC ; 22isOpen = false; 23baseObject -> endEncoding (); 24} 25 26Result DebugComputeCommandEncoder ::bindPipeline ( 27IPipelineState * state , 28IShaderObject ** outRootShaderObject ) 29{ 30SLANG_GFX_API_FUNC ; 31 32auto innerState = getInnerObj (state ); 33IShaderObject * innerRootObject = nullptr ; 34commandBuffer -> rootObject .reset (); 35auto result = baseObject -> bindPipeline (innerState ,& innerRootObject ); 36commandBuffer -> rootObject .baseObject .attach (innerRootObject ); 37* outRootShaderObject = & commandBuffer -> rootObject ; 38return result ; 39} 40 41Result DebugComputeCommandEncoder ::bindPipelineWithRootObject ( 42IPipelineState * state , 43IShaderObject * rootObject ) 44{ 45SLANG_GFX_API_FUNC ; 46return baseObject -> bindPipelineWithRootObject (getInnerObj (state ),getInnerObj (rootObject )); 47} 48 49Result DebugComputeCommandEncoder ::dispatchCompute (int x ,int y ,int z ) 50{ 51SLANG_GFX_API_FUNC ; 52return baseObject -> dispatchCompute (x ,y ,z ); 53} 54 55Result DebugComputeCommandEncoder ::dispatchComputeIndirect ( 56IBufferResource * cmdBuffer , 57Offset offset ) 58{ 59SLANG_GFX_API_FUNC ; 60return baseObject -> dispatchComputeIndirect (getInnerObj (cmdBuffer ),offset ); 61} 62 63void DebugRenderCommandEncoder ::endEncoding () 64{ 65SLANG_GFX_API_FUNC ; 66isOpen = false; 67baseObject -> endEncoding (); 68} 69 70Result DebugRenderCommandEncoder ::bindPipeline ( 71IPipelineState * state , 72IShaderObject ** outRootShaderObject ) 73{ 74SLANG_GFX_API_FUNC ; 75 76auto innerState = getInnerObj (state ); 77IShaderObject * innerRootObject = nullptr ; 78commandBuffer -> rootObject .reset (); 79auto result = baseObject -> bindPipeline (innerState ,& innerRootObject ); 80commandBuffer -> rootObject .baseObject .attach (innerRootObject ); 81* outRootShaderObject = & commandBuffer -> rootObject ; 82return result ; 83} 84 85Result DebugRenderCommandEncoder ::bindPipelineWithRootObject ( 86IPipelineState * state , 87IShaderObject * rootObject ) 88{ 89SLANG_GFX_API_FUNC ; 90return baseObject -> bindPipelineWithRootObject (getInnerObj (state ),getInnerObj (rootObject )); 91} 92 93void DebugRenderCommandEncoder ::setViewports (GfxCount count ,const Viewport * viewports ) 94{ 95SLANG_GFX_API_FUNC ; 96baseObject -> setViewports (count ,viewports ); 97} 98 99void DebugRenderCommandEncoder ::setScissorRects (GfxCount count ,const ScissorRect * scissors ) 100{ 101SLANG_GFX_API_FUNC ; 102baseObject -> setScissorRects (count ,scissors ); 103} 104 105void DebugRenderCommandEncoder ::setPrimitiveTopology (PrimitiveTopology topology ) 106{ 107SLANG_GFX_API_FUNC ; 108baseObject -> setPrimitiveTopology (topology ); 109} 110 111void DebugRenderCommandEncoder ::setVertexBuffers ( 112GfxIndex startSlot , 113GfxCount slotCount , 114IBufferResource * const * buffers , 115const Offset * offsets ) 116{ 117SLANG_GFX_API_FUNC ; 118 119List < IBufferResource *> innerBuffers ; 120for (GfxIndex i = 0 ;i < slotCount ;i ++ ) 121 { 122innerBuffers .add (static_cast < DebugBufferResource *> (buffers [i ])-> baseObject .get ()); 123 } 124baseObject -> setVertexBuffers (startSlot ,slotCount ,innerBuffers .getBuffer (),offsets ); 125} 126 127void DebugRenderCommandEncoder ::setIndexBuffer ( 128IBufferResource * buffer , 129Format indexFormat , 130Offset offset ) 131{ 132SLANG_GFX_API_FUNC ; 133auto innerBuffer = static_cast < DebugBufferResource *> (buffer )-> baseObject .get (); 134baseObject -> setIndexBuffer (innerBuffer ,indexFormat ,offset ); 135} 136 137Result DebugRenderCommandEncoder ::draw (GfxCount vertexCount ,GfxIndex startVertex ) 138{ 139SLANG_GFX_API_FUNC ; 140return baseObject -> draw (vertexCount ,startVertex ); 141} 142 143Result DebugRenderCommandEncoder ::drawIndexed ( 144GfxCount indexCount , 145GfxIndex startIndex , 146GfxIndex baseVertex ) 147{ 148SLANG_GFX_API_FUNC ; 149return baseObject -> drawIndexed (indexCount ,startIndex ,baseVertex ); 150} 151 152Result DebugRenderCommandEncoder ::drawIndirect ( 153GfxCount maxDrawCount , 154IBufferResource * argBuffer , 155Offset argOffset , 156IBufferResource * countBuffer , 157Offset countOffset ) 158{ 159SLANG_GFX_API_FUNC ; 160return baseObject -> drawIndirect ( 161maxDrawCount , 162getInnerObj (argBuffer ), 163argOffset , 164getInnerObj (countBuffer ), 165countOffset ); 166} 167 168Result DebugRenderCommandEncoder ::drawIndexedIndirect ( 169GfxCount maxDrawCount , 170IBufferResource * argBuffer , 171Offset argOffset , 172IBufferResource * countBuffer , 173Offset countOffset ) 174{ 175SLANG_GFX_API_FUNC ; 176return baseObject -> drawIndexedIndirect ( 177maxDrawCount , 178getInnerObj (argBuffer ), 179argOffset , 180getInnerObj (countBuffer ), 181countOffset ); 182} 183 184void DebugRenderCommandEncoder ::setStencilReference (uint32_t referenceValue ) 185{ 186SLANG_GFX_API_FUNC ; 187return baseObject -> setStencilReference (referenceValue ); 188} 189 190Result DebugRenderCommandEncoder ::setSamplePositions ( 191GfxCount samplesPerPixel , 192GfxCount pixelCount , 193const SamplePosition * samplePositions ) 194{ 195SLANG_GFX_API_FUNC ; 196return baseObject -> setSamplePositions (samplesPerPixel ,pixelCount ,samplePositions ); 197} 198 199Result DebugRenderCommandEncoder ::drawInstanced ( 200GfxCount vertexCount , 201GfxCount instanceCount , 202GfxIndex startVertex , 203GfxIndex startInstanceLocation ) 204{ 205SLANG_GFX_API_FUNC ; 206return baseObject 207-> drawInstanced (vertexCount ,instanceCount ,startVertex ,startInstanceLocation ); 208} 209 210Result DebugRenderCommandEncoder ::drawIndexedInstanced ( 211GfxCount indexCount , 212GfxCount instanceCount , 213GfxIndex startIndexLocation , 214GfxIndex baseVertexLocation , 215GfxIndex startInstanceLocation ) 216{ 217SLANG_GFX_API_FUNC ; 218return baseObject -> drawIndexedInstanced ( 219indexCount , 220instanceCount , 221startIndexLocation , 222baseVertexLocation , 223startInstanceLocation ); 224} 225 226Result DebugRenderCommandEncoder ::drawMeshTasks (int x ,int y ,int z ) 227{ 228SLANG_GFX_API_FUNC ; 229return baseObject -> drawMeshTasks (x ,y ,z ); 230} 231 232void DebugResourceCommandEncoder ::endEncoding () 233{ 234SLANG_GFX_API_FUNC ; 235isOpen = false; 236baseObject -> endEncoding (); 237} 238 239void DebugResourceCommandEncoderImpl ::writeTimestamp (IQueryPool * pool ,GfxIndex index ) 240{ 241SLANG_GFX_API_FUNC ; 242getBaseResourceEncoder ()-> writeTimestamp (static_cast < DebugQueryPool *> (pool )-> baseObject ,index ); 243} 244 245void DebugResourceCommandEncoderImpl ::copyBuffer ( 246IBufferResource * dst , 247Offset dstOffset , 248IBufferResource * src , 249Offset srcOffset , 250Size size ) 251{ 252SLANG_GFX_API_FUNC ; 253auto dstImpl = static_cast < DebugBufferResource *> (dst ); 254auto srcImpl = static_cast < DebugBufferResource *> (src ); 255getBaseResourceEncoder () 256-> copyBuffer (dstImpl -> baseObject ,dstOffset ,srcImpl -> baseObject ,srcOffset ,size ); 257} 258 259void DebugResourceCommandEncoderImpl ::uploadBufferData ( 260IBufferResource * dst , 261Offset offset , 262Size size , 263void * data ) 264{ 265SLANG_GFX_API_FUNC ; 266auto dstImpl = static_cast < DebugBufferResource *> (dst ); 267getBaseResourceEncoder ()-> uploadBufferData (dstImpl -> baseObject ,offset ,size ,data ); 268} 269 270void DebugResourceCommandEncoderImpl ::textureBarrier ( 271GfxCount count , 272ITextureResource * const * textures , 273ResourceState src , 274ResourceState dst ) 275{ 276SLANG_GFX_API_FUNC ; 277 278List < ITextureResource *> innerTextures ; 279for (GfxIndex i = 0 ;i < count ;i ++ ) 280 { 281innerTextures .add (static_cast < DebugTextureResource *> (textures [i ])-> baseObject .get ()); 282 } 283getBaseResourceEncoder ()-> textureBarrier (count ,innerTextures .getBuffer (),src ,dst ); 284} 285 286void DebugResourceCommandEncoderImpl ::bufferBarrier ( 287GfxCount count , 288IBufferResource * const * buffers , 289ResourceState src , 290ResourceState dst ) 291{ 292SLANG_GFX_API_FUNC ; 293 294List < IBufferResource *> innerBuffers ; 295for (GfxIndex i = 0 ;i < count ;i ++ ) 296 { 297innerBuffers .add (static_cast < DebugBufferResource *> (buffers [i ])-> baseObject .get ()); 298 } 299getBaseResourceEncoder ()-> bufferBarrier (count ,innerBuffers .getBuffer (),src ,dst ); 300} 301 302void DebugResourceCommandEncoderImpl ::copyTexture ( 303ITextureResource * dst , 304ResourceState dstState , 305SubresourceRange dstSubresource , 306ITextureResource ::Offset3D dstOffset , 307ITextureResource * src , 308ResourceState srcState , 309SubresourceRange srcSubresource , 310ITextureResource ::Offset3D srcOffset , 311ITextureResource ::Extents extent ) 312{ 313SLANG_GFX_API_FUNC ; 314getBaseResourceEncoder ()-> copyTexture ( 315getInnerObj (dst ), 316dstState , 317dstSubresource , 318dstOffset , 319getInnerObj (src ), 320srcState , 321srcSubresource , 322srcOffset , 323extent ); 324} 325 326void DebugResourceCommandEncoderImpl ::uploadTextureData ( 327ITextureResource * dst , 328SubresourceRange subResourceRange , 329ITextureResource ::Offset3D offset , 330ITextureResource ::Extents extent , 331ITextureResource ::SubresourceData * subResourceData , 332GfxCount subResourceDataCount ) 333{ 334SLANG_GFX_API_FUNC ; 335getBaseResourceEncoder ()-> uploadTextureData ( 336getInnerObj (dst ), 337subResourceRange , 338offset , 339extent , 340subResourceData , 341subResourceDataCount ); 342} 343 344void DebugResourceCommandEncoderImpl ::clearResourceView ( 345IResourceView * view , 346ClearValue * clearValue , 347ClearResourceViewFlags ::Enum flags ) 348{ 349SLANG_GFX_API_FUNC ; 350switch (view -> getViewDesc ()-> type ) 351 { 352case IResourceView ::Type ::DepthStencil : 353case IResourceView ::Type ::RenderTarget : 354case IResourceView ::Type ::UnorderedAccess : 355break ; 356default : 357GFX_DIAGNOSE_ERROR_FORMAT ( 358"Resource view %lld cannot be cleared. Only DepthStencil, " 359"RenderTarget or UnorderedAccess views can be cleared." , 360getDebugObj (view )-> uid ); 361 } 362getBaseResourceEncoder ()-> clearResourceView (getInnerObj (view ),clearValue ,flags ); 363} 364 365void DebugResourceCommandEncoderImpl ::resolveResource ( 366ITextureResource * source , 367ResourceState sourceState , 368SubresourceRange sourceRange , 369ITextureResource * dest , 370ResourceState destState , 371SubresourceRange destRange ) 372{ 373SLANG_GFX_API_FUNC ; 374getBaseResourceEncoder ()-> resolveResource ( 375getInnerObj (source ), 376sourceState , 377sourceRange , 378getInnerObj (dest ), 379destState , 380destRange ); 381} 382 383void DebugResourceCommandEncoderImpl ::resolveQuery ( 384IQueryPool * queryPool , 385GfxIndex index , 386GfxCount count , 387IBufferResource * buffer , 388Offset offset ) 389{ 390SLANG_GFX_API_FUNC ; 391getBaseResourceEncoder () 392-> resolveQuery (getInnerObj (queryPool ),index ,count ,getInnerObj (buffer ),offset ); 393} 394 395void DebugResourceCommandEncoderImpl ::copyTextureToBuffer ( 396IBufferResource * dst , 397Offset dstOffset , 398Size dstSize , 399Size dstRowStride , 400ITextureResource * src , 401ResourceState srcState , 402SubresourceRange srcSubresource , 403ITextureResource ::Offset3D srcOffset , 404ITextureResource ::Extents extent ) 405{ 406SLANG_GFX_API_FUNC ; 407getBaseResourceEncoder ()-> copyTextureToBuffer ( 408getInnerObj (dst ), 409dstOffset , 410dstSize , 411dstRowStride , 412getInnerObj (src ), 413srcState , 414srcSubresource , 415srcOffset , 416extent ); 417} 418 419void DebugResourceCommandEncoderImpl ::textureSubresourceBarrier ( 420ITextureResource * texture , 421SubresourceRange subresourceRange , 422ResourceState src , 423ResourceState dst ) 424{ 425SLANG_GFX_API_FUNC ; 426getBaseResourceEncoder () 427-> textureSubresourceBarrier (getInnerObj (texture ),subresourceRange ,src ,dst ); 428} 429 430void DebugResourceCommandEncoderImpl ::beginDebugEvent (const char * name ,float rgbColor [3 ]) 431{ 432SLANG_GFX_API_FUNC ; 433getBaseResourceEncoder ()-> beginDebugEvent (name ,rgbColor ); 434} 435 436void DebugResourceCommandEncoderImpl ::endDebugEvent () 437{ 438SLANG_GFX_API_FUNC ; 439getBaseResourceEncoder ()-> endDebugEvent (); 440} 441 442void DebugRayTracingCommandEncoder ::endEncoding () 443{ 444SLANG_GFX_API_FUNC ; 445isOpen = false; 446baseObject -> endEncoding (); 447} 448 449void DebugRayTracingCommandEncoder ::buildAccelerationStructure ( 450const IAccelerationStructure ::BuildDesc & desc , 451GfxCount propertyQueryCount , 452AccelerationStructureQueryDesc * queryDescs ) 453{ 454SLANG_GFX_API_FUNC ; 455IAccelerationStructure ::BuildDesc innerDesc = desc ; 456innerDesc .dest = getInnerObj (innerDesc .dest ); 457innerDesc .source = getInnerObj (innerDesc .source ); 458List < AccelerationStructureQueryDesc > innerQueryDescs ; 459innerQueryDescs .addRange (queryDescs ,propertyQueryCount ); 460for (auto & innerQueryDesc :innerQueryDescs ) 461 { 462innerQueryDesc .queryPool = getInnerObj (innerQueryDesc .queryPool ); 463 } 464validateAccelerationStructureBuildInputs (desc .inputs ); 465baseObject -> buildAccelerationStructure ( 466innerDesc , 467propertyQueryCount , 468innerQueryDescs .getBuffer ()); 469} 470 471void DebugRayTracingCommandEncoder ::copyAccelerationStructure ( 472IAccelerationStructure * dest , 473IAccelerationStructure * src , 474AccelerationStructureCopyMode mode ) 475{ 476SLANG_GFX_API_FUNC ; 477auto innerDest = getInnerObj (dest ); 478auto innerSrc = getInnerObj (src ); 479baseObject -> copyAccelerationStructure (innerDest ,innerSrc ,mode ); 480} 481 482void DebugRayTracingCommandEncoder ::queryAccelerationStructureProperties ( 483GfxCount accelerationStructureCount , 484IAccelerationStructure * const * accelerationStructures , 485GfxCount queryCount , 486AccelerationStructureQueryDesc * queryDescs ) 487{ 488SLANG_GFX_API_FUNC ; 489List < IAccelerationStructure *> innerAS ; 490for (GfxIndex i = 0 ;i < accelerationStructureCount ;i ++ ) 491 { 492innerAS .add (getInnerObj (accelerationStructures [i ])); 493 } 494List < AccelerationStructureQueryDesc > innerQueryDescs ; 495innerQueryDescs .addRange (queryDescs ,queryCount ); 496for (auto & innerQueryDesc :innerQueryDescs ) 497 { 498innerQueryDesc .queryPool = getInnerObj (innerQueryDesc .queryPool ); 499 } 500baseObject -> queryAccelerationStructureProperties ( 501accelerationStructureCount , 502innerAS .getBuffer (), 503queryCount , 504innerQueryDescs .getBuffer ()); 505} 506 507void DebugRayTracingCommandEncoder ::serializeAccelerationStructure ( 508DeviceAddress dest , 509IAccelerationStructure * source ) 510{ 511SLANG_GFX_API_FUNC ; 512baseObject -> serializeAccelerationStructure (dest ,getInnerObj (source )); 513} 514 515void DebugRayTracingCommandEncoder ::deserializeAccelerationStructure ( 516IAccelerationStructure * dest , 517DeviceAddress source ) 518{ 519SLANG_GFX_API_FUNC ; 520baseObject -> deserializeAccelerationStructure (getInnerObj (dest ),source ); 521} 522 523Result DebugRayTracingCommandEncoder ::bindPipeline ( 524IPipelineState * state , 525IShaderObject ** outRootObject ) 526{ 527SLANG_GFX_API_FUNC ; 528auto innerPipeline = getInnerObj (state ); 529IShaderObject * innerRootObject = nullptr ; 530commandBuffer -> rootObject .reset (); 531Result result = baseObject -> bindPipeline (innerPipeline ,& innerRootObject ); 532commandBuffer -> rootObject .baseObject .attach (innerRootObject ); 533* outRootObject = & commandBuffer -> rootObject ; 534return result ; 535} 536 537Result DebugRayTracingCommandEncoder ::bindPipelineWithRootObject ( 538IPipelineState * state , 539IShaderObject * rootObject ) 540{ 541SLANG_GFX_API_FUNC ; 542return baseObject -> bindPipelineWithRootObject (getInnerObj (state ),getInnerObj (rootObject )); 543} 544 545Result DebugRayTracingCommandEncoder ::dispatchRays ( 546GfxIndex rayGenShaderIndex , 547IShaderTable * shaderTable , 548GfxCount width , 549GfxCount height , 550GfxCount depth ) 551{ 552SLANG_GFX_API_FUNC ; 553return baseObject 554-> dispatchRays (rayGenShaderIndex ,getInnerObj (shaderTable ),width ,height ,depth ); 555} 556 557}// namespace debug 558}// namespace gfx