nir: apply interpolated input intrinsics setting when lowering clipdist

For drivers that use this in fragment shaders, load_input is going to
produce incorrect results (flat-shaded values).

Fixes clipping tests on a4xx.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13900>
This commit is contained in:
Ilia Mirkin
2021-11-21 03:12:51 -05:00
committed by Marge Bot
parent df934873e1
commit 3b5b4b5d45

View File

@@ -115,10 +115,23 @@ load_clipdist_input(nir_builder *b, nir_variable *in, int location_offset,
.num_slots = 1,
};
nir_ssa_def *load =
nir_load_input(b, 4, 32, nir_imm_int(b, 0),
.base = in->data.driver_location + location_offset,
.io_semantics = semantics);
nir_ssa_def *load;
if (b->shader->options->use_interpolated_input_intrinsics) {
/* TODO: use sample when per-sample shading? */
nir_ssa_def *barycentric = nir_load_barycentric(
b, nir_intrinsic_load_barycentric_pixel, INTERP_MODE_NONE);
load = nir_load_interpolated_input(
b, 4, 32, barycentric, nir_imm_int(b, 0),
.base = in->data.driver_location + location_offset,
.dest_type = nir_type_float32,
.io_semantics = semantics);
} else {
load = nir_load_input(b, 4, 32, nir_imm_int(b, 0),
.base = in->data.driver_location + location_offset,
.dest_type = nir_type_float32,
.io_semantics = semantics);
}
val[0] = nir_channel(b, load, 0);
val[1] = nir_channel(b, load, 1);