diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2020-05-29 15:56:28 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-05-29 15:56:28 -0400 |
| commit | 8acb704ecabc10c31e664de3814c544572e3945f (patch) | |
| tree | 82380012610537fd3d475b7f3eee70d78b3fcc78 /source | |
| parent | 9773495f1ab8a11194a21e1cf7b141c3da5cdfce (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.cpp | 5 | ||||
| -rw-r--r-- | source/slang/slang-emit-c-like.h | 4 | ||||
| -rw-r--r-- | source/slang/slang-emit-glsl.cpp | 34 | ||||
| -rw-r--r-- | source/slang/slang-emit-glsl.h | 6 | ||||
| -rw-r--r-- | source/slang/slang-emit.cpp | 25 |
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(); |
