v3d: Fix shaders using pixel center W but no varyings.
The docs called this field "uses both center W and centroid W", but actually it's "do you need center W even if varyings don't obviously call for it?" Fixes dEQP-GLES3.functional.shaders.builtin_variable.fragcoord_w
This commit is contained in:
@@ -2006,9 +2006,10 @@ vir_emit_last_thrsw(struct v3d_compile *c)
|
|||||||
c->last_thrsw->is_last_thrsw = true;
|
c->last_thrsw->is_last_thrsw = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* There's a flag in the shader for "centroid W used in addition to center W",
|
/* There's a flag in the shader for "center W is needed for reasons other than
|
||||||
* so we need to walk the program after VIR optimization to see if both are
|
* non-centroid varyings", so we just walk the program after VIR optimization
|
||||||
* used.
|
* to see if it's used. It should be harmless to set even if we only use
|
||||||
|
* center W for varyings.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
vir_check_payload_w(struct v3d_compile *c)
|
vir_check_payload_w(struct v3d_compile *c)
|
||||||
@@ -2016,19 +2017,11 @@ vir_check_payload_w(struct v3d_compile *c)
|
|||||||
if (c->s->info.stage != MESA_SHADER_FRAGMENT)
|
if (c->s->info.stage != MESA_SHADER_FRAGMENT)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
bool any_centroid = false;
|
|
||||||
for (int i = 0; i < ARRAY_SIZE(c->centroid_flags); i++) {
|
|
||||||
if (c->centroid_flags[i])
|
|
||||||
any_centroid = true;
|
|
||||||
}
|
|
||||||
if (!any_centroid)
|
|
||||||
return;
|
|
||||||
|
|
||||||
vir_for_each_inst_inorder(inst, c) {
|
vir_for_each_inst_inorder(inst, c) {
|
||||||
for (int i = 0; i < vir_get_nsrc(inst); i++) {
|
for (int i = 0; i < vir_get_nsrc(inst); i++) {
|
||||||
if (inst->src[i].file == QFILE_REG &&
|
if (inst->src[i].file == QFILE_REG &&
|
||||||
inst->src[i].index == 0) {
|
inst->src[i].index == 0) {
|
||||||
c->uses_centroid_and_center_w = true;
|
c->uses_center_w = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -478,7 +478,7 @@ struct v3d_compile {
|
|||||||
|
|
||||||
uint32_t centroid_flags[BITSET_WORDS(V3D_MAX_FS_INPUTS)];
|
uint32_t centroid_flags[BITSET_WORDS(V3D_MAX_FS_INPUTS)];
|
||||||
|
|
||||||
bool uses_centroid_and_center_w;
|
bool uses_center_w;
|
||||||
|
|
||||||
struct v3d_ubo_range *ubo_ranges;
|
struct v3d_ubo_range *ubo_ranges;
|
||||||
bool *ubo_range_used;
|
bool *ubo_range_used;
|
||||||
@@ -663,7 +663,7 @@ struct v3d_fs_prog_data {
|
|||||||
|
|
||||||
bool writes_z;
|
bool writes_z;
|
||||||
bool discard;
|
bool discard;
|
||||||
bool uses_centroid_and_center_w;
|
bool uses_center_w;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Special nir_load_input intrinsic index for loading the current TLB
|
/* Special nir_load_input intrinsic index for loading the current TLB
|
||||||
|
@@ -841,7 +841,7 @@ uint64_t *v3d_compile_fs(const struct v3d_compiler *compiler,
|
|||||||
prog_data->writes_z = (c->s->info.outputs_written &
|
prog_data->writes_z = (c->s->info.outputs_written &
|
||||||
(1 << FRAG_RESULT_DEPTH));
|
(1 << FRAG_RESULT_DEPTH));
|
||||||
prog_data->discard = c->s->info.fs.uses_discard;
|
prog_data->discard = c->s->info.fs.uses_discard;
|
||||||
prog_data->uses_centroid_and_center_w = c->uses_centroid_and_center_w;
|
prog_data->uses_center_w = c->uses_center_w;
|
||||||
|
|
||||||
return v3d_return_qpu_insts(c, final_assembly_size);
|
return v3d_return_qpu_insts(c, final_assembly_size);
|
||||||
}
|
}
|
||||||
|
@@ -178,7 +178,7 @@ v3d_emit_gl_shader_state(struct v3d_context *v3d,
|
|||||||
v3d->prog.fs->prog_data.fs->discard);
|
v3d->prog.fs->prog_data.fs->discard);
|
||||||
|
|
||||||
shader.fragment_shader_uses_real_pixel_centre_w_in_addition_to_centroid_w2 =
|
shader.fragment_shader_uses_real_pixel_centre_w_in_addition_to_centroid_w2 =
|
||||||
v3d->prog.fs->prog_data.fs->uses_centroid_and_center_w;
|
v3d->prog.fs->prog_data.fs->uses_center_w;
|
||||||
|
|
||||||
shader.number_of_varyings_in_fragment_shader =
|
shader.number_of_varyings_in_fragment_shader =
|
||||||
v3d->prog.fs->prog_data.base->num_inputs;
|
v3d->prog.fs->prog_data.base->num_inputs;
|
||||||
|
Reference in New Issue
Block a user