From 8eed291c2c4bfaddf256dcdb10bfa95bfe2b7c58 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Mon, 26 Jun 2017 00:52:07 +0100 Subject: radv/clear: add r32g32b32a32 fast clear support (v2) We can only fast clear 128-bit images if the r/g/b channels are the same, and we are using DCC. For DCC we'll bail out on translate if this isn't true, and we catch cmask clears explicitly. v2: remove 64-bit block (Bas), add uint32 as well. Reviewed-by: Bas Nieuwenhuizen Signed-off-by: Dave Airlie --- src/amd/vulkan/radv_formats.c | 21 +++++++++++++++++++++ src/amd/vulkan/radv_meta_clear.c | 7 +++++-- 2 files changed, 26 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/amd/vulkan/radv_formats.c b/src/amd/vulkan/radv_formats.c index 4d0aca1490d..7c3bbc0f66f 100644 --- a/src/amd/vulkan/radv_formats.c +++ b/src/amd/vulkan/radv_formats.c @@ -977,6 +977,27 @@ bool radv_format_pack_clear_color(VkFormat format, clear_vals[0] = float3_to_r11g11b10f(value->float32); clear_vals[1] = 0; break; + case VK_FORMAT_R32G32B32A32_SFLOAT: + if (value->float32[0] != value->float32[1] || + value->float32[0] != value->float32[2]) + return false; + clear_vals[0] = fui(value->float32[0]); + clear_vals[1] = fui(value->float32[3]); + break; + case VK_FORMAT_R32G32B32A32_UINT: + if (value->uint32[0] != value->uint32[1] || + value->uint32[0] != value->uint32[2]) + return false; + clear_vals[0] = value->uint32[0]; + clear_vals[1] = value->uint32[3]; + break; + case VK_FORMAT_R32G32B32A32_SINT: + if (value->int32[0] != value->int32[1] || + value->int32[0] != value->int32[2]) + return false; + clear_vals[0] = value->int32[0]; + clear_vals[1] = value->int32[3]; + break; default: fprintf(stderr, "failed to fast clear %d\n", format); return false; diff --git a/src/amd/vulkan/radv_meta_clear.c b/src/amd/vulkan/radv_meta_clear.c index 7f3cfdccc86..bf583452453 100644 --- a/src/amd/vulkan/radv_meta_clear.c +++ b/src/amd/vulkan/radv_meta_clear.c @@ -881,8 +881,6 @@ emit_fast_color_clear(struct radv_cmd_buffer *cmd_buffer, if (!radv_layout_can_fast_clear(iview->image, image_layout, radv_image_queue_family_mask(iview->image, cmd_buffer->queue_family_index, cmd_buffer->queue_family_index))) goto fail; - if (vk_format_get_blocksizebits(iview->image->vk_format) > 64) - goto fail; /* don't fast clear 3D */ if (iview->image->type == VK_IMAGE_TYPE_3D) @@ -936,6 +934,11 @@ emit_fast_color_clear(struct radv_cmd_buffer *cmd_buffer, iview->image->offset + iview->image->dcc_offset, iview->image->surface.dcc_size, 0x20202020); } else { + + if (iview->image->surface.bpe > 8) { + /* 128 bit formats not supported */ + return false; + } radv_fill_buffer(cmd_buffer, iview->image->bo, iview->image->offset + iview->image->cmask.offset, iview->image->cmask.size, 0); -- cgit v1.2.3