i965: Make a barycentric_mode() helper function.

This combines two copies of basically the same code.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Matt Turner <mattst88@gmail.com>
This commit is contained in:
Kenneth Graunke 2016-07-11 15:00:37 -07:00
parent 783511e605
commit eefbbb943e
1 changed files with 49 additions and 51 deletions

View File

@ -1070,30 +1070,48 @@ fs_visitor::emit_fragcoord_interpolation()
return reg;
}
static enum brw_barycentric_mode
barycentric_mode(enum glsl_interp_qualifier mode,
bool is_centroid, bool is_sample)
{
unsigned bary;
/* Barycentric modes don't make sense for flat inputs. */
assert(mode != INTERP_QUALIFIER_FLAT);
if (is_sample) {
bary = BRW_BARYCENTRIC_PERSPECTIVE_SAMPLE;
} else if (is_centroid) {
bary = BRW_BARYCENTRIC_PERSPECTIVE_CENTROID;
} else {
bary = BRW_BARYCENTRIC_PERSPECTIVE_PIXEL;
}
if (mode == INTERP_QUALIFIER_NOPERSPECTIVE)
bary += 3;
return (enum brw_barycentric_mode) bary;
}
/**
* Turn one of the two CENTROID barycentric modes into PIXEL mode.
*/
static enum brw_barycentric_mode
centroid_to_pixel(enum brw_barycentric_mode bary)
{
assert(bary == BRW_BARYCENTRIC_PERSPECTIVE_CENTROID ||
bary == BRW_BARYCENTRIC_NONPERSPECTIVE_CENTROID);
return (enum brw_barycentric_mode) ((unsigned) bary - 1);
}
fs_inst *
fs_visitor::emit_linterp(const fs_reg &attr, const fs_reg &interp,
glsl_interp_qualifier interpolation_mode,
bool is_centroid, bool is_sample)
{
brw_barycentric_mode barycoord_mode;
if (true) {
if (is_centroid) {
if (interpolation_mode == INTERP_QUALIFIER_SMOOTH)
barycoord_mode = BRW_BARYCENTRIC_PERSPECTIVE_CENTROID;
else
barycoord_mode = BRW_BARYCENTRIC_NONPERSPECTIVE_CENTROID;
} else if (is_sample) {
if (interpolation_mode == INTERP_QUALIFIER_SMOOTH)
barycoord_mode = BRW_BARYCENTRIC_PERSPECTIVE_SAMPLE;
else
barycoord_mode = BRW_BARYCENTRIC_NONPERSPECTIVE_SAMPLE;
} else {
if (interpolation_mode == INTERP_QUALIFIER_SMOOTH)
barycoord_mode = BRW_BARYCENTRIC_PERSPECTIVE_PIXEL;
else
barycoord_mode = BRW_BARYCENTRIC_NONPERSPECTIVE_PIXEL;
}
}
brw_barycentric_mode barycoord_mode =
barycentric_mode(interpolation_mode, is_centroid, is_sample);
return bld.emit(FS_OPCODE_LINTERP, attr,
this->delta_xy[barycoord_mode], interp);
}
@ -6333,49 +6351,29 @@ brw_compute_barycentric_interp_modes(const struct brw_device_info *devinfo,
unsigned barycentric_interp_modes = 0;
nir_foreach_variable(var, &shader->inputs) {
enum glsl_interp_qualifier interp_qualifier =
(enum glsl_interp_qualifier)var->data.interpolation;
bool is_centroid = var->data.centroid;
bool is_sample = var->data.sample;
/* Ignore WPOS and FACE, because they don't require interpolation. */
if (var->data.location == VARYING_SLOT_POS ||
var->data.location == VARYING_SLOT_FACE)
continue;
/* Flat inputs don't need barycentric modes. */
if (var->data.interpolation == INTERP_QUALIFIER_FLAT)
continue;
/* Determine the set (or sets) of barycentric coordinates needed to
* interpolate this variable. Note that when
* brw->needs_unlit_centroid_workaround is set, centroid interpolation
* uses PIXEL interpolation for unlit pixels and CENTROID interpolation
* for lit pixels, so we need both sets of barycentric coordinates.
*/
if (interp_qualifier == INTERP_QUALIFIER_NOPERSPECTIVE) {
if (is_centroid) {
barycentric_interp_modes |=
1 << BRW_BARYCENTRIC_NONPERSPECTIVE_CENTROID;
} else if (is_sample) {
barycentric_interp_modes |=
1 << BRW_BARYCENTRIC_NONPERSPECTIVE_SAMPLE;
}
if ((!is_centroid && !is_sample) ||
devinfo->needs_unlit_centroid_workaround) {
barycentric_interp_modes |=
1 << BRW_BARYCENTRIC_NONPERSPECTIVE_PIXEL;
}
} else if (interp_qualifier == INTERP_QUALIFIER_SMOOTH) {
if (is_centroid) {
barycentric_interp_modes |=
1 << BRW_BARYCENTRIC_PERSPECTIVE_CENTROID;
} else if (is_sample) {
barycentric_interp_modes |=
1 << BRW_BARYCENTRIC_PERSPECTIVE_SAMPLE;
}
if ((!is_centroid && !is_sample) ||
devinfo->needs_unlit_centroid_workaround) {
barycentric_interp_modes |=
1 << BRW_BARYCENTRIC_PERSPECTIVE_PIXEL;
}
}
enum brw_barycentric_mode bary_mode =
barycentric_mode((glsl_interp_qualifier) var->data.interpolation,
var->data.centroid, var->data.sample);
barycentric_interp_modes |= 1 << bary_mode;
if (var->data.centroid && devinfo->needs_unlit_centroid_workaround)
barycentric_interp_modes |= 1 << centroid_to_pixel(bary_mode);
}
return barycentric_interp_modes;