From b2ad8e99a82884bb157e1be76b1ad7eb0e481457 Mon Sep 17 00:00:00 2001 From: Yong He Date: Thu, 26 Aug 2021 10:30:35 -0700 Subject: Add API to control interface specialization. (#1925) --- tools/render-test/slang-support.cpp | 39 +++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'tools/render-test/slang-support.cpp') diff --git a/tools/render-test/slang-support.cpp b/tools/render-test/slang-support.cpp index 65f8f244b..f479218f7 100644 --- a/tools/render-test/slang-support.cpp +++ b/tools/render-test/slang-support.cpp @@ -235,6 +235,37 @@ void ShaderCompilerUtil::Output::reset() actualEntryPoints = request.entryPoints; } + if (request.typeConformances.getCount()) + { + ComPtr session; + slangRequest->getSession(session.writeRef()); + List> typeConformanceComponents; + List componentsRawPtr; + componentsRawPtr.add(linkedSlangProgram.get()); + auto reflection = slang::ProgramLayout::get(slangRequest); + ComPtr outDiagnostic; + for (auto& conformance : request.typeConformances) + { + auto derivedType = reflection->findTypeByName(conformance.derivedTypeName.getBuffer()); + auto baseType = reflection->findTypeByName(conformance.baseTypeName.getBuffer()); + ComPtr conformanceComponentType; + session->createTypeConformanceComponentType( + derivedType, + baseType, + conformanceComponentType.writeRef(), + conformance.idOverride, + outDiagnostic.writeRef()); + typeConformanceComponents.add(conformanceComponentType); + componentsRawPtr.add(conformanceComponentType); + } + ComPtr newProgram; + session->createCompositeComponentType( + componentsRawPtr.getBuffer(), + componentsRawPtr.getCount(), + newProgram.writeRef(), + outDiagnostic.writeRef()); + linkedSlangProgram = newProgram; + } out.set(input.pipelineType, linkedSlangProgram); return SLANG_OK; } @@ -415,6 +446,14 @@ void ShaderCompilerUtil::Output::reset() } compileRequest.globalSpecializationArgs = layout.globalSpecializationArgs; compileRequest.entryPointSpecializationArgs = layout.entryPointSpecializationArgs; + for (auto conformance : layout.typeConformances) + { + ShaderCompileRequest::TypeConformance c; + c.derivedTypeName = conformance.derivedTypeName; + c.baseTypeName = conformance.baseTypeName; + c.idOverride = conformance.idOverride; + compileRequest.typeConformances.add(c); + } return ShaderCompilerUtil::compileProgram(session, options, input, compileRequest, output.output); } -- cgit v1.2.3