mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-22 13:30:12 +01:00
r600g/compute: Fix handling of global buffers in r600_resource_copy_region()
Global buffers do not have an associate cs_buf handle, so
we can't copy them using r600_copy_buffer()
https://bugs.freedesktop.org/show_bug.cgi?id=64226
Reviewed-by: Marek Ol????k <marek.olsak@amd.com>
CC: "10.0" <mesa-stable@lists.freedesktop.org>
(cherry picked from commit 1b9511d7ce)
This commit is contained in:
parent
521c59f132
commit
9495fb4fff
1 changed files with 36 additions and 1 deletions
|
|
@ -619,6 +619,36 @@ void r600_copy_buffer(struct pipe_context *ctx, struct pipe_resource *dst, unsig
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Global buffers are not really resources, they are are actually offsets
|
||||||
|
* into a single global resource (r600_screen::global_pool). The means
|
||||||
|
* they don't have their own cs_buf handle, so they cannot be passed
|
||||||
|
* to r600_copy_buffer() and must be handled separately.
|
||||||
|
*
|
||||||
|
* XXX: It should be possible to implement this function using
|
||||||
|
* r600_copy_buffer() by passing the memory_pool resource as both src
|
||||||
|
* and dst and updating dstx and src_box to point to the correct offsets.
|
||||||
|
* This would likely perform better than the current implementation.
|
||||||
|
*/
|
||||||
|
static void r600_copy_global_buffer(struct pipe_context *ctx,
|
||||||
|
struct pipe_resource *dst, unsigned
|
||||||
|
dstx, struct pipe_resource *src,
|
||||||
|
const struct pipe_box *src_box)
|
||||||
|
{
|
||||||
|
struct pipe_box dst_box; struct pipe_transfer *src_pxfer,
|
||||||
|
*dst_pxfer;
|
||||||
|
|
||||||
|
u_box_1d(dstx, src_box->width, &dst_box);
|
||||||
|
void *src_ptr = ctx->transfer_map(ctx, src, 0, PIPE_TRANSFER_READ,
|
||||||
|
src_box, &src_pxfer);
|
||||||
|
void *dst_ptr = ctx->transfer_map(ctx, dst, 0, PIPE_TRANSFER_WRITE,
|
||||||
|
&dst_box, &dst_pxfer);
|
||||||
|
memcpy(dst_ptr, src_ptr, src_box->width);
|
||||||
|
|
||||||
|
ctx->transfer_unmap(ctx, src_pxfer);
|
||||||
|
ctx->transfer_unmap(ctx, dst_pxfer);
|
||||||
|
}
|
||||||
|
|
||||||
static void r600_clear_buffer(struct pipe_context *ctx, struct pipe_resource *dst,
|
static void r600_clear_buffer(struct pipe_context *ctx, struct pipe_resource *dst,
|
||||||
unsigned offset, unsigned size, unsigned value)
|
unsigned offset, unsigned size, unsigned value)
|
||||||
{
|
{
|
||||||
|
|
@ -671,7 +701,12 @@ static void r600_resource_copy_region(struct pipe_context *ctx,
|
||||||
|
|
||||||
/* Handle buffers first. */
|
/* Handle buffers first. */
|
||||||
if (dst->target == PIPE_BUFFER && src->target == PIPE_BUFFER) {
|
if (dst->target == PIPE_BUFFER && src->target == PIPE_BUFFER) {
|
||||||
r600_copy_buffer(ctx, dst, dstx, src, src_box);
|
if ((src->bind & PIPE_BIND_GLOBAL) ||
|
||||||
|
(dst->bind & PIPE_BIND_GLOBAL)) {
|
||||||
|
r600_copy_global_buffer(ctx, dst, dstx, src, src_box);
|
||||||
|
} else {
|
||||||
|
r600_copy_buffer(ctx, dst, dstx, src, src_box);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue