[Intel-gfx] [PATCH] i965: Add batch_flush_notify hook to create new vertex-buffer bo
Eric Anholt
eric at anholt.net
Wed Dec 3 23:08:30 CET 2008
On Wed, 2008-12-03 at 13:53 -0800, Carl Worth wrote:
> This avoids mapping a buffer object which is being referenced
> by a batch that has already been flushed, (which is a terribly
> expensive operation).
>
> On my machine this brings the performance of x11perf -aa10text
> from 85k back to 150k, (where it was before a recent kernel
> upgrade). Also, before this patch, when I used my X server
> actively performance would drop as low as 15k---hopefully that
> bug is gone with this change.
If we drop the bits about active, won't the next header emit alloc the
new vb for us?
> ---
> src/i830.h | 7 +++++++
> src/i830_batchbuffer.c | 3 +++
> src/i830_driver.c | 5 +++++
> src/i830_exa.c | 4 ++--
> src/i965_render.c | 39 +++++++++++++++++++++++++++++++++++++++
> 5 files changed, 56 insertions(+), 2 deletions(-)
>
> diff --git a/src/i830.h b/src/i830.h
> index 14c371c..8e8c55f 100644
> --- a/src/i830.h
> +++ b/src/i830.h
> @@ -531,6 +531,8 @@ typedef struct _I830Rec {
> #endif
> CloseScreenProcPtr CloseScreen;
>
> + void (*batch_flush_notify)(ScrnInfoPtr pScrn);
> +
> #ifdef I830_USE_EXA
> ExaDriverPtr EXADriverPtr;
> #endif
> @@ -920,6 +922,11 @@ Bool i965_prepare_composite(int op, PicturePtr pSrc, PicturePtr pMask,
> PixmapPtr pMaskPixmap, PixmapPtr pDstPixmap);
> void i965_composite(PixmapPtr pDst, int srcX, int srcY,
> int maskX, int maskY, int dstX, int dstY, int w, int h);
> +void
> +i965_done_composite(PixmapPtr pDst);
> +
> +void
> +i965_batch_flush_notify(ScrnInfoPtr pScrn);
>
> Bool
> i830_get_transformed_coordinates(int x, int y, PictTransformPtr transform,
> diff --git a/src/i830_batchbuffer.c b/src/i830_batchbuffer.c
> index a770616..072ac75 100644
> --- a/src/i830_batchbuffer.c
> +++ b/src/i830_batchbuffer.c
> @@ -201,4 +201,7 @@ intel_batch_flush(ScrnInfoPtr pScrn, Bool flushed)
> */
> if (pI830->memory_manager != NULL)
> pI830->need_mi_flush = TRUE;
> +
> + if (pI830->batch_flush_notify)
> + pI830->batch_flush_notify (pScrn);
> }
> diff --git a/src/i830_driver.c b/src/i830_driver.c
> index 1407a22..544efd2 100644
> --- a/src/i830_driver.c
> +++ b/src/i830_driver.c
> @@ -3358,6 +3358,11 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
> }
> }
>
> + if (IS_I965G(pI830))
> + pI830->batch_flush_notify = i965_batch_flush_notify;
> + else
> + pI830->batch_flush_notify = NULL;
> +
> miInitializeBackingStore(pScreen);
> xf86SetBackingStore(pScreen);
> xf86SetSilkenMouse(pScreen);
> diff --git a/src/i830_exa.c b/src/i830_exa.c
> index 9fcda51..ded1fbd 100644
> --- a/src/i830_exa.c
> +++ b/src/i830_exa.c
> @@ -348,7 +348,7 @@ I830EXADoneCopy(PixmapPtr pDstPixmap)
> /**
> * Do any cleanup from the Composite operation.
> *
> - * This is shared between i830 through i965.
> + * This is shared between i830 through i945.
> */
> void
> i830_done_composite(PixmapPtr pDst)
> @@ -686,7 +686,7 @@ I830EXAInit(ScreenPtr pScreen)
> pI830->EXADriverPtr->CheckComposite = i965_check_composite;
> pI830->EXADriverPtr->PrepareComposite = i965_prepare_composite;
> pI830->EXADriverPtr->Composite = i965_composite;
> - pI830->EXADriverPtr->DoneComposite = i830_done_composite;
> + pI830->EXADriverPtr->DoneComposite = i965_done_composite;
> }
> #if EXA_VERSION_MINOR >= 2
> if (!pI830->use_drm_mode)
> diff --git a/src/i965_render.c b/src/i965_render.c
> index 9863697..008a68c 100644
> --- a/src/i965_render.c
> +++ b/src/i965_render.c
> @@ -494,6 +494,7 @@ typedef struct _gen4_static_state {
> typedef float gen4_vertex_buffer[VERTEX_BUFFER_SIZE];
>
> typedef struct gen4_composite_op {
> + Bool active;
> int op;
> PicturePtr source_picture;
> PicturePtr mask_picture;
> @@ -1380,6 +1381,7 @@ i965_prepare_composite(int op, PicturePtr pSrcPicture,
> struct gen4_render_state *render_state= pI830->gen4_render_state;
> gen4_composite_op *composite_op = &render_state->composite_op;
>
> + composite_op->active = TRUE;
> composite_op->op = op;
> composite_op->source_picture = pSrcPicture;
> composite_op->mask_picture = pMaskPicture;
> @@ -1570,6 +1572,43 @@ i965_composite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY,
> #endif
> }
>
> +void
> +i965_done_composite(PixmapPtr pDst)
> +{
> + ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
> + I830Ptr pI830 = I830PTR(pScrn);
> + struct gen4_render_state *render_state = pI830->gen4_render_state;
> +
> + render_state->composite_op.active = FALSE;
> +
> +#if ALWAYS_SYNC || ALWAYS_FLUSH
> +#if ALWAYS_FLUSH
> + intel_batch_flush(pScrn, FALSE);
> +#endif
> +#if ALWAYS_SYNC
> + I830Sync(pScrn);
> +#endif
> +#endif
> +}
> +
> +void
> +i965_batch_flush_notify(ScrnInfoPtr pScrn)
> +{
> + I830Ptr pI830 = I830PTR(pScrn);
> + struct gen4_render_state *render_state = pI830->gen4_render_state;
> +
> + /* Once a batch is emitted, we never want to map again any buffer
> + * object being referenced by that batch, (which would be very
> + * expensive). */
> + dri_bo_unreference (render_state->vertex_buffer_bo);
> + render_state->vertex_buffer_bo = NULL;
> +
> + if (render_state->composite_op.active)
> + render_state->vertex_buffer_bo = dri_bo_alloc (pI830->bufmgr, "vb",
> + sizeof (gen4_vertex_buffer),
> + 4096);
> +}
> +
> /**
> * Called at EnterVT so we can set up our offsets into the state buffer.
> */
--
Eric Anholt
eric at anholt.net eric.anholt at intel.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 197 bytes
Desc: This is a digitally signed message part
URL: <http://lists.freedesktop.org/archives/intel-gfx/attachments/20081203/347e94d2/attachment.sig>
More information about the Intel-gfx
mailing list