summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2008-04-16 21:39:58 -0700
committerEric Anholt <eric@anholt.net>2008-04-17 11:08:28 -0700
commit2c135ef8ac40f8e7cd071de7414adfae019f9198 (patch)
tree451b2d770315252007cfc457c508ee5177a32495
parentc3fb62df4e60b63295f94c99b3c5de70dbf94e1c (diff)
Make the binding table and surface state be arrays to reduce syncing.
-rw-r--r--src/i830.h1
-rw-r--r--src/i830_accel.c3
-rw-r--r--src/i965_render.c63
3 files changed, 35 insertions, 32 deletions
diff --git a/src/i830.h b/src/i830.h
index 4e82036b..2c6d2b45 100644
--- a/src/i830.h
+++ b/src/i830.h
@@ -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)
{