radv: use 32-bit predication for skipping FCE on GFX10.3+
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Thu, 3 Dec 2020 11:51:35 +0000 (12:51 +0100)
committerMarge Bot <eric+marge@anholt.net>
Mon, 7 Dec 2020 09:30:05 +0000 (09:30 +0000)
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7897>

src/amd/vulkan/radv_image.c
src/amd/vulkan/radv_meta_fast_clear.c

index 908fb1e..cb67fb5 100644 (file)
@@ -1278,11 +1278,15 @@ static void
 radv_image_alloc_values(const struct radv_device *device, struct radv_image *image)
 {
        if (radv_image_has_dcc(image)) {
+               unsigned pred_size = 8;
+               if (device->physical_device->rad_info.has_32bit_predication)
+                       pred_size = 4;
+
                image->fce_pred_offset = image->size;
-               image->size += 8 * image->info.levels;
+               image->size += pred_size * image->info.levels;
 
                image->dcc_pred_offset = image->size;
-               image->size += 8 * image->info.levels;
+               image->size += pred_size * image->info.levels;
        }
 
        if (radv_image_has_dcc(image) || radv_image_has_cmask(image) ||
index e20d561..310e48c 100644 (file)
@@ -565,14 +565,18 @@ radv_emit_set_predication_state_from_image(struct radv_cmd_buffer *cmd_buffer,
                                      struct radv_image *image,
                                      uint64_t pred_offset, bool value)
 {
+       unsigned pred_op = PREDICATION_OP_BOOL64;
        uint64_t va = 0;
 
+       if (cmd_buffer->device->physical_device->rad_info.has_32bit_predication)
+               pred_op = PREDICATION_OP_BOOL32;
+
        if (value) {
                va = radv_buffer_get_va(image->bo) + image->offset;
                va += pred_offset;
        }
 
-       si_emit_set_predication_state(cmd_buffer, true, PREDICATION_OP_BOOL64, va);
+       si_emit_set_predication_state(cmd_buffer, true, pred_op, va);
 }
 
 static void