glsl: do not set the 'smooth' qualifier by default on ES shaders
It leads to surprising states with integer inputs and outputs on vertex processing stages (e.g. geometry stages). Instead, rely on the driver to choose smooth interpolation by default. We still allow varyings to match when one stage declares it as smooth and the other declares it without interpolation qualifiers. Reviewed-by: Marek Olšák <marek.olsak@amd.com> Tested-by: Dieter Nützel <Dieter@nuetzel-hh.de>
This commit is contained in:
@@ -3126,17 +3126,6 @@ interpret_interpolation_qualifier(const struct ast_type_qualifier *qual,
|
||||
interpolation = INTERP_MODE_NOPERSPECTIVE;
|
||||
else if (qual->flags.q.smooth)
|
||||
interpolation = INTERP_MODE_SMOOTH;
|
||||
else if (state->es_shader &&
|
||||
((mode == ir_var_shader_in &&
|
||||
state->stage != MESA_SHADER_VERTEX) ||
|
||||
(mode == ir_var_shader_out &&
|
||||
state->stage != MESA_SHADER_FRAGMENT)))
|
||||
/* Section 4.3.9 (Interpolation) of the GLSL ES 3.00 spec says:
|
||||
*
|
||||
* "When no interpolation qualifier is present, smooth interpolation
|
||||
* is used."
|
||||
*/
|
||||
interpolation = INTERP_MODE_SMOOTH;
|
||||
else
|
||||
interpolation = INTERP_MODE_NONE;
|
||||
|
||||
|
@@ -325,8 +325,23 @@ cross_validate_types_and_qualifiers(struct gl_shader_program *prog,
|
||||
* "It is a link-time error if, within the same stage, the interpolation
|
||||
* qualifiers of variables of the same name do not match.
|
||||
*
|
||||
* Section 4.3.9 (Interpolation) of the GLSL ES 3.00 spec says:
|
||||
*
|
||||
* "When no interpolation qualifier is present, smooth interpolation
|
||||
* is used."
|
||||
*
|
||||
* So we match variables where one is smooth and the other has no explicit
|
||||
* qualifier.
|
||||
*/
|
||||
if (input->data.interpolation != output->data.interpolation &&
|
||||
unsigned input_interpolation = input->data.interpolation;
|
||||
unsigned output_interpolation = output->data.interpolation;
|
||||
if (prog->IsES) {
|
||||
if (input_interpolation == INTERP_MODE_NONE)
|
||||
input_interpolation = INTERP_MODE_SMOOTH;
|
||||
if (output_interpolation == INTERP_MODE_NONE)
|
||||
output_interpolation = INTERP_MODE_SMOOTH;
|
||||
}
|
||||
if (input_interpolation != output_interpolation &&
|
||||
prog->data->Version < 440) {
|
||||
linker_error(prog,
|
||||
"%s shader output `%s' specifies %s "
|
||||
|
Reference in New Issue
Block a user