Mesa (master): gallium+(u_threaded,r300,r600,radeonsi): move transfer offset into pipe_transfer

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat May 1 18:28:58 UTC 2021


Module: Mesa
Branch: master
Commit: 967757a2088b00fa0e564ebfe31411ec1ec3e8be
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=967757a2088b00fa0e564ebfe31411ec1ec3e8be

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Thu Apr 22 00:11:18 2021 -0400

gallium+(u_threaded,r300,r600,radeonsi): move transfer offset into pipe_transfer

Let's use the 4 bytes of unused padding usefully in pipe_transfer.

Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10527>

---

 src/gallium/auxiliary/util/u_threaded_context.c | 4 ++--
 src/gallium/auxiliary/util/u_threaded_context.h | 4 ----
 src/gallium/drivers/r300/r300_transfer.c        | 7 ++-----
 src/gallium/drivers/r600/r600_buffer_common.c   | 4 ++--
 src/gallium/drivers/r600/r600_pipe_common.h     | 1 -
 src/gallium/drivers/radeonsi/si_buffer.c        | 4 ++--
 src/gallium/drivers/radeonsi/si_pipe.h          | 1 -
 src/gallium/include/pipe/p_state.h              | 5 +++++
 8 files changed, 13 insertions(+), 17 deletions(-)

diff --git a/src/gallium/auxiliary/util/u_threaded_context.c b/src/gallium/auxiliary/util/u_threaded_context.c
index 691c01c83a4..73d45a6c909 100644
--- a/src/gallium/auxiliary/util/u_threaded_context.c
+++ b/src/gallium/auxiliary/util/u_threaded_context.c
@@ -1710,7 +1710,7 @@ tc_transfer_map(struct pipe_context *_pipe,
 
          u_upload_alloc(tc->base.stream_uploader, 0,
                         box->width + (box->x % tc->map_buffer_alignment),
-                        tc->map_buffer_alignment, &ttrans->offset,
+                        tc->map_buffer_alignment, &ttrans->b.offset,
                         &ttrans->staging, (void**)&map);
          if (!map) {
             slab_free(&tc->pool_transfers, ttrans);
@@ -1806,7 +1806,7 @@ tc_buffer_do_flush_region(struct threaded_context *tc,
    if (ttrans->staging) {
       struct pipe_box src_box;
 
-      u_box_1d(ttrans->offset + ttrans->b.box.x % tc->map_buffer_alignment +
+      u_box_1d(ttrans->b.offset + ttrans->b.box.x % tc->map_buffer_alignment +
                (box->x - ttrans->b.box.x),
                box->width, &src_box);
 
diff --git a/src/gallium/auxiliary/util/u_threaded_context.h b/src/gallium/auxiliary/util/u_threaded_context.h
index 6d0227a4a14..59c6f4acab2 100644
--- a/src/gallium/auxiliary/util/u_threaded_context.h
+++ b/src/gallium/auxiliary/util/u_threaded_context.h
@@ -298,10 +298,6 @@ struct threaded_transfer {
 
    /* Staging buffer for DISCARD_RANGE transfers. */
    struct pipe_resource *staging;
-
-   /* Offset into the staging buffer, because the backing buffer is
-    * sub-allocated. */
-   unsigned offset;
 };
 
 struct threaded_query {
diff --git a/src/gallium/drivers/r300/r300_transfer.c b/src/gallium/drivers/r300/r300_transfer.c
index 8274de5f4b4..bceeb712459 100644
--- a/src/gallium/drivers/r300/r300_transfer.c
+++ b/src/gallium/drivers/r300/r300_transfer.c
@@ -33,9 +33,6 @@ struct r300_transfer {
     /* Parent class */
     struct pipe_transfer transfer;
 
-    /* Offset from start of buffer. */
-    unsigned offset;
-
     /* Linear texture. */
     struct r300_resource *linear_texture;
 };
@@ -206,7 +203,7 @@ r300_texture_transfer_map(struct pipe_context *ctx,
             /* Unpipelined transfer. */
             trans->transfer.stride = tex->tex.stride_in_bytes[level];
             trans->transfer.layer_stride = tex->tex.layer_size_in_bytes[level];
-            trans->offset = r300_texture_get_offset(tex, level, box->z);
+            trans->transfer.offset = r300_texture_get_offset(tex, level, box->z);
 
             if (referenced_cs &&
                 !(usage & PIPE_MAP_UNSYNCHRONIZED)) {
@@ -237,7 +234,7 @@ r300_texture_transfer_map(struct pipe_context *ctx,
         }
 
 	*transfer = &trans->transfer;
-        return map + trans->offset +
+        return map + trans->transfer.offset +
             box->y / util_format_get_blockheight(format) * trans->transfer.stride +
             box->x / util_format_get_blockwidth(format) * util_format_get_blocksize(format);
     }
diff --git a/src/gallium/drivers/r600/r600_buffer_common.c b/src/gallium/drivers/r600/r600_buffer_common.c
index 7dbf7a1baaf..c390b2bf4b5 100644
--- a/src/gallium/drivers/r600/r600_buffer_common.c
+++ b/src/gallium/drivers/r600/r600_buffer_common.c
@@ -322,7 +322,7 @@ static void *r600_buffer_get_transfer(struct pipe_context *ctx,
 	transfer->b.b.stride = 0;
 	transfer->b.b.layer_stride = 0;
 	transfer->b.staging = NULL;
-	transfer->offset = offset;
+	transfer->b.b.offset = offset;
 	transfer->staging = staging;
 	*ptransfer = &transfer->b.b;
 	return data;
@@ -490,7 +490,7 @@ static void r600_buffer_do_flush_region(struct pipe_context *ctx,
 
 		dst = transfer->resource;
 		src = &rtransfer->staging->b.b;
-		soffset = rtransfer->offset + box->x % R600_MAP_BUFFER_ALIGNMENT;
+		soffset = rtransfer->b.b.offset + box->x % R600_MAP_BUFFER_ALIGNMENT;
 
 		u_box_1d(soffset, box->width, &dma_box);
 
diff --git a/src/gallium/drivers/r600/r600_pipe_common.h b/src/gallium/drivers/r600/r600_pipe_common.h
index b55a27d63f0..91c92dad50e 100644
--- a/src/gallium/drivers/r600/r600_pipe_common.h
+++ b/src/gallium/drivers/r600/r600_pipe_common.h
@@ -178,7 +178,6 @@ struct r600_resource {
 struct r600_transfer {
 	struct threaded_transfer	b;
 	struct r600_resource		*staging;
-	unsigned			offset;
 };
 
 struct r600_fmask_info {
diff --git a/src/gallium/drivers/radeonsi/si_buffer.c b/src/gallium/drivers/radeonsi/si_buffer.c
index 5a9d7b9473e..bc3b2af8349 100644
--- a/src/gallium/drivers/radeonsi/si_buffer.c
+++ b/src/gallium/drivers/radeonsi/si_buffer.c
@@ -319,8 +319,8 @@ static void *si_buffer_get_transfer(struct pipe_context *ctx, struct pipe_resour
    transfer->b.b.box = *box;
    transfer->b.b.stride = 0;
    transfer->b.b.layer_stride = 0;
+   transfer->b.b.offset = offset;
    transfer->b.staging = NULL;
-   transfer->offset = offset;
    transfer->staging = staging;
    *ptransfer = &transfer->b.b;
    return data;
@@ -480,7 +480,7 @@ static void si_buffer_do_flush_region(struct pipe_context *ctx, struct pipe_tran
 
    if (stransfer->staging) {
       unsigned src_offset =
-         stransfer->offset + transfer->box.x % SI_MAP_BUFFER_ALIGNMENT + (box->x - transfer->box.x);
+         stransfer->b.b.offset + transfer->box.x % SI_MAP_BUFFER_ALIGNMENT + (box->x - transfer->box.x);
 
       /* Copy the staging buffer into the original one. */
       si_copy_buffer(sctx, transfer->resource, &stransfer->staging->b.b, box->x, src_offset,
diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h
index fba6d53a20c..4ce881ef24a 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.h
+++ b/src/gallium/drivers/radeonsi/si_pipe.h
@@ -337,7 +337,6 @@ struct si_resource {
 struct si_transfer {
    struct threaded_transfer b;
    struct si_resource *staging;
-   unsigned offset;
 };
 
 struct si_texture {
diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h
index 7e9246a920a..f9027908b39 100644
--- a/src/gallium/include/pipe/p_state.h
+++ b/src/gallium/include/pipe/p_state.h
@@ -586,6 +586,11 @@ struct pipe_transfer
    struct pipe_box box;            /**< region of the resource to access */
    unsigned stride;                /**< row stride in bytes */
    unsigned layer_stride;          /**< image/layer stride in bytes */
+
+   /* Offset into a driver-internal staging buffer to make use of unused
+    * padding in this structure.
+    */
+   unsigned offset;
 };
 
 



More information about the mesa-commit mailing list