diff --git a/src/compiler/glsl/link_interface_blocks.cpp b/src/compiler/glsl/link_interface_blocks.cpp index 9a0b6ec9256..a176c3b6da7 100644 --- a/src/compiler/glsl/link_interface_blocks.cpp +++ b/src/compiler/glsl/link_interface_blocks.cpp @@ -112,8 +112,11 @@ intrastage_match(ir_variable *a, * don't force their types to match. They might mismatch due to the two * shaders using different GLSL versions, and that's ok. */ - if (a->data.how_declared != ir_var_declared_implicitly || - b->data.how_declared != ir_var_declared_implicitly) + if ((a->data.how_declared != ir_var_declared_implicitly || + b->data.how_declared != ir_var_declared_implicitly) && + (!prog->IsES || prog->Version != 310 || + interstage_member_mismatch(prog, a->get_interface_type(), + b->get_interface_type()))) return false; } diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp index 85995905bbb..0b3c195219a 100644 --- a/src/compiler/glsl/linker.cpp +++ b/src/compiler/glsl/linker.cpp @@ -1063,7 +1063,15 @@ cross_validate_globals(struct gl_shader_program *prog, return; } - if (prog->IsES && existing->data.precision != var->data.precision) { + /* Only in GLSL ES 3.10, the precision qualifier should not match + * between block members defined in matched block names within a + * shader interface. + * + * In GLSL ES 3.00 and ES 3.20, precision qualifier for each block + * member should match. + */ + if (prog->IsES && (prog->Version != 310 || !var->get_interface_type()) && + existing->data.precision != var->data.precision) { linker_error(prog, "declarations for %s `%s` have " "mismatching precision qualifiers\n", mode_string(var), var->name);