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 <ian.d.roman...@intel.com>
> ---
>  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
> Mesa3d-dev@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/mesa3d-dev
-- 
Eric Anholt
e...@anholt.net                         eric.anh...@intel.com


Attachment: signature.asc
Description: This is a digitally signed message part

------------------------------------------------------------------------------
_______________________________________________
Mesa3d-dev mailing list
Mesa3d-dev@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev

Reply via email to