yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
43d0c2100
master
1#include "core/slang-basic.h" 2#include "gfx-test-util.h" 3#include "slang-rhi.h" 4#include "slang-rhi/shader-cursor.h" 5#include "unit-test/slang-unit-test.h" 6using namespace rhi ; 7 8namespace gfx_test 9{ 10Slang ::ComPtr < IBuffer > createBuffer (IDevice * device ,uint32_t data ,ResourceState defaultState ) 11{ 12uint32_t initialData []= {data ,data ,data ,data }; 13const int numberCount = SLANG_COUNT_OF (initialData ); 14BufferDesc bufferDesc = {}; 15bufferDesc .size = sizeof (initialData ); 16bufferDesc .format = rhi::Format ::Undefined ; 17bufferDesc .elementSize = sizeof (uint32_t )* 4 ; 18bufferDesc .defaultState = defaultState ; 19bufferDesc .memoryType = MemoryType ::DeviceLocal ; 20 21// Set appropriate usage flags based on the default state 22if (defaultState == ResourceState ::ShaderResource ) 23 { 24bufferDesc .usage = BufferUsage ::ShaderResource ; 25 } 26else if (defaultState == ResourceState ::UnorderedAccess ) 27 { 28bufferDesc .usage = BufferUsage ::UnorderedAccess |BufferUsage ::CopySource ; 29 } 30 31ComPtr < IBuffer > numbersBuffer ; 32GFX_CHECK_CALL_ABORT ( 33device -> createBuffer (bufferDesc , (void * )initialData ,numbersBuffer .writeRef ())); 34return numbersBuffer ; 35} 36 37struct uint4 38{ 39uint32_t x ,y ,z ,w ; 40}; 41 42void nestedParameterBlockTestImpl (IDevice * device ,UnitTestContext * context ) 43{ 44ComPtr < IShaderProgram > shaderProgram ; 45 slang::ProgramLayout * slangReflection ; 46GFX_CHECK_CALL_ABORT (loadComputeProgram ( 47device , 48shaderProgram , 49"nested-parameter-block" , 50"computeMain" , 51slangReflection )); 52 53ComputePipelineDesc pipelineDesc = {}; 54pipelineDesc .program = shaderProgram .get (); 55ComPtr < rhi::IComputePipeline > pipeline ; 56pipeline = device -> createComputePipeline (pipelineDesc ); 57 58ComPtr < IShaderObject > shaderObject ; 59SLANG_CHECK ( 60SLANG_SUCCEEDED (device -> createRootShaderObject (shaderProgram ,shaderObject .writeRef ()))); 61 62Slang ::List < Slang ::ComPtr < IBuffer >> srvBuffers ; 63 64for (uint32_t i = 0 ;i < 6 ;i ++ ) 65 { 66srvBuffers .add (createBuffer (device ,i , rhi::ResourceState ::ShaderResource )); 67 } 68Slang ::ComPtr < IBuffer > resultBuffer = 69createBuffer (device ,0 , rhi::ResourceState ::UnorderedAccess ); 70 71Slang ::ComPtr < IShaderObject > materialObject ; 72SLANG_CHECK (SLANG_SUCCEEDED (device -> createShaderObject ( 73slangReflection -> findTypeByName ("MaterialSystem" ), 74ShaderObjectContainerType ::None , 75materialObject .writeRef ()))); 76 77Slang ::ComPtr < IShaderObject > sceneObject ; 78SLANG_CHECK (SLANG_SUCCEEDED (device -> createShaderObject ( 79slangReflection -> findTypeByName ("Scene" ), 80ShaderObjectContainerType ::None , 81sceneObject .writeRef ()))); 82 83ShaderCursor cursor (shaderObject ); 84cursor ["resultBuffer" ].setBinding (Binding (resultBuffer )); 85cursor ["scene" ].setObject (sceneObject ); 86 87Slang ::ComPtr < IShaderObject > globalCB ; 88SLANG_CHECK (SLANG_SUCCEEDED (device -> createShaderObject ( 89cursor [0 ].getTypeLayout ()-> getType (), 90ShaderObjectContainerType ::None , 91globalCB .writeRef ()))); 92 93cursor [0 ].setObject (globalCB ); 94auto initialData = uint4 {20 ,20 ,20 ,20 }; 95globalCB -> setData (ShaderOffset (),& initialData ,sizeof (initialData )); 96 97ShaderCursor sceneCursor (sceneObject ); 98sceneCursor ["sceneCb" ].setData (uint4 {100 ,100 ,100 ,100 }); 99sceneCursor ["data" ].setBinding (Binding (srvBuffers [1 ])); 100sceneCursor ["material" ].setObject (materialObject ); 101 102ShaderCursor materialCursor (materialObject ); 103materialCursor ["cb" ].setData (uint4 {1000 ,1000 ,1000 ,1000 }); 104materialCursor ["data" ].setBinding (Binding (srvBuffers [2 ])); 105 106// We have done all the set up work, now it is time to start recording a command buffer for 107// GPU execution. 108 { 109auto queue = device -> getQueue (QueueType ::Graphics ); 110 111auto commandEncoder = queue -> createCommandEncoder (); 112auto encoder = commandEncoder -> beginComputePass (); 113 114encoder -> bindPipeline (pipeline ,shaderObject ); 115 116encoder -> dispatchCompute (1 ,1 ,1 ); 117encoder -> end (); 118queue -> submit (commandEncoder -> finish ()); 119queue -> waitOnHost (); 120 } 121 122compareComputeResult (device ,resultBuffer , std::array {1123u ,1123u ,1123u ,1123u }); 123} 124 125SLANG_UNIT_TEST (nestedParameterBlockTestD3D12 ) 126{ 127runTestImpl (nestedParameterBlockTestImpl ,unitTestContext ,DeviceType ::D3D12 ); 128} 129 130SLANG_UNIT_TEST (nestedParameterBlockTestVulkan ) 131{ 132runTestImpl (nestedParameterBlockTestImpl ,unitTestContext ,DeviceType ::Vulkan ); 133} 134}// namespace gfx_test