i965: use _NEW_PROGRAM_CONSTANTS and always create new const buffers
authorBrian Paul <brianp@vmware.com>
Wed, 22 Apr 2009 15:14:16 +0000 (09:14 -0600)
committerBrian Paul <brianp@vmware.com>
Wed, 22 Apr 2009 15:14:16 +0000 (09:14 -0600)
When program constants change we create a new VS constant buffer
instead of re-using the old one.  This allows us to have several
const buffers in flight with vertex rendering.

src/mesa/drivers/dri/i965/brw_wm_surface_state.c

index 71840d1e4e8e72968863ce5f459ce5b6ee8b3825..89c456e62cc6f55cec64a17a1e88d43c0a1582bb 100644 (file)
@@ -456,17 +456,14 @@ brw_update_vs_constant_surface( GLcontext *ctx,
 
    assert(surf == 0);
 
-   /* free old const buffer if too small */
-   if (const_buffer && const_buffer->size < size) {
-      dri_bo_unreference(const_buffer);
-      const_buffer = NULL;
-   }
+   /* We always create a new VS constant buffer so that several can be
+    * in flight at a time.  Free the old one first...
+    */
+   dri_bo_unreference(const_buffer);
 
-   /* alloc new buffer if needed */
-   if (!const_buffer) {
-      const_buffer =
-         drm_intel_bo_alloc(intel->bufmgr, "vp_const_buffer", size, 64);
-   }
+   /* alloc new buffer */
+   const_buffer =
+      drm_intel_bo_alloc(intel->bufmgr, "vp_const_buffer", size, 64);
 
    memset(&key, 0, sizeof(key));
 
@@ -783,8 +780,7 @@ brw_vs_get_binding_table(struct brw_context *brw)
 
 
 /**
- * Vertex shader surfaces.  Just constant buffer for now.  Could add vertex 
- * shader textures in the future.
+ * Vertex shader surfaces (constant buffer).
  */
 static void prepare_vs_surfaces(struct brw_context *brw )
 {
@@ -820,8 +816,12 @@ prepare_surfaces(struct brw_context *brw)
 
 const struct brw_tracked_state brw_wm_surfaces = {
    .dirty = {
-      .mesa = _NEW_COLOR | _NEW_TEXTURE | _NEW_BUFFERS | _NEW_PROGRAM,
-      .brw = BRW_NEW_CONTEXT,
+      .mesa = (_NEW_COLOR |
+               _NEW_TEXTURE |
+               _NEW_BUFFERS |
+               _NEW_PROGRAM |
+               _NEW_PROGRAM_CONSTANTS),
+      .brw = (BRW_NEW_CONTEXT),
       .cache = 0
    },
    .prepare = prepare_surfaces,