yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
43d0c2100
master
1#if 0 2// Duplicated: This test is identical to slang-rhi\tests\test-mutable-shader-object.cpp 3// TODO: This test failed 4// The result buffer is still {0.0f, 1.0f, 2.0f, 3.0f}. Not incremented by the shader 5 6#include "core/slang-basic.h" 7#include "gfx-test-util.h" 8#include "unit-test/slang-unit-test.h" 9 10#include <slang-rhi.h> 11#include <slang-rhi/shader-cursor.h> 12 13using namespace rhi ; 14 15namespace gfx_test 16{ 17void mutableRootShaderObjectTestImpl (IDevice * device ,UnitTestContext * context ) 18{ 19ComPtr < IShaderProgram > shaderProgram ; 20 slang::ProgramLayout * slangReflection ; 21GFX_CHECK_CALL_ABORT (loadComputeProgram ( 22device , 23shaderProgram , 24"mutable-shader-object" , 25"computeMain" , 26slangReflection )); 27 28ComputePipelineDesc pipelineDesc = {}; 29pipelineDesc .program = shaderProgram .get (); 30ComPtr < IComputePipeline > computePipeline ; 31GFX_CHECK_CALL_ABORT ( 32device -> createComputePipeline (pipelineDesc ,computePipeline .writeRef ())); 33 34float initialData []= {0.0f ,1.0f ,2.0f ,3.0f }; 35const int numberCount = SLANG_COUNT_OF (initialData ); 36BufferDesc bufferDesc = {}; 37bufferDesc .size = sizeof (initialData ); 38bufferDesc .format = Format ::Undefined ; 39bufferDesc .elementSize = sizeof (float ); 40bufferDesc .usage = BufferUsage ::UnorderedAccess |BufferUsage ::ShaderResource |BufferUsage ::CopySource |BufferUsage ::CopyDestination ; 41bufferDesc .defaultState = ResourceState ::UnorderedAccess ; 42bufferDesc .memoryType = MemoryType ::DeviceLocal ; 43 44ComPtr < IBuffer > numbersBuffer ; 45GFX_CHECK_CALL_ABORT ( 46device -> createBuffer (bufferDesc , (void * )initialData ,numbersBuffer .writeRef ())); 47 48ComPtr < IShaderObject > rootObject ; 49device -> createRootShaderObject (shaderProgram ,rootObject .writeRef ()); 50auto entryPointCursor = ShaderCursor (rootObject -> getEntryPoint (0 )); 51entryPointCursor .getPath ("buffer" ).setBinding (Binding (numbersBuffer )); 52 53 slang::TypeReflection * addTransformerType = slangReflection -> findTypeByName ("AddTransformer" ); 54ComPtr < IShaderObject > transformer ; 55GFX_CHECK_CALL_ABORT (device -> createShaderObject ( 56addTransformerType , 57ShaderObjectContainerType ::None , 58transformer .writeRef ())); 59entryPointCursor .getPath ("transformer" ).setObject (transformer ); 60 61// Set the `c` field of the `AddTransformer`. 62float c = 1.0f ; 63ShaderCursor (transformer ).getPath ("c" ).setData (& c ,sizeof (float )); 64 65 { 66auto queue = device -> getQueue (QueueType ::Graphics ); 67 68auto commandEncoder = queue -> createCommandEncoder (); 69 { 70auto encoder = commandEncoder -> beginComputePass (); 71encoder -> bindPipeline (computePipeline ,rootObject ); 72encoder -> dispatchCompute (1 ,1 ,1 ); 73encoder -> end (); 74 } 75 76// Set buffer state to ensure writes are visible 77commandEncoder -> setBufferState (numbersBuffer ,ResourceState ::UnorderedAccess ); 78 79// Mutate `transformer` object and run again. 80c = 2.0f ; 81ShaderCursor (transformer ).getPath ("c" ).setData (& c ,sizeof (float )); 82 { 83auto encoder = commandEncoder -> beginComputePass (); 84encoder -> bindPipeline (computePipeline ,rootObject ); 85encoder -> dispatchCompute (1 ,1 ,1 ); 86encoder -> end (); 87 } 88 89queue -> submit (commandEncoder -> finish ()); 90queue -> waitOnHost (); 91 } 92 93compareComputeResult (device ,numbersBuffer , std::array {3.0f ,4.0f ,5.0f ,6.0f }); 94} 95 96SLANG_UNIT_TEST (mutableRootShaderObjectD3D12 ) 97{ 98runTestImpl (mutableRootShaderObjectTestImpl ,unitTestContext ,DeviceType ::D3D12 , {}); 99} 100 101/*SLANG_UNIT_TEST(mutableRootShaderObjectVulkan) 102{ 103runTestImpl(mutableRootShaderObjectTestImpl, unitTestContext, DeviceType::Vulkan, {}); 104}*/ 105}// namespace gfx_test 106 107#endif