summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorKai-Hwa Yao <kyao@nvidia.com>2017-07-10 13:50:16 -0700
committerKai-Hwa Yao <kyao@nvidia.com>2017-07-10 17:49:35 -0700
commit7c0ebeee95cb72f086a261ed6c55f33571bb62db (patch)
tree037b716c36ced7fea574c231405c05bf2d58e6a0 /source
parent4bb88c4a45707fb88150aa7952b4c9b9f55b1749 (diff)
Refactored compile output to work with raw data instead of Strings
Diffstat (limited to 'source')
-rw-r--r--source/slang/compiler.cpp100
-rw-r--r--source/slang/compiler.h4
-rw-r--r--source/slang/slang.cpp27
3 files changed, 62 insertions, 69 deletions
diff --git a/source/slang/compiler.cpp b/source/slang/compiler.cpp
index 2f6204eb2..3225aafb2 100644
--- a/source/slang/compiler.cpp
+++ b/source/slang/compiler.cpp
@@ -197,6 +197,7 @@ namespace Slang
0,
&codeBlob,
&diagnosticsBlob);
+
List<uint8_t> data;
if (codeBlob)
{
@@ -243,7 +244,7 @@ namespace Slang
}
#endif
- String EmitDXBytecodeAssemblyForEntryPoint(
+ List<uint8_t> EmitDXBytecodeAssemblyForEntryPoint(
EntryPointRequest* entryPoint)
{
static pD3DDisassemble D3DDisassemble_ = nullptr;
@@ -259,7 +260,7 @@ namespace Slang
List<uint8_t> dxbc = EmitDXBytecodeForEntryPoint(entryPoint);
if (!dxbc.Count())
{
- return "";
+ return List<uint8_t>();
}
ID3DBlob* codeBlob;
@@ -270,10 +271,10 @@ namespace Slang
nullptr,
&codeBlob);
- String result;
+ List<uint8_t> result;
if (codeBlob)
{
- result = String((char const*) codeBlob->GetBufferPointer());
+ result.AddRange((uint8_t*)codeBlob->GetBufferPointer(), codeBlob->GetBufferSize());
codeBlob->Release();
}
if (FAILED(hr))
@@ -314,8 +315,9 @@ namespace Slang
}
- String emitSPIRVAssemblyForEntryPoint(
- EntryPointRequest* entryPoint)
+ List<uint8_t> emitSPIRVForEntryPoint(
+ EntryPointRequest* entryPoint,
+ bool spirvAssembly)
{
String rawGLSL = emitGLSLForEntryPoint(entryPoint);
@@ -329,34 +331,32 @@ namespace Slang
assert(glslang_compile);
}
- StringBuilder diagnosticBuilder;
- StringBuilder outputBuilder;
+ List<uint8_t> diagnosticOutput;
+ List<uint8_t> output;
- auto outputFunc = [](char const* text, void* userData)
+ auto outputFunc = [](void const* data, size_t size, void* userData)
{
- *(StringBuilder*)userData << text;
+ ((List<uint8_t>*)userData)->AddRange((uint8_t*)data, size);
};
glslang_CompileRequest request;
request.sourcePath = "slang";
request.sourceText = rawGLSL.begin();
- request.slangStage = (SlangStage) entryPoint->profile.GetStage();
+ request.slangStage = (SlangStage)entryPoint->profile.GetStage();
+ request.disassembleResult = spirvAssembly;
request.diagnosticFunc = outputFunc;
- request.diagnosticUserData = &diagnosticBuilder;
+ request.diagnosticUserData = &diagnosticOutput;
request.outputFunc = outputFunc;
- request.outputUserData = &outputBuilder;
+ request.outputUserData = &output;
int err = glslang_compile(&request);
- String diagnostics = diagnosticBuilder.ProduceString();
- String output = outputBuilder.ProduceString();
-
- if(err)
+ if (err)
{
- OutputDebugStringA(diagnostics.Buffer());
- fprintf(stderr, "%s", diagnostics.Buffer());
+ OutputDebugStringA((char const *)diagnosticOutput.Buffer());
+ fwrite(diagnosticOutput.Buffer(), 1, diagnosticOutput.Count(), stderr);
exit(1);
}
@@ -397,67 +397,42 @@ namespace Slang
case CodeGenTarget::HLSL:
{
String code = emitHLSLForEntryPoint(entryPoint);
- result.outputSource = code;
+ result.outputSource.AddRange((uint8_t*)code.Buffer(), code.Length());
}
break;
case CodeGenTarget::GLSL:
{
String code = emitGLSLForEntryPoint(entryPoint);
- result.outputSource = code;
+ result.outputSource.AddRange((uint8_t*)code.Buffer(), code.Length());
}
break;
case CodeGenTarget::DXBytecode:
{
- auto code = EmitDXBytecodeForEntryPoint(entryPoint);
-
- // TODO(tfoley): Need to figure out an appropriate interface
- // for returning binary code, in addition to source.
-#if 0
- if (context.compileResult)
- {
- StringBuilder sb;
- sb.Append((char*) code.begin(), code.Count());
-
- String codeString = sb.ProduceString();
- result.outputSource = codeString;
- }
- else
-#endif
- {
- int col = 0;
- for(auto ii : code)
- {
- if(col != 0) fputs(" ", stdout);
- fprintf(stdout, "%02X", ii);
- col++;
- if(col == 8)
- {
- fputs("\n", stdout);
- col = 0;
- }
- }
- if(col != 0)
- {
- fputs("\n", stdout);
- }
- }
- return result;
+ List<uint8_t> code = EmitDXBytecodeForEntryPoint(entryPoint);
+ result.outputSource.AddRange(code.Buffer(), code.Count());
}
break;
case CodeGenTarget::DXBytecodeAssembly:
{
- String code = EmitDXBytecodeAssemblyForEntryPoint(entryPoint);
- result.outputSource = code;
+ List<uint8_t> code = EmitDXBytecodeAssemblyForEntryPoint(entryPoint);
+ result.outputSource.AddRange(code.Buffer(), code.Count());
+ }
+ break;
+
+ case CodeGenTarget::SPIRV:
+ {
+ List<uint8_t> code = emitSPIRVForEntryPoint(entryPoint, false);
+ result.outputSource.AddRange(code.Buffer(), code.Count());
}
break;
case CodeGenTarget::SPIRVAssembly:
{
- String code = emitSPIRVAssemblyForEntryPoint(entryPoint);
- result.outputSource = code;
+ List<uint8_t> code = emitSPIRVForEntryPoint(entryPoint, true);
+ result.outputSource.AddRange(code.Buffer(), code.Count());
}
break;
@@ -493,14 +468,11 @@ namespace Slang
// The result for the translation unit will just be the concatenation
// of the results for each entry point. This doesn't actually make
// much sense, but it is good enough for now.
- //
- // TODO: Replace this with a packaged JSON and/or binary format.
- StringBuilder sb;
for (auto& entryPoint : translationUnit->entryPoints)
{
- sb << entryPoint->result.outputSource;
+ UInt size = entryPoint->result.outputSource.Count();
+ result.outputSource.AddRange(entryPoint->result.outputSource.Buffer(), size);
}
- result.outputSource = sb.ProduceString();
return result;
}
diff --git a/source/slang/compiler.h b/source/slang/compiler.h
index cb7eb6265..3763faec7 100644
--- a/source/slang/compiler.h
+++ b/source/slang/compiler.h
@@ -54,7 +54,7 @@ namespace Slang
// Result of compiling an entry point
struct EntryPointResult
{
- String outputSource;
+ List<uint8_t> outputSource;
};
// Describes an entry point that we've been requested to compile
@@ -108,7 +108,7 @@ namespace Slang
// Result of compiling a translation unit
struct TranslationUnitResult
{
- String outputSource;
+ List<uint8_t> outputSource;
};
// A single translation unit requested to be compiled.
diff --git a/source/slang/slang.cpp b/source/slang/slang.cpp
index af68060cd..7f30e91c2 100644
--- a/source/slang/slang.cpp
+++ b/source/slang/slang.cpp
@@ -862,7 +862,18 @@ SLANG_API char const* spGetTranslationUnitSource(
int translationUnitIndex)
{
auto req = REQ(request);
- return req->translationUnits[translationUnitIndex]->result.outputSource.Buffer();
+ return (char const*)req->translationUnits[translationUnitIndex]->result.outputSource.Buffer();
+}
+
+SLANG_API void const* spGetTranslationUnitCode(
+ SlangCompileRequest* request,
+ int translationUnitIndex,
+ size_t* outSize)
+{
+ auto req = REQ(request);
+ Slang::TranslationUnitResult& result = req->translationUnits[translationUnitIndex]->result;
+ *outSize = (size_t)result.outputSource.Count();
+ return result.outputSource.Buffer();
}
SLANG_API char const* spGetEntryPointSource(
@@ -870,10 +881,21 @@ SLANG_API char const* spGetEntryPointSource(
int entryPointIndex)
{
auto req = REQ(request);
- return req->entryPoints[entryPointIndex]->result.outputSource.Buffer();
+ return (char const*)req->entryPoints[entryPointIndex]->result.outputSource.Buffer();
}
+SLANG_API void const* spGetEntryPointCode(
+ SlangCompileRequest* request,
+ int entryPointIndex,
+ size_t* outSize)
+{
+ auto req = REQ(request);
+ Slang::EntryPointResult& result = req->entryPoints[entryPointIndex]->result;
+ *outSize = (size_t)result.outputSource.Count();
+ return result.outputSource.Buffer();
+}
+
// Reflection API
SLANG_API SlangReflection* spGetReflection(
@@ -885,5 +907,4 @@ SLANG_API SlangReflection* spGetReflection(
return (SlangReflection*) req->layout.Ptr();
}
-
// ... rest of reflection API implementation is in `Reflection.cpp`