#include "gfx-test-util.h" #include "tools/unit-test/slang-unit-test.h" #include using Slang::ComPtr; namespace gfx_test { void diagnoseIfNeeded(slang::IBlob* diagnosticsBlob) { if (diagnosticsBlob != nullptr) { getTestReporter()->message(TestMessageType::Info, (const char*)diagnosticsBlob->getBufferPointer()); } } Slang::Result loadComputeProgram( gfx::IDevice* device, Slang::ComPtr& outShaderProgram, const char* shaderModuleName, const char* entryPointName, slang::ProgramLayout*& slangReflection) { Slang::ComPtr slangSession; SLANG_RETURN_ON_FAIL(device->getSlangSession(slangSession.writeRef())); Slang::ComPtr diagnosticsBlob; slang::IModule* module = slangSession->loadModule(shaderModuleName, diagnosticsBlob.writeRef()); diagnoseIfNeeded(diagnosticsBlob); if (!module) return SLANG_FAIL; ComPtr computeEntryPoint; SLANG_RETURN_ON_FAIL( module->findEntryPointByName(entryPointName, computeEntryPoint.writeRef())); Slang::List componentTypes; componentTypes.add(module); componentTypes.add(computeEntryPoint); Slang::ComPtr composedProgram; SlangResult result = slangSession->createCompositeComponentType( componentTypes.getBuffer(), componentTypes.getCount(), composedProgram.writeRef(), diagnosticsBlob.writeRef()); diagnoseIfNeeded(diagnosticsBlob); SLANG_RETURN_ON_FAIL(result); slangReflection = composedProgram->getLayout(); gfx::IShaderProgram::Desc programDesc = {}; programDesc.pipelineType = gfx::PipelineType::Compute; programDesc.slangProgram = composedProgram.get(); auto shaderProgram = device->createProgram(programDesc); outShaderProgram = shaderProgram; return SLANG_OK; } void compareComputeResult(gfx::IDevice* device, gfx::IBufferResource* buffer, uint8_t* expectedResult, size_t expectedBufferSize) { // Read back the results. ComPtr resultBlob; GFX_CHECK_CALL_ABORT(device->readBufferResource( buffer, 0, expectedBufferSize, resultBlob.writeRef())); if (resultBlob->getBufferSize() < expectedBufferSize) { getTestReporter()->addResult(TestResult::Fail); return; } // Compare results. auto result = reinterpret_cast(resultBlob->getBufferPointer()); for (int i = 0; i < expectedBufferSize; i++) { if (expectedResult[i] != result[i]) { getTestReporter()->addResult(TestResult::Fail); return; } } getTestReporter()->addResult(TestResult::Pass); } }