summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/compiler-core/slang-glslang-compiler.cpp3
-rwxr-xr-xsource/slang/slang-compiler.cpp118
-rwxr-xr-xsource/slang/slang-compiler.h18
-rw-r--r--source/slang/slang-emit-c-like.h3
-rw-r--r--source/slang/slang-emit-cuda.h10
-rw-r--r--source/slang/slang-emit-glsl.cpp7
-rw-r--r--source/slang/slang-emit-glsl.h8
-rw-r--r--source/slang/slang-emit.cpp12
-rw-r--r--source/slang/slang-emit.h3
-rw-r--r--source/slang/slang-glsl-extension-tracker.h2
10 files changed, 94 insertions, 90 deletions
diff --git a/source/compiler-core/slang-glslang-compiler.cpp b/source/compiler-core/slang-glslang-compiler.cpp
index 8a8712024..e754cbdbc 100644
--- a/source/compiler-core/slang-glslang-compiler.cpp
+++ b/source/compiler-core/slang-glslang-compiler.cpp
@@ -221,7 +221,6 @@ SlangResult GlslangDownstreamCompiler::disassemble(SlangCompileTarget sourceBlob
StringBuilder builder;
- String output;
auto outputFunc = [](void const* data, size_t size, void* userData)
{
(*(StringBuilder*)userData).append((char const*)data, (char const*)data + size);
@@ -239,7 +238,7 @@ SlangResult GlslangDownstreamCompiler::disassemble(SlangCompileTarget sourceBlob
request.inputEnd = (char*)blob + blobSize;
request.outputFunc = outputFunc;
- request.outputUserData = &output;
+ request.outputUserData = &builder;
SLANG_RETURN_ON_FAIL(_invoke(request));
diff --git a/source/slang/slang-compiler.cpp b/source/slang/slang-compiler.cpp
index 2428bb8fb..c90b12722 100755
--- a/source/slang/slang-compiler.cpp
+++ b/source/slang/slang-compiler.cpp
@@ -368,17 +368,10 @@ namespace Slang
SlangResult checkExternalCompilerSupport(Session* session, PassThroughMode passThrough)
{
// Check if the type is supported on this compile
- switch (passThrough)
+ if (passThrough == PassThroughMode::None)
{
- case PassThroughMode::None:
- {
- // If no pass through -> that will always work!
- return SLANG_OK;
- }
-#if !SLANG_ENABLE_GLSLANG_SUPPORT
- case PassThroughMode::Glslang: return SLANG_E_NOT_IMPLEMENTED;
-#endif
- default: break;
+ // If no pass through -> that will always work!
+ return SLANG_OK;
}
return session->getOrLoadDownstreamCompiler(passThrough, nullptr) ? SLANG_OK: SLANG_E_NOT_FOUND;
@@ -522,24 +515,6 @@ namespace Slang
outCodeBuilder << fileContent << "\n";
}
- static void _maybeCreatePassThroughExtensionTracker(
- CodeGenTarget target,
- EndToEndCompileRequest* endToEndReq,
- SourceResult& outSource)
- {
- if(!isPassThroughEnabled(endToEndReq))
- return;
-
- if(target != CodeGenTarget::GLSL)
- return;
-
- if(outSource.extensionTracker)
- return;
-
- RefPtr<GLSLExtensionTracker> extensionTracker = new GLSLExtensionTracker();
- outSource.extensionTracker = extensionTracker;
- }
-
void trackGLSLTargetCaps(
GLSLExtensionTracker* extensionTracker,
CapabilitySet const& caps)
@@ -567,9 +542,10 @@ namespace Slang
TargetRequest* targetReq,
CodeGenTarget target,
EndToEndCompileRequest* endToEndReq,
- SourceResult& outSource)
+ ExtensionTracker* extensionTracker,
+ String& outSource)
{
- outSource.reset();
+ outSource = String();
if(isPassThroughEnabled(endToEndReq))
{
@@ -586,10 +562,6 @@ namespace Slang
StringBuilder codeBuilder;
if (target == CodeGenTarget::GLSL)
{
- _maybeCreatePassThroughExtensionTracker(target, endToEndReq, outSource);
- if(auto extensionTracker = as<GLSLExtensionTracker>(outSource.extensionTracker))
- trackGLSLTargetCaps(extensionTracker, targetReq->getTargetCaps());
-
// Special case GLSL
int translationUnitCounter = 0;
for (auto sourceFile : translationUnit->getSourceFiles())
@@ -616,7 +588,7 @@ namespace Slang
}
}
- outSource.source = codeBuilder.ProduceString();
+ outSource = codeBuilder.ProduceString();
}
return SLANG_OK;
}
@@ -627,6 +599,7 @@ namespace Slang
entryPointIndices,
target,
targetReq,
+ extensionTracker,
outSource);
}
}
@@ -637,12 +610,13 @@ namespace Slang
TargetRequest* targetReq,
CodeGenTarget target,
EndToEndCompileRequest* endToEndReq,
- SourceResult& outSource)
+ ExtensionTracker* extensionTracker,
+ String& outSource)
{
List<Int> entryPointIndices;
entryPointIndices.add(entryPointIndex);
return emitEntryPointsSource(compileRequest, entryPointIndices, targetReq,
- target, endToEndReq, outSource);
+ target, endToEndReq, extensionTracker, outSource);
}
String GetHLSLProfileName(Profile profile)
@@ -874,6 +848,24 @@ namespace Slang
}
}
+ static RefPtr<ExtensionTracker> _newExtensionTracker(CodeGenTarget target)
+ {
+ switch (target)
+ {
+ case CodeGenTarget::PTX:
+ case CodeGenTarget::CUDASource:
+ {
+ return new CUDAExtensionTracker;
+ }
+ case CodeGenTarget::SPIRV:
+ case CodeGenTarget::GLSL:
+ {
+ return new GLSLExtensionTracker;
+ }
+ default: return nullptr;
+ }
+ }
+
SlangResult emitWithDownstreamForEntryPoints(
ComponentType* program,
BackEndCompileRequest* slangRequest,
@@ -894,6 +886,8 @@ namespace Slang
PassThroughMode downstreamCompiler = endToEndReq ? endToEndReq->m_passThrough : PassThroughMode::None;
+ RefPtr<ExtensionTracker> extensionTracker = _newExtensionTracker(target);
+
// If we are not in pass through, lookup the default compiler for the emitted source type
if (downstreamCompiler == PassThroughMode::None)
{
@@ -943,7 +937,14 @@ namespace Slang
downstreamCompiler = PassThroughMode(session->getDefaultDownstreamCompiler(SlangSourceLanguage(sourceLanguage)));
}
}
-
+ else
+ {
+ // If we are pass through, we may need to set extension tracker state.
+ if (GLSLExtensionTracker* glslTracker = as<GLSLExtensionTracker>(extensionTracker))
+ {
+ trackGLSLTargetCaps(glslTracker, targetReq->getTargetCaps());
+ }
+ }
// We should have a downstream compiler set at this point
SLANG_ASSERT(downstreamCompiler != PassThroughMode::None);
@@ -982,6 +983,7 @@ namespace Slang
}
}
+
/* This is more convoluted than the other scenarios, because when we invoke C/C++ compiler we would ideally like
to use the original file. We want to do this because we want includes relative to the source file to work, and
for that to work most easily we want to use the original file, if there is one */
@@ -1051,10 +1053,7 @@ namespace Slang
// If it's not file based we can set an appropriate path name, and it doesn't matter if it doesn't
// exist on the file system
options.sourceContentsPath = calcSourcePathForEntryPoints(endToEndReq, entryPointIndices);
-
- SourceResult source;
- SLANG_RETURN_ON_FAIL(emitEntryPointsSource(slangRequest, entryPointIndices, targetReq, sourceTarget, endToEndReq, source));
- options.sourceContents = source.source;
+ SLANG_RETURN_ON_FAIL(emitEntryPointsSource(slangRequest, entryPointIndices, targetReq, sourceTarget, endToEndReq, extensionTracker, options.sourceContents));
}
else
{
@@ -1070,11 +1069,16 @@ namespace Slang
}
else
{
- SourceResult source;
- SLANG_RETURN_ON_FAIL(emitEntryPointsSource(slangRequest, entryPointIndices, targetReq, sourceTarget, endToEndReq, source));
+ SLANG_RETURN_ON_FAIL(emitEntryPointsSource(slangRequest, entryPointIndices, targetReq, sourceTarget, endToEndReq, extensionTracker, options.sourceContents));
+ maybeDumpIntermediate(slangRequest, options.sourceContents.getBuffer(), sourceTarget);
+ }
+ // If we have an extension tracker, we may need to set options such as SPIR-V version
+ // and CUDA Shader Model.
+ if (extensionTracker)
+ {
// Look for the version
- if (auto cudaTracker = as<CUDAExtensionTracker>(source.extensionTracker))
+ if (auto cudaTracker = as<CUDAExtensionTracker>(extensionTracker))
{
cudaTracker->finalize();
@@ -1092,18 +1096,14 @@ namespace Slang
options.flags |= CompileOptions::Flag::EnableFloat16;
}
}
- else if (GLSLExtensionTracker* tracker = as<GLSLExtensionTracker>(source.extensionTracker.Ptr()))
+ else if (GLSLExtensionTracker* glslTracker = as<GLSLExtensionTracker>(extensionTracker))
{
DownstreamCompiler::CapabilityVersion version;
version.kind = DownstreamCompiler::CapabilityVersion::Kind::SPIRV;
- version.version = tracker->getSPIRVVersion();
+ version.version = glslTracker->getSPIRVVersion();
options.requiredCapabilityVersions.add(version);
}
-
- options.sourceContents = source.source;
-
- maybeDumpIntermediate(slangRequest, options.sourceContents.getBuffer(), sourceTarget);
}
// Set the file sytem and source manager, as *may* be used by downstream compiler
@@ -1164,7 +1164,7 @@ namespace Slang
// Set the matrix layout
options.matrixLayout = targetReq->getDefaultMatrixLayoutMode();
}
- else
+ else if (downstreamCompiler == PassThroughMode::Fxc)
{
// Set the profile
options.profileName = GetHLSLProfileName(profile);
@@ -1517,14 +1517,20 @@ namespace Slang
case CodeGenTarget::CPPSource:
case CodeGenTarget::CSource:
{
- SourceResult source;
- if (SLANG_FAILED(emitEntryPointsSource(compileRequest, entryPointIndices,
- targetReq, target, endToEndReq, source)))
+ RefPtr<ExtensionTracker> extensionTracker = _newExtensionTracker(target);
+
+ String code;
+ if (SLANG_FAILED(emitEntryPointsSource(compileRequest,
+ entryPointIndices,
+ targetReq,
+ target,
+ endToEndReq,
+ extensionTracker,
+ code)))
{
return result;
}
- const auto& code = source.source;
maybeDumpIntermediate(compileRequest, code.getBuffer(), target);
result = CompileResult(code);
}
diff --git a/source/slang/slang-compiler.h b/source/slang/slang-compiler.h
index e3d8e506c..8aaf1bb0b 100755
--- a/source/slang/slang-compiler.h
+++ b/source/slang/slang-compiler.h
@@ -2145,17 +2145,9 @@ namespace Slang
String calcSourcePathForEntryPoint(EndToEndCompileRequest* endToEndReq, Int entryPointIndex);
String calcSourcePathForEntryPoints(EndToEndCompileRequest* endToEndReq, const List<Int>& entryPointIndices);
- struct SourceResult
+ class ExtensionTracker : public RefObject
{
- void reset()
- {
- source = String();
- extensionTracker.setNull();
- }
-
- String source;
- // Must be cast to a specific extension tracker such as GLSLExtensionTracker
- RefPtr<RefObject> extensionTracker;
+ public:
};
/* Emits entry point source taking into account if a pass-through or not. Uses 'target' to determine
@@ -2166,7 +2158,8 @@ namespace Slang
TargetRequest* targetReq,
CodeGenTarget target,
EndToEndCompileRequest* endToEndReq,
- SourceResult& outSource);
+ ExtensionTracker* extensionTracker,
+ String& outSource);
SlangResult emitEntryPointSource(
BackEndCompileRequest* compileRequest,
@@ -2174,7 +2167,8 @@ namespace Slang
TargetRequest* targetReq,
CodeGenTarget target,
EndToEndCompileRequest* endToEndReq,
- SourceResult& outSource);
+ ExtensionTracker* extensionTracker,
+ String& outSource);
//
diff --git a/source/slang/slang-emit-c-like.h b/source/slang/slang-emit-c-like.h
index 16a6d303f..16d03989c 100644
--- a/source/slang/slang-emit-c-like.h
+++ b/source/slang/slang-emit-c-like.h
@@ -36,6 +36,9 @@ public:
/// The capabilities of the target
CapabilitySet targetCaps;
+ /// The associated extension tracker
+ ExtensionTracker* extensionTracker = nullptr;
+
SourceWriter* sourceWriter = nullptr;
};
diff --git a/source/slang/slang-emit-cuda.h b/source/slang/slang-emit-cuda.h
index d91ea504c..07f429898 100644
--- a/source/slang/slang-emit-cuda.h
+++ b/source/slang/slang-emit-cuda.h
@@ -7,7 +7,7 @@
namespace Slang
{
-class CUDAExtensionTracker : public RefObject
+class CUDAExtensionTracker : public ExtensionTracker
{
public:
@@ -54,9 +54,11 @@ public:
virtual void emitTempModifiers(IRInst* temp) SLANG_OVERRIDE;
CUDASourceEmitter(const Desc& desc) :
- Super(desc),
- m_extensionTracker(new CUDAExtensionTracker)
- {}
+ Super(desc)
+ {
+ m_extensionTracker = dynamicCast<CUDAExtensionTracker>(desc.extensionTracker);
+ SLANG_ASSERT(m_extensionTracker);
+ }
protected:
diff --git a/source/slang/slang-emit-glsl.cpp b/source/slang/slang-emit-glsl.cpp
index 5b29fb8fa..b5eec456a 100644
--- a/source/slang/slang-emit-glsl.cpp
+++ b/source/slang/slang-emit-glsl.cpp
@@ -12,6 +12,13 @@
namespace Slang {
+GLSLSourceEmitter::GLSLSourceEmitter(const Desc& desc) :
+ Super(desc)
+{
+ m_glslExtensionTracker = dynamicCast<GLSLExtensionTracker>(desc.extensionTracker);
+ SLANG_ASSERT(m_glslExtensionTracker);
+}
+
SlangResult GLSLSourceEmitter::init()
{
SLANG_RETURN_ON_FAIL(Super::init());
diff --git a/source/slang/slang-emit-glsl.h b/source/slang/slang-emit-glsl.h
index e9d45de11..c770cce34 100644
--- a/source/slang/slang-emit-glsl.h
+++ b/source/slang/slang-emit-glsl.h
@@ -16,13 +16,7 @@ public:
virtual SlangResult init() SLANG_OVERRIDE;
- GLSLSourceEmitter(const Desc& desc) :
- Super(desc)
- {
- m_glslExtensionTracker = new GLSLExtensionTracker;
- }
-
-
+ GLSLSourceEmitter(const Desc& desc);
virtual RefObject* getExtensionTracker() SLANG_OVERRIDE { return m_glslExtensionTracker; }
diff --git a/source/slang/slang-emit.cpp b/source/slang/slang-emit.cpp
index 16164b957..623b79a1f 100644
--- a/source/slang/slang-emit.cpp
+++ b/source/slang/slang-emit.cpp
@@ -721,9 +721,10 @@ SlangResult emitEntryPointsSourceFromIR(
const List<Int>& entryPointIndices,
CodeGenTarget target,
TargetRequest* targetRequest,
- SourceResult& outSource)
+ ExtensionTracker* extensionTracker,
+ String& outSource)
{
- outSource.reset();
+ outSource = String();
auto sink = compileRequest->getSink();
auto program = compileRequest->getProgram();
@@ -760,6 +761,7 @@ SlangResult emitEntryPointsSourceFromIR(
}
desc.targetCaps = targetRequest->getTargetCaps();
desc.sourceWriter = &sourceWriter;
+ desc.extensionTracker = extensionTracker;
// Define here, because must be in scope longer than the sourceEmitter, as sourceEmitter might reference
// items in the linkedIR module
@@ -866,8 +868,6 @@ SlangResult emitEntryPointsSourceFromIR(
sourceEmitter->emitPreprocessorDirectives();
sourceWriter.resumeLineDirective();
- RefObject* extensionTracker = sourceEmitter->getExtensionTracker();
-
if (auto glslExtensionTracker = as<GLSLExtensionTracker>(extensionTracker))
{
trackGLSLTargetCaps(glslExtensionTracker, targetRequest->getTargetCaps());
@@ -887,9 +887,7 @@ SlangResult emitEntryPointsSourceFromIR(
finalResultBuilder << code;
// Write out the result
- outSource.source = finalResultBuilder.ProduceString();
- outSource.extensionTracker = extensionTracker;
-
+ outSource = finalResultBuilder.ProduceString();
return SLANG_OK;
}
diff --git a/source/slang/slang-emit.h b/source/slang/slang-emit.h
index 7d783d99c..1467a9bcd 100644
--- a/source/slang/slang-emit.h
+++ b/source/slang/slang-emit.h
@@ -41,6 +41,7 @@ namespace Slang
const List<Int>& entryPointIndices,
CodeGenTarget target,
TargetRequest* targetRequest,
- SourceResult& outSource);
+ ExtensionTracker* extensionTracker,
+ String& outSource);
}
#endif
diff --git a/source/slang/slang-glsl-extension-tracker.h b/source/slang/slang-glsl-extension-tracker.h
index 5127674a3..cee11cad5 100644
--- a/source/slang/slang-glsl-extension-tracker.h
+++ b/source/slang/slang-glsl-extension-tracker.h
@@ -12,7 +12,7 @@
namespace Slang
{
-class GLSLExtensionTracker : public RefObject
+class GLSLExtensionTracker : public ExtensionTracker
{
public: