diff options
Diffstat (limited to 'src/sna/brw')
-rw-r--r-- | src/sna/brw/brw.h | 3 | ||||
-rw-r--r-- | src/sna/brw/brw_test_gen7.c | 13 | ||||
-rw-r--r-- | src/sna/brw/brw_wm.c | 96 |
3 files changed, 112 insertions, 0 deletions
diff --git a/src/sna/brw/brw.h b/src/sna/brw/brw.h index f0f3ac87..e5fa72f9 100644 --- a/src/sna/brw/brw.h +++ b/src/sna/brw/brw.h @@ -12,3 +12,6 @@ bool brw_wm_kernel__projective(struct brw_compile *p, int dispatch_width); bool brw_wm_kernel__projective_mask(struct brw_compile *p, int dispatch_width); bool brw_wm_kernel__projective_mask_ca(struct brw_compile *p, int dispatch_width); bool brw_wm_kernel__projective_mask_sa(struct brw_compile *p, int dispatch_width); + +bool brw_wm_kernel__affine_opacity(struct brw_compile *p, int dispatch_width); +bool brw_wm_kernel__projective_opacity(struct brw_compile *p, int dispatch_width); diff --git a/src/sna/brw/brw_test_gen7.c b/src/sna/brw/brw_test_gen7.c index c3f0e231..085b25cc 100644 --- a/src/sna/brw/brw_test_gen7.c +++ b/src/sna/brw/brw_test_gen7.c @@ -167,6 +167,17 @@ static void gen7_ps_nomask_projective(void) compare(ps_kernel_nomask_projective); } +static void gen7_ps_opacity(void) +{ + uint32_t store[1024]; + struct brw_compile p; + + brw_compile_init(&p, GEN, store); + brw_wm_kernel__affine_opacity(&p, 16); + + compare(ps_kernel_nomask_affine); +} + void brw_test_gen7(void) { gen7_ps_nomask_affine(); @@ -175,4 +186,6 @@ void brw_test_gen7(void) gen7_ps_masksa_affine(); gen7_ps_nomask_projective(); + + gen7_ps_opacity(); } diff --git a/src/sna/brw/brw_wm.c b/src/sna/brw/brw_wm.c index f96881af..bd4003dd 100644 --- a/src/sna/brw/brw_wm.c +++ b/src/sna/brw/brw_wm.c @@ -323,6 +323,68 @@ done: brw_fb_write(p, dw); } +static void brw_wm_write__opacity(struct brw_compile *p, int dw, + int src, int mask) +{ + int n; + + if (dw == 8 && p->gen >= 60) { + brw_set_compression_control(p, BRW_COMPRESSION_NONE); + + brw_MUL(p, + brw_message_reg(2), + brw_vec8_grf(src+0, 0), + brw_vec1_grf(mask, 3)); + brw_MUL(p, + brw_message_reg(3), + brw_vec8_grf(src+1, 0), + brw_vec1_grf(mask, 3)); + brw_MUL(p, + brw_message_reg(4), + brw_vec8_grf(src+2, 0), + brw_vec1_grf(mask, 3)); + brw_MUL(p, + brw_message_reg(5), + brw_vec8_grf(src+3, 0), + brw_vec1_grf(mask, 3)); + + goto done; + } + + brw_set_compression_control(p, BRW_COMPRESSION_COMPRESSED); + + for (n = 0; n < 4; n++) { + if (p->gen >= 60) { + brw_MUL(p, + brw_message_reg(2 + 2*n), + brw_vec8_grf(src + 2*n, 0), + brw_vec1_grf(mask, 3)); + } else if (p->gen >= 45 && dw == 16) { + brw_MUL(p, + brw_message_reg(2 + n + BRW_MRF_COMPR4), + brw_vec8_grf(src + 2*n, 0), + brw_vec1_grf(mask, 3)); + } else { + brw_set_compression_control(p, BRW_COMPRESSION_NONE); + brw_MUL(p, + brw_message_reg(2 + n), + brw_vec8_grf(src + 2*n, 0), + brw_vec1_grf(mask, 3)); + + if (dw == 16) { + brw_set_compression_control(p, BRW_COMPRESSION_2NDHALF); + brw_MUL(p, + brw_message_reg(2 + n + 4), + brw_vec8_grf(src + 2*n+1, 0), + brw_vec1_grf(mask, 3)); + } + } + } + +done: + brw_fb_write(p, dw); +} + static void brw_wm_write__mask_ca(struct brw_compile *p, int dw, int src, int mask) { @@ -597,3 +659,37 @@ brw_wm_kernel__projective_mask_sa(struct brw_compile *p, int dispatch) return true; } + +bool +brw_wm_kernel__affine_opacity(struct brw_compile *p, int dispatch) +{ + int src, mask; + + if (p->gen < 60) { + brw_wm_xy(p, dispatch); + mask = 4; + } else + mask = dispatch == 16 ? 8 : 6; + + src = brw_wm_affine(p, dispatch, 0, 1, 12); + brw_wm_write__opacity(p, dispatch, src, mask); + + return true; +} + +bool +brw_wm_kernel__projective_opacity(struct brw_compile *p, int dispatch) +{ + int src, mask; + + if (p->gen < 60) { + brw_wm_xy(p, dispatch); + mask = 4; + } else + mask = dispatch == 16 ? 8 : 6; + + src = brw_wm_projective(p, dispatch, 0, 1, 12); + brw_wm_write__opacity(p, dispatch, src, mask); + + return true; +} |