summaryrefslogtreecommitdiffstats
path: root/tools/render-test
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2021-08-26 10:30:35 -0700
committerGitHub <noreply@github.com>2021-08-26 10:30:35 -0700
commitb2ad8e99a82884bb157e1be76b1ad7eb0e481457 (patch)
tree3f5357083b5972761d516b70cb51a4fa7ab72cd5 /tools/render-test
parent33f7e1599cbecb32c23787b37b2bf3b34bdd5c84 (diff)
Add API to control interface specialization. (#1925)
Diffstat (limited to 'tools/render-test')
-rw-r--r--tools/render-test/shader-input-layout.cpp15
-rw-r--r--tools/render-test/shader-input-layout.h10
-rw-r--r--tools/render-test/slang-support.cpp39
-rw-r--r--tools/render-test/slang-support.h9
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;
};