diff options
author | Eric Anholt <eric@anholt.net> | 2008-04-16 21:39:58 -0700 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2008-04-17 11:08:28 -0700 |
commit | 2c135ef8ac40f8e7cd071de7414adfae019f9198 (patch) | |
tree | 451b2d770315252007cfc457c508ee5177a32495 | |
parent | c3fb62df4e60b63295f94c99b3c5de70dbf94e1c (diff) |
Make the binding table and surface state be arrays to reduce syncing.
-rw-r--r-- | src/i830.h | 1 | ||||
-rw-r--r-- | src/i830_accel.c | 3 | ||||
-rw-r--r-- | src/i965_render.c | 63 |
3 files changed, 35 insertions, 32 deletions
@@ -831,7 +831,6 @@ Bool i915_prepare_composite(int op, PicturePtr pSrc, PicturePtr pMask, unsigned int gen4_render_state_size(ScrnInfoPtr pScrn); void gen4_render_state_init(ScrnInfoPtr pScrn); void gen4_render_state_cleanup(ScrnInfoPtr pScrn); -void gen4_render_state_reset(ScrnInfoPtr pScrn); Bool i965_check_composite(int op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst); Bool i965_prepare_composite(int op, PicturePtr pSrc, PicturePtr pMask, diff --git a/src/i830_accel.c b/src/i830_accel.c index 0194f00d..953a73bc 100644 --- a/src/i830_accel.c +++ b/src/i830_accel.c @@ -205,9 +205,6 @@ I830Sync(ScrnInfoPtr pScrn) pI830->LpRing->space = pI830->LpRing->mem->size - 8; pI830->nextColorExpandBuf = 0; - - if (IS_I965G(pI830)) - gen4_render_state_reset(pScrn); } void diff --git a/src/i965_render.c b/src/i965_render.c index 95ac0631..3c553de1 100644 --- a/src/i965_render.c +++ b/src/i965_render.c @@ -479,12 +479,9 @@ typedef struct _gen4_state { WM_STATE_DECL (masknoca_affine); WM_STATE_DECL (masknoca_projective); - uint32_t binding_table[16]; /* Only use 3, but pad to 64 bytes */ + uint32_t binding_table[128]; - struct brw_surface_state_padded dst_surface; - struct brw_surface_state_padded src_surface; - struct brw_surface_state_padded mask_surface; - uint8_t surface_pad[32]; + struct brw_surface_state_padded surface_state[32]; /* Index by [src_filter][src_extend][mask_filter][mask_extend]. Two of * the structs happen to add to 32 bytes. @@ -510,6 +507,9 @@ typedef struct _gen4_state { struct gen4_render_state { gen4_state_t *card_state; uint32_t card_state_offset; + + int binding_table_index; + int surface_state_index; }; /** @@ -902,6 +902,7 @@ i965_prepare_composite(int op, PicturePtr pSrcPicture, I830Ptr pI830 = I830PTR(pScrn); struct gen4_render_state *render_state= pI830->gen4_render_state; gen4_state_t *card_state = render_state->card_state; + struct brw_surface_state_padded *ss; uint32_t sf_state_offset; sampler_state_filter_t src_filter, mask_filter; sampler_state_extend_t src_extend, mask_extend; @@ -914,6 +915,7 @@ i965_prepare_composite(int op, PicturePtr pSrcPicture, char *state_base; int state_base_offset; uint32_t src_blend, dst_blend; + uint32_t *binding_table; IntelEmitInvarientState(pScrn); *pI830->last_3d = LAST_3D_RENDER; @@ -953,34 +955,48 @@ i965_prepare_composite(int op, PicturePtr pSrcPicture, urb_cs_start = urb_sf_start + urb_sf_size; urb_cs_size = URB_CS_ENTRIES * URB_CS_ENTRY_SIZE; - /* Because we only have a single static buffer for our state currently, - * we have to sync before updating it every time. - */ - i830WaitSync(pScrn); - i965_get_blend_cntl(op, pMaskPicture, pDstPicture->format, &src_blend, &dst_blend); + if ((render_state->binding_table_index + 3 >= + ARRAY_SIZE(card_state->binding_table)) || + (render_state->surface_state_index + 3 >= + ARRAY_SIZE(card_state->surface_state))) + { + i830WaitSync(pScrn); + render_state->binding_table_index = 0; + render_state->surface_state_index = 0; + } + + binding_table = card_state->binding_table + + render_state->binding_table_index; + ss = card_state->surface_state + render_state->surface_state_index; + /* We only use 2 or 3 entries, but the table has to be 32-byte + * aligned. + */ + render_state->binding_table_index += 8; + render_state->surface_state_index += (pMask != NULL) ? 3 : 2; + /* Set up and bind the state buffer for the destination surface */ - card_state->binding_table[0] = state_base_offset + + binding_table[0] = state_base_offset + i965_set_picture_surface_state(pScrn, - &card_state->dst_surface.state, + &ss[0].state, pDstPicture, pDst, TRUE); /* Set up and bind the source surface state buffer */ - card_state->binding_table[1] = state_base_offset + + binding_table[1] = state_base_offset + i965_set_picture_surface_state(pScrn, - &card_state->src_surface.state, + &ss[1].state, pSrcPicture, pSrc, FALSE); if (pMask) { /* Set up and bind the mask surface state buffer */ - card_state->binding_table[2] = state_base_offset + + binding_table[2] = state_base_offset + i965_set_picture_surface_state(pScrn, - &card_state->mask_surface.state, + &ss[2].state, pMaskPicture, pMask, FALSE); } else { - card_state->binding_table[2] = 0; + binding_table[2] = 0; } src_filter = sampler_state_filter_from_picture (pSrcPicture->filter); @@ -1062,8 +1078,8 @@ i965_prepare_composite(int op, PicturePtr pSrcPicture, OUT_BATCH(0); /* clip */ OUT_BATCH(0); /* sf */ /* Only the PS uses the binding table */ - assert((offsetof(gen4_state_t, binding_table) & 31) == 0); - OUT_BATCH(state_base_offset + offsetof(gen4_state_t, binding_table)); + assert((((unsigned char *)binding_table - pI830->FbBase) & 31) == 0); + OUT_BATCH((unsigned char *)binding_table - pI830->FbBase); /* The drawing rectangle clipping is always on. Set it to values that * shouldn't do any clipping. @@ -1454,15 +1470,6 @@ gen4_render_state_cleanup(ScrnInfoPtr pScrn) pI830->gen4_render_state->card_state = NULL; } -/** - * Called when the hardware is idled and flushed, so we know we can - * reuse the buffer contents. - */ -void -gen4_render_state_reset(ScrnInfoPtr pScrn) -{ -} - unsigned int gen4_render_state_size(ScrnInfoPtr pScrn) { |