From 69cb6e8f300d77e74bd2c7dfe15d12e10b38f512 Mon Sep 17 00:00:00 2001 From: Alexey Panteleev Date: Wed, 18 May 2022 10:57:37 -0700 Subject: Support for querying which parameters are used in emitted code (#2239) See https://github.com/shader-slang/slang/issues/2213 --- source/slang/slang-compiler.cpp | 56 ++++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 14 deletions(-) (limited to 'source/slang/slang-compiler.cpp') diff --git a/source/slang/slang-compiler.cpp b/source/slang/slang-compiler.cpp index 7988af3e8..74162d2ef 100644 --- a/source/slang/slang-compiler.cpp +++ b/source/slang/slang-compiler.cpp @@ -143,6 +143,28 @@ void printDiagnosticArg(StringBuilder& sb, CodeGenTarget val) return SLANG_OK; } + SlangResult CompileResult::isParameterLocationUsed(SlangParameterCategory category, UInt spaceIndex, UInt registerIndex, bool& outUsed) + { + if (!postEmitMetadata) + return SLANG_E_NOT_AVAILABLE; + + if (!ShaderBindingRange::isUsageTracked((slang::ParameterCategory)category)) + return SLANG_E_NOT_AVAILABLE; + + // TODO: optimize this with a binary search through a sorted list + for (const auto& range : postEmitMetadata->usedBindings) + { + if (range.containsBinding((slang::ParameterCategory)category, spaceIndex, registerIndex)) + { + outUsed = true; + return SLANG_OK; + } + } + + outUsed = false; + return SLANG_OK; + } + // // FrontEndEntryPointRequest // @@ -662,7 +684,8 @@ void printDiagnosticArg(StringBuilder& sb, CodeGenTarget val) } SlangResult CodeGenContext::emitEntryPointsSource( - String& outSource) + String& outSource, + RefPtr& outMetadata) { outSource = String(); @@ -714,7 +737,7 @@ void printDiagnosticArg(StringBuilder& sb, CodeGenTarget val) else { return emitEntryPointsSourceFromIR( - outSource); + outSource, outMetadata); } } @@ -985,7 +1008,8 @@ void printDiagnosticArg(StringBuilder& sb, CodeGenTarget val) } SlangResult CodeGenContext::emitWithDownstreamForEntryPoints( - RefPtr& outResult) + RefPtr& outResult, + RefPtr& outMetadata) { outResult.setNull(); @@ -1127,7 +1151,7 @@ void printDiagnosticArg(StringBuilder& sb, CodeGenTarget val) options.sourceContentsPath = calcSourcePathForEntryPoints(); CodeGenContext sourceCodeGenContext(this, sourceTarget, extensionTracker); - SLANG_RETURN_ON_FAIL(sourceCodeGenContext.emitEntryPointsSource(options.sourceContents)); + SLANG_RETURN_ON_FAIL(sourceCodeGenContext.emitEntryPointsSource(options.sourceContents, outMetadata)); } else { @@ -1144,7 +1168,7 @@ void printDiagnosticArg(StringBuilder& sb, CodeGenTarget val) else { CodeGenContext sourceCodeGenContext(this, sourceTarget, extensionTracker); - SLANG_RETURN_ON_FAIL(sourceCodeGenContext.emitEntryPointsSource(options.sourceContents)); + SLANG_RETURN_ON_FAIL(sourceCodeGenContext.emitEntryPointsSource(options.sourceContents, outMetadata)); sourceCodeGenContext.maybeDumpIntermediate(options.sourceContents.getBuffer()); sourceLanguage = (SourceLanguage)TypeConvertUtil::getSourceLanguageFromTarget((SlangCompileTarget)sourceTarget); @@ -1504,7 +1528,8 @@ void printDiagnosticArg(StringBuilder& sb, CodeGenTarget val) SlangResult emitSPIRVForEntryPointsDirectly( CodeGenContext* codeGenContext, - List& spirvOut); + List& spirvOut, + RefPtr& outMetadata); static CodeGenTarget _getIntermediateTarget(CodeGenTarget target) { @@ -1519,7 +1544,8 @@ void printDiagnosticArg(StringBuilder& sb, CodeGenTarget val) /// Function to simplify the logic around emitting, and dissassembling SlangResult CodeGenContext::_emitEntryPoints( - RefPtr& outDownstreamResult) + RefPtr& outDownstreamResult, + RefPtr& outMetadata) { auto target = getTargetFormat(); switch (target) @@ -1533,7 +1559,7 @@ void printDiagnosticArg(StringBuilder& sb, CodeGenTarget val) CodeGenContext intermediateContext(this, intermediateTarget); RefPtr code; - SLANG_RETURN_ON_FAIL(intermediateContext._emitEntryPoints(code)); + SLANG_RETURN_ON_FAIL(intermediateContext._emitEntryPoints(code, outMetadata)); intermediateContext.maybeDumpIntermediate(code); // Then disassemble the intermediate binary result to get the desired output @@ -1548,7 +1574,7 @@ void printDiagnosticArg(StringBuilder& sb, CodeGenTarget val) if (getTargetReq()->shouldEmitSPIRVDirectly()) { List spirv; - SLANG_RETURN_ON_FAIL(emitSPIRVForEntryPointsDirectly(this, spirv)); + SLANG_RETURN_ON_FAIL(emitSPIRVForEntryPointsDirectly(this, spirv, outMetadata)); auto spirvBlob = ListBlob::moveCreate(spirv); outDownstreamResult = new BlobDownstreamCompileResult(DownstreamDiagnostics(), spirvBlob); return SLANG_OK; @@ -1560,7 +1586,7 @@ void printDiagnosticArg(StringBuilder& sb, CodeGenTarget val) case CodeGenTarget::ShaderHostCallable: case CodeGenTarget::ShaderSharedLibrary: case CodeGenTarget::HostExecutable: - SLANG_RETURN_ON_FAIL(emitWithDownstreamForEntryPoints(outDownstreamResult)); + SLANG_RETURN_ON_FAIL(emitWithDownstreamForEntryPoints(outDownstreamResult, outMetadata)); return SLANG_OK; default: break; @@ -1590,11 +1616,12 @@ void printDiagnosticArg(StringBuilder& sb, CodeGenTarget val) case CodeGenTarget::HostExecutable: { RefPtr downstreamResult; + RefPtr metadata; - if (SLANG_SUCCEEDED(_emitEntryPoints(downstreamResult))) + if (SLANG_SUCCEEDED(_emitEntryPoints(downstreamResult, metadata))) { maybeDumpIntermediate(downstreamResult); - result = CompileResult(downstreamResult); + result = CompileResult(downstreamResult, metadata); } } break; @@ -1606,17 +1633,18 @@ void printDiagnosticArg(StringBuilder& sb, CodeGenTarget val) case CodeGenTarget::CSource: { RefPtr extensionTracker = _newExtensionTracker(target); + RefPtr metadata; CodeGenContext subContext(this, target, extensionTracker); String code; - if (SLANG_FAILED(subContext.emitEntryPointsSource(code))) + if (SLANG_FAILED(subContext.emitEntryPointsSource(code, metadata))) { return result; } subContext.maybeDumpIntermediate(code.getBuffer()); - result = CompileResult(code); + result = CompileResult(code, metadata); } break; -- cgit v1.2.3