GLSL: Add error checking and extension fallback for textureGather

This commit is contained in:
rdb 2020-11-07 00:01:57 +01:00
parent 683c3f5c3f
commit 509908d8db

View File

@ -6162,6 +6162,10 @@ std::string CompilerGLSL::to_texture_op(const Instruction &i, bool sparse, bool
opt = &ops[5]; opt = &ops[5];
length -= 5; length -= 5;
gather = true; gather = true;
if (options.es && options.version < 310)
SPIRV_CROSS_THROW("textureGather requires ESSL 310.");
else if (!options.es && options.version < 400)
SPIRV_CROSS_THROW("textureGather with depth compare requires GLSL 400.");
break; break;
case OpImageGather: case OpImageGather:
@ -6170,6 +6174,14 @@ std::string CompilerGLSL::to_texture_op(const Instruction &i, bool sparse, bool
opt = &ops[5]; opt = &ops[5];
length -= 5; length -= 5;
gather = true; gather = true;
if (options.es && options.version < 310)
SPIRV_CROSS_THROW("textureGather requires ESSL 310.");
else if (!options.es && options.version < 400)
{
if (!expression_is_constant_null(comp))
SPIRV_CROSS_THROW("textureGather with component requires GLSL 400.");
require_extension_internal("GL_ARB_texture_gather");
}
break; break;
case OpImageFetch: case OpImageFetch:
@ -6438,7 +6450,7 @@ string CompilerGLSL::to_function_name(const TextureFunctionNameArguments &args)
if (args.is_sparse_feedback || args.has_min_lod) if (args.is_sparse_feedback || args.has_min_lod)
fname += "ARB"; fname += "ARB";
return is_legacy() ? legacy_tex_op(fname, imgtype, tex) : fname; return (is_legacy() && !args.base.is_gather) ? legacy_tex_op(fname, imgtype, tex) : fname;
} }
std::string CompilerGLSL::convert_separate_image_to_expression(uint32_t id) std::string CompilerGLSL::convert_separate_image_to_expression(uint32_t id)
@ -6685,7 +6697,7 @@ string CompilerGLSL::to_function_args(const TextureFunctionArguments &args, bool
farg_str += to_expression(args.bias); farg_str += to_expression(args.bias);
} }
if (args.component) if (args.component && !expression_is_constant_null(args.component))
{ {
forward = forward && should_forward(args.component); forward = forward && should_forward(args.component);
farg_str += ", "; farg_str += ", ";