i965: Reuse intel_upload.c for gen4/5 constant buffers.
authorEric Anholt <eric@anholt.net>
Tue, 20 May 2014 18:09:57 +0000 (11:09 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 2 Jul 2014 19:45:58 +0000 (12:45 -0700)
No performance difference on glamor with copywinwin10 (n=40) on my gm45.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_context.h
src/mesa/drivers/dri/i965/brw_curbe.c
src/mesa/drivers/dri/i965/intel_batchbuffer.c

index c68167f848aa7b89f41fbd00a3174b61084ec356..f9e0c8c51d010be6a2b590d8c5b5bc150930fe34 100644 (file)
@@ -1227,11 +1227,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
index e5ca2ce6b666bb76040c1a1e5bcf882f391a95f4..b776bdc8c8fe20e52a52c4f4ccf77f756fab0621 100644 (file)
@@ -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
index 818ac61cd5d3a8a2e9588b9c21a2d996798225e3..cba81bce7e216c0539e2be2a911a467710214592 100644 (file)
@@ -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;
    }