diff options
-rw-r--r-- | src/Makefile.am | 1 | ||||
-rw-r--r-- | src/i965_composite_wm_nomask.h | 68 | ||||
-rw-r--r-- | src/i965_exa_render.c | 77 |
3 files changed, 110 insertions, 36 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index b0c6c92d..54e56579 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -94,6 +94,7 @@ i810_drv_la_SOURCES = \ i830_xaa.c \ i830_exa_render.c \ i915_exa_render.c \ + i965_composite_wm_nomask.h \ i965_exa_render.c if HAVE_GEN4ASM diff --git a/src/i965_composite_wm_nomask.h b/src/i965_composite_wm_nomask.h new file mode 100644 index 00000000..bd99dd95 --- /dev/null +++ b/src/i965_composite_wm_nomask.h @@ -0,0 +1,68 @@ + { 0x00000001, 0x2080013d, 0x00000028, 0x00000000 }, + { 0x00000040, 0x20840d3d, 0x00000028, 0x00000001 }, + { 0x00000001, 0x2088013d, 0x00000028, 0x00000000 }, + { 0x00000040, 0x208c0d3d, 0x00000028, 0x00000001 }, + { 0x00000001, 0x20c0013d, 0x0000002a, 0x00000000 }, + { 0x00000001, 0x20c4013d, 0x0000002a, 0x00000000 }, + { 0x00000040, 0x20c80d3d, 0x0000002a, 0x00000001 }, + { 0x00000040, 0x20cc0d3d, 0x0000002a, 0x00000001 }, + { 0x00000001, 0x2090013d, 0x0000002c, 0x00000000 }, + { 0x00000040, 0x20940d3d, 0x0000002c, 0x00000001 }, + { 0x00000001, 0x2098013d, 0x0000002c, 0x00000000 }, + { 0x00000040, 0x209c0d3d, 0x0000002c, 0x00000001 }, + { 0x00000001, 0x20d0013d, 0x0000002e, 0x00000000 }, + { 0x00000001, 0x20d4013d, 0x0000002e, 0x00000000 }, + { 0x00000040, 0x20d80d3d, 0x0000002e, 0x00000001 }, + { 0x00000040, 0x20dc0d3d, 0x0000002e, 0x00000001 }, + { 0x00000001, 0x20a0013d, 0x00000030, 0x00000000 }, + { 0x00000040, 0x20a40d3d, 0x00000030, 0x00000001 }, + { 0x00000001, 0x20a8013d, 0x00000030, 0x00000000 }, + { 0x00000040, 0x20ac0d3d, 0x00000030, 0x00000001 }, + { 0x00000001, 0x20e0013d, 0x00000032, 0x00000000 }, + { 0x00000001, 0x20e4013d, 0x00000032, 0x00000000 }, + { 0x00000040, 0x20e80d3d, 0x00000032, 0x00000001 }, + { 0x00000040, 0x20ec0d3d, 0x00000032, 0x00000001 }, + { 0x00000001, 0x20b0013d, 0x00000034, 0x00000000 }, + { 0x00000040, 0x20b40d3d, 0x00000034, 0x00000001 }, + { 0x00000001, 0x20b8013d, 0x00000034, 0x00000000 }, + { 0x00000040, 0x20bc0d3d, 0x00000034, 0x00000001 }, + { 0x00000001, 0x20f0013d, 0x00000036, 0x00000000 }, + { 0x00000001, 0x20f4013d, 0x00000036, 0x00000000 }, + { 0x00000040, 0x20f80d3d, 0x00000036, 0x00000001 }, + { 0x00000040, 0x20fc0d3d, 0x00000036, 0x00000001 }, + { 0x00600040, 0x208077bd, 0x008d0080, 0x00004020 }, + { 0x00600040, 0x20a077bd, 0x008d00a0, 0x00004020 }, + { 0x00600041, 0x208077bd, 0x008d0080, 0x00000060 }, + { 0x00600041, 0x20a077bd, 0x008d00a0, 0x00000060 }, + { 0x00600040, 0x208077bd, 0x008d0080, 0x0000006c }, + { 0x00600040, 0x20a077bd, 0x008d00a0, 0x0000006c }, + { 0x00600040, 0x20c077bd, 0x008d00c0, 0x00004024 }, + { 0x00600040, 0x20e077bd, 0x008d00e0, 0x00004024 }, + { 0x00600041, 0x20c077bd, 0x008d00c0, 0x00000074 }, + { 0x00600041, 0x20e077bd, 0x008d00e0, 0x00000074 }, + { 0x00600040, 0x20c077bd, 0x008d00c0, 0x0000007c }, + { 0x00600040, 0x20e077bd, 0x008d00e0, 0x0000007c }, + { 0x00600001, 0x202003be, 0x008d0080, 0x00000000 }, + { 0x00600001, 0x204003be, 0x008d00a0, 0x00000000 }, + { 0x00600001, 0x206003be, 0x008d00c0, 0x00000000 }, + { 0x00600001, 0x208003be, 0x008d00e0, 0x00000000 }, + { 0x00800031, 0x21801d29, 0x008d0000, 0x02580001 }, + { 0x00600001, 0x202003be, 0x008d0020, 0x00000000 }, + { 0x00600001, 0x204003be, 0x008d0180, 0x00000000 }, + { 0x00600001, 0x206003be, 0x008d01c0, 0x00000000 }, + { 0x00600001, 0x208003be, 0x008d0200, 0x00000000 }, + { 0x00600001, 0x20a003be, 0x008d0240, 0x00000000 }, + { 0x00600001, 0x20c003be, 0x008d01a0, 0x00000000 }, + { 0x00600001, 0x20e003be, 0x008d01e0, 0x00000000 }, + { 0x00600001, 0x210003be, 0x008d0220, 0x00000000 }, + { 0x00600001, 0x212003be, 0x008d0260, 0x00000000 }, + { 0x00800031, 0x20001d3c, 0x008d0000, 0x85a04800 }, + { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, + { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, + { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, + { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, + { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, + { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, + { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, + { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, + { 0x0000007e, 0x00000000, 0x00000000, 0x00000000 }, diff --git a/src/i965_exa_render.c b/src/i965_exa_render.c index dfa9a043..b56bf7f1 100644 --- a/src/i965_exa_render.c +++ b/src/i965_exa_render.c @@ -68,6 +68,9 @@ extern void I965EXAComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, int dstX, int dstY, int width, int height); +static void I965GetBlendCntl(int op, PicturePtr pMask, CARD32 dst_format, + CARD32 *sblend, CARD32 *dblend); + extern float scale_units[2][2]; extern Bool is_transform[2]; extern PictTransform *transform[2]; @@ -90,31 +93,31 @@ struct formatinfo { /* defined in brw_defines.h */ static struct blendinfo I965BlendOp[] = { /* Clear */ - {0, 0, BRW_BLENDFACT_ZERO, BRW_BLENDFACT_ZERO}, + {0, 0, BRW_BLENDFACTOR_ZERO, BRW_BLENDFACTOR_ZERO}, /* Src */ - {0, 0, BRW_BLENDFACT_ONE, BRW_BLENDFACT_ZERO}, + {0, 0, BRW_BLENDFACTOR_ONE, BRW_BLENDFACTOR_ZERO}, /* Dst */ - {0, 0, BRW_BLENDFACT_ZERO, BRW_BLENDFACT_ONE}, + {0, 0, BRW_BLENDFACTOR_ZERO, BRW_BLENDFACTOR_ONE}, /* Over */ - {0, 1, BRW_BLENDFACT_ONE, BRW_BLENDFACT_INV_SRC_ALPHA}, + {0, 1, BRW_BLENDFACTOR_ONE, BRW_BLENDFACTOR_INV_SRC_ALPHA}, /* OverReverse */ - {1, 0, BRW_BLENDFACT_INV_DST_ALPHA, BRW_BLENDFACT_ONE}, + {1, 0, BRW_BLENDFACTOR_INV_DST_ALPHA, BRW_BLENDFACTOR_ONE}, /* In */ - {1, 0, BRW_BLENDFACT_DST_ALPHA, BRW_BLENDFACT_ZERO}, + {1, 0, BRW_BLENDFACTOR_DST_ALPHA, BRW_BLENDFACTOR_ZERO}, /* InReverse */ - {0, 1, BRW_BLENDFACT_ZERO, BRW_BLENDFACT_SRC_ALPHA}, + {0, 1, BRW_BLENDFACTOR_ZERO, BRW_BLENDFACTOR_SRC_ALPHA}, /* Out */ - {1, 0, BRW_BLENDFACT_INV_DST_ALPHA, BRW_BLENDFACT_ZERO}, + {1, 0, BRW_BLENDFACTOR_INV_DST_ALPHA, BRW_BLENDFACTOR_ZERO}, /* OutReverse */ - {0, 1, BRW_BLENDFACT_ZERO, BRW_BLENDFACT_INV_SRC_ALPHA}, + {0, 1, BRW_BLENDFACTOR_ZERO, BRW_BLENDFACTOR_INV_SRC_ALPHA}, /* Atop */ - {1, 1, BRW_BLENDFACT_DST_ALPHA, BRW_BLENDFACT_INV_SRC_ALPHA}, + {1, 1, BRW_BLENDFACTOR_DST_ALPHA, BRW_BLENDFACTOR_INV_SRC_ALPHA}, /* AtopReverse */ - {1, 1, BRW_BLENDFACT_INV_DST_ALPHA, BRW_BLENDFACT_SRC_ALPHA}, + {1, 1, BRW_BLENDFACTOR_INV_DST_ALPHA, BRW_BLENDFACTOR_SRC_ALPHA}, /* Xor */ - {1, 1, BRW_BLENDFACT_INV_DST_ALPHA, BRW_BLENDFACT_INV_SRC_ALPHA}, + {1, 1, BRW_BLENDFACTOR_INV_DST_ALPHA, BRW_BLENDFACTOR_INV_SRC_ALPHA}, /* Add */ - {0, 0, BRW_BLENDFACT_ONE, BRW_BLENDFACT_ONE}, + {0, 0, BRW_BLENDFACTOR_ONE, BRW_BLENDFACTOR_ONE}, }; /* FIXME: surface format defined in brw_defines.h, shared Sampling engine 1.7.2*/ @@ -124,8 +127,8 @@ static struct formatinfo I965TexFormats[] = { {PICT_a8b8g8r8, BRW_SURFACEFORMAT_B8G8R8A8_UNORM }, {PICT_x8b8g8r8, BRW_SURFACEFORMAT_B8G8R8X8_UNORM }, {PICT_r5g6b5, BRW_SURFACEFORMAT_B5G6R5_UNORM }, - {PICT_a1r5g5b5, BRW_SURFACEFORMAT_B5G6R5A1_UNORM }, - {PICT_x1r5g5b5, BRW_SURFACEFORMAT_B5G6R5X1_UNORM }, + {PICT_a1r5g5b5, BRW_SURFACEFORMAT_B5G5R5A1_UNORM }, + {PICT_x1r5g5b5, BRW_SURFACEFORMAT_B5G5R5X1_UNORM }, {PICT_a8, BRW_SURFACEFORMAT_A8_UNORM }, }; @@ -140,10 +143,10 @@ static void I965GetBlendCntl(int op, PicturePtr pMask, CARD32 dst_format, * it as always 1. */ if (PICT_FORMAT_A(dst_format) == 0 && I965BlendOp[op].dst_alpha) { - if (*sblend == BRW_BLENDFACT_DST_ALPHA) - *sblend = BRW_BLENDFACT_ONE; - else if (*sblend == BRW_BLENDFACT_INV_DST_ALPHA) - *sblend = BRW_BLENDFACT_ZERO; + if (*sblend == BRW_BLENDFACTOR_DST_ALPHA) + *sblend = BRW_BLENDFACTOR_ONE; + else if (*sblend == BRW_BLENDFACTOR_INV_DST_ALPHA) + *sblend = BRW_BLENDFACTOR_ZERO; } /* If the source alpha is being used, then we should only be in a case where @@ -151,10 +154,10 @@ static void I965GetBlendCntl(int op, PicturePtr pMask, CARD32 dst_format, * channels multiplied by the source picture's alpha. */ if (pMask && pMask->componentAlpha && I965BlendOp[op].src_alpha) { - if (*dblend == BRW_BLENDFACT_SRC_ALPHA) { - *dblend = BRW_BLENDFACT_SRC_COLR; - } else if (*dblend == BRW_BLENDFACT_INV_SRC_ALPHA) { - *dblend = BRW_BLENDFACT_INV_SRC_COLR; + if (*dblend == BRW_BLENDFACTOR_SRC_ALPHA) { + *dblend = BRW_BLENDFACTOR_SRC_COLOR; + } else if (*dblend == BRW_BLENDFACTOR_INV_SRC_ALPHA) { + *dblend = BRW_BLENDFACTOR_INV_SRC_COLOR; } } @@ -173,10 +176,10 @@ static Bool I965GetDestFormat(PicturePtr pDstPicture, CARD32 *dst_format) *dst_format = BRW_SURFACEFORMAT_B5G6R5_UNORM; break; case PICT_a1r5g5b5: - *dst_format = BRW_SURFACEFORMAT_B5G6R5A1_UNORM; + *dst_format = BRW_SURFACEFORMAT_B5G5R5A1_UNORM; break; case PICT_x1r5g5b5: - *dst_format = BRW_SURFACEFORMAT_B5G6R5X1_UNORM; + *dst_format = BRW_SURFACEFORMAT_B5G5R5X1_UNORM; break; /* COLR_BUF_8BIT is special for YUV surfaces. While we may end up being * able to use it depending on how the hardware implements it, disable it @@ -250,7 +253,7 @@ I965EXACheckComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, * source value that we get to blend with. */ if (I965BlendOp[op].src_alpha && - (I965BlendOp[op].src_blend != BRW_BLENDFACT_ZERO)) + (I965BlendOp[op].src_blend != BRW_BLENDFACTOR_ZERO)) I830FALLBACK("Component alpha not supported with source " "alpha and source value blending.\n"); /* XXX: fallback now for mask with componentAlpha */ @@ -297,7 +300,7 @@ struct brw_instruction *sip_kernel; CARD32 *binding_table; int binding_table_entries; -int dest_surf_offset, src_surf_offset; +int dest_surf_offset, src_surf_offset, mask_surf_offset; int src_sampler_offset, mask_sampler_offset,vs_offset; int sf_offset, wm_offset, cc_offset, vb_offset, cc_viewport_offset; int sf_kernel_offset, ps_kernel_offset, sip_kernel_offset; @@ -308,7 +311,7 @@ int state_base_offset; float *vb; int vb_size = 4 * 4 ; /* 4 DWORDS per vertex, 4 vertices for TRIFAN*/ -int src_blend, dst_blend; +CARD32 src_blend, dst_blend; static const CARD32 sip_kernel_static[][4] = { /* wait (1) a0<1>UW a145<0,1,0>UW { align1 + } */ @@ -380,6 +383,8 @@ static const CARD32 sf_kernel_static[][4] = { }; /* ps kernels */ +#define PS_KERNEL_NUM_GRF 32 +#define PS_MAX_THREADS 32 /* 1: no mask */ static const CARD32 ps_kernel_static_nomask [][4] = { #include "i965_composite_wm_nomask.h" @@ -387,12 +392,12 @@ static const CARD32 ps_kernel_static_nomask [][4] = { /* 2: mask with componentAlpha, src * mask color, XXX: later */ static const CARD32 ps_kernel_static_maskca [][4] = { - #include "i965_composite_wm_maskca.h" +/*#include "i965_composite_wm_maskca.h" */ }; /* 3: mask without componentAlpha, src * mask alpha */ static const CARD32 ps_kernel_static_masknoca [][4] = { - #include "i965_composite_wm_masknoca.h" +/*#include "i965_composite_wm_masknoca.h" */ }; Bool @@ -403,9 +408,8 @@ I965EXAPrepareComposite(int op, PicturePtr pSrcPicture, ScrnInfoPtr pScrn = xf86Screens[pSrcPicture->pDrawable->pScreen->myNum]; I830Ptr pI830 = I830PTR(pScrn); CARD32 src_offset, src_pitch; - CARD32 mask_offset, mask_pitch; + CARD32 mask_offset = 0, mask_pitch = 0; CARD32 dst_format, dst_offset, dst_pitch; - CARD32 blendctl; ErrorF("i965 prepareComposite\n"); @@ -437,7 +441,6 @@ ErrorF("i965 prepareComposite\n"); scale_units[1][1] = pMask->drawable.height; } -/* FIXME */ /* setup 3d pipeline state */ binding_table_entries = 2; /* default no mask */ @@ -602,7 +605,7 @@ ErrorF("i965 prepareComposite\n"); // cc_state->cc5.ia_src_blend_factor = BRW_BLENDFACTOR_ONE; // cc_state->cc5.ia_dest_blend_factor = BRW_BLENDFACTOR_ONE; cc_state->cc6.blend_function = BRW_BLENDFUNCTION_ADD; - I965GetBlendCntl(op, pMask, pDstPicture->format, + I965GetBlendCntl(op, pMaskPicture, pDstPicture->format, &src_blend, &dst_blend); cc_state->cc6.src_blend_factor = src_blend; cc_state->cc6.dest_blend_factor = dst_blend; @@ -703,7 +706,7 @@ ErrorF("i965 prepareComposite\n"); /* PS kernel use this sampler */ memset(src_sampler_state, 0, sizeof(*src_sampler_state)); - src_sampler_state->ss0.lod_peclamp = 1; /* GL mode */ + src_sampler_state->ss0.lod_preclamp = 1; /* GL mode */ switch(pSrcPicture->filter) { case PictFilterNearest: src_sampler_state->ss0.min_filter = BRW_MAPFILTER_NEAREST; @@ -733,7 +736,7 @@ ErrorF("i965 prepareComposite\n"); if (pMask) { memset(mask_sampler_state, 0, sizeof(*mask_sampler_state)); - mask_sampler_state->ss0.lod_peclamp = 1; /* GL mode */ + mask_sampler_state->ss0.lod_preclamp = 1; /* GL mode */ switch(pMaskPicture->filter) { case PictFilterNearest: mask_sampler_state->ss0.min_filter = BRW_MAPFILTER_NEAREST; @@ -1065,6 +1068,8 @@ void I965EXAComposite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, int dstX, int dstY, int w, int h) { + ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; + I830Ptr pI830 = I830PTR(pScrn); int srcXend, srcYend, maskXend, maskYend; PictVector v; int pMask = 1, i = 0; |