summaryrefslogtreecommitdiffstats
path: root/source/slang/compiler.cpp
diff options
context:
space:
mode:
authorTim Foley <tfoley@nvidia.com>2017-07-11 11:06:58 -0700
committerTim Foley <tfoley@nvidia.com>2017-07-11 12:07:09 -0700
commit672332936ad7a4610ce0595493152c117476e823 (patch)
treec25a4de9ef6120b2fb4d439dcdce82ce4d995318 /source/slang/compiler.cpp
parent98b3e5bc95b6de081885798840c2deb79905a68f (diff)
Fixup for binary/string output.
Actually output SPIR-V/DXBC assembly as text, instead of binary. This fixes a bunch of tests that were passing on accident, because nothing was producing output.
Diffstat (limited to 'source/slang/compiler.cpp')
-rw-r--r--source/slang/compiler.cpp90
1 files changed, 65 insertions, 25 deletions
diff --git a/source/slang/compiler.cpp b/source/slang/compiler.cpp
index c04c2150d..3155bb75a 100644
--- a/source/slang/compiler.cpp
+++ b/source/slang/compiler.cpp
@@ -271,7 +271,7 @@ namespace Slang
}
#endif
- List<uint8_t> EmitDXBytecodeAssemblyForEntryPoint(
+ String EmitDXBytecodeAssemblyForEntryPoint(
EntryPointRequest* entryPoint)
{
static pD3DDisassemble D3DDisassemble_ = nullptr;
@@ -287,7 +287,7 @@ namespace Slang
List<uint8_t> dxbc = EmitDXBytecodeForEntryPoint(entryPoint);
if (!dxbc.Count())
{
- return List<uint8_t>();
+ return String();
}
ID3DBlob* codeBlob;
@@ -298,10 +298,12 @@ namespace Slang
nullptr,
&codeBlob);
- List<uint8_t> result;
+ String result;
if (codeBlob)
{
- result.AddRange((uint8_t*)codeBlob->GetBufferPointer(), codeBlob->GetBufferSize());
+ char const* codeBegin = (char const*)codeBlob->GetBufferPointer();
+ char const* codeEnd = codeBegin + codeBlob->GetBufferSize();
+ result.append(codeBegin, codeEnd);
codeBlob->Release();
}
if (FAILED(hr))
@@ -341,10 +343,9 @@ namespace Slang
return glslCompiler;
}
-
- List<uint8_t> emitSPIRVForEntryPoint(
- EntryPointRequest* entryPoint,
- bool spirvAssembly)
+ int invokeGLSLCompilerForEntryPoint(
+ EntryPointRequest* entryPoint,
+ glslang_CompileRequest& request)
{
String rawGLSL = emitGLSLForEntryPoint(entryPoint);
@@ -358,36 +359,75 @@ namespace Slang
assert(glslang_compile);
}
- List<uint8_t> diagnosticOutput;
- List<uint8_t> output;
-
- auto outputFunc = [](void const* data, size_t size, void* userData)
+ String diagnosticOutput;
+ auto diagnosticOutputFunc = [](void const* data, size_t size, void* userData)
{
- ((List<uint8_t>*)userData)->AddRange((uint8_t*)data, size);
+ (*(String*)userData).append((char const*)data, (char const*)data + size);
};
- glslang_CompileRequest request;
request.sourcePath = "slang";
request.sourceText = rawGLSL.begin();
request.slangStage = (SlangStage)entryPoint->profile.GetStage();
- request.disassembleResult = spirvAssembly;
- request.diagnosticFunc = outputFunc;
+ request.diagnosticFunc = diagnosticOutputFunc;
request.diagnosticUserData = &diagnosticOutput;
+ int err = glslang_compile(&request);
+
+ if (err)
+ {
+ OutputDebugStringA(diagnosticOutput.Buffer());
+ fprintf(stderr, "%s", diagnosticOutput.Buffer());
+ exit(1);
+ }
+
+ return 0;
+ }
+
+
+ List<uint8_t> emitSPIRVForEntryPoint(
+ EntryPointRequest* entryPoint)
+ {
+ List<uint8_t> output;
+ auto outputFunc = [](void const* data, size_t size, void* userData)
+ {
+ ((List<uint8_t>*)userData)->AddRange((uint8_t*)data, size);
+ };
+
+ glslang_CompileRequest request;
request.outputFunc = outputFunc;
request.outputUserData = &output;
+ request.disassembleResult = false;
- int err = glslang_compile(&request);
+ int err = invokeGLSLCompilerForEntryPoint(entryPoint, request);
if (err)
{
- char const* diagnosticString = (char const*)diagnosticOutput.Buffer();
- String debugStr(diagnosticString, diagnosticString + diagnosticOutput.Count());
+ return List<uint8_t>();
+ }
- OutputDebugStringA(debugStr.Buffer());
- fprintf(stderr, "%s", debugStr.Buffer());
- exit(1);
+ return output;
+ }
+
+ String emitSPIRVAssemblyForEntryPoint(
+ EntryPointRequest* entryPoint)
+ {
+ String output;
+ auto outputFunc = [](void const* data, size_t size, void* userData)
+ {
+ (*(String*)userData).append((char const*)data, (char const*)data + size);
+ };
+
+ glslang_CompileRequest request;
+ request.outputFunc = outputFunc;
+ request.outputUserData = &output;
+ request.disassembleResult = true;
+
+ int err = invokeGLSLCompilerForEntryPoint(entryPoint, request);
+
+ if (err)
+ {
+ String();
}
return output;
@@ -447,21 +487,21 @@ namespace Slang
case CodeGenTarget::DXBytecodeAssembly:
{
- List<uint8_t> code = EmitDXBytecodeAssemblyForEntryPoint(entryPoint);
+ String code = EmitDXBytecodeAssemblyForEntryPoint(entryPoint);
result = CompileResult(code);
}
break;
case CodeGenTarget::SPIRV:
{
- List<uint8_t> code = emitSPIRVForEntryPoint(entryPoint, false);
+ List<uint8_t> code = emitSPIRVForEntryPoint(entryPoint);
result = CompileResult(code);
}
break;
case CodeGenTarget::SPIRVAssembly:
{
- List<uint8_t> code = emitSPIRVForEntryPoint(entryPoint, true);
+ String code = emitSPIRVAssemblyForEntryPoint(entryPoint);
result = CompileResult(code);
}
break;