summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/drivers/ilo/shader/ilo_shader_fs.c63
1 files changed, 46 insertions, 17 deletions
diff --git a/src/gallium/drivers/ilo/shader/ilo_shader_fs.c b/src/gallium/drivers/ilo/shader/ilo_shader_fs.c
index 0a65498b536..817b12743bb 100644
--- a/src/gallium/drivers/ilo/shader/ilo_shader_fs.c
+++ b/src/gallium/drivers/ilo/shader/ilo_shader_fs.c
@@ -46,7 +46,12 @@ struct fs_compile_context {
int dispatch_mode;
struct {
- int barycentric_interps[BRW_WM_BARYCENTRIC_INTERP_MODE_COUNT];
+ int interp_perspective_pixel;
+ int interp_perspective_centroid;
+ int interp_perspective_sample;
+ int interp_nonperspective_pixel;
+ int interp_nonperspective_centroid;
+ int interp_nonperspective_sample;
int source_depth;
int source_w;
int pos_offset;
@@ -157,7 +162,7 @@ fetch_attr(struct fs_compile_context *fcc, struct toy_dst dst, int slot)
struct toy_compiler *tc = &fcc->tc;
struct toy_dst real_dst[4];
bool is_const = false;
- int grf, mode, ch;
+ int grf, interp, ch;
tdst_transpose(dst, real_dst);
@@ -169,9 +174,9 @@ fetch_attr(struct fs_compile_context *fcc, struct toy_dst dst, int slot)
break;
case TGSI_INTERPOLATE_LINEAR:
if (fcc->tgsi.inputs[slot].centroid)
- mode = BRW_WM_NONPERSPECTIVE_CENTROID_BARYCENTRIC;
+ interp = fcc->payloads[0].interp_nonperspective_centroid;
else
- mode = BRW_WM_NONPERSPECTIVE_PIXEL_BARYCENTRIC;
+ interp = fcc->payloads[0].interp_nonperspective_pixel;
break;
case TGSI_INTERPOLATE_COLOR:
if (fcc->variant->u.fs.flatshade) {
@@ -181,13 +186,13 @@ fetch_attr(struct fs_compile_context *fcc, struct toy_dst dst, int slot)
/* fall through */
case TGSI_INTERPOLATE_PERSPECTIVE:
if (fcc->tgsi.inputs[slot].centroid)
- mode = BRW_WM_PERSPECTIVE_CENTROID_BARYCENTRIC;
+ interp = fcc->payloads[0].interp_perspective_centroid;
else
- mode = BRW_WM_PERSPECTIVE_PIXEL_BARYCENTRIC;
+ interp = fcc->payloads[0].interp_perspective_pixel;
break;
default:
assert(!"unexpected FS interpolation");
- mode = BRW_WM_PERSPECTIVE_PIXEL_BARYCENTRIC;
+ interp = fcc->payloads[0].interp_perspective_pixel;
break;
}
@@ -210,7 +215,7 @@ fetch_attr(struct fs_compile_context *fcc, struct toy_dst dst, int slot)
attr[2] = tsrc(TOY_FILE_GRF, grf + 1, 0);
attr[3] = tsrc(TOY_FILE_GRF, grf + 1, 4 * 4);
- uv = tsrc(TOY_FILE_GRF, fcc->payloads[0].barycentric_interps[mode], 0);
+ uv = tsrc(TOY_FILE_GRF, interp, 0);
for (ch = 0; ch < 4; ch++) {
tc_add2(tc, BRW_OPCODE_PLN, real_dst[ch],
@@ -1667,27 +1672,51 @@ fs_setup_payloads(struct fs_compile_context *fcc)
grf += (fcc->dispatch_mode == GEN6_WM_32_DISPATCH_ENABLE) ? 2 : 1;
for (i = 0; i < Elements(fcc->payloads); i++) {
- int interp;
+ const int reg_scale =
+ (fcc->dispatch_mode == GEN6_WM_8_DISPATCH_ENABLE) ? 1 : 2;
/* r3-r26 or r32-r55: barycentric interpolation parameters */
- for (interp = 0; interp < BRW_WM_BARYCENTRIC_INTERP_MODE_COUNT; interp++) {
- if (!(sh->in.barycentric_interpolation_mode & (1 << interp)))
- continue;
-
- fcc->payloads[i].barycentric_interps[interp] = grf;
- grf += (fcc->dispatch_mode == GEN6_WM_8_DISPATCH_ENABLE) ? 2 : 4;
+ if (sh->in.barycentric_interpolation_mode &
+ (1 << BRW_WM_PERSPECTIVE_PIXEL_BARYCENTRIC)) {
+ fcc->payloads[i].interp_perspective_pixel = grf;
+ grf += 2 * reg_scale;
+ }
+ if (sh->in.barycentric_interpolation_mode &
+ (1 << BRW_WM_PERSPECTIVE_CENTROID_BARYCENTRIC)) {
+ fcc->payloads[i].interp_perspective_centroid = grf;
+ grf += 2 * reg_scale;
+ }
+ if (sh->in.barycentric_interpolation_mode &
+ (1 << BRW_WM_PERSPECTIVE_SAMPLE_BARYCENTRIC)) {
+ fcc->payloads[i].interp_perspective_sample = grf;
+ grf += 2 * reg_scale;
+ }
+ if (sh->in.barycentric_interpolation_mode &
+ (1 << BRW_WM_NONPERSPECTIVE_PIXEL_BARYCENTRIC)) {
+ fcc->payloads[i].interp_nonperspective_pixel = grf;
+ grf += 2 * reg_scale;
+ }
+ if (sh->in.barycentric_interpolation_mode &
+ (1 << BRW_WM_NONPERSPECTIVE_CENTROID_BARYCENTRIC)) {
+ fcc->payloads[i].interp_nonperspective_centroid = grf;
+ grf += 2 * reg_scale;
+ }
+ if (sh->in.barycentric_interpolation_mode &
+ (1 << BRW_WM_NONPERSPECTIVE_SAMPLE_BARYCENTRIC)) {
+ fcc->payloads[i].interp_nonperspective_sample = grf;
+ grf += 2 * reg_scale;
}
/* r27-r28 or r56-r57: interpoloated depth */
if (sh->in.has_pos) {
fcc->payloads[i].source_depth = grf;
- grf += (fcc->dispatch_mode == GEN6_WM_8_DISPATCH_ENABLE) ? 1 : 2;
+ grf += 1 * reg_scale;
}
/* r29-r30 or r58-r59: interpoloated w */
if (sh->in.has_pos) {
fcc->payloads[i].source_w = grf;
- grf += (fcc->dispatch_mode == GEN6_WM_8_DISPATCH_ENABLE) ? 1 : 2;
+ grf += 1 * reg_scale;
}
/* r31 or r60: position offset */