r600g: use common interfaces in buffer_transfer_unmap
authorMarek Olšák <marek.olsak@amd.com>
Wed, 27 Nov 2013 11:43:40 +0000 (12:43 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 12 Dec 2013 17:34:11 +0000 (18:34 +0100)
i.e. dma_copy and resource_copy_region.

Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
src/gallium/drivers/r600/evergreen_state.c
src/gallium/drivers/r600/r600_blit.c
src/gallium/drivers/r600/r600_buffer.c
src/gallium/drivers/r600/r600_pipe.h
src/gallium/drivers/r600/r600_state.c

index a4a4e3e94512b3430a968b8ac2220bb22e304f6c..065ac6f7a7a6564bf245ee8d4b9289a36819d349 100644 (file)
@@ -3769,6 +3769,12 @@ static boolean evergreen_dma_blit(struct pipe_context *ctx,
        if (rctx->b.rings.dma.cs == NULL) {
                return FALSE;
        }
+
+       if (dst->target == PIPE_BUFFER && src->target == PIPE_BUFFER) {
+               evergreen_dma_copy(rctx, dst, src, dst_x, src_box->x, src_box->width);
+               return TRUE;
+       }
+
        if (src->format != dst->format) {
                return FALSE;
        }
index f33bb43b8c632bbf644e841c30b23d136d5164dc..8680f797a6773dba5f6f34c2854000a08bcd9bf5 100644 (file)
@@ -599,8 +599,8 @@ static void r600_clear_depth_stencil(struct pipe_context *ctx,
        r600_blitter_end(ctx);
 }
 
-void r600_copy_buffer(struct pipe_context *ctx, struct pipe_resource *dst, unsigned dstx,
-                     struct pipe_resource *src, const struct pipe_box *src_box)
+static void r600_copy_buffer(struct pipe_context *ctx, struct pipe_resource *dst, unsigned dstx,
+                            struct pipe_resource *src, const struct pipe_box *src_box)
 {
        struct r600_context *rctx = (struct r600_context*)ctx;
 
index 107538a86e00c04bd6cc06d1d7d5b9818773a9ba..8d5c255bcfdf105dc42c26a2ad5af936555d5c56 100644 (file)
@@ -196,24 +196,22 @@ static void r600_buffer_transfer_unmap(struct pipe_context *pipe,
        if (rtransfer->staging) {
                struct pipe_resource *dst, *src;
                unsigned soffset, doffset, size;
+               struct pipe_box box;
 
                dst = transfer->resource;
                src = &rtransfer->staging->b.b;
                size = transfer->box.width;
                doffset = transfer->box.x;
                soffset = rtransfer->offset + transfer->box.x % R600_MAP_BUFFER_ALIGNMENT;
+
+               u_box_1d(soffset, size, &box);
+
                /* Copy the staging buffer into the original one. */
-               if (rctx->b.rings.dma.cs && !(size % 4) && !(doffset % 4) && !(soffset % 4)) {
-                       if (rctx->screen->b.chip_class >= EVERGREEN) {
-                               evergreen_dma_copy(rctx, dst, src, doffset, soffset, size);
-                       } else {
-                               r600_dma_copy(rctx, dst, src, doffset, soffset, size);
-                       }
+               if (!(size % 4) && !(doffset % 4) && !(soffset % 4) &&
+                   rctx->b.dma_copy(pipe, dst, 0, doffset, 0, 0, src, 0, &box)) {
+                       /* DONE. */
                } else {
-                       struct pipe_box box;
-
-                       u_box_1d(soffset, size, &box);
-                       r600_copy_buffer(pipe, dst, doffset, src, &box);
+                       pipe->resource_copy_region(pipe, dst, 0, doffset, 0, 0, src, 0, &box);
                }
                pipe_resource_reference((struct pipe_resource**)&rtransfer->staging, NULL);
        }
index f0d4be481420e0453d2dd4dc044f59890a40d192..d58cd2e66c873ddb078bf633942d42efc1bf9fc0 100644 (file)
@@ -598,8 +598,6 @@ void evergreen_init_color_surface_rat(struct r600_context *rctx,
 void evergreen_update_db_shader_control(struct r600_context * rctx);
 
 /* r600_blit.c */
-void r600_copy_buffer(struct pipe_context *ctx, struct pipe_resource *dst, unsigned dstx,
-                     struct pipe_resource *src, const struct pipe_box *src_box);
 void r600_init_blit_functions(struct r600_context *rctx);
 void r600_decompress_depth_textures(struct r600_context *rctx,
                                    struct r600_samplerview_state *textures);
index 41e9c5dfbdb64cb47f042f0aabc6a73e5df8728a..b938c33f7ce2698de45b986d81f8959b50a669fa 100644 (file)
@@ -3149,6 +3149,12 @@ static boolean r600_dma_blit(struct pipe_context *ctx,
        if (rctx->b.rings.dma.cs == NULL) {
                return FALSE;
        }
+
+       if (dst->target == PIPE_BUFFER && src->target == PIPE_BUFFER) {
+               r600_dma_copy(rctx, dst, src, dst_x, src_box->x, src_box->width);
+               return TRUE;
+       }
+
        if (src->format != dst->format) {
                return FALSE;
        }