From: Marek Olšák <marek.ol...@amd.com> The DMA functions modify dst_offset and size and util_range_add gets wrong values. --- src/gallium/drivers/r600/evergreen_hw_context.c | 18 ++++++++++++------ src/gallium/drivers/r600/r600_hw_context.c | 18 ++++++++++++------ src/gallium/drivers/radeonsi/si_descriptors.c | 21 ++++++++++++--------- 3 files changed, 36 insertions(+), 21 deletions(-)
diff --git a/src/gallium/drivers/r600/evergreen_hw_context.c b/src/gallium/drivers/r600/evergreen_hw_context.c index e5d6249..85fdc4e 100644 --- a/src/gallium/drivers/r600/evergreen_hw_context.c +++ b/src/gallium/drivers/r600/evergreen_hw_context.c @@ -40,6 +40,12 @@ void evergreen_dma_copy(struct r600_context *rctx, struct r600_resource *rdst = (struct r600_resource*)dst; struct r600_resource *rsrc = (struct r600_resource*)src; + /* Mark the buffer range of destination as valid (initialized), + * so that transfer_map knows it should wait for the GPU when mapping + * that range. */ + util_range_add(&rdst->valid_buffer_range, dst_offset, + dst_offset + size); + /* make sure that the dma ring is only one active */ rctx->b.rings.gfx.flush(rctx, RADEON_FLUSH_ASYNC); dst_offset += r600_resource_va(&rctx->screen->b.b, dst); @@ -71,9 +77,6 @@ void evergreen_dma_copy(struct r600_context *rctx, src_offset += csize << shift; size -= csize; } - - util_range_add(&rdst->valid_buffer_range, dst_offset, - dst_offset + size); } /* The max number of bytes to copy per packet. */ @@ -88,6 +91,12 @@ void evergreen_cp_dma_clear_buffer(struct r600_context *rctx, assert(size); assert(rctx->screen->b.has_cp_dma); + /* Mark the buffer range of destination as valid (initialized), + * so that transfer_map knows it should wait for the GPU when mapping + * that range. */ + util_range_add(&r600_resource(dst)->valid_buffer_range, offset, + offset + size); + offset += r600_resource_va(&rctx->screen->b.b, dst); /* Flush the cache where the resource is bound. */ @@ -141,8 +150,5 @@ void evergreen_cp_dma_clear_buffer(struct r600_context *rctx, rctx->b.flags |= R600_CONTEXT_INV_CONST_CACHE | R600_CONTEXT_INV_VERTEX_CACHE | R600_CONTEXT_INV_TEX_CACHE; - - util_range_add(&r600_resource(dst)->valid_buffer_range, offset, - offset + size); } diff --git a/src/gallium/drivers/r600/r600_hw_context.c b/src/gallium/drivers/r600/r600_hw_context.c index 11414cb..da90d63 100644 --- a/src/gallium/drivers/r600/r600_hw_context.c +++ b/src/gallium/drivers/r600/r600_hw_context.c @@ -447,6 +447,12 @@ void r600_cp_dma_copy_buffer(struct r600_context *rctx, assert(size); assert(rctx->screen->b.has_cp_dma); + /* Mark the buffer range of destination as valid (initialized), + * so that transfer_map knows it should wait for the GPU when mapping + * that range. */ + util_range_add(&r600_resource(dst)->valid_buffer_range, dst_offset, + dst_offset + size); + dst_offset += r600_resource_va(&rctx->screen->b.b, dst); src_offset += r600_resource_va(&rctx->screen->b.b, src); @@ -506,9 +512,6 @@ void r600_cp_dma_copy_buffer(struct r600_context *rctx, rctx->b.flags |= R600_CONTEXT_INV_CONST_CACHE | R600_CONTEXT_INV_VERTEX_CACHE | R600_CONTEXT_INV_TEX_CACHE; - - util_range_add(&r600_resource(dst)->valid_buffer_range, dst_offset, - dst_offset + size); } void r600_need_dma_space(struct r600_context *ctx, unsigned num_dw) @@ -533,6 +536,12 @@ void r600_dma_copy(struct r600_context *rctx, struct r600_resource *rdst = (struct r600_resource*)dst; struct r600_resource *rsrc = (struct r600_resource*)src; + /* Mark the buffer range of destination as valid (initialized), + * so that transfer_map knows it should wait for the GPU when mapping + * that range. */ + util_range_add(&rdst->valid_buffer_range, dst_offset, + dst_offset + size); + /* make sure that the dma ring is only one active */ rctx->b.rings.gfx.flush(rctx, RADEON_FLUSH_ASYNC); @@ -555,7 +564,4 @@ void r600_dma_copy(struct r600_context *rctx, src_offset += csize << shift; size -= csize; } - - util_range_add(&rdst->valid_buffer_range, dst_offset, - dst_offset + size); } diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c index e6d566d..c43b35e 100644 --- a/src/gallium/drivers/radeonsi/si_descriptors.c +++ b/src/gallium/drivers/radeonsi/si_descriptors.c @@ -659,6 +659,12 @@ static void si_clear_buffer(struct pipe_context *ctx, struct pipe_resource *dst, if (!size) return; + /* Mark the buffer range of destination as valid (initialized), + * so that transfer_map knows it should wait for the GPU when mapping + * that range. */ + util_range_add(&r600_resource(dst)->valid_buffer_range, offset, + offset + size); + /* Fallback for unaligned clears. */ if (offset % 4 != 0 || size % 4 != 0) { uint32_t *map = rctx->b.ws->buffer_map(r600_resource(dst)->cs_buf, @@ -667,9 +673,6 @@ static void si_clear_buffer(struct pipe_context *ctx, struct pipe_resource *dst, size /= 4; for (unsigned i = 0; i < size; i++) *map++ = value; - - util_range_add(&r600_resource(dst)->valid_buffer_range, offset, - offset + size); return; } @@ -723,9 +726,6 @@ static void si_clear_buffer(struct pipe_context *ctx, struct pipe_resource *dst, R600_CONTEXT_FLUSH_AND_INV_DB | R600_CONTEXT_FLUSH_AND_INV_CB_META | R600_CONTEXT_FLUSH_AND_INV_DB_META; - - util_range_add(&r600_resource(dst)->valid_buffer_range, offset, - offset + size); } void si_copy_buffer(struct r600_context *rctx, @@ -735,6 +735,12 @@ void si_copy_buffer(struct r600_context *rctx, if (!size) return; + /* Mark the buffer range of destination as valid (initialized), + * so that transfer_map knows it should wait for the GPU when mapping + * that range. */ + util_range_add(&r600_resource(dst)->valid_buffer_range, dst_offset, + dst_offset + size); + dst_offset += r600_resource_va(&rctx->screen->b.b, dst); src_offset += r600_resource_va(&rctx->screen->b.b, src); @@ -781,9 +787,6 @@ void si_copy_buffer(struct r600_context *rctx, R600_CONTEXT_FLUSH_AND_INV_DB | R600_CONTEXT_FLUSH_AND_INV_CB_META | R600_CONTEXT_FLUSH_AND_INV_DB_META; - - util_range_add(&r600_resource(dst)->valid_buffer_range, dst_offset, - dst_offset + size); } /* INIT/DEINIT */ -- 1.8.3.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev