i965: Skip a bunch of IB BO refcount twiddling.
authorEric Anholt <eric@anholt.net>
Sun, 6 Apr 2014 18:16:48 +0000 (11:16 -0700)
committerEric Anholt <eric@anholt.net>
Fri, 11 Apr 2014 20:38:52 +0000 (13:38 -0700)
Improves cairo performance on glamor by 1.64828% +/- 1.04742% (n=65).

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/mesa/drivers/dri/i965/brw_draw_upload.c

index a579025508c4d9c298831b3609c85cf3a382aa09..2b56cdedd1c139d7b7c8a5d58dbb74d8e6efd731 100644 (file)
@@ -813,7 +813,7 @@ static void brw_upload_indices(struct brw_context *brw)
    struct gl_context *ctx = &brw->ctx;
    const struct _mesa_index_buffer *index_buffer = brw->ib.ib;
    GLuint ib_size;
-   drm_intel_bo *bo = NULL;
+   drm_intel_bo *old_bo = brw->ib.bo;
    struct gl_buffer_object *bufferobj;
    GLuint offset;
    GLuint ib_type_size;
@@ -831,7 +831,7 @@ static void brw_upload_indices(struct brw_context *brw)
       /* Get new bufferobj, offset:
        */
       intel_upload_data(brw, index_buffer->ptr, ib_size, ib_type_size,
-                       &bo, &offset);
+                       &brw->ib.bo, &offset);
    } else {
       offset = (GLuint) (unsigned long) index_buffer->ptr;
 
@@ -849,13 +849,19 @@ static void brw_upload_indices(struct brw_context *brw)
                                                    bufferobj,
                                                    MAP_INTERNAL);
 
-         intel_upload_data(brw, map, ib_size, ib_type_size, &bo, &offset);
+         intel_upload_data(brw, map, ib_size, ib_type_size,
+                           &brw->ib.bo, &offset);
 
          ctx->Driver.UnmapBuffer(ctx, bufferobj, MAP_INTERNAL);
       } else {
-         bo = intel_bufferobj_buffer(brw, intel_buffer_object(bufferobj),
-                                     offset, ib_size);
-         drm_intel_bo_reference(bo);
+         drm_intel_bo *bo =
+            intel_bufferobj_buffer(brw, intel_buffer_object(bufferobj),
+                                   offset, ib_size);
+         if (bo != brw->ib.bo) {
+            drm_intel_bo_unreference(brw->ib.bo);
+            brw->ib.bo = bo;
+            drm_intel_bo_reference(bo);
+         }
       }
    }
 
@@ -865,14 +871,8 @@ static void brw_upload_indices(struct brw_context *brw)
     */
    brw->ib.start_vertex_offset = offset / ib_type_size;
 
-   if (brw->ib.bo != bo) {
-      drm_intel_bo_unreference(brw->ib.bo);
-      brw->ib.bo = bo;
-
+   if (brw->ib.bo != old_bo)
       brw->state.dirty.brw |= BRW_NEW_INDEX_BUFFER;
-   } else {
-      drm_intel_bo_unreference(bo);
-   }
 
    if (index_buffer->type != brw->ib.type) {
       brw->ib.type = index_buffer->type;