glsl: don't lower fragdata array if the output data types don't match
Commit7e414b5864
broke the gl_FragData array into separate gl_FragData[i] variables, so drivers can eliminate useless writes to gl_FragData improving their performance. The problem occurs when GLSL IR code is linked in the following case: * The FS output variable base data type does not match gl_FragData one (float vector) * The FS output variable is replaced by gl_out_FragDataX because of commit7e414b5864
with X from 0 to GL_MAX_DRAW_BUFFERS. Then the FS output variable base data type is lost in the resulting GLSL IR, making that the driver does a wrong assignment to gl_out_FragData components because of unmatching data types. This patch reverts the fragdata array lowering when the output var base data type doesn't match gl_out_FragData, i.e., when output variable base data type is not a float or a float vector. This patch fixes 250 dEQP tests (tested in an Intel Haswell machine) dEQP-GLES3.functional.fragment_out.random.* (22 failed tests) dEQP-GLES3.functional.fragment_out.array.uint.* (120 failed tests) dEQP-GLES3.functional.fragment_out.array.int.* (108 failed tests) Signed-off-by: Samuel Iglesias Gonsalvez <siglesias@igalia.com> Reviewed-by: Matt Turner <mattst88@gmail.com>
This commit is contained in:
parent
4ab8d59a23
commit
08a4639e81
|
@ -99,6 +99,16 @@ public:
|
|||
}
|
||||
else {
|
||||
this->fragdata_usage |= 1 << index->get_uint_component(0);
|
||||
/* Don't lower fragdata array if the output variable
|
||||
* is not a float variable (or float vector) because it will
|
||||
* generate wrong register assignments because of different
|
||||
* data types.
|
||||
*/
|
||||
if (var->type->gl_type != GL_FLOAT &&
|
||||
var->type->gl_type != GL_FLOAT_VEC2 &&
|
||||
var->type->gl_type != GL_FLOAT_VEC3 &&
|
||||
var->type->gl_type != GL_FLOAT_VEC4)
|
||||
this->lower_fragdata_array = false;
|
||||
}
|
||||
|
||||
/* Don't visit the leaves of ir_dereference_array. */
|
||||
|
|
Loading…
Reference in New Issue