[Mesa-dev] [PATCH 1/2] i965: Reuse intel_upload.c for gen4/5 constant buffers.

Eric Anholt eric at anholt.net
Tue May 20 13:00:43 PDT 2014


No performance difference on glamor with copywinwin10 (n=40) on my gm45.
---
 src/mesa/drivers/dri/i965/brw_context.h       |  6 ++++--
 src/mesa/drivers/dri/i965/brw_curbe.c         | 31 +++------------------------
 src/mesa/drivers/dri/i965/intel_batchbuffer.c |  1 -
 3 files changed, 7 insertions(+), 31 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
index 283c576..b84b2a2 100644
--- a/src/mesa/drivers/dri/i965/brw_context.h
+++ b/src/mesa/drivers/dri/i965/brw_context.h
@@ -1223,11 +1223,13 @@ struct brw_context
       GLuint vs_size;
       GLuint total_size;
 
+      /**
+       * Pointer to the (intel_upload.c-generated) BO containing the uniforms
+       * for upload to the CURBE.
+       */
       drm_intel_bo *curbe_bo;
       /** Offset within curbe_bo of space for current curbe entry */
       GLuint curbe_offset;
-      /** Offset within curbe_bo of space for next curbe entry */
-      GLuint curbe_next_offset;
 
       /**
        * Copy of the last set of CURBEs uploaded.  Frequently we'll end up
diff --git a/src/mesa/drivers/dri/i965/brw_curbe.c b/src/mesa/drivers/dri/i965/brw_curbe.c
index e5ca2ce..b776bdc 100644
--- a/src/mesa/drivers/dri/i965/brw_curbe.c
+++ b/src/mesa/drivers/dri/i965/brw_curbe.c
@@ -39,6 +39,7 @@
 #include "program/prog_print.h"
 #include "program/prog_statevars.h"
 #include "intel_batchbuffer.h"
+#include "intel_buffer_objects.h"
 #include "brw_context.h"
 #include "brw_defines.h"
 #include "brw_state.h"
@@ -264,34 +265,8 @@ brw_upload_constant_buffer(struct brw_context *brw)
       memcpy(brw->curbe.last_buf, buf, bufsz);
       brw->curbe.last_bufsz = bufsz;
 
-      if (brw->curbe.curbe_bo != NULL &&
-	  brw->curbe.curbe_next_offset + bufsz > brw->curbe.curbe_bo->size)
-      {
-	 drm_intel_gem_bo_unmap_gtt(brw->curbe.curbe_bo);
-	 drm_intel_bo_unreference(brw->curbe.curbe_bo);
-	 brw->curbe.curbe_bo = NULL;
-      }
-
-      if (brw->curbe.curbe_bo == NULL) {
-	 /* Allocate a single page for CURBE entries for this batchbuffer.
-	  * They're generally around 64b.
-	  */
-	 brw->curbe.curbe_bo = drm_intel_bo_alloc(brw->bufmgr, "CURBE",
-						  4096, 1 << 6);
-	 brw->curbe.curbe_next_offset = 0;
-	 drm_intel_gem_bo_map_gtt(brw->curbe.curbe_bo);
-	 assert(bufsz < 4096);
-      }
-
-      brw->curbe.curbe_offset = brw->curbe.curbe_next_offset;
-      brw->curbe.curbe_next_offset += bufsz;
-      brw->curbe.curbe_next_offset = ALIGN(brw->curbe.curbe_next_offset, 64);
-
-      /* Copy data to the buffer:
-       */
-      memcpy(brw->curbe.curbe_bo->virtual + brw->curbe.curbe_offset,
-	     buf,
-	     bufsz);
+      intel_upload_data(brw, buf, bufsz, 64,
+                        &brw->curbe.curbe_bo, &brw->curbe.curbe_offset);
    }
 
    /* Because this provokes an action (ie copy the constants into the
diff --git a/src/mesa/drivers/dri/i965/intel_batchbuffer.c b/src/mesa/drivers/dri/i965/intel_batchbuffer.c
index 818ac61..cba81bc 100644
--- a/src/mesa/drivers/dri/i965/intel_batchbuffer.c
+++ b/src/mesa/drivers/dri/i965/intel_batchbuffer.c
@@ -225,7 +225,6 @@ brw_finish_batch(struct brw_context *brw)
       brw_perf_monitor_finish_batch(brw);
 
    if (brw->curbe.curbe_bo) {
-      drm_intel_gem_bo_unmap_gtt(brw->curbe.curbe_bo);
       drm_intel_bo_unreference(brw->curbe.curbe_bo);
       brw->curbe.curbe_bo = NULL;
    }
-- 
2.0.0.rc2



More information about the mesa-dev mailing list