Re: [Mesa-dev] [PATCH v2 34/37] panfrost: Do fine-grained flushing when preparing BO for CPU accesses

2019-09-17 Thread Alyssa Rosenzweig
R-b

On Mon, Sep 16, 2019 at 11:37:12AM +0200, Boris Brezillon wrote:
> We don't have to flush all batches when we're only interested in
> reading/writing a specific BO. Thanks to the
> panfrost_flush_batches_accessing_bo() and panfrost_bo_wait() helpers
> we can now flush only the batches touching the BO we want to access
> from the CPU.
> 
> Signed-off-by: Boris Brezillon 
> ---
>  src/gallium/drivers/panfrost/pan_resource.c | 27 +
>  1 file changed, 12 insertions(+), 15 deletions(-)
> 
> diff --git a/src/gallium/drivers/panfrost/pan_resource.c 
> b/src/gallium/drivers/panfrost/pan_resource.c
> index 1f7605adcd5d..d59529ff15b7 100644
> --- a/src/gallium/drivers/panfrost/pan_resource.c
> +++ b/src/gallium/drivers/panfrost/pan_resource.c
> @@ -578,10 +578,8 @@ panfrost_transfer_map(struct pipe_context *pctx,
>  is_bound |= fb->cbufs[c]->texture == resource;
>  }
>  
> -if (is_bound && (usage & PIPE_TRANSFER_READ)) {
> -assert(level == 0);
> -panfrost_flush_all_batches(ctx, true);
> -}
> +if (is_bound && (usage & PIPE_TRANSFER_READ))
> + assert(level == 0);
>  
>  /* TODO: Respect usage flags */
>  
> @@ -594,11 +592,11 @@ panfrost_transfer_map(struct pipe_context *pctx,
>  /* No flush for writes to uninitialized */
>  } else if (!(usage & PIPE_TRANSFER_UNSYNCHRONIZED)) {
>  if (usage & PIPE_TRANSFER_WRITE) {
> -/* STUB: flush reading */
> -//printf("debug: missed reading flush %d\n", 
> resource->target);
> +panfrost_flush_batches_accessing_bo(ctx, bo, 
> PAN_BO_GPU_ACCESS_RW);
> +panfrost_bo_wait(bo, INT64_MAX, 
> PAN_BO_GPU_ACCESS_RW);
>  } else if (usage & PIPE_TRANSFER_READ) {
> -/* STUB: flush writing */
> -//printf("debug: missed writing flush %d (%d-%d)\n", 
> resource->target, box->x, box->x + box->width);
> +panfrost_flush_batches_accessing_bo(ctx, bo, 
> PAN_BO_GPU_ACCESS_WRITE);
> +panfrost_bo_wait(bo, INT64_MAX, 
> PAN_BO_GPU_ACCESS_WRITE);
>  } else {
>  /* Why are you even mapping?! */
>  }
> @@ -748,11 +746,8 @@ panfrost_generate_mipmap(
>   * reorder-type optimizations in place. But for now prioritize
>   * correctness. */
>  
> -struct panfrost_batch *batch = panfrost_get_batch_for_fbo(ctx);
> -bool has_draws = batch->last_job.gpu;
> -
> -if (has_draws)
> -panfrost_flush_all_batches(ctx, true);
> +panfrost_flush_batches_accessing_bo(ctx, rsrc->bo, 
> PAN_BO_GPU_ACCESS_RW);
> +panfrost_bo_wait(rsrc->bo, INT64_MAX, PAN_BO_GPU_ACCESS_RW);
>  
>  /* We've flushed the original buffer if needed, now trigger a blit */
>  
> @@ -765,8 +760,10 @@ panfrost_generate_mipmap(
>  /* If the blit was successful, flush once more. If it wasn't, well, 
> let
>   * the state tracker deal with it. */
>  
> -if (blit_res)
> -panfrost_flush_all_batches(ctx, true);
> +if (blit_res) {
> +panfrost_flush_batches_accessing_bo(ctx, rsrc->bo, 
> PAN_BO_GPU_ACCESS_WRITE);
> +panfrost_bo_wait(rsrc->bo, INT64_MAX, 
> PAN_BO_GPU_ACCESS_WRITE);
> +}
>  
>  return blit_res;
>  }
> -- 
> 2.21.0
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

[Mesa-dev] [PATCH v2 34/37] panfrost: Do fine-grained flushing when preparing BO for CPU accesses

2019-09-16 Thread Boris Brezillon
We don't have to flush all batches when we're only interested in
reading/writing a specific BO. Thanks to the
panfrost_flush_batches_accessing_bo() and panfrost_bo_wait() helpers
we can now flush only the batches touching the BO we want to access
from the CPU.

Signed-off-by: Boris Brezillon 
---
 src/gallium/drivers/panfrost/pan_resource.c | 27 +
 1 file changed, 12 insertions(+), 15 deletions(-)

diff --git a/src/gallium/drivers/panfrost/pan_resource.c 
b/src/gallium/drivers/panfrost/pan_resource.c
index 1f7605adcd5d..d59529ff15b7 100644
--- a/src/gallium/drivers/panfrost/pan_resource.c
+++ b/src/gallium/drivers/panfrost/pan_resource.c
@@ -578,10 +578,8 @@ panfrost_transfer_map(struct pipe_context *pctx,
 is_bound |= fb->cbufs[c]->texture == resource;
 }
 
-if (is_bound && (usage & PIPE_TRANSFER_READ)) {
-assert(level == 0);
-panfrost_flush_all_batches(ctx, true);
-}
+if (is_bound && (usage & PIPE_TRANSFER_READ))
+ assert(level == 0);
 
 /* TODO: Respect usage flags */
 
@@ -594,11 +592,11 @@ panfrost_transfer_map(struct pipe_context *pctx,
 /* No flush for writes to uninitialized */
 } else if (!(usage & PIPE_TRANSFER_UNSYNCHRONIZED)) {
 if (usage & PIPE_TRANSFER_WRITE) {
-/* STUB: flush reading */
-//printf("debug: missed reading flush %d\n", 
resource->target);
+panfrost_flush_batches_accessing_bo(ctx, bo, 
PAN_BO_GPU_ACCESS_RW);
+panfrost_bo_wait(bo, INT64_MAX, PAN_BO_GPU_ACCESS_RW);
 } else if (usage & PIPE_TRANSFER_READ) {
-/* STUB: flush writing */
-//printf("debug: missed writing flush %d (%d-%d)\n", 
resource->target, box->x, box->x + box->width);
+panfrost_flush_batches_accessing_bo(ctx, bo, 
PAN_BO_GPU_ACCESS_WRITE);
+panfrost_bo_wait(bo, INT64_MAX, 
PAN_BO_GPU_ACCESS_WRITE);
 } else {
 /* Why are you even mapping?! */
 }
