r600g,radeonsi: add common interface for buffer invalidation
authorMarek Olšák <marek.olsak@amd.com>
Fri, 29 Nov 2013 15:26:36 +0000 (16:26 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 12 Dec 2013 17:34:11 +0000 (18:34 +0100)
This will be used by common code in the next commit.

Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
src/gallium/drivers/r600/r600_buffer.c
src/gallium/drivers/r600/r600_pipe.h
src/gallium/drivers/r600/r600_state_common.c
src/gallium/drivers/radeon/r600_pipe_common.h
src/gallium/drivers/radeonsi/r600_buffer.c
src/gallium/drivers/radeonsi/si_descriptors.c
src/gallium/drivers/radeonsi/si_state.h

index 7239e5a365f0e944aea88f3fb36a4b9dd129de82..969803fe9514f844df949795c3eb691c4ec7b5f7 100644 (file)
@@ -91,7 +91,7 @@ static void *r600_buffer_transfer_map(struct pipe_context *ctx,
                /* Check if mapping this buffer would cause waiting for the GPU. */
                if (r600_rings_is_buffer_referenced(&rctx->b, rbuffer->cs_buf, RADEON_USAGE_READWRITE) ||
                    rctx->b.ws->buffer_is_busy(rbuffer->buf, RADEON_USAGE_READWRITE)) {
-                       r600_invalidate_buffer(&rctx->b.b, &rbuffer->b.b);
+                       rctx->b.invalidate_buffer(&rctx->b.b, &rbuffer->b.b);
                }
        }
        else if ((usage & PIPE_TRANSFER_DISCARD_RANGE) &&
index 45512639b52212102810c287542b0e2a0532033a..15e89a0e26394241540a4ab34dc69884a0a6c097 100644 (file)
@@ -717,7 +717,6 @@ unsigned r600_get_swizzle_combined(const unsigned char *swizzle_format,
 uint32_t r600_translate_texformat(struct pipe_screen *screen, enum pipe_format format,
                                  const unsigned char *swizzle_view,
                                  uint32_t *word4_p, uint32_t *yuv_format_p);
-void r600_invalidate_buffer(struct pipe_context *ctx, struct pipe_resource *buf);
 
 /* r600_uvd.c */
 struct pipe_video_codec *r600_uvd_create_decoder(struct pipe_context *context,
index 718a173236d7e5795ec363d4f3ecc5f24e4ac087..3c7bfe9474513083c3af710b6aa4b5f9d27f5ed6 100644 (file)
@@ -2072,7 +2072,7 @@ out_unknown:
        return ~0;
 }
 
-void r600_invalidate_buffer(struct pipe_context *ctx, struct pipe_resource *buf)
+static void r600_invalidate_buffer(struct pipe_context *ctx, struct pipe_resource *buf)
 {
        struct r600_context *rctx = (struct r600_context*)ctx;
        struct r600_resource *rbuffer = r600_resource(buf);
@@ -2162,6 +2162,7 @@ void r600_init_common_state_functions(struct r600_context *rctx)
        rctx->b.b.create_surface = r600_create_surface;
        rctx->b.b.surface_destroy = r600_surface_destroy;
        rctx->b.b.draw_vbo = r600_draw_vbo;
+       rctx->b.invalidate_buffer = r600_invalidate_buffer;
 }
 
 void r600_trace_emit(struct r600_context *rctx)
index e830360d5cf425ff9716e774b58afc7ac5c5e9c1..172dd937bbd81db8f9af20fe4ea77f8f0d36f8ee 100644 (file)
@@ -256,6 +256,10 @@ struct r600_common_context {
                                      unsigned first_level, unsigned last_level,
                                      unsigned first_layer, unsigned last_layer,
                                      unsigned first_sample, unsigned last_sample);
+
+       /* Reallocate the buffer and update all resource bindings where
+        * the buffer is bound, including all resource descriptors. */
+       void (*invalidate_buffer)(struct pipe_context *ctx, struct pipe_resource *buf);
 };
 
 /* r600_buffer.c */
index 560e7daf3cc14d57e5bb1e31fbd2c8851eb9b4e6..c952fe0084bb2749ce3d1e931b92264327322c13 100644 (file)
@@ -63,7 +63,7 @@ static void *r600_buffer_transfer_map(struct pipe_context *ctx,
                /* Check if mapping this buffer would cause waiting for the GPU. */
                if (r600_rings_is_buffer_referenced(&rctx->b, rbuffer->cs_buf, RADEON_USAGE_READWRITE) ||
                    rctx->b.ws->buffer_is_busy(rbuffer->buf, RADEON_USAGE_READWRITE)) {
-                       si_invalidate_buffer(&rctx->b.b, &rbuffer->b.b);
+                       rctx->b.invalidate_buffer(&rctx->b.b, &rbuffer->b.b);
                }
        }
 
index 62c354fffcf82648f4c6f579ff6caab57bbfcaaa..e6d566d02e06f0e5377a7ecec87acbfe1845c9a8 100644 (file)
@@ -551,7 +551,7 @@ static void si_desc_reset_buffer_offset(struct pipe_context *ctx,
  * idle by discarding its contents. Apps usually tell us when to do this using
  * map_buffer flags, for example.
  */
-void si_invalidate_buffer(struct pipe_context *ctx, struct pipe_resource *buf)
+static void si_invalidate_buffer(struct pipe_context *ctx, struct pipe_resource *buf)
 {
        struct r600_context *rctx = (struct r600_context*)ctx;
        struct r600_resource *rbuffer = r600_resource(buf);
@@ -811,6 +811,7 @@ void si_init_all_descriptors(struct r600_context *rctx)
        rctx->b.b.set_constant_buffer = si_set_constant_buffer;
        rctx->b.b.set_stream_output_targets = si_set_streamout_targets;
        rctx->b.clear_buffer = si_clear_buffer;
+       rctx->b.invalidate_buffer = si_invalidate_buffer;
 }
 
 void si_release_all_descriptors(struct r600_context *rctx)
index 7e2cb81eaaf83b4d4c4d0868fb46436e5895d887..6774e57e21f38246890566d68b8183e229c7a76b 100644 (file)
@@ -200,7 +200,6 @@ void si_all_descriptors_begin_new_cs(struct r600_context *rctx);
 void si_copy_buffer(struct r600_context *rctx,
                    struct pipe_resource *dst, struct pipe_resource *src,
                    uint64_t dst_offset, uint64_t src_offset, unsigned size);
-void si_invalidate_buffer(struct pipe_context *ctx, struct pipe_resource *buf);
 
 /* si_state.c */
 struct si_pipe_shader_selector;