diff options
author | Jason Ekstrand <[email protected]> | 2018-07-31 05:31:47 -0700 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2018-08-01 18:02:28 -0700 |
commit | 57804efa885074866e1388191b5f48680c6151da (patch) | |
tree | 800cec737aa0b75e2a51ca4a05e00849a67e1bf7 /src/intel/compiler/brw_fs.cpp | |
parent | 4e060385e9c46892535d2d62313d5e53f175c0f5 (diff) |
i965/fs: Flag all slots of a flat input as flat
Otherwise, only the first vec4 of a matrix or other complex type will
get marked as flat and we'll interpolate the others. This was caught by
a dEQP test which started failing because it did a SSO vs. non-SSO
comparison. Previously, we did the interpolation wrong consistently in
both versions. However, with one of Tim Arceri's NIR linkingpatches, we
started splitting the matrix input into vectors at link time in the
non-SSO version and it started getting correctly interpolated which
didn't match the broken SSO version. As of this commit, they both get
correctly interpolated.
Fixes: e61cc87c757f8bc "i965/fs: Add a flat_inputs field to prog_data"
Reviewed-by: Kenneth Graunke <[email protected]>
Reviewed-by: Timothy Arceri <[email protected]>
Diffstat (limited to 'src/intel/compiler/brw_fs.cpp')
-rw-r--r-- | src/intel/compiler/brw_fs.cpp | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/src/intel/compiler/brw_fs.cpp b/src/intel/compiler/brw_fs.cpp index 7ddbd285fe2..20b89035e1f 100644 --- a/src/intel/compiler/brw_fs.cpp +++ b/src/intel/compiler/brw_fs.cpp @@ -6880,14 +6880,17 @@ brw_compute_flat_inputs(struct brw_wm_prog_data *prog_data, prog_data->flat_inputs = 0; nir_foreach_variable(var, &shader->inputs) { - int input_index = prog_data->urb_setup[var->data.location]; + unsigned slots = glsl_count_attribute_slots(var->type, false); + for (unsigned s = 0; s < slots; s++) { + int input_index = prog_data->urb_setup[var->data.location + s]; - if (input_index < 0) - continue; + if (input_index < 0) + continue; - /* flat shading */ - if (var->data.interpolation == INTERP_MODE_FLAT) - prog_data->flat_inputs |= (1 << input_index); + /* flat shading */ + if (var->data.interpolation == INTERP_MODE_FLAT) + prog_data->flat_inputs |= 1 << input_index; + } } } |