@@ -748,11 +746,8 @@ panfrost_generate_mipmap(
  * reorder-type optimizations in place. But for now prioritize
  * correctness. */
 
-struct panfrost_batch *batch = panfrost_get_batch_for_fbo(ctx);
-bool has_draws = batch->last_job.gpu;
-
-if (has_draws)
-panfrost_flush_all_batches(ctx, true);
+panfrost_flush_batches_accessing_bo(ctx, rsrc->bo, 
PAN_BO_GPU_ACCESS_RW);
+panfrost_bo_wait(rsrc->bo, INT64_MAX, PAN_BO_GPU_ACCESS_RW);
 
 /* We've flushed the original buffer if needed, now trigger a blit */
 
@@ -765,8 +760,10 @@ panfrost_generate_mipmap(
 /* If the blit was successful, flush once more. If it wasn't, well, let
  * the state tracker deal with it. */
 
-if (blit_res)
-panfrost_flush_all_batches(ctx, true);
+if (blit_res) {
+panfrost_flush_batches_accessing_bo(ctx, rsrc->bo, 
PAN_BO_GPU_ACCESS_WRITE);
+panfrost_bo_wait(rsrc->bo, INT64_MAX, PAN_BO_GPU_ACCESS_WRITE);
+}
 
 return blit_res;
 }
-- 
2.21.0

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev