From 53731f674601a2eb81c5715957d2e0e65637aee3 Mon Sep 17 00:00:00 2001 From: Tim Foley Date: Fri, 19 Oct 2018 13:53:18 -0700 Subject: Vulkan implicit sampler fixups (#686) * Fix sampler-less texture functions (#685) * Fix sampler-less texeture functions I'm honestly not sure how the original work on this feature in #648 worked at all (probably insufficient testing). We have these front-end modifiers to indicate that a particular function definition requires a certain GLSL version, or a GLSL extension in order to be used, and they are supposed to be automatically employed by the logic in `emit.cpp` to output `#extension` lines in the output GLSL. However, it turns out that nothing is actually wired up right now, so that adding the modifiers to a declaration is a placebo. This change propagates the modifiers through as decorations, and then uses them during GLSL code emit, which allows the functions that require `EXT_samplerless_texture_functions` to work. * fixup: 32-bit warning * Add serialization support for GLSL extension/version decorations --- source/slang/emit.cpp | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) (limited to 'source/slang/emit.cpp') diff --git a/source/slang/emit.cpp b/source/slang/emit.cpp index 4961518f1..c9e19dffc 100644 --- a/source/slang/emit.cpp +++ b/source/slang/emit.cpp @@ -3466,9 +3466,38 @@ struct EmitVisitor IREmitMode mode, EOpInfo outerPrec) { + auto funcValue = inst->getOperand(0); + + // Does this function declare any requirements on GLSL version or + // extensions, which should affect our output? + if(getTarget(ctx) == CodeGenTarget::GLSL) + { + auto decoratedValue = funcValue; + while (auto specInst = as(decoratedValue)) + { + decoratedValue = getSpecializedValue(specInst); + } + + for( auto decoration = decoratedValue->firstDecoration; decoration; decoration = decoration->next ) + { + switch(decoration->op) + { + default: + break; + + case kIRDecorationOp_RequireGLSLExtension: + requireGLSLExtension(String(((IRRequireGLSLExtensionDecoration*)decoration)->extensionName)); + break; + + case kIRDecorationOp_RequireGLSLVersion: + requireGLSLVersion(int(((IRRequireGLSLVersionDecoration*)decoration)->languageVersion)); + break; + } + } + } + // We want to detect any call to an intrinsic operation, // that we can emit it directly without mangling, etc. - auto funcValue = inst->getOperand(0); if(auto irFunc = asTargetIntrinsic(ctx, funcValue)) { emitIntrinsicCallExpr(ctx, inst, irFunc, mode, outerPrec); -- cgit v1.2.3