yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
43d0c2100
master
1// main.cpp 2#include "slang-com-ptr.h" 3#include "slang.h" 4 5#include <string> 6using Slang ::ComPtr ; 7 8#include "core/slang-basic.h" 9#include "examples/example-base/example-base.h" 10#include "gpu-printing.h" 11#include "platform/window.h" 12#include "slang-rhi.h" 13 14#include <slang-rhi/shader-cursor.h> 15 16using namespace rhi ; 17 18static const ExampleResources resourceBase ("gpu-printing" ); 19 20ComPtr < slang::ISession > createSlangSession (IDevice * device ) 21{ 22ComPtr < slang::ISession > slangSession = device -> getSlangSession (); 23return slangSession ; 24} 25 26ComPtr < slang::IModule > compileShaderModuleFromFile ( 27 slang::ISession * slangSession , 28char const * filePath ) 29{ 30ComPtr < slang::IModule > slangModule ; 31ComPtr < slang::IBlob > diagnosticBlob ; 32Slang ::String path = resourceBase .resolveResource (filePath ); 33slangModule = slangSession -> loadModule (path .getBuffer (),diagnosticBlob .writeRef ()); 34diagnoseIfNeeded (diagnosticBlob ); 35 36return slangModule ; 37} 38 39struct ExampleProgram :public TestBase 40{ 41int gWindowWidth = 640 ; 42int gWindowHeight = 480 ; 43 44ComPtr < IDevice > gDevice ; 45 46ComPtr < slang::ISession > gSlangSession ; 47ComPtr < slang::IModule > gSlangModule ; 48ComPtr < IShaderProgram > gProgram ; 49 50ComPtr < IComputePipeline > gPipelineState ; 51 52Slang ::Dictionary < int , std::string > gHashedStrings ; 53 54GPUPrinting gGPUPrinting ; 55 56ComPtr < IShaderProgram > loadComputeProgram ( 57 slang::IModule * slangModule , 58char const * entryPointName ) 59 { 60ComPtr < slang::IEntryPoint > entryPoint ; 61slangModule -> findEntryPointByName (entryPointName ,entryPoint .writeRef ()); 62 63ComPtr < slang::IComponentType > linkedProgram ; 64entryPoint -> link (linkedProgram .writeRef ()); 65 66if (isTestMode ()) 67 { 68printEntrypointHashes (1 ,1 ,linkedProgram ); 69 } 70 71gGPUPrinting .loadStrings (linkedProgram -> getLayout ()); 72 73ShaderProgramDesc programDesc = {}; 74programDesc .slangGlobalScope = linkedProgram ; 75 76auto shaderProgram = gDevice -> createShaderProgram (programDesc ); 77 78return shaderProgram ; 79 } 80 81Result execute (int argc ,char * argv []) 82 { 83parseOption (argc ,argv ); 84DeviceDesc deviceDesc ; 85gDevice = getRHI ()-> createDevice (deviceDesc ); 86if (!gDevice ) 87return SLANG_FAIL ; 88 89Slang ::String path = resourceBase .resolveResource ("kernels.slang" ); 90 91gSlangSession = createSlangSession (gDevice ); 92gSlangModule = compileShaderModuleFromFile (gSlangSession ,path .getBuffer ()); 93if (!gSlangModule ) 94return SLANG_FAIL ; 95 96gProgram = loadComputeProgram (gSlangModule ,"computeMain" ); 97if (!gProgram ) 98return SLANG_FAIL ; 99 100ComputePipelineDesc desc ; 101desc .program = gProgram ; 102auto pipelineState = gDevice -> createComputePipeline (desc ); 103if (!pipelineState ) 104return SLANG_FAIL ; 105 106gPipelineState = pipelineState ; 107 108size_t printBufferSize = 4 * 1024 ;// use a small-ish (4KB) buffer for print output 109 110BufferDesc printBufferDesc = {}; 111printBufferDesc .size = printBufferSize ; 112printBufferDesc .elementSize = sizeof (uint32_t ); 113printBufferDesc .usage = 114BufferUsage ::UnorderedAccess |BufferUsage ::CopySource |BufferUsage ::CopyDestination ; 115printBufferDesc .memoryType = MemoryType ::DeviceLocal ; 116auto printBuffer = gDevice -> createBuffer (printBufferDesc ); 117 118auto queue = gDevice -> getQueue (QueueType ::Graphics ); 119auto commandEncoder = queue -> createCommandEncoder (); 120auto computeEncoder = commandEncoder -> beginComputePass (); 121auto rootShaderObject = computeEncoder -> bindPipeline (gPipelineState ); 122auto cursor = ShaderCursor (rootShaderObject ); 123cursor ["gPrintBuffer" ].setBinding (printBuffer ); 124 125computeEncoder -> dispatchCompute (1 ,1 ,1 ); 126 127computeEncoder -> end (); 128queue -> submit (commandEncoder -> finish ()); 129 130ComPtr < ISlangBlob > blob ; 131gDevice -> readBuffer (printBuffer ,0 ,printBufferSize ,blob .writeRef ()); 132 133gGPUPrinting .processGPUPrintCommands (blob -> getBufferPointer (),printBufferSize ); 134 135return SLANG_OK ; 136 } 137}; 138 139int exampleMain (int argc ,char ** argv ) 140{ 141ExampleProgram app ; 142if (SLANG_FAILED (app .execute (argc ,argv ))) 143 { 144return -1 ; 145 } 146return 0 ; 147}