On Wed, 2009-04-01 at 18:30 -0700, Ian Romanick wrote: > Track whether or not front-buffer rendering may have occured. If > there might be any pending front-buffer rendering waiting to get to > the screen, flush it from glFlush and related paths in the driver. > > Signed-off-by: Ian Romanick <[email protected]> > --- > src/mesa/drivers/dri/intel/intel_buffers.c | 2 ++ > src/mesa/drivers/dri/intel/intel_context.c | 11 +++++++++++ > src/mesa/drivers/dri/intel/intel_context.h | 10 ++++++++++ > 3 files changed, 23 insertions(+), 0 deletions(-) > > diff --git a/src/mesa/drivers/dri/intel/intel_buffers.c > b/src/mesa/drivers/dri/intel/intel_buffers.c > index f1908cb..26dd818 100644 > --- a/src/mesa/drivers/dri/intel/intel_buffers.c > +++ b/src/mesa/drivers/dri/intel/intel_buffers.c > @@ -204,6 +204,8 @@ intel_draw_buffer(GLcontext * ctx, struct gl_framebuffer > *fb) > intel_batchbuffer_flush(intel->batch); > intel->front_cliprects = GL_TRUE; > colorRegions[0] = intel_get_rb_region(fb, BUFFER_FRONT_LEFT); > + > + intel->front_buffer_dirty = GL_TRUE;
Why is DrawBuffers the right place for this? It looks like some
triangles, then glFlush, then some triangles, then glFlush, the last set
of triangles wouldn't show up.
Instead, I think I'd put the "we've done some rendering" flag setting
in:
intel_flush_primitive
intel_flush_inline_prim
brw_try_draw_prims
do_blit_bitmap()
do_blit_copypixels()
intelClearWithBlit
> }
> else {
> if (!intel->constant_cliprect && intel->front_cliprects)
> diff --git a/src/mesa/drivers/dri/intel/intel_context.c
> b/src/mesa/drivers/dri/intel/intel_context.c
> index 0aa1c18..72169ca 100644
> --- a/src/mesa/drivers/dri/intel/intel_context.c
> +++ b/src/mesa/drivers/dri/intel/intel_context.c
> @@ -531,6 +531,17 @@ intel_flush(GLcontext *ctx, GLboolean needs_mi_flush)
>
> if (intel->batch->map != intel->batch->ptr)
> intel_batchbuffer_flush(intel->batch);
> +
> + if (intel->front_buffer_dirty) {
> + __DRIscreen *const screen = intel->intelScreen->driScrnPriv;
> +
> + intel->front_buffer_dirty = GL_FALSE;
> +
> + if ((screen->dri2.loader->base.version >= 2)
> + && (screen->dri2.loader->flushFrontBuffer != NULL)) {
> +
> (*screen->dri2.loader->flushFrontBuffer)(intel->driDrawable->loaderPrivate);
> + }
> + }
> }
>
> void
> diff --git a/src/mesa/drivers/dri/intel/intel_context.h
> b/src/mesa/drivers/dri/intel/intel_context.h
> index 8a8e59f..0af7677 100644
> --- a/src/mesa/drivers/dri/intel/intel_context.h
> +++ b/src/mesa/drivers/dri/intel/intel_context.h
> @@ -260,11 +260,21 @@ struct intel_context
> * flush time while the lock is held.
> */
> GLboolean constant_cliprect;
> +
> /**
> * In !constant_cliprect mode, set to true if the front cliprects should
> be
> * used instead of back.
> */
> GLboolean front_cliprects;
> +
> + /**
> + * Set if rendering has occured to the drawable's front buffer.
> + *
> + * This is used in the DRI2 case to detect that glFlush should also copy
> + * the contents of the fake front buffer to the real front buffer.
> + */
> + GLboolean front_buffer_dirty;
> +
> drm_clip_rect_t fboRect; /**< cliprect for FBO rendering */
>
> int perf_boxes;
> ------------------------------------------------------------------------------
> _______________________________________________
> Mesa3d-dev mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/mesa3d-dev
--
Eric Anholt
[email protected] [email protected]
signature.asc
Description: This is a digitally signed message part
------------------------------------------------------------------------------
_______________________________________________ Mesa3d-dev mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/mesa3d-dev
