Skip to content

Commit cfb1f61

Browse files
authored
* Fix bug outputing dxbc assembly (shader-slang#719)
* Make the disassembly methods returns SlangResult and String as last output param so as to make error case clear.
1 parent 039c233 commit cfb1f61

File tree

2 files changed

+17
-14
lines changed

2 files changed

+17
-14
lines changed

source/slang/compiler.cpp

+16-11
Original file line numberDiff line numberDiff line change
@@ -491,12 +491,11 @@ namespace Slang
491491
ComPtr<ID3DBlob> codeBlob;
492492
SlangResult res = disassembleFunc(data, size, 0, nullptr, codeBlob.writeRef());
493493

494-
String result;
495494
if (codeBlob)
496495
{
497496
char const* codeBegin = (char const*)codeBlob->GetBufferPointer();
498497
char const* codeEnd = codeBegin + codeBlob->GetBufferSize() - 1;
499-
result.append(codeBegin, codeEnd);
498+
stringOut = String(codeBegin, codeEnd);
500499
}
501500
if (FAILED(res))
502501
{
@@ -576,11 +575,14 @@ SlangResult dissassembleDXILUsingDXC(
576575
return 0;
577576
}
578577

579-
String dissassembleSPIRV(
578+
SlangResult dissassembleSPIRV(
580579
CompileRequest* slangRequest,
581580
void const* data,
582-
size_t size)
581+
size_t size,
582+
String& stringOut)
583583
{
584+
stringOut = String();
585+
584586
String output;
585587
auto outputFunc = [](void const* data, size_t size, void* userData)
586588
{
@@ -597,13 +599,13 @@ SlangResult dissassembleDXILUsingDXC(
597599
request.outputUserData = &output;
598600

599601
int err = invokeGLSLCompiler(slangRequest, request);
600-
601602
if (err)
602603
{
603-
String();
604+
return SLANG_FAIL;
604605
}
605606

606-
return output;
607+
stringOut = output;
608+
return SLANG_OK;
607609
}
608610

609611
List<uint8_t> emitSPIRVForEntryPoint(
@@ -648,7 +650,8 @@ SlangResult dissassembleDXILUsingDXC(
648650
if (spirv.Count() == 0)
649651
return String();
650652

651-
String result = dissassembleSPIRV(entryPoint->compileRequest, spirv.begin(), spirv.Count());
653+
String result;
654+
dissassembleSPIRV(entryPoint->compileRequest, spirv.begin(), spirv.Count(), result);
652655
return result;
653656
}
654657
#endif
@@ -910,9 +913,10 @@ SlangResult dissassembleDXILUsingDXC(
910913

911914
case CodeGenTarget::SPIRV:
912915
{
913-
String assembly = dissassembleSPIRV(compileRequest,
916+
String assembly;
917+
dissassembleSPIRV(compileRequest,
914918
data.begin(),
915-
data.end() - data.begin());
919+
data.end() - data.begin(), assembly);
916920
writeOutputToConsole(compileRequest, assembly);
917921
}
918922
break;
@@ -1135,7 +1139,8 @@ SlangResult dissassembleDXILUsingDXC(
11351139
case CodeGenTarget::SPIRV:
11361140
dumpIntermediateBinary(compileRequest, data, size, ".spv");
11371141
{
1138-
String spirvAssembly = dissassembleSPIRV(compileRequest, data, size);
1142+
String spirvAssembly;
1143+
dissassembleSPIRV(compileRequest, data, size, spirvAssembly);
11391144
dumpIntermediateText(compileRequest, spirvAssembly.begin(), spirvAssembly.Length(), ".spv.asm");
11401145
}
11411146
break;

source/slang/dxc-support.cpp

+1-3
Original file line numberDiff line numberDiff line change
@@ -270,11 +270,9 @@ namespace Slang
270270
ComPtr<IDxcBlobEncoding> dxcResultBlob;
271271
SLANG_RETURN_ON_FAIL(dxcCompiler->Disassemble(dxcSourceBlob, dxcResultBlob.writeRef()));
272272

273-
String result;
274273
char const* codeBegin = (char const*)dxcResultBlob->GetBufferPointer();
275274
char const* codeEnd = codeBegin + dxcResultBlob->GetBufferSize() - 1;
276-
result.append(codeBegin, codeEnd);
277-
stringOut = result;
275+
stringOut = String(codeBegin, codeEnd);
278276

279277
return SLANG_OK;
280278
}

0 commit comments

Comments
 (0)