radeonsi: disable SDMA clears and copies for sparse buffers
VM faults cannot be disabled for SDMA on <= VI. We could still use SDMA by asking the winsys about which parts of the buffers are committed. This is left as a potential future improvement. Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
parent
0a685ce9a7
commit
aee473eb01
|
@ -80,7 +80,8 @@ static void cik_sdma_clear_buffer(struct pipe_context *ctx,
|
||||||
unsigned i, ncopy, csize;
|
unsigned i, ncopy, csize;
|
||||||
struct r600_resource *rdst = r600_resource(dst);
|
struct r600_resource *rdst = r600_resource(dst);
|
||||||
|
|
||||||
if (!cs || offset % 4 != 0 || size % 4 != 0) {
|
if (!cs || offset % 4 != 0 || size % 4 != 0 ||
|
||||||
|
dst->flags & PIPE_RESOURCE_FLAG_SPARSE) {
|
||||||
ctx->clear_buffer(ctx, dst, offset, size, &clear_value, 4);
|
ctx->clear_buffer(ctx, dst, offset, size, &clear_value, 4);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -526,7 +527,9 @@ static void cik_sdma_copy(struct pipe_context *ctx,
|
||||||
{
|
{
|
||||||
struct si_context *sctx = (struct si_context *)ctx;
|
struct si_context *sctx = (struct si_context *)ctx;
|
||||||
|
|
||||||
if (!sctx->b.dma.cs)
|
if (!sctx->b.dma.cs ||
|
||||||
|
src->flags & PIPE_RESOURCE_FLAG_SPARSE ||
|
||||||
|
dst->flags & PIPE_RESOURCE_FLAG_SPARSE)
|
||||||
goto fallback;
|
goto fallback;
|
||||||
|
|
||||||
if (dst->target == PIPE_BUFFER && src->target == PIPE_BUFFER) {
|
if (dst->target == PIPE_BUFFER && src->target == PIPE_BUFFER) {
|
||||||
|
|
|
@ -223,6 +223,7 @@ static void si_clear_buffer(struct pipe_context *ctx, struct pipe_resource *dst,
|
||||||
/* dma_clear_buffer can use clear_buffer on failure. Make sure that
|
/* dma_clear_buffer can use clear_buffer on failure. Make sure that
|
||||||
* doesn't happen. We don't want an infinite recursion: */
|
* doesn't happen. We don't want an infinite recursion: */
|
||||||
if (sctx->b.dma.cs &&
|
if (sctx->b.dma.cs &&
|
||||||
|
!(dst->flags & PIPE_RESOURCE_FLAG_SPARSE) &&
|
||||||
(offset % 4 == 0) &&
|
(offset % 4 == 0) &&
|
||||||
/* CP DMA is very slow. Always use SDMA for big clears. This
|
/* CP DMA is very slow. Always use SDMA for big clears. This
|
||||||
* alone improves DeusEx:MD performance by 70%. */
|
* alone improves DeusEx:MD performance by 70%. */
|
||||||
|
|
|
@ -89,7 +89,8 @@ static void si_dma_clear_buffer(struct pipe_context *ctx,
|
||||||
unsigned i, ncopy, csize;
|
unsigned i, ncopy, csize;
|
||||||
struct r600_resource *rdst = r600_resource(dst);
|
struct r600_resource *rdst = r600_resource(dst);
|
||||||
|
|
||||||
if (!cs || offset % 4 != 0 || size % 4 != 0) {
|
if (!cs || offset % 4 != 0 || size % 4 != 0 ||
|
||||||
|
dst->flags & PIPE_RESOURCE_FLAG_SPARSE) {
|
||||||
ctx->clear_buffer(ctx, dst, offset, size, &clear_value, 4);
|
ctx->clear_buffer(ctx, dst, offset, size, &clear_value, 4);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -233,7 +234,9 @@ static void si_dma_copy(struct pipe_context *ctx,
|
||||||
unsigned src_x, src_y;
|
unsigned src_x, src_y;
|
||||||
unsigned dst_x = dstx, dst_y = dsty, dst_z = dstz;
|
unsigned dst_x = dstx, dst_y = dsty, dst_z = dstz;
|
||||||
|
|
||||||
if (sctx->b.dma.cs == NULL) {
|
if (sctx->b.dma.cs == NULL ||
|
||||||
|
src->flags & PIPE_RESOURCE_FLAG_SPARSE ||
|
||||||
|
dst->flags & PIPE_RESOURCE_FLAG_SPARSE) {
|
||||||
goto fallback;
|
goto fallback;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue