diff options
| author | Yong He <yonghe@outlook.com> | 2021-08-26 10:30:35 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-08-26 10:30:35 -0700 |
| commit | b2ad8e99a82884bb157e1be76b1ad7eb0e481457 (patch) | |
| tree | 3f5357083b5972761d516b70cb51a4fa7ab72cd5 /tools/render-test | |
| parent | 33f7e1599cbecb32c23787b37b2bf3b34bdd5c84 (diff) | |
Add API to control interface specialization. (#1925)
Diffstat (limited to 'tools/render-test')
| -rw-r--r-- | tools/render-test/shader-input-layout.cpp | 15 | ||||
| -rw-r--r-- | tools/render-test/shader-input-layout.h | 10 | ||||
| -rw-r--r-- | tools/render-test/slang-support.cpp | 39 | ||||
| -rw-r--r-- | tools/render-test/slang-support.h | 9 |
4 files changed, 73 insertions, 0 deletions
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<AggVal> rootVal; Slang::List<Slang::String> globalSpecializationArgs; Slang::List<Slang::String> entryPointSpecializationArgs; + + class TypeConformanceVal + { + public: + Slang::String derivedTypeName; + Slang::String baseTypeName; + Int idOverride = -1; + }; + Slang::List<TypeConformanceVal> 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<slang::ISession> session; + slangRequest->getSession(session.writeRef()); + List<ComPtr<slang::ITypeConformance>> typeConformanceComponents; + List<slang::IComponentType*> componentsRawPtr; + componentsRawPtr.add(linkedSlangProgram.get()); + auto reflection = slang::ProgramLayout::get(slangRequest); + ComPtr<ISlangBlob> outDiagnostic; + for (auto& conformance : request.typeConformances) + { + auto derivedType = reflection->findTypeByName(conformance.derivedTypeName.getBuffer()); + auto baseType = reflection->findTypeByName(conformance.baseTypeName.getBuffer()); + ComPtr<slang::ITypeConformance> conformanceComponentType; + session->createTypeConformanceComponentType( + derivedType, + baseType, + conformanceComponentType.writeRef(), + conformance.idOverride, + outDiagnostic.writeRef()); + typeConformanceComponents.add(conformanceComponentType); + componentsRawPtr.add(conformanceComponentType); + } + ComPtr<slang::IComponentType> 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<EntryPoint> entryPoints; Slang::List<Slang::String> globalSpecializationArgs; Slang::List<Slang::String> entryPointSpecializationArgs; + Slang::List<TypeConformance> typeConformances; }; |
