summaryrefslogtreecommitdiffstats
path: root/tools/render-test/slang-support.cpp
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/slang-support.cpp
parent33f7e1599cbecb32c23787b37b2bf3b34bdd5c84 (diff)
Add API to control interface specialization. (#1925)
Diffstat (limited to 'tools/render-test/slang-support.cpp')
-rw-r--r--tools/render-test/slang-support.cpp39
1 files changed, 39 insertions, 0 deletions
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);
}