nir: support derefs in two-sided lighting lowering

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
Erik Faye-Lund 2019-10-03 16:51:03 -04:00
parent 3b4fc2401b
commit 011d692a52
1 changed files with 28 additions and 12 deletions

View File

@ -138,18 +138,28 @@ nir_lower_two_sided_color_block(nir_block *block,
nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr);
if (intr->intrinsic != nir_intrinsic_load_input)
continue;
int idx;
for (idx = 0; idx < state->colors_count; idx++) {
unsigned drvloc =
state->colors[idx].front->data.driver_location;
if (nir_intrinsic_base(intr) == drvloc) {
assert(nir_src_is_const(intr->src[0]));
break;
if (intr->intrinsic == nir_intrinsic_load_input) {
for (idx = 0; idx < state->colors_count; idx++) {
unsigned drvloc =
state->colors[idx].front->data.driver_location;
if (nir_intrinsic_base(intr) == drvloc) {
assert(nir_src_is_const(intr->src[0]));
break;
}
}
}
} else if (intr->intrinsic == nir_intrinsic_load_deref) {
nir_variable *var = nir_intrinsic_get_var(intr, 0);
if (var->data.mode != nir_var_shader_in)
continue;
for (idx = 0; idx < state->colors_count; idx++) {
unsigned loc = state->colors[idx].front->data.location;
if (var->data.location == loc)
break;
}
} else
continue;
if (idx == state->colors_count)
continue;
@ -162,8 +172,14 @@ nir_lower_two_sided_color_block(nir_block *block,
* 32-bit value by default.
*/
nir_ssa_def *face = nir_load_front_face(b, 1);
nir_ssa_def *front = load_input(b, state->colors[idx].front);
nir_ssa_def *back = load_input(b, state->colors[idx].back);
nir_ssa_def *front, *back;
if (intr->intrinsic == nir_intrinsic_load_deref) {
front = nir_load_var(b, state->colors[idx].front);
back = nir_load_var(b, state->colors[idx].back);
} else {
front = load_input(b, state->colors[idx].front);
back = load_input(b, state->colors[idx].back);
}
nir_ssa_def *color = nir_bcsel(b, face, front, back);
assert(intr->dest.is_ssa);