summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeil Roberts <neil@linux.intel.com>2015-09-11 18:09:46 +0100
committerNeil Roberts <neil@linux.intel.com>2015-11-05 10:33:16 +0100
commit1a22b12fc51e80c20c700f93904ffd12caa73473 (patch)
tree0c5fb0f5645e1aa59578c84605376d027279909f
parenta6804654283a9d03bee92d61eee5b1d036c8db68 (diff)
i965/meta: Support 16x MSAA in the meta stencil blit
The destination rectangle is now drawn at 4x4 the size and the shader code to calculate the sample number is adjusted accordingly. Acked-by: Ben Widawsky <ben@bwidawsk.net>
-rw-r--r--src/mesa/drivers/dri/i965/brw_meta_stencil_blit.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_meta_stencil_blit.c b/src/mesa/drivers/dri/i965/brw_meta_stencil_blit.c
index cbbb919c6e..4e9aa94950 100644
--- a/src/mesa/drivers/dri/i965/brw_meta_stencil_blit.c
+++ b/src/mesa/drivers/dri/i965/brw_meta_stencil_blit.c
@@ -163,6 +163,13 @@ static const char *fs_tmpl =
" txl_coords.x = ((X & int(0xfff8)) >> 2) | (X & int(0x1));\n"
" txl_coords.y = ((Y & int(0xfffc)) >> 1) | (Y & int(0x1));\n"
" sample_index = (X & 0x4) | (Y & 0x2) | ((X & 0x2) >> 1);\n"
+ " break;\n"
+ " case 16:\n"
+ " txl_coords.x = ((X & int(0xfff8)) >> 2) | (X & int(0x1));\n"
+ " txl_coords.y = ((Y & int(0xfff8)) >> 2) | (Y & int(0x1));\n"
+ " sample_index = (((Y & 0x4) << 1) | (X & 0x4) | (Y & 0x2) |\n"
+ " ((X & 0x2) >> 1));\n"
+ " break;\n"
" }\n"
"}\n"
"\n"
@@ -313,11 +320,16 @@ adjust_msaa(struct blit_dims *dims, int num_samples)
dims->dst_x0 *= 2;
dims->dst_x1 *= 2;
} else if (num_samples) {
- const int x_num_samples = num_samples / 2;
- dims->dst_x0 = ROUND_DOWN_TO(dims->dst_x0 * x_num_samples, num_samples);
- dims->dst_y0 = ROUND_DOWN_TO(dims->dst_y0 * 2, 4);
- dims->dst_x1 = ALIGN(dims->dst_x1 * x_num_samples, num_samples);
- dims->dst_y1 = ALIGN(dims->dst_y1 * 2, 4);
+ const int y_num_samples = num_samples >= 16 ? 4 : 2;
+ const int x_num_samples = num_samples / y_num_samples;
+ dims->dst_x0 = ROUND_DOWN_TO(dims->dst_x0 * x_num_samples,
+ x_num_samples * 2);
+ dims->dst_y0 = ROUND_DOWN_TO(dims->dst_y0 * y_num_samples,
+ y_num_samples * 2);
+ dims->dst_x1 = ALIGN(dims->dst_x1 * x_num_samples,
+ x_num_samples * 2);
+ dims->dst_y1 = ALIGN(dims->dst_y1 * y_num_samples,
+ y_num_samples * 2);
}
}