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/shader-input-layout.cpp | 15 ++++++++++++ tools/render-test/shader-input-layout.h | 10 ++++++++ tools/render-test/slang-support.cpp | 39 +++++++++++++++++++++++++++++++ tools/render-test/slang-support.h | 9 +++++++ 4 files changed, 73 insertions(+) (limited to 'tools/render-test') diff --git a/tools/render-test/shader-input-layout.cpp b/tools/render-test/shader-input-layout.cpp index 2e0741cea..7e6d290c8 100644 --- a/tools/render-test/shader-input-layout.cpp +++ b/tools/render-test/shader-input-layout.cpp @@ -837,6 +837,17 @@ namespace renderer_test parentForNewVal->addField(field); } + void parseTypeConformance(Misc::TokenReader& parser) + { + ShaderInputLayout::TypeConformanceVal conformance; + conformance.derivedTypeName = parseTypeName(parser); + parser.Read(":"); + conformance.baseTypeName = parseTypeName(parser); + if (parser.AdvanceIf("=")) + conformance.idOverride = parser.ReadInt(); + layout->typeConformances.add(conformance); + } + void parseLine(Misc::TokenReader& parser) { if (parser.LookAhead("entryPointSpecializationArg") @@ -872,6 +883,10 @@ namespace renderer_test { parseSetEntry(parser); } + else if (parser.AdvanceIf("type_conformance")) + { + parseTypeConformance(parser); + } else { parseValEntry(parser); diff --git a/tools/render-test/shader-input-layout.h b/tools/render-test/shader-input-layout.h index 76ebe79b3..fe835a7f1 100644 --- a/tools/render-test/shader-input-layout.h +++ b/tools/render-test/shader-input-layout.h @@ -285,6 +285,16 @@ public: Slang::RefPtr rootVal; Slang::List globalSpecializationArgs; Slang::List entryPointSpecializationArgs; + + class TypeConformanceVal + { + public: + Slang::String derivedTypeName; + Slang::String baseTypeName; + Int idOverride = -1; + }; + Slang::List typeConformances; + int numRenderTargets = 1; Slang::Index findEntryIndexByName(const Slang::String& name) const; 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); } diff --git a/tools/render-test/slang-support.h b/tools/render-test/slang-support.h index da1f379fd..7770bada4 100644 --- a/tools/render-test/slang-support.h +++ b/tools/render-test/slang-support.h @@ -33,11 +33,20 @@ struct ShaderCompileRequest SlangStage slangStage; }; + struct TypeConformance + { + public: + Slang::String derivedTypeName; + Slang::String baseTypeName; + Int idOverride; + }; + SourceInfo source; Slang::List entryPoints; Slang::List globalSpecializationArgs; Slang::List entryPointSpecializationArgs; + Slang::List typeConformances; }; -- cgit v1.2.3