in Source/Core/ShaderConductor.cpp [1153:1209]
Compiler::ResultDesc Compiler::Disassemble(const DisassembleDesc& source)
{
assert((source.language == ShadingLanguage::SpirV) || (source.language == ShadingLanguage::Dxil));
Compiler::ResultDesc ret;
ret.isText = true;
if (source.language == ShadingLanguage::SpirV)
{
const uint32_t* spirvIr = reinterpret_cast<const uint32_t*>(source.binary);
const size_t spirvSize = source.binarySize / sizeof(uint32_t);
spv_context context = spvContextCreate(SPV_ENV_UNIVERSAL_1_3);
uint32_t options = SPV_BINARY_TO_TEXT_OPTION_NONE | SPV_BINARY_TO_TEXT_OPTION_INDENT | SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES;
spv_text text = nullptr;
spv_diagnostic diagnostic = nullptr;
spv_result_t error = spvBinaryToText(context, spirvIr, spirvSize, options, &text, &diagnostic);
spvContextDestroy(context);
if (error)
{
ret.errorWarningMsg.Reset(diagnostic->error, static_cast<uint32_t>(std::strlen(diagnostic->error)));
ret.hasError = true;
spvDiagnosticDestroy(diagnostic);
}
else
{
const std::string disassemble = text->str;
ret.target.Reset(disassemble.data(), static_cast<uint32_t>(disassemble.size()));
ret.hasError = false;
}
spvTextDestroy(text);
}
else
{
CComPtr<IDxcBlobEncoding> blob;
CComPtr<IDxcBlobEncoding> disassembly;
IFT(Dxcompiler::Instance().Library()->CreateBlobWithEncodingOnHeapCopy(source.binary, source.binarySize, CP_UTF8, &blob));
IFT(Dxcompiler::Instance().Compiler()->Disassemble(blob, &disassembly));
if (disassembly != nullptr)
{
// Remove the tailing \0
ret.target.Reset(disassembly->GetBufferPointer(), static_cast<uint32_t>(disassembly->GetBufferSize() - 1));
ret.hasError = false;
}
else
{
ret.hasError = true;
}
}
return ret;
}