glsl: re-enable varying packing in GL4.4+
We can still do packing we just need to get the packing type from the consumer rather than the producer. Reviewed-by: Iago Toral Quiroga <itoral@igalia.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97033
This commit is contained in:
@@ -1405,10 +1405,26 @@ varying_matches::record(ir_variable *producer_var, ir_variable *consumer_var)
|
||||
sizeof(*this->matches) * this->matches_capacity);
|
||||
}
|
||||
|
||||
const ir_variable *const var = (producer_var != NULL)
|
||||
? producer_var : consumer_var;
|
||||
const gl_shader_stage stage = (producer_var != NULL)
|
||||
? producer_stage : consumer_stage;
|
||||
/* We must use the consumer to compute the packing class because in GL4.4+
|
||||
* there is no guarantee interpolation qualifiers will match across stages.
|
||||
*
|
||||
* From Section 4.5 (Interpolation Qualifiers) of the GLSL 4.30 spec:
|
||||
*
|
||||
* "The type and presence of interpolation qualifiers of variables with
|
||||
* the same name declared in all linked shaders for the same cross-stage
|
||||
* interface must match, otherwise the link command will fail.
|
||||
*
|
||||
* When comparing an output from one stage to an input of a subsequent
|
||||
* stage, the input and output don't match if their interpolation
|
||||
* qualifiers (or lack thereof) are not the same."
|
||||
*
|
||||
* This text was also in at least revison 7 of the 4.40 spec but is no
|
||||
* longer in revision 9 and not in the 4.50 spec.
|
||||
*/
|
||||
const ir_variable *const var = (consumer_var != NULL)
|
||||
? consumer_var : producer_var;
|
||||
const gl_shader_stage stage = (consumer_var != NULL)
|
||||
? consumer_stage : producer_stage;
|
||||
const glsl_type *type = get_varying_type(var, stage);
|
||||
|
||||
this->matches[this->num_matches].packing_class
|
||||
@@ -2023,40 +2039,18 @@ assign_varying_locations(struct gl_context *ctx,
|
||||
bool xfb_enabled =
|
||||
ctx->Extensions.EXT_transform_feedback && !unpackable_tess;
|
||||
|
||||
/* Disable varying packing for GL 4.4+ as there is no guarantee
|
||||
* that interpolation qualifiers will match between shaders in these
|
||||
* versions. We also disable packing on outward facing interfaces for
|
||||
* SSO because in ES we need to retain the unpacked varying information
|
||||
* for draw time validation. For desktop GL we could allow packing for
|
||||
* versions < 4.4 but it's just safer not to do packing.
|
||||
/* Disable packing on outward facing interfaces for SSO because in ES we
|
||||
* need to retain the unpacked varying information for draw time
|
||||
* validation.
|
||||
*
|
||||
* Packing is still enabled on individual arrays, structs, and matrices as
|
||||
* these are required by the transform feedback code and it is still safe
|
||||
* to do so. We also enable packing when a varying is only used for
|
||||
* transform feedback and its not a SSO.
|
||||
*
|
||||
* Varying packing currently only packs together varyings with matching
|
||||
* interpolation qualifiers as the backends assume all packed components
|
||||
* are to be processed in the same way. Therefore we cannot do packing in
|
||||
* these versions of GL without the risk of mismatching interfaces.
|
||||
*
|
||||
* From Section 4.5 (Interpolation Qualifiers) of the GLSL 4.30 spec:
|
||||
*
|
||||
* "The type and presence of interpolation qualifiers of variables with
|
||||
* the same name declared in all linked shaders for the same cross-stage
|
||||
* interface must match, otherwise the link command will fail.
|
||||
*
|
||||
* When comparing an output from one stage to an input of a subsequent
|
||||
* stage, the input and output don't match if their interpolation
|
||||
* qualifiers (or lack thereof) are not the same."
|
||||
*
|
||||
* This text was also in at least revison 7 of the 4.40 spec but is no
|
||||
* longer in revision 9 and not in the 4.50 spec.
|
||||
*/
|
||||
bool disable_varying_packing =
|
||||
ctx->Const.DisableVaryingPacking || unpackable_tess;
|
||||
if ((ctx->API == API_OPENGL_CORE && ctx->Version >= 44) ||
|
||||
(prog->SeparateShader && (producer == NULL || consumer == NULL)))
|
||||
if (prog->SeparateShader && (producer == NULL || consumer == NULL))
|
||||
disable_varying_packing = true;
|
||||
|
||||
varying_matches matches(disable_varying_packing, xfb_enabled,
|
||||
|
Reference in New Issue
Block a user