yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
43d0c2100
master
1// Duplicated: This test is identical slang-rhi\tests\test-root-shader-parameter.cpp 2 3#include "core/slang-basic.h" 4#include "gfx-test-util.h" 5#include "slang-rhi.h" 6#include "slang-rhi/shader-cursor.h" 7#include "unit-test/slang-unit-test.h" 8 9using namespace rhi ; 10 11namespace gfx_test 12{ 13static ComPtr < IBuffer > createBuffer (IDevice * device ,uint32_t content ) 14{ 15ComPtr < IBuffer > buffer ; 16BufferDesc bufferDesc = {}; 17bufferDesc .size = sizeof (uint32_t ); 18bufferDesc .format = rhi::Format ::Undefined ; 19bufferDesc .elementSize = sizeof (float ); 20bufferDesc .usage = BufferUsage ::ShaderResource |BufferUsage ::UnorderedAccess | 21BufferUsage ::CopyDestination |BufferUsage ::CopySource ; 22bufferDesc .defaultState = ResourceState ::UnorderedAccess ; 23bufferDesc .memoryType = MemoryType ::DeviceLocal ; 24 25ComPtr < IBuffer > numbersBuffer ; 26GFX_CHECK_CALL_ABORT (device -> createBuffer (bufferDesc , (void * )& content ,buffer .writeRef ())); 27 28return buffer ; 29} 30void rootShaderParameterTestImpl (IDevice * device ,UnitTestContext * context ) 31{ 32if (!device -> hasFeature (Feature ::ParameterBlock )) 33 { 34SLANG_CHECK ("no support for parameter blocks" ); 35 } 36 37ComPtr < IShaderProgram > shaderProgram ; 38 slang::ProgramLayout * slangReflection ; 39GFX_CHECK_CALL_ABORT (loadComputeProgram ( 40device , 41shaderProgram , 42"root-shader-parameter" , 43"computeMain" , 44slangReflection )); 45 46ComputePipelineDesc pipelineDesc = {}; 47pipelineDesc .program = shaderProgram .get (); 48ComPtr < rhi::IComputePipeline > pipeline = device -> createComputePipeline (pipelineDesc ); 49 50Slang ::List < ComPtr < IBuffer >> buffers ; 51 52for (uint32_t i = 0 ;i < 9 ;i ++ ) 53 { 54buffers .add (createBuffer (device ,i == 0 ?10 :i )); 55 } 56 57ComPtr < IShaderObject > rootObject ; 58device -> createRootShaderObject (shaderProgram ,rootObject .writeRef ()); 59 60ComPtr < IShaderObject > g ,s1 ,s2 ; 61device -> createShaderObject ( 62slangReflection -> findTypeByName ("S0" ), 63ShaderObjectContainerType ::None , 64g .writeRef ()); 65device -> createShaderObject ( 66slangReflection -> findTypeByName ("S1" ), 67ShaderObjectContainerType ::None , 68s1 .writeRef ()); 69device -> createShaderObject ( 70slangReflection -> findTypeByName ("S1" ), 71ShaderObjectContainerType ::None , 72s2 .writeRef ()); 73 74 { 75auto cursor = ShaderCursor (s1 ); 76cursor ["c0" ].setBinding (buffers [2 ]); 77cursor ["c1" ].setBinding (buffers [3 ]); 78cursor ["c2" ].setBinding (buffers [4 ]); 79 } 80 { 81auto cursor = ShaderCursor (s2 ); 82cursor ["c0" ].setBinding (buffers [5 ]); 83cursor ["c1" ].setBinding (buffers [6 ]); 84cursor ["c2" ].setBinding (buffers [7 ]); 85 } 86 { 87auto cursor = ShaderCursor (g ); 88cursor ["b0" ].setBinding (buffers [0 ]); 89cursor ["b1" ].setBinding (buffers [1 ]); 90cursor ["s1" ].setObject (s1 ); 91cursor ["s2" ].setObject (s2 ); 92 } 93 { 94auto cursor = ShaderCursor (rootObject ); 95cursor ["g" ].setObject (g ); 96cursor ["buffer" ].setBinding (buffers [8 ]); 97 } 98 99 { 100auto queue = device -> getQueue (QueueType ::Graphics ); 101 102auto commandBuffer = queue -> createCommandEncoder (); 103 { 104auto encoder = commandBuffer -> beginComputePass (); 105encoder -> bindPipeline (pipeline ,rootObject ); 106encoder -> dispatchCompute (1 ,1 ,1 ); 107encoder -> end (); 108 } 109 110queue -> submit (commandBuffer -> finish ()); 111queue -> waitOnHost (); 112 } 113 114compareComputeResult (device ,buffers [8 ], std::array {10 - 1 + 2 - 3 + 4 + 5 - 6 + 7 }); 115} 116 117SLANG_UNIT_TEST (rootShaderParameterD3D12 ) 118{ 119runTestImpl (rootShaderParameterTestImpl ,unitTestContext ,DeviceType ::D3D12 ); 120} 121 122SLANG_UNIT_TEST (rootShaderParameterVulkan ) 123{ 124runTestImpl (rootShaderParameterTestImpl ,unitTestContext ,DeviceType ::Vulkan ); 125} 126}// namespace gfx_test