summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRhys Perry <pendingchaos02@gmail.com>2021-04-09 16:14:50 +0100
committerEric Engestrom <eric@engestrom.ch>2021-04-18 22:13:24 +0200
commit61660ee4e091dd9686a51156ff521589c722d167 (patch)
tree4952196ad7aa42294783a026dc9a3560e38f4e28
parent7e32a8990219140c6e5af9629322c6b428da82e8 (diff)
radv: fix clearing DCC-compressed e5b9g9r9 images
Fixes dEQP-VK.api.image_clearing.core.clear_color_image.2d.optimal.single_layer.e5b9g9r9_ufloat_pack32_33x128 with RADV_DEBUG=forcecompress on GFX10.3. Signed-off-by: Rhys Perry <pendingchaos02@gmail.com> Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Cc: 21.1 <mesa-stable> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10176> (cherry picked from commit 86d903e88ddab658c4806bdbc0656a2eeaac949c)
-rw-r--r--.pick_status.json2
-rw-r--r--src/amd/vulkan/radv_formats.c2
-rw-r--r--src/amd/vulkan/radv_meta_clear.c32
-rw-r--r--src/amd/vulkan/radv_private.h2
4 files changed, 31 insertions, 7 deletions
diff --git a/.pick_status.json b/.pick_status.json
index d0df8bf74a9..22f320fef3a 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -400,7 +400,7 @@
"description": "radv: fix clearing DCC-compressed e5b9g9r9 images",
"nominated": true,
"nomination_type": 0,
- "resolution": 0,
+ "resolution": 1,
"master_sha": null,
"because_sha": null
},
diff --git a/src/amd/vulkan/radv_formats.c b/src/amd/vulkan/radv_formats.c
index de046a842a8..d4ad6a35b6a 100644
--- a/src/amd/vulkan/radv_formats.c
+++ b/src/amd/vulkan/radv_formats.c
@@ -501,7 +501,7 @@ radv_is_atomic_format_supported(VkFormat format)
format == VK_FORMAT_R64_SINT;
}
-static bool
+bool
radv_is_storage_image_format_supported(struct radv_physical_device *physical_device,
VkFormat format)
{
diff --git a/src/amd/vulkan/radv_meta_clear.c b/src/amd/vulkan/radv_meta_clear.c
index 1cf4ed956fc..87d18b351e2 100644
--- a/src/amd/vulkan/radv_meta_clear.c
+++ b/src/amd/vulkan/radv_meta_clear.c
@@ -2014,11 +2014,23 @@ radv_cmd_clear_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *imag
else
internal_clear_value.depthStencil = clear_value->depthStencil;
+ bool disable_compression = false;
+
if (format == VK_FORMAT_E5B9G9R9_UFLOAT_PACK32) {
- uint32_t value;
- format = VK_FORMAT_R32_UINT;
- value = float3_to_rgb9e5(clear_value->color.float32);
- internal_clear_value.color.uint32[0] = value;
+ bool blendable;
+ if (cs ? !radv_is_storage_image_format_supported(cmd_buffer->device->physical_device, format)
+ : !radv_is_colorbuffer_format_supported(cmd_buffer->device->physical_device, format,
+ &blendable)) {
+ format = VK_FORMAT_R32_UINT;
+ internal_clear_value.color.uint32[0] = float3_to_rgb9e5(clear_value->color.float32);
+
+ uint32_t queue_mask = radv_image_queue_family_mask(image, cmd_buffer->queue_family_index,
+ cmd_buffer->queue_family_index);
+
+ /* Don't use compressed image stores because they will use an incompatible format. */
+ if (radv_layout_dcc_compressed(cmd_buffer->device, image, image_layout, false, queue_mask))
+ disable_compression = cs;
+ }
}
if (format == VK_FORMAT_R4G4_UNORM_PACK8) {
@@ -2053,15 +2065,25 @@ radv_cmd_clear_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *imag
surf.level = range->baseMipLevel + l;
surf.layer = range->baseArrayLayer + s;
surf.aspect_mask = range->aspectMask;
- surf.disable_compression = false;
+ surf.disable_compression = disable_compression;
radv_meta_clear_image_cs(cmd_buffer, &surf, &internal_clear_value.color);
} else {
+ assert(!disable_compression);
radv_clear_image_layer(cmd_buffer, image, image_layout, range, format, l, s,
&internal_clear_value);
}
}
}
}
+
+ if (disable_compression) {
+ enum radv_cmd_flush_bits flush_bits = 0;
+ for (unsigned i = 0; i < range_count; i++) {
+ if (radv_dcc_enabled(image, ranges[i].baseMipLevel))
+ flush_bits |= radv_clear_dcc(cmd_buffer, image, &ranges[i], 0xffffffffu);
+ }
+ cmd_buffer->state.flush_bits |= flush_bits;
+ }
}
void
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index 4088af95a5c..34d8d64a9f1 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -1794,6 +1794,8 @@ uint32_t radv_translate_tex_numformat(VkFormat format, const struct util_format_
int first_non_void);
bool radv_format_pack_clear_color(VkFormat format, uint32_t clear_vals[2],
VkClearColorValue *value);
+bool radv_is_storage_image_format_supported(struct radv_physical_device *physical_device,
+ VkFormat format);
bool radv_is_colorbuffer_format_supported(const struct radv_physical_device *pdevice,
VkFormat format, bool *blendable);
bool radv_dcc_formats_compatible(VkFormat format1, VkFormat format2);