yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
af27de015
master
1// unit-test-load-module-from-source.cpp 2 3#include "slang-com-ptr.h" 4#include "slang.h" 5#include "unit-test/slang-unit-test.h" 6 7#include <stdio.h> 8#include <stdlib.h> 9 10using namespace Slang ; 11 12// Test the loadModuleFromSource method and slang_loadModuleFromSource function 13SLANG_UNIT_TEST (loadModuleFromSource ) 14{ 15// Test source code with various content 16const char * testSource = R"( 17[shader("compute")] 18[numthreads(1,1,1)] 19void computeMain(uint3 workGroup : SV_GroupID) 20{ 21// Simple compute shader 22} 23)" ; 24 25size_t sourceSize = strlen (testSource ); 26 27ComPtr < slang::IGlobalSession > globalSession ; 28SLANG_CHECK (slang_createGlobalSession (SLANG_API_VERSION ,globalSession .writeRef ())== SLANG_OK ); 29 30 slang::SessionDesc sessionDesc = {}; 31sessionDesc .targetCount = 1 ; 32 slang::TargetDesc targetDesc = {}; 33targetDesc .format = SLANG_HLSL ; 34targetDesc .profile = globalSession -> findProfile ("sm_5_0" ); 35sessionDesc .targets = & targetDesc ; 36 37ComPtr < slang::ISession > session ; 38SLANG_CHECK (globalSession -> createSession (sessionDesc ,session .writeRef ())== SLANG_OK ); 39 40// Test 1: Test the method version (existing functionality) 41 { 42ComPtr < slang::IModule > module ; 43ComPtr < ISlangBlob > diagnostics ; 44 45// Use loadModuleFromSourceString which takes a string directly 46module = session -> loadModuleFromSourceString ( 47"testModule" , 48"test.slang" , 49testSource , 50diagnostics .writeRef ()); 51 52SLANG_CHECK (module != nullptr ); 53if (diagnostics ) 54 { 55// If there are diagnostics, they should be warnings or errors 56SLANG_CHECK (diagnostics -> getBufferSize ()> 0 ); 57 } 58 } 59 60// Test 2: Test the new slang_loadModuleFromSource function 61 { 62ComPtr < slang::IModule > module ; 63ComPtr < ISlangBlob > diagnostics ; 64 65module = slang_loadModuleFromSource ( 66session , 67"testModule2" , 68"test2.slang" , 69testSource , 70sourceSize , 71diagnostics .writeRef ()); 72 73SLANG_CHECK (module != nullptr ); 74if (diagnostics ) 75 { 76// If there are diagnostics, they should be warnings or errors 77SLANG_CHECK (diagnostics -> getBufferSize ()> 0 ); 78 } 79 } 80 81// Test 3: Test with invalid parameters 82 { 83ComPtr < slang::IModule > module ; 84ComPtr < ISlangBlob > diagnostics ; 85 86// Test with null session 87module = slang_loadModuleFromSource ( 88nullptr , 89"testModule" , 90"test.slang" , 91testSource , 92sourceSize , 93diagnostics .writeRef ()); 94 95SLANG_CHECK (module == nullptr ); 96 97// Test with null moduleName 98module = slang_loadModuleFromSource ( 99session , 100nullptr , 101"test.slang" , 102testSource , 103sourceSize , 104diagnostics .writeRef ()); 105 106SLANG_CHECK (module == nullptr ); 107 108// Test with null path 109module = slang_loadModuleFromSource ( 110session , 111"testModule" , 112nullptr , 113testSource , 114sourceSize , 115diagnostics .writeRef ()); 116 117SLANG_CHECK (module == nullptr ); 118 } 119 120// Test 4: Test with null source and non-zero size (should fail) 121 { 122ComPtr < slang::IModule > module ; 123ComPtr < ISlangBlob > diagnostics ; 124 125module = slang_loadModuleFromSource ( 126session , 127"testModule" , 128"test.slang" , 129nullptr , 13010 , 131diagnostics .writeRef ()); 132 133SLANG_CHECK (module == nullptr ); 134 } 135 136// Test 5: Test with complex source code 137 { 138const char * complexSource = R"( 139[shader("compute")] 140[numthreads(8,8,1)] 141void computeMain(uint3 workGroup : SV_GroupID, uint3 localID : SV_GroupThreadID) 142{ 143uint2 pixelPos = workGroup.xy * uint2(8,8) + localID.xy; 144145 // Simple computation 146float result = sin(pixelPos.x * 0.1f) * cos(pixelPos.y * 0.1f); 147148 // Store result (in a real shader, this would go to a buffer) 149// outputBuffer[pixelPos] = result; 150} 151)" ; 152 153size_t complexSourceSize = strlen (complexSource ); 154 155ComPtr < slang::IModule > module ; 156ComPtr < ISlangBlob > diagnostics ; 157 158module = slang_loadModuleFromSource ( 159session , 160"complexModule" , 161"complex.slang" , 162complexSource , 163complexSourceSize , 164diagnostics .writeRef ()); 165 166SLANG_CHECK (module != nullptr ); 167 } 168 169// Test 6: Test IR blob functions with invalid parameters 170 { 171ComPtr < slang::IModule > module ; 172ComPtr < ISlangBlob > diagnostics ; 173const char * testData = "test data" ; 174size_t testDataSize = strlen (testData ); 175 176// Test with null session 177module = slang_loadModuleFromIRBlob ( 178nullptr , 179"testModule" , 180"test.slang" , 181testData , 182testDataSize , 183diagnostics .writeRef ()); 184 185SLANG_CHECK (module == nullptr ); 186 187// Test with null moduleName 188module = slang_loadModuleFromIRBlob ( 189session , 190nullptr , 191"test.slang" , 192testData , 193testDataSize , 194diagnostics .writeRef ()); 195 196SLANG_CHECK (module == nullptr ); 197 198// Test with null path 199module = slang_loadModuleFromIRBlob ( 200session , 201"testModule" , 202nullptr , 203testData , 204testDataSize , 205diagnostics .writeRef ()); 206 207SLANG_CHECK (module == nullptr ); 208 209// Test with null source 210module = slang_loadModuleFromIRBlob ( 211session , 212"testModule" , 213"test.slang" , 214nullptr , 215testDataSize , 216diagnostics .writeRef ()); 217 218SLANG_CHECK (module == nullptr ); 219 220// Test with zero size 221module = slang_loadModuleFromIRBlob ( 222session , 223"testModule" , 224"test.slang" , 225testData , 2260 , 227diagnostics .writeRef ()); 228 229SLANG_CHECK (module == nullptr ); 230 231// Test loadModuleInfoFromIRBlob with null session 232SlangInt moduleVersion ; 233const char * moduleCompilerVersion ; 234const char * moduleName ; 235 236SlangResult infoResult = slang_loadModuleInfoFromIRBlob ( 237nullptr , 238testData , 239testDataSize , 240moduleVersion , 241moduleCompilerVersion , 242moduleName ); 243 244SLANG_CHECK (infoResult == SLANG_E_INVALID_ARG ); 245 246// Test loadModuleInfoFromIRBlob with null source 247infoResult = slang_loadModuleInfoFromIRBlob ( 248session , 249nullptr , 250testDataSize , 251moduleVersion , 252moduleCompilerVersion , 253moduleName ); 254 255SLANG_CHECK (infoResult == SLANG_E_INVALID_ARG ); 256 257// Test loadModuleInfoFromIRBlob with zero size 258infoResult = slang_loadModuleInfoFromIRBlob ( 259session , 260testData , 2610 , 262moduleVersion , 263moduleCompilerVersion , 264moduleName ); 265 266SLANG_CHECK (infoResult == SLANG_E_INVALID_ARG ); 267 } 268}