Mesa (mesa_7_7_branch): vbo: Ensure vertices are always unmapped before the context is flushed.

Jose Fonseca jrfonseca at kemper.freedesktop.org
Tue Feb 16 13:25:53 UTC 2010


Module: Mesa
Branch: mesa_7_7_branch
Commit: af2023e31cde5ad2cf8ce740e20a98c4cbab37ce
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=af2023e31cde5ad2cf8ce740e20a98c4cbab37ce

Author: José Fonseca <jfonseca at vmware.com>
Date:   Tue Feb 16 12:21:55 2010 +0000

vbo: Ensure vertices are always unmapped before the context is flushed.

Purpose is two fold:

- when doing user-space memory management mapping a buffer stored in the
  graphics aperture effectively pins it there, increasing the likelyhood
  of failure of validating other buffers when flushing

- certain hardware/platform combinations do not allow a buffer to be
  simultaneously mapped and validated

This fixes assertion failures in HL Uplink with the svga driver, where
vbo was holding a map to a buffer which was also referred in the command
stream.

Note: this a non-invasive fix and shouldn't be just cherry-picked into
master as-is -- a cleaner fix for this problem should be searched.

---

 src/mesa/main/context.h          |    8 ++++----
 src/mesa/state_tracker/st_draw.c |    2 ++
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/src/mesa/main/context.h b/src/mesa/main/context.h
index c3be106..5a4f860 100644
--- a/src/mesa/main/context.h
+++ b/src/mesa/main/context.h
@@ -207,8 +207,8 @@ _mesa_Flush( void );
 do {								\
    if (MESA_VERBOSE & VERBOSE_STATE)				\
       _mesa_debug(ctx, "FLUSH_VERTICES in %s\n", MESA_FUNCTION);\
-   if (ctx->Driver.NeedFlush & FLUSH_STORED_VERTICES)		\
-      ctx->Driver.FlushVertices(ctx, FLUSH_STORED_VERTICES);	\
+   if (ctx->Driver.NeedFlush)		\
+      ctx->Driver.FlushVertices(ctx, FLUSH_STORED_VERTICES | FLUSH_UPDATE_CURRENT);     \
    ctx->NewState |= newstate;					\
 } while (0)
 
@@ -226,8 +226,8 @@ do {								\
 do {								\
    if (MESA_VERBOSE & VERBOSE_STATE)				\
       _mesa_debug(ctx, "FLUSH_CURRENT in %s\n", MESA_FUNCTION);	\
-   if (ctx->Driver.NeedFlush & FLUSH_UPDATE_CURRENT)		\
-      ctx->Driver.FlushVertices(ctx, FLUSH_UPDATE_CURRENT);	\
+   if (ctx->Driver.NeedFlush)		\
+      ctx->Driver.FlushVertices(ctx, FLUSH_STORED_VERTICES | FLUSH_UPDATE_CURRENT);	\
    ctx->NewState |= newstate;					\
 } while (0)
 
diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c
index d3b22db..823c72d 100644
--- a/src/mesa/state_tracker/st_draw.c
+++ b/src/mesa/state_tracker/st_draw.c
@@ -404,6 +404,7 @@ setup_interleaved_attribs(GLcontext *ctx,
             vbuffer->buffer_offset = 0;
          }
          else {
+            assert(!bufobj->Pointer);
             vbuffer->buffer = NULL;
             pipe_buffer_reference(&vbuffer->buffer, stobj->buffer);
             vbuffer->buffer_offset = pointer_to_offset(low);
@@ -460,6 +461,7 @@ setup_non_interleaved_attribs(GLcontext *ctx,
          assert(stobj->buffer);
          /*printf("stobj %u = %p\n", attr, (void*) stobj);*/
 
+         assert(!bufobj->Pointer);
          vbuffer[attr].buffer = NULL;
          pipe_buffer_reference(&vbuffer[attr].buffer, stobj->buffer);
          vbuffer[attr].buffer_offset = pointer_to_offset(arrays[mesaAttr]->Ptr);




More information about the mesa-commit mailing list