gallium/radeon: move DCC clearing into a separate function
authorMarek Olšák <marek.olsak@amd.com>
Sun, 5 Jun 2016 23:54:20 +0000 (01:54 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Tue, 7 Jun 2016 22:22:45 +0000 (00:22 +0200)
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/gallium/drivers/radeon/r600_pipe_common.h
src/gallium/drivers/radeon/r600_texture.c

index bb090d65d162b56015f64d4a227f3ea3a0de4cdc..edfae95ec781128b9df5d0abb87ac0e4209eed0d 100644 (file)
@@ -675,6 +675,9 @@ struct pipe_surface *r600_create_surface_custom(struct pipe_context *pipe,
                                                const struct pipe_surface *templ,
                                                unsigned width, unsigned height);
 unsigned r600_translate_colorswap(enum pipe_format format, bool do_endian_swap);
+void vi_dcc_clear_level(struct r600_common_context *rctx,
+                       struct r600_texture *rtex,
+                       unsigned level, unsigned clear_value);
 void evergreen_do_fast_color_clear(struct r600_common_context *rctx,
                                   struct pipe_framebuffer_state *fb,
                                   struct r600_atom *fb_state,
index b0f375e4b1f67c34f5aec6eec38d8d0acd349169..a1c314ebce0e7571560fb34b62f02819627ab44d 100644 (file)
@@ -1793,6 +1793,21 @@ static void vi_get_fast_clear_parameters(enum pipe_format surface_format,
                *reset_value |= 0x40404040U;
 }
 
+void vi_dcc_clear_level(struct r600_common_context *rctx,
+                       struct r600_texture *rtex,
+                       unsigned level, unsigned clear_value)
+{
+       struct pipe_resource *dcc_buffer = &rtex->resource.b.b;
+       uint64_t dcc_offset = rtex->dcc_offset +
+                             rtex->surface.level[level].dcc_offset;
+
+       assert(rtex->dcc_offset && rtex->surface.level[level].dcc_enabled);
+
+       rctx->clear_buffer(&rctx->b, dcc_buffer, dcc_offset,
+                          rtex->surface.level[level].dcc_fast_clear_size,
+                          clear_value, R600_COHERENCY_CB_META);
+}
+
 void evergreen_do_fast_color_clear(struct r600_common_context *rctx,
                                   struct pipe_framebuffer_state *fb,
                                   struct r600_atom *fb_state,
@@ -1867,11 +1882,7 @@ void evergreen_do_fast_color_clear(struct r600_common_context *rctx,
                                continue;
 
                        vi_get_fast_clear_parameters(fb->cbufs[i]->format, color, &reset_value, &clear_words_needed);
-
-                       rctx->clear_buffer(&rctx->b, &tex->resource.b.b,
-                                          tex->dcc_offset,
-                                          tex->surface.level[0].dcc_fast_clear_size,
-                                          reset_value, R600_COHERENCY_CB_META);
+                       vi_dcc_clear_level(rctx, tex, 0, reset_value);
 
                        if (clear_words_needed)
                                tex->dirty_level_mask |= 1 << fb->cbufs[i]->u.tex.level;