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 to slang-rhi\tests\test-sampler-array.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 25GFX_CHECK_CALL_ABORT (device -> createBuffer (bufferDesc , (void * )& content ,buffer .writeRef ())); 26 27return buffer ; 28} 29void samplerArrayTestImpl (IDevice * device ,UnitTestContext * context ) 30{ 31ComPtr < IShaderProgram > shaderProgram ; 32 slang::ProgramLayout * slangReflection ; 33GFX_CHECK_CALL_ABORT ( 34loadComputeProgram (device ,shaderProgram ,"sampler-array" ,"computeMain" ,slangReflection )); 35 36ComputePipelineDesc pipelineDesc = {}; 37pipelineDesc .program = shaderProgram .get (); 38ComPtr < IComputePipeline > pipeline ; 39GFX_CHECK_CALL_ABORT (device -> createComputePipeline (pipelineDesc ,pipeline .writeRef ())); 40 41Slang ::List < ComPtr < ISampler >> samplers ; 42ComPtr < ITexture > texture ; 43ComPtr < IBuffer > buffer = createBuffer (device ,0 ); 44 45 { 46TextureDesc textureDesc = {}; 47textureDesc .type = TextureType ::Texture2D ; 48textureDesc .format = Format ::RGBA8Unorm ; 49textureDesc .size .width = 2 ; 50textureDesc .size .height = 2 ; 51textureDesc .size .depth = 1 ; 52textureDesc .mipCount = 2 ; 53textureDesc .memoryType = MemoryType ::DeviceLocal ; 54textureDesc .usage = TextureUsage ::ShaderResource |TextureUsage ::CopyDestination ; 55textureDesc .defaultState = ResourceState ::ShaderResource ; 56uint32_t data []= {0xFFFFFFFF ,0xFFFFFFFF ,0xFFFFFFFF ,0xFFFFFFFF }; 57SubresourceData subResourceData [2 ]= {{data ,8 ,16 }, {data ,8 ,16 }}; 58GFX_CHECK_CALL_ABORT ( 59device -> createTexture (textureDesc ,subResourceData ,texture .writeRef ())); 60 } 61 62for (uint32_t i = 0 ;i < 32 ;i ++ ) 63 { 64SamplerDesc desc = {}; 65ComPtr < ISampler > sampler ; 66GFX_CHECK_CALL_ABORT (device -> createSampler (desc ,sampler .writeRef ())); 67samplers .add (sampler ); 68 } 69 70ComPtr < IShaderObject > rootObject ; 71device -> createRootShaderObject (shaderProgram ,rootObject .writeRef ()); 72 73ComPtr < IShaderObject > g ; 74device -> createShaderObject ( 75slangReflection -> findTypeByName ("S0" ), 76ShaderObjectContainerType ::None , 77g .writeRef ()); 78 79ComPtr < IShaderObject > s1 ; 80device -> createShaderObject ( 81slangReflection -> findTypeByName ("S1" ), 82ShaderObjectContainerType ::None , 83s1 .writeRef ()); 84 85 { 86auto cursor = ShaderCursor (s1 ); 87for (uint32_t i = 0 ;i < 32 ;i ++ ) 88 { 89cursor ["samplers" ][i ].setBinding (Binding (samplers [i ])); 90cursor ["tex" ][i ].setBinding (Binding (texture )); 91 } 92cursor ["data" ].setData (1.0f ); 93 } 94s1 -> finalize (); 95 96 { 97auto cursor = ShaderCursor (g ); 98cursor ["s" ].setObject (s1 ); 99cursor ["data" ].setData (2.0f ); 100 } 101 102 { 103auto cursor = ShaderCursor (rootObject ); 104cursor ["g" ].setObject (g ); 105cursor ["buffer" ].setBinding (Binding (buffer )); 106 } 107g -> finalize (); 108 109 { 110auto queue = device -> getQueue (QueueType ::Graphics ); 111auto commandEncoder = queue -> createCommandEncoder (); 112auto passEncoder = commandEncoder -> beginComputePass (); 113auto rootObject = passEncoder -> bindPipeline (pipeline ); 114auto cursor = ShaderCursor (rootObject ); 115cursor ["g" ].setObject (g ); 116cursor ["buffer" ].setBinding (buffer ); 117passEncoder -> dispatchCompute (1 ,1 ,1 ); 118passEncoder -> end (); 119 120queue -> submit (commandEncoder -> finish ()); 121queue -> waitOnHost (); 122 } 123 124compareComputeResult (device ,buffer , std::array {4.0f }); 125} 126 127SLANG_UNIT_TEST (samplerArrayVulkan ) 128{ 129runTestImpl (samplerArrayTestImpl ,unitTestContext ,DeviceType ::Vulkan ); 130} 131}// namespace gfx_test