radv: allow to skip DCC decompressions with the new predicate
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Mon, 10 Dec 2018 12:00:33 +0000 (13:00 +0100)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Thu, 13 Dec 2018 08:21:14 +0000 (09:21 +0100)
Feral games aren't affected because they don't decompress DCC.
F1 2018 has one DCC decompression per frame, but I don't see
any performance improvements. This new predicate will be
probably more useful for DCC/MSAA.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/amd/vulkan/radv_meta_fast_clear.c

index 481c432513f06b407a80cf37f190736195131f83..8f97c1a8f157175d190166d23b7297c7143e66de 100644 (file)
@@ -551,13 +551,14 @@ radv_device_init_meta_fast_clear_flush_state(struct radv_device *device, bool on
 
 static void
 radv_emit_set_predication_state_from_image(struct radv_cmd_buffer *cmd_buffer,
-                                     struct radv_image *image, bool value)
+                                     struct radv_image *image, 
+                                     uint64_t pred_offset, bool value)
 {
        uint64_t va = 0;
 
        if (value) {
                va = radv_buffer_get_va(image->bo) + image->offset;
-               va += image->fce_pred_offset;
+               va += pred_offset;
        }
 
        si_emit_set_predication_state(cmd_buffer, true, va);
@@ -600,10 +601,13 @@ radv_emit_color_decompress(struct radv_cmd_buffer *cmd_buffer,
                pipeline = cmd_buffer->device->meta_state.fast_clear_flush.cmask_eliminate_pipeline;
        }
 
-       if (!decompress_dcc && radv_image_has_dcc(image)) {
+       if (radv_image_has_dcc(image)) {
+               uint64_t pred_offset = decompress_dcc ? image->dcc_pred_offset :
+                                                       image->fce_pred_offset;
+
                old_predicating = cmd_buffer->state.predicating;
 
-               radv_emit_set_predication_state_from_image(cmd_buffer, image, true);
+               radv_emit_set_predication_state_from_image(cmd_buffer, image, pred_offset, true);
                cmd_buffer->state.predicating = true;
        }
 
@@ -688,10 +692,13 @@ radv_emit_color_decompress(struct radv_cmd_buffer *cmd_buffer,
                                        &cmd_buffer->pool->alloc);
 
        }
-       if (!decompress_dcc && radv_image_has_dcc(image)) {
+       if (radv_image_has_dcc(image)) {
+               uint64_t pred_offset = decompress_dcc ? image->dcc_pred_offset :
+                                                       image->fce_pred_offset;
+
                cmd_buffer->state.predicating = old_predicating;
 
-               radv_emit_set_predication_state_from_image(cmd_buffer, image, false);
+               radv_emit_set_predication_state_from_image(cmd_buffer, image, pred_offset, false);
 
                if (cmd_buffer->state.predication_type != -1) {
                        /* Restore previous conditional rendering user state. */