summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2020-05-29 15:56:28 -0400
committerGitHub <noreply@github.com>2020-05-29 15:56:28 -0400
commit8acb704ecabc10c31e664de3814c544572e3945f (patch)
tree82380012610537fd3d475b7f3eee70d78b3fcc78 /source
parent9773495f1ab8a11194a21e1cf7b141c3da5cdfce (diff)
Bug fix problem with ray tracing from fragment shader (#1362)
* Added GLSL_460 if ray tracing is used on fragment shader. Moved GLSL specific setup init function. * Split out _requireRayTracing method.
Diffstat (limited to 'source')
-rw-r--r--source/slang/slang-emit-c-like.cpp5
-rw-r--r--source/slang/slang-emit-c-like.h4
-rw-r--r--source/slang/slang-emit-glsl.cpp34
-rw-r--r--source/slang/slang-emit-glsl.h6
-rw-r--r--source/slang/slang-emit.cpp25
5 files changed, 50 insertions, 24 deletions
diff --git a/source/slang/slang-emit-c-like.cpp b/source/slang/slang-emit-c-like.cpp
index 61b5ed139..9d23cec43 100644
--- a/source/slang/slang-emit-c-like.cpp
+++ b/source/slang/slang-emit-c-like.cpp
@@ -136,6 +136,11 @@ CLikeSourceEmitter::CLikeSourceEmitter(const Desc& desc)
m_effectiveProfile = desc.effectiveProfile;
}
+SlangResult CLikeSourceEmitter::init()
+{
+ return SLANG_OK;
+}
+
//
// Types
//
diff --git a/source/slang/slang-emit-c-like.h b/source/slang/slang-emit-c-like.h
index a02fc873a..212e90019 100644
--- a/source/slang/slang-emit-c-like.h
+++ b/source/slang/slang-emit-c-like.h
@@ -96,8 +96,12 @@ public:
{}
};
+ /// Must be called before used
+ virtual SlangResult init();
+
/// Ctor
CLikeSourceEmitter(const Desc& desc);
+
/// Get the source manager
SourceManager* getSourceManager() { return m_compileRequest->getSourceManager(); }
diff --git a/source/slang/slang-emit-glsl.cpp b/source/slang/slang-emit-glsl.cpp
index 18bb84e0e..a41004622 100644
--- a/source/slang/slang-emit-glsl.cpp
+++ b/source/slang/slang-emit-glsl.cpp
@@ -12,6 +12,36 @@
namespace Slang {
+SlangResult GLSLSourceEmitter::init()
+{
+ SLANG_RETURN_ON_FAIL(Super::init());
+
+ // Deal with cases where a particular stage requires certain GLSL versions
+ // and/or extensions.
+ switch (m_entryPointStage)
+ {
+ case Stage::AnyHit:
+ case Stage::Callable:
+ case Stage::ClosestHit:
+ case Stage::Intersection:
+ case Stage::Miss:
+ case Stage::RayGeneration:
+ {
+ _requireRayTracing();
+ break;
+ }
+ default: break;
+ }
+
+ return SLANG_OK;
+}
+
+void GLSLSourceEmitter::_requireRayTracing()
+{
+ m_glslExtensionTracker->requireExtension(UnownedStringSlice::fromLiteral("GL_NV_ray_tracing"));
+ m_glslExtensionTracker->requireVersion(ProfileVersion::GLSL_460);
+}
+
void GLSLSourceEmitter::_requireGLSLExtension(const UnownedStringSlice& name)
{
m_glslExtensionTracker->requireExtension(name);
@@ -1673,9 +1703,11 @@ void GLSLSourceEmitter::emitSimpleTypeImpl(IRType* type)
switch (untypedBufferType->op)
{
case kIROp_RaytracingAccelerationStructureType:
- _requireGLSLExtension(UnownedStringSlice::fromLiteral("GL_NV_ray_tracing"));
+ {
+ _requireRayTracing();
m_writer->emit("accelerationStructureNV");
break;
+ }
// TODO: These "translations" are obviously wrong for GLSL.
case kIROp_HLSLByteAddressBufferType: m_writer->emit("ByteAddressBuffer"); break;
diff --git a/source/slang/slang-emit-glsl.h b/source/slang/slang-emit-glsl.h
index 760d62194..5c46d5471 100644
--- a/source/slang/slang-emit-glsl.h
+++ b/source/slang/slang-emit-glsl.h
@@ -14,12 +14,16 @@ class GLSLSourceEmitter : public CLikeSourceEmitter
public:
typedef CLikeSourceEmitter Super;
+ virtual SlangResult init() SLANG_OVERRIDE;
+
GLSLSourceEmitter(const Desc& desc) :
Super(desc)
{
m_glslExtensionTracker = new GLSLExtensionTracker;
}
+
+
virtual RefObject* getExtensionTracker() SLANG_OVERRIDE { return m_glslExtensionTracker; }
protected:
@@ -100,6 +104,8 @@ protected:
///
bool _tryEmitBitBinOp(IRInst* inst, const EmitOpInfo& bitOp, const EmitOpInfo& boolOp, const EmitOpInfo& inOuterPrec);
+ void _requireRayTracing();
+
RefPtr<GLSLExtensionTracker> m_glslExtensionTracker;
};
diff --git a/source/slang/slang-emit.cpp b/source/slang/slang-emit.cpp
index 63d46aa30..12996e783 100644
--- a/source/slang/slang-emit.cpp
+++ b/source/slang/slang-emit.cpp
@@ -662,6 +662,8 @@ SlangResult emitEntryPointSourceFromIR(
return SLANG_FAIL;
}
+ SLANG_RETURN_ON_FAIL(sourceEmitter->init());
+
{
LinkingAndOptimizationOptions linkingAndOptimizationOptions;
@@ -698,29 +700,6 @@ SlangResult emitEntryPointSourceFromIR(
sourceEmitter->emitModule(irModule);
}
- // Deal with cases where a particular stage requires certain GLSL versions
- // and/or extensions.
- switch( entryPoint->getStage() )
- {
- default:
- break;
-
- case Stage::AnyHit:
- case Stage::Callable:
- case Stage::ClosestHit:
- case Stage::Intersection:
- case Stage::Miss:
- case Stage::RayGeneration:
- if( target == CodeGenTarget::GLSL )
- {
- auto glslExtensionTracker = as<GLSLExtensionTracker>(sourceEmitter->getExtensionTracker());
-
- glslExtensionTracker->requireExtension(UnownedStringSlice::fromLiteral("GL_NV_ray_tracing"));
- glslExtensionTracker->requireVersion(ProfileVersion::GLSL_460);
- }
- break;
- }
-
String code = sourceWriter.getContent();
sourceWriter.clearContent();