[Mesa-dev] [PATCH 2/7] glx: Centralize the code for context flushing.
Marek Olšák
maraeo at gmail.com
Wed Jan 9 13:44:21 PST 2013
For the GLX patches:
Reviewed-by: Marek Olšák <maraeo at gmail.com>
Marek
On Wed, Jan 9, 2013 at 9:42 PM, Eric Anholt <eric at anholt.net> wrote:
> ---
> src/glx/dri2_glx.c | 82 ++++++++++++++++++++++++----------------------------
> 1 file changed, 37 insertions(+), 45 deletions(-)
>
> diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c
> index 4afce77..075df37 100644
> --- a/src/glx/dri2_glx.c
> +++ b/src/glx/dri2_glx.c
> @@ -537,6 +537,32 @@ dri2Throttle(struct dri2_screen *psc,
> }
> }
>
> +/**
> + * Asks the driver to flush any queued work necessary for serializing with the
> + * X command stream, and optionally the slightly more strict requirement of
> + * glFlush() equivalence (which would require flushing even if nothing had
> + * been drawn to a window system framebuffer, for example).
> + */
> +static void
> +dri2Flush(struct dri2_screen *psc,
> + __DRIcontext *ctx,
> + struct dri2_drawable *draw,
> + unsigned flags,
> + enum __DRI2throttleReason throttle_reason)
> +{
> + if (ctx && psc->f && psc->f->base.version >= 4) {
> + psc->f->flush_with_flags(ctx, draw->driDrawable, flags, throttle_reason);
> + } else {
> + if (flags & __DRI2_FLUSH_CONTEXT)
> + glFlush();
> +
> + if (psc->f)
> + psc->f->flush(draw->driDrawable);
> +
> + dri2Throttle(psc, draw, throttle_reason);
> + }
> +}
> +
> static void
> __dri2CopySubBuffer(__GLXDRIdrawable *pdraw, int x, int y,
> int width, int height,
> @@ -546,6 +572,8 @@ __dri2CopySubBuffer(__GLXDRIdrawable *pdraw, int x, int y,
> struct dri2_screen *psc = (struct dri2_screen *) pdraw->psc;
> XRectangle xrect;
> XserverRegion region;
> + __DRIcontext *ctx = dri2GetCurrentContext();
> + unsigned flags;
>
> /* Check we have the right attachments */
> if (!priv->have_back)
> @@ -556,26 +584,10 @@ __dri2CopySubBuffer(__GLXDRIdrawable *pdraw, int x, int y,
> xrect.width = width;
> xrect.height = height;
>
> - if (psc->f && psc->f->base.version >= 4) {
> - unsigned flags = (flush ? __DRI2_FLUSH_CONTEXT : 0) |
> - __DRI2_FLUSH_DRAWABLE;
> - __DRIcontext *ctx = dri2GetCurrentContext();
> -
> - if (ctx) {
> - (*psc->f->flush_with_flags)(ctx, priv->driDrawable, flags, reason);
> - }
> - }
> - else {
> - if (flush) {
> - glFlush();
> - }
> -
> - if (psc->f) {
> - (*psc->f->flush) (priv->driDrawable);
> - }
> -
> - dri2Throttle(psc, priv, reason);
> - }
> + flags = __DRI2_FLUSH_DRAWABLE;
> + if (flush)
> + flags |= __DRI2_FLUSH_CONTEXT;
> + dri2Flush(psc, ctx, priv, flags, __DRI2_THROTTLE_SWAPBUFFER);
>
> region = XFixesCreateRegion(psc->base.dpy, &xrect, 1);
> DRI2CopyRegion(psc->base.dpy, pdraw->xDrawable, region,
> @@ -819,31 +831,11 @@ dri2SwapBuffers(__GLXDRIdrawable *pdraw, int64_t target_msc, int64_t divisor,
> __dri2CopySubBuffer(pdraw, 0, 0, priv->width, priv->height,
> __DRI2_THROTTLE_SWAPBUFFER, flush);
> } else {
> - if (psc->f && psc->f->base.version >= 4) {
> - unsigned flags = (flush ? __DRI2_FLUSH_CONTEXT : 0) |
> - __DRI2_FLUSH_DRAWABLE;
> - __DRIcontext *ctx = dri2GetCurrentContext();
> -
> - if (ctx) {
> - (*psc->f->flush_with_flags)(ctx, priv->driDrawable, flags,
> - __DRI2_THROTTLE_SWAPBUFFER);
> - }
> - }
> - else {
> - if (flush) {
> - glFlush();
> - }
> -
> - if (psc->f) {
> - struct glx_context *gc = __glXGetCurrentContext();
> -
> - if (gc) {
> - (*psc->f->flush)(priv->driDrawable);
> - }
> - }
> -
> - dri2Throttle(psc, priv, __DRI2_THROTTLE_SWAPBUFFER);
> - }
> + __DRIcontext *ctx = dri2GetCurrentContext();
> + unsigned flags = __DRI2_FLUSH_DRAWABLE;
> + if (flush)
> + flags |= __DRI2_FLUSH_CONTEXT;
> + dri2Flush(psc, ctx, priv, flags, __DRI2_THROTTLE_SWAPBUFFER);
>
> ret = dri2XcbSwapBuffers(pdraw->psc->dpy, pdraw,
> target_msc, divisor, remainder);
> --
> 1.7.10.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list