mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-28 21:10:12 +01:00
i965/msaa: Add backend support for centroid interpolation.
This patch causes the fragment shader to be configured correctly (and
the correct code to be generated) for centroid interpolation. This
required two changes: brw_compute_barycentric_interp_modes() needs to
determine when centroid barycentric coordinates need to be included in
the pixel shader thread payload, and
fs_visitor::emit_general_interpolation() needs to interpolate using
the correct set of barycentric coordinates.
Fixes piglit tests "EXT_framebuffer_multisample/interpolation {2,4}
centroid-edges" on i965.
Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
parent
cf0e7aa9f8
commit
d1056541e2
3 changed files with 32 additions and 11 deletions
|
|
@ -421,13 +421,21 @@ fs_visitor::emit_fragcoord_interpolation(ir_variable *ir)
|
|||
|
||||
fs_inst *
|
||||
fs_visitor::emit_linterp(const fs_reg &attr, const fs_reg &interp,
|
||||
glsl_interp_qualifier interpolation_mode)
|
||||
glsl_interp_qualifier interpolation_mode,
|
||||
bool is_centroid)
|
||||
{
|
||||
brw_wm_barycentric_interp_mode barycoord_mode;
|
||||
if (interpolation_mode == INTERP_QUALIFIER_SMOOTH)
|
||||
barycoord_mode = BRW_WM_PERSPECTIVE_PIXEL_BARYCENTRIC;
|
||||
else
|
||||
barycoord_mode = BRW_WM_NONPERSPECTIVE_PIXEL_BARYCENTRIC;
|
||||
if (is_centroid) {
|
||||
if (interpolation_mode == INTERP_QUALIFIER_SMOOTH)
|
||||
barycoord_mode = BRW_WM_PERSPECTIVE_CENTROID_BARYCENTRIC;
|
||||
else
|
||||
barycoord_mode = BRW_WM_NONPERSPECTIVE_CENTROID_BARYCENTRIC;
|
||||
} else {
|
||||
if (interpolation_mode == INTERP_QUALIFIER_SMOOTH)
|
||||
barycoord_mode = BRW_WM_PERSPECTIVE_PIXEL_BARYCENTRIC;
|
||||
else
|
||||
barycoord_mode = BRW_WM_NONPERSPECTIVE_PIXEL_BARYCENTRIC;
|
||||
}
|
||||
return emit(FS_OPCODE_LINTERP, attr,
|
||||
this->delta_x[barycoord_mode],
|
||||
this->delta_y[barycoord_mode], interp);
|
||||
|
|
@ -496,7 +504,8 @@ fs_visitor::emit_general_interpolation(ir_variable *ir)
|
|||
emit(BRW_OPCODE_MOV, attr, fs_reg(1.0f));
|
||||
} else {
|
||||
struct brw_reg interp = interp_reg(location, k);
|
||||
emit_linterp(attr, fs_reg(interp), interpolation_mode);
|
||||
emit_linterp(attr, fs_reg(interp), interpolation_mode,
|
||||
ir->centroid);
|
||||
if (intel->gen < 6) {
|
||||
emit(BRW_OPCODE_MUL, attr, attr, this->pixel_w);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -543,7 +543,8 @@ public:
|
|||
void emit_dummy_fs();
|
||||
fs_reg *emit_fragcoord_interpolation(ir_variable *ir);
|
||||
fs_inst *emit_linterp(const fs_reg &attr, const fs_reg &interp,
|
||||
glsl_interp_qualifier interpolation_mode);
|
||||
glsl_interp_qualifier interpolation_mode,
|
||||
bool is_centroid);
|
||||
fs_reg *emit_frontfacing_interpolation(ir_variable *ir);
|
||||
fs_reg *emit_general_interpolation(ir_variable *ir);
|
||||
void emit_interpolation_setup_gen4();
|
||||
|
|
|
|||
|
|
@ -143,6 +143,7 @@ brw_compute_barycentric_interp_modes(bool shade_model_flat,
|
|||
for (attr = 0; attr < FRAG_ATTRIB_MAX; ++attr) {
|
||||
enum glsl_interp_qualifier interp_qualifier =
|
||||
fprog->InterpQualifier[attr];
|
||||
bool is_centroid = fprog->IsCentroid & BITFIELD64_BIT(attr);
|
||||
bool is_gl_Color = attr == FRAG_ATTRIB_COL0 || attr == FRAG_ATTRIB_COL1;
|
||||
|
||||
/* Ignore unused inputs. */
|
||||
|
|
@ -154,13 +155,23 @@ brw_compute_barycentric_interp_modes(bool shade_model_flat,
|
|||
continue;
|
||||
|
||||
if (interp_qualifier == INTERP_QUALIFIER_NOPERSPECTIVE) {
|
||||
barycentric_interp_modes |=
|
||||
1 << BRW_WM_NONPERSPECTIVE_PIXEL_BARYCENTRIC;
|
||||
if (is_centroid) {
|
||||
barycentric_interp_modes |=
|
||||
1 << BRW_WM_NONPERSPECTIVE_CENTROID_BARYCENTRIC;
|
||||
} else {
|
||||
barycentric_interp_modes |=
|
||||
1 << BRW_WM_NONPERSPECTIVE_PIXEL_BARYCENTRIC;
|
||||
}
|
||||
} else if (interp_qualifier == INTERP_QUALIFIER_SMOOTH ||
|
||||
(!(shade_model_flat && is_gl_Color) &&
|
||||
interp_qualifier == INTERP_QUALIFIER_NONE)) {
|
||||
barycentric_interp_modes |=
|
||||
1 << BRW_WM_PERSPECTIVE_PIXEL_BARYCENTRIC;
|
||||
if (is_centroid) {
|
||||
barycentric_interp_modes |=
|
||||
1 << BRW_WM_PERSPECTIVE_CENTROID_BARYCENTRIC;
|
||||
} else {
|
||||
barycentric_interp_modes |=
|
||||
1 << BRW_WM_PERSPECTIVE_PIXEL_BARYCENTRIC;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue