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@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10527>
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -178,7 +178,6 @@ struct r600_resource {
|
||||
struct r600_transfer {
|
||||
struct threaded_transfer b;
|
||||
struct r600_resource *staging;
|
||||
unsigned offset;
|
||||
};
|
||||
|
||||
struct r600_fmask_info {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -337,7 +337,6 @@ struct si_resource {
|
||||
struct si_transfer {
|
||||
struct threaded_transfer b;
|
||||
struct si_resource *staging;
|
||||
unsigned offset;
|
||||
};
|
||||
|
||||
struct si_texture {
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user