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" 6 7using namespace rhi ; 8 9namespace gfx_test 10{ 11void createBufferFromHandleTestImpl (IDevice * device ,UnitTestContext * context ) 12{ 13ComPtr < IShaderProgram > shaderProgram ; 14 slang::ProgramLayout * slangReflection ; 15GFX_CHECK_CALL_ABORT (loadComputeProgram ( 16device , 17shaderProgram , 18"compute-trivial" , 19"computeMain" , 20slangReflection )); 21 22ComputePipelineDesc pipelineDesc = {}; 23pipelineDesc .program = shaderProgram .get (); 24ComPtr < IComputePipeline > pipelineState ; 25GFX_CHECK_CALL_ABORT (device -> createComputePipeline (pipelineDesc ,pipelineState .writeRef ())); 26 27const int numberCount = 4 ; 28float initialData []= {0.0f ,1.0f ,2.0f ,3.0f }; 29BufferDesc bufferDesc = {}; 30bufferDesc .size = numberCount * sizeof (float ); 31bufferDesc .format = Format ::Undefined ; 32bufferDesc .elementSize = sizeof (float ); 33bufferDesc .usage = BufferUsage ::ShaderResource |BufferUsage ::UnorderedAccess | 34BufferUsage ::CopyDestination |BufferUsage ::CopySource ; 35bufferDesc .defaultState = ResourceState ::UnorderedAccess ; 36bufferDesc .memoryType = MemoryType ::DeviceLocal ; 37 38ComPtr < IBuffer > originalNumbersBuffer ; 39GFX_CHECK_CALL_ABORT ( 40device -> createBuffer (bufferDesc , (void * )initialData ,originalNumbersBuffer .writeRef ())); 41 42NativeHandle handle ; 43originalNumbersBuffer -> getNativeHandle (& handle ); 44ComPtr < IBuffer > numbersBuffer ; 45GFX_CHECK_CALL_ABORT ( 46device -> createBufferFromNativeHandle (handle ,bufferDesc ,numbersBuffer .writeRef ())); 47compareComputeResult (device ,numbersBuffer , std::array {0.0f ,1.0f ,2.0f ,3.0f }); 48 49// We have done all the set up work, now it is time to start recording a command buffer for 50// GPU execution. 51 { 52auto queue = device -> getQueue (QueueType ::Graphics ); 53auto commandEncoder = queue -> createCommandEncoder (); 54 { 55auto encoder = commandEncoder -> beginComputePass (); 56auto rootObject = encoder -> bindPipeline (pipelineState ); 57 58ShaderCursor rootCursor (rootObject ); 59// Bind buffer directly to the entry point. 60rootCursor .getPath ("buffer" ).setBinding (Binding (numbersBuffer )); 61 62encoder -> dispatchCompute (1 ,1 ,1 ); 63encoder -> end (); 64 } 65 66auto commandBuffer = commandEncoder -> finish (); 67queue -> submit (commandBuffer ); 68queue -> waitOnHost (); 69 } 70 71compareComputeResult (device ,numbersBuffer , std::array {1.0f ,2.0f ,3.0f ,4.0f }); 72} 73 74SLANG_UNIT_TEST (createBufferFromHandleD3D12 ) 75{ 76runTestImpl (createBufferFromHandleTestImpl ,unitTestContext ,DeviceType ::D3D12 ); 77} 78 79SLANG_UNIT_TEST (createBufferFromHandleVulkan ) 80{ 81runTestImpl (createBufferFromHandleTestImpl ,unitTestContext ,DeviceType ::Vulkan ); 82} 83 84}// namespace gfx_test