[Mesa-dev,2/2] i965: Use the render cache tracker in more places to skip mi_flush()es.

Submitted by Eric Anholt on March 6, 2014, 12:17 a.m.

Details

Message ID 1394065045-24148-2-git-send-email-eric@anholt.net
State New
Headers show

Not browsing as part of any series.

Commit Message

Eric Anholt March 6, 2014, 12:17 a.m.
Now you can call the blit functions without worrying about flushing either
too much or too little.
---
 src/mesa/drivers/dri/i965/intel_blit.c           |  8 +++++---
 src/mesa/drivers/dri/i965/intel_buffer_objects.c | 20 --------------------
 2 files changed, 5 insertions(+), 23 deletions(-)

Patch hide | download patch | download mbox

diff --git a/src/mesa/drivers/dri/i965/intel_blit.c b/src/mesa/drivers/dri/i965/intel_blit.c
index d482272..992a603 100644
--- a/src/mesa/drivers/dri/i965/intel_blit.c
+++ b/src/mesa/drivers/dri/i965/intel_blit.c
@@ -431,7 +431,7 @@  intelEmitCopyBlit(struct brw_context *brw,
 
    ADVANCE_BATCH_TILED(dst_y_tiled, src_y_tiled);
 
-   intel_batchbuffer_emit_mi_flush(brw);
+   brw_render_cache_set_add_bo(brw, dst_buffer);
 
    return true;
 }
@@ -515,7 +515,7 @@  intelEmitImmediateColorExpandBlit(struct brw_context *brw,
 
    intel_batchbuffer_data(brw, src_bits, dwords * 4, BLT_RING);
 
-   intel_batchbuffer_emit_mi_flush(brw);
+   brw_render_cache_set_add_bo(brw, dst_buffer);
 
    return true;
 }
@@ -568,6 +568,8 @@  intel_emit_linear_blit(struct brw_context *brw,
       if (!ok)
          _mesa_problem(ctx, "Failed to linear blit %dx%d\n", size, 1);
    }
+
+   brw_render_cache_set_add_bo(brw, dst_bo);
 }
 
 /**
@@ -633,5 +635,5 @@  intel_miptree_set_alpha_to_one(struct brw_context *brw,
    OUT_BATCH(0xffffffff); /* white, but only alpha gets written */
    ADVANCE_BATCH_TILED(dst_y_tiled, false);
 
-   intel_batchbuffer_emit_mi_flush(brw);
+   brw_render_cache_set_add_bo(brw, region->bo);
 }
