yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
c39c29bf4
master
1// unit-test-slang-vm.cpp 2 3#include "core/slang-memory-file-system.h" 4#include "slang-com-ptr.h" 5#include "slang.h" 6#include "unit-test/slang-unit-test.h" 7 8#include <stdio.h> 9#include <stdlib.h> 10 11using namespace Slang ; 12 13SLANG_UNIT_TEST (slangVM ) 14{ 15const char * testSource = R"( 16int one() { return 1; } 17int sum(int x) 18{ 19int result = 0; 20for (int i = 0; i <= x; i++) 21{ 22result += i; 23} 24return result + one(); 25} 26[shader("dispatch")] 27int dispatchMain(uniform int2 v, out int c) 28{ 29int a = v.x; 30int b = v.y; 31int tmp = 0; 32if (a > 0) 33tmp = a + b; 34else 35tmp = b - a; 36tmp += sum(b); 37c = tmp; 38return 100; 39} 40)" ; 41 42// Create Slang session and compile code. 43ComPtr < slang::IBlob > code ; 44String disasmText ; 45 { 46ComPtr < slang::IGlobalSession > globalSession ; 47SLANG_CHECK ( 48slang_createGlobalSession (SLANG_API_VERSION ,globalSession .writeRef ())== SLANG_OK ); 49 slang::TargetDesc targetDesc = {}; 50targetDesc .format = SLANG_HOST_VM ; 51 slang::SessionDesc sessionDesc = {}; 52sessionDesc .targetCount = 1 ; 53sessionDesc .targets = & targetDesc ; 54sessionDesc .compilerOptionEntryCount = 0 ; 55 56ComPtr < slang::ISession > session ; 57SLANG_CHECK (globalSession -> createSession (sessionDesc ,session .writeRef ())== SLANG_OK ); 58 59ComPtr < slang::IBlob > diagnosticBlob ; 60auto module = session -> loadModuleFromSourceString ( 61"test" , 62"test.slang" , 63testSource , 64diagnosticBlob .writeRef ()); 65SLANG_CHECK (module != nullptr ); 66 67ComPtr < slang::IComponentType > linkedProgram ; 68module -> link (linkedProgram .writeRef ()); 69 70 71linkedProgram -> getTargetCode (0 ,code .writeRef (),diagnosticBlob .writeRef ()); 72 73SLANG_CHECK (code -> getBufferSize ()> 0 ); 74 75ComPtr < slang::IBlob > disasmBlob ; 76SLANG_CHECK (slang_disassembleByteCode (code ,disasmBlob .writeRef ())== SLANG_OK ); 77disasmText = (const char * )disasmBlob -> getBufferPointer (); 78SLANG_CHECK (disasmText .indexOf ("ret" )!= -1 ); 79 } 80 81// Create a byte code runner and interpret the code. 82ComPtr < slang::IByteCodeRunner > runner ; 83 slang::ByteCodeRunnerDesc runnerDesc = {}; 84SLANG_CHECK (slang_createByteCodeRunner (& runnerDesc ,runner .writeRef ())== SLANG_OK ); 85SLANG_CHECK (runner -> loadModule (code )== SLANG_OK ); 86SLANG_CHECK (runner -> selectFunctionByIndex (0 )== SLANG_OK ); 87struct Params 88 { 89int a ; 90int b ; 91int * result ; 92 }; 93int result = 0 ; 94Params params = {1 ,2 ,& result }; 95SLANG_CHECK (runner -> execute (& params ,sizeof (params ))== SLANG_OK ); 96SLANG_CHECK (result == 7 ); 97 98size_t returnValSize = 0 ; 99int * returnVal = (int * )runner -> getReturnValue (& returnValSize ); 100SLANG_CHECK (returnValSize == sizeof (int )); 101SLANG_CHECK (* returnVal == 100 ); 102}