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 "unit-test/slang-unit-test.h" 4 5#include <slang-rhi.h> 6#include <slang-rhi/shader-cursor.h> 7 8using namespace rhi ; 9 10namespace gfx_test 11{ 12void mutableShaderObjectTestImpl (IDevice * device ,UnitTestContext * context ) 13{ 14ComPtr < IShaderProgram > shaderProgram ; 15 slang::ProgramLayout * slangReflection ; 16GFX_CHECK_CALL_ABORT (loadComputeProgram ( 17device , 18shaderProgram , 19"mutable-shader-object" , 20"computeMain" , 21slangReflection )); 22 23ComputePipelineDesc pipelineDesc = {}; 24pipelineDesc .program = shaderProgram .get (); 25ComPtr < IComputePipeline > pipelineState ; 26GFX_CHECK_CALL_ABORT (device -> createComputePipeline (pipelineDesc ,pipelineState .writeRef ())); 27 28float initialData []= {0.0f ,1.0f ,2.0f ,3.0f }; 29const int numberCount = SLANG_COUNT_OF (initialData ); 30BufferDesc bufferDesc = {}; 31bufferDesc .size = sizeof (initialData ); 32bufferDesc .format = Format ::Undefined ; 33bufferDesc .elementSize = sizeof (float ); 34bufferDesc .usage = BufferUsage ::ShaderResource |BufferUsage ::UnorderedAccess | 35BufferUsage ::CopyDestination |BufferUsage ::CopySource ; 36bufferDesc .defaultState = ResourceState ::UnorderedAccess ; 37bufferDesc .memoryType = MemoryType ::DeviceLocal ; 38 39ComPtr < IBuffer > numbersBuffer ; 40GFX_CHECK_CALL_ABORT ( 41device -> createBuffer (bufferDesc , (void * )initialData ,numbersBuffer .writeRef ())); 42 43 { 44 slang::TypeReflection * addTransformerType = 45slangReflection -> findTypeByName ("AddTransformer" ); 46 47ComPtr < IShaderObject > transformer ; 48GFX_CHECK_CALL_ABORT (device -> createShaderObject ( 49addTransformerType , 50ShaderObjectContainerType ::None , 51transformer .writeRef ())); 52 53// Set the `c` field of the `AddTransformer`. 54float c = 1.0f ; 55ShaderCursor (transformer ).getPath ("c" ).setData (& c ,sizeof (float )); 56 57ComPtr < ICommandQueue > queue ; 58GFX_CHECK_CALL_ABORT (device -> getQueue (QueueType ::Graphics ,queue .writeRef ())); 59 60// Create root shader object 61ComPtr < IShaderObject > rootObject ; 62GFX_CHECK_CALL_ABORT (device -> createRootShaderObject (shaderProgram ,rootObject .writeRef ())); 63 64auto commandEncoder = queue -> createCommandEncoder (); 65auto computeEncoder = commandEncoder -> beginComputePass (); 66 67// Bind pipeline with our root object 68computeEncoder -> bindPipeline (pipelineState ,rootObject ); 69 70auto entryPointCursor = ShaderCursor (rootObject -> getEntryPoint (0 )); 71 72entryPointCursor .getPath ("buffer" ).setBinding (Binding (numbersBuffer )); 73 74// Bind the transformer object to root object. 75entryPointCursor .getPath ("transformer" ).setObject (transformer ); 76 77computeEncoder -> dispatchCompute (1 ,1 ,1 ); 78computeEncoder -> end (); 79 80// Set buffer state to ensure writes are visible 81commandEncoder -> setBufferState (numbersBuffer ,ResourceState ::UnorderedAccess ); 82 83computeEncoder = commandEncoder -> beginComputePass (); 84 85// Bind pipeline with our root object again 86computeEncoder -> bindPipeline (pipelineState ,rootObject ); 87 88// Mutate `transformer` object and run again. 89c = 2.0f ; 90ShaderCursor (transformer ).getPath ("c" ).setData (& c ,sizeof (float )); 91entryPointCursor .getPath ("buffer" ).setBinding (Binding (numbersBuffer )); 92entryPointCursor .getPath ("transformer" ).setObject (transformer ); 93computeEncoder -> dispatchCompute (1 ,1 ,1 ); 94computeEncoder -> end (); 95 96auto commandBuffer = commandEncoder -> finish (); 97queue -> submit (commandBuffer ); 98queue -> waitOnHost (); 99 } 100 101compareComputeResult (device ,numbersBuffer , std::array {3.0f ,4.0f ,5.0f ,6.0f }); 102} 103 104// SLANG_UNIT_TEST(mutableShaderObjectCPU) 105//{ 106// runTestImpl(mutableShaderObjectTestImpl, unitTestContext, Slang::RenderApiFlag::CPU); 107// } 108 109SLANG_UNIT_TEST (mutableShaderObjectD3D11 ) 110{ 111runTestImpl (mutableShaderObjectTestImpl ,unitTestContext ,DeviceType ::D3D11 ); 112} 113 114SLANG_UNIT_TEST (mutableShaderObjectD3D12 ) 115{ 116runTestImpl (mutableShaderObjectTestImpl ,unitTestContext ,DeviceType ::D3D12 ); 117} 118 119SLANG_UNIT_TEST (mutableShaderObjectVulkan ) 120{ 121runTestImpl (mutableShaderObjectTestImpl ,unitTestContext ,DeviceType ::Vulkan ); 122} 123}// namespace gfx_test