diff --git a/src/mesa/drivers/dri/i965/intel_buffer_objects.c b/src/mesa/drivers/dri/i965/intel_buffer_objects.c
index e6124dc..288bff4 100644
--- a/src/mesa/drivers/dri/i965/intel_buffer_objects.c
+++ b/src/mesa/drivers/dri/i965/intel_buffer_objects.c
@@ -515,12 +515,6 @@  intel_bufferobj_unmap(struct gl_context * ctx, struct gl_buffer_object *obj,
    assert(intel_obj);
    assert(obj->Mappings[index].Pointer);
    if (intel_obj->range_map_buffer[index] != NULL) {
-      /* Since we've emitted some blits to buffers that will (likely) be used
-       * in rendering operations in other cache domains in this batch, emit a
-       * flush.  Once again, we wish for a domain tracker in libdrm to cover
-       * usage inside of a batchbuffer.
-       */
-      intel_batchbuffer_emit_mi_flush(brw);
       _mesa_align_free(intel_obj->range_map_buffer[index]);
       intel_obj->range_map_buffer[index] = NULL;
    } else if (intel_obj->range_map_bo[index] != NULL) {
@@ -536,13 +530,6 @@  intel_bufferobj_unmap(struct gl_context * ctx, struct gl_buffer_object *obj,
       intel_bufferobj_mark_gpu_usage(intel_obj, obj->Mappings[index].Offset,
                                      obj->Mappings[index].Length);
 
-      /* Since we've emitted some blits to buffers that will (likely) be used
-       * in rendering operations in other cache domains in this batch, emit a
-       * flush.  Once again, we wish for a domain tracker in libdrm to cover
-       * usage inside of a batchbuffer.
-       */
-      intel_batchbuffer_emit_mi_flush(brw);
-
       drm_intel_bo_unreference(intel_obj->range_map_bo[index]);
       intel_obj->range_map_bo[index] = NULL;
    } else if (intel_obj->buffer != NULL) {
@@ -607,13 +594,6 @@  intel_bufferobj_copy_subdata(struct gl_context *ctx,
    intel_emit_linear_blit(brw,
 			  dst_bo, write_offset,
 			  src_bo, read_offset, size);
-
-   /* Since we've emitted some blits to buffers that will (likely) be used
-    * in rendering operations in other cache domains in this batch, emit a
-    * flush.  Once again, we wish for a domain tracker in libdrm to cover
-    * usage inside of a batchbuffer.
-    */
-   intel_batchbuffer_emit_mi_flush(brw);
 }
 
 void

Comments

On 03/05/2014 04:17 PM, Eric Anholt wrote:
> Now you can call the blit functions without worrying about flushing either
> too much or too little.
> ---
>  src/mesa/drivers/dri/i965/intel_blit.c           |  8 +++++---
>  src/mesa/drivers/dri/i965/intel_buffer_objects.c | 20 --------------------
>  2 files changed, 5 insertions(+), 23 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/intel_blit.c b/src/mesa/drivers/dri/i965/intel_blit.c
> index d482272..992a603 100644
> --- a/src/mesa/drivers/dri/i965/intel_blit.c
> +++ b/src/mesa/drivers/dri/i965/intel_blit.c
> @@ -431,7 +431,7 @@ intelEmitCopyBlit(struct brw_context *brw,
>  
>     ADVANCE_BATCH_TILED(dst_y_tiled, src_y_tiled);
>  
> -   intel_batchbuffer_emit_mi_flush(brw);
> +   brw_render_cache_set_add_bo(brw, dst_buffer);
>  
>     return true;
>  }
> @@ -515,7 +515,7 @@ intelEmitImmediateColorExpandBlit(struct brw_context *brw,
>  
>     intel_batchbuffer_data(brw, src_bits, dwords * 4, BLT_RING);
>  
> -   intel_batchbuffer_emit_mi_flush(brw);
> +   brw_render_cache_set_add_bo(brw, dst_buffer);
>  
>     return true;
>  }
> @@ -568,6 +568,8 @@ intel_emit_linear_blit(struct brw_context *brw,
>        if (!ok)
>           _mesa_problem(ctx, "Failed to linear blit %dx%d\n", size, 1);
>     }
> +
> +   brw_render_cache_set_add_bo(brw, dst_bo);
>  }
>  
>  /**
> @@ -633,5 +635,5 @@ intel_miptree_set_alpha_to_one(struct brw_context *brw,
>     OUT_BATCH(0xffffffff); /* white, but only alpha gets written */
>     ADVANCE_BATCH_TILED(dst_y_tiled, false);
>  
> -   intel_batchbuffer_emit_mi_flush(brw);
> +   brw_render_cache_set_add_bo(brw, region->bo);
>  }
> diff --git a/src/mesa/drivers/dri/i965/intel_buffer_objects.c b/src/mesa/drivers/dri/i965/intel_buffer_objects.c
> index e6124dc..288bff4 100644
> --- a/src/mesa/drivers/dri/i965/intel_buffer_objects.c
> +++ b/src/mesa/drivers/dri/i965/intel_buffer_objects.c
> @@ -515,12 +515,6 @@ intel_bufferobj_unmap(struct gl_context * ctx, struct gl_buffer_object *obj,
>     assert(intel_obj);
>     assert(obj->Mappings[index].Pointer);
>     if (intel_obj->range_map_buffer[index] != NULL) {
> -      /* Since we've emitted some blits to buffers that will (likely) be used
> -       * in rendering operations in other cache domains in this batch, emit a
> -       * flush.  Once again, we wish for a domain tracker in libdrm to cover
> -       * usage inside of a batchbuffer.
> -       */
> -      intel_batchbuffer_emit_mi_flush(brw);
>        _mesa_align_free(intel_obj->range_map_buffer[index]);
>        intel_obj->range_map_buffer[index] = NULL;
>     } else if (intel_obj->range_map_bo[index] != NULL) {
> @@ -536,13 +530,6 @@ intel_bufferobj_unmap(struct gl_context * ctx, struct gl_buffer_object *obj,
>        intel_bufferobj_mark_gpu_usage(intel_obj, obj->Mappings[index].Offset,
>                                       obj->Mappings[index].Length);
>  
> -      /* Since we've emitted some blits to buffers that will (likely) be used
> -       * in rendering operations in other cache domains in this batch, emit a
> -       * flush.  Once again, we wish for a domain tracker in libdrm to cover
> -       * usage inside of a batchbuffer.
> -       */
> -      intel_batchbuffer_emit_mi_flush(brw);
> -
>        drm_intel_bo_unreference(intel_obj->range_map_bo[index]);
>        intel_obj->range_map_bo[index] = NULL;
>     } else if (intel_obj->buffer != NULL) {
> @@ -607,13 +594,6 @@ intel_bufferobj_copy_subdata(struct gl_context *ctx,
>     intel_emit_linear_blit(brw,
>  			  dst_bo, write_offset,
>  			  src_bo, read_offset, size);
> -
> -   /* Since we've emitted some blits to buffers that will (likely) be used
> -    * in rendering operations in other cache domains in this batch, emit a
> -    * flush.  Once again, we wish for a domain tracker in libdrm to cover
> -    * usage inside of a batchbuffer.
> -    */
> -   intel_batchbuffer_emit_mi_flush(brw);
>  }
>  
>  void
> 

I really like the idea of this patch, but we probably need to add
set_check() operations somewhere.  Buffer objects used as TexBOs and
UBOs get accessed via the sampler, and I don't see how they'd get the
flushes they need.

--Ken