summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2016-07-11 15:00:37 -0700
committerKenneth Graunke <[email protected]>2016-07-15 17:16:54 -0700
commiteefbbb943e81b182a1c5ef6cac8425686f5b636c (patch)
treea7457904c7a429d7ad31a7ee0d56e7f56b6f026c /src
parent783511e605160bcfc9132b6fbc83c8816262effd (diff)
i965: Make a barycentric_mode() helper function.
This combines two copies of basically the same code. Signed-off-by: Kenneth Graunke <[email protected]> Reviewed-by: Matt Turner <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/mesa/drivers/dri/i965/brw_fs.cpp100
1 files changed, 49 insertions, 51 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
index bc63b2ca600..c6f193a4a39 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -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;