mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 02:48:06 +02:00
radv: Decompress DCC when the image format is not allowed for buffers.
Otherwise the buffer loads/stores in the bufimage meta operations fail.
If we decompress DCC then we can use the "canonical" format compatible
with the not-supported format.
CC: <mesa-stable@lists.freedesktop.org>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
(cherry picked from commit 4107590911)
This commit is contained in:
parent
eb1e6e6412
commit
6f18adff0a
3 changed files with 40 additions and 2 deletions
|
|
@ -547,7 +547,7 @@ static bool radv_is_storage_image_format_supported(struct radv_physical_device *
|
|||
}
|
||||
}
|
||||
|
||||
static bool radv_is_buffer_format_supported(VkFormat format, bool *scaled)
|
||||
bool radv_is_buffer_format_supported(VkFormat format, bool *scaled)
|
||||
{
|
||||
const struct vk_format_description *desc = vk_format_description(format);
|
||||
unsigned data_format, num_format;
|
||||
|
|
@ -559,7 +559,8 @@ static bool radv_is_buffer_format_supported(VkFormat format, bool *scaled)
|
|||
num_format = radv_translate_buffer_numformat(desc,
|
||||
vk_format_get_first_non_void_channel(format));
|
||||
|
||||
*scaled = (num_format == V_008F0C_BUF_NUM_FORMAT_SSCALED) || (num_format == V_008F0C_BUF_NUM_FORMAT_USCALED);
|
||||
if (scaled)
|
||||
*scaled = (num_format == V_008F0C_BUF_NUM_FORMAT_SSCALED) || (num_format == V_008F0C_BUF_NUM_FORMAT_USCALED);
|
||||
return data_format != V_008F0C_BUF_DATA_FORMAT_INVALID &&
|
||||
num_format != ~0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -187,6 +187,24 @@ meta_copy_buffer_to_image(struct radv_cmd_buffer *cmd_buffer,
|
|||
&pRegions[r].imageSubresource,
|
||||
pRegions[r].imageSubresource.aspectMask);
|
||||
|
||||
if (!radv_is_buffer_format_supported(img_bsurf.format, NULL)) {
|
||||
uint32_t queue_mask = radv_image_queue_family_mask(image,
|
||||
cmd_buffer->queue_family_index,
|
||||
cmd_buffer->queue_family_index);
|
||||
MAYBE_UNUSED bool compressed = radv_layout_dcc_compressed(image, layout, queue_mask);
|
||||
if (compressed) {
|
||||
radv_decompress_dcc(cmd_buffer, image, &(VkImageSubresourceRange) {
|
||||
.aspectMask = pRegions[r].imageSubresource.aspectMask,
|
||||
.baseMipLevel = pRegions[r].imageSubresource.mipLevel,
|
||||
.levelCount = 1,
|
||||
.baseArrayLayer = pRegions[r].imageSubresource.baseArrayLayer,
|
||||
.layerCount = pRegions[r].imageSubresource.layerCount,
|
||||
});
|
||||
}
|
||||
img_bsurf.format = vk_format_for_size(vk_format_get_blocksize(img_bsurf.format));
|
||||
img_bsurf.current_layout = VK_IMAGE_LAYOUT_GENERAL;
|
||||
}
|
||||
|
||||
struct radv_meta_blit2d_buffer buf_bsurf = {
|
||||
.bs = img_bsurf.bs,
|
||||
.format = img_bsurf.format,
|
||||
|
|
@ -313,6 +331,24 @@ meta_copy_image_to_buffer(struct radv_cmd_buffer *cmd_buffer,
|
|||
&pRegions[r].imageSubresource,
|
||||
pRegions[r].imageSubresource.aspectMask);
|
||||
|
||||
if (!radv_is_buffer_format_supported(img_info.format, NULL)) {
|
||||
uint32_t queue_mask = radv_image_queue_family_mask(image,
|
||||
cmd_buffer->queue_family_index,
|
||||
cmd_buffer->queue_family_index);
|
||||
MAYBE_UNUSED bool compressed = radv_layout_dcc_compressed(image, layout, queue_mask);
|
||||
if (compressed) {
|
||||
radv_decompress_dcc(cmd_buffer, image, &(VkImageSubresourceRange) {
|
||||
.aspectMask = pRegions[r].imageSubresource.aspectMask,
|
||||
.baseMipLevel = pRegions[r].imageSubresource.mipLevel,
|
||||
.levelCount = 1,
|
||||
.baseArrayLayer = pRegions[r].imageSubresource.baseArrayLayer,
|
||||
.layerCount = pRegions[r].imageSubresource.layerCount,
|
||||
});
|
||||
}
|
||||
img_info.format = vk_format_for_size(vk_format_get_blocksize(img_info.format));
|
||||
img_info.current_layout = VK_IMAGE_LAYOUT_GENERAL;
|
||||
}
|
||||
|
||||
struct radv_meta_blit2d_buffer buf_info = {
|
||||
.bs = img_info.bs,
|
||||
.format = img_info.format,
|
||||
|
|
|
|||
|
|
@ -1456,6 +1456,7 @@ uint32_t radv_translate_buffer_dataformat(const struct vk_format_description *de
|
|||
int first_non_void);
|
||||
uint32_t radv_translate_buffer_numformat(const struct vk_format_description *desc,
|
||||
int first_non_void);
|
||||
bool radv_is_buffer_format_supported(VkFormat format, bool *scaled);
|
||||
uint32_t radv_translate_colorformat(VkFormat format);
|
||||
uint32_t radv_translate_color_numformat(VkFormat format,
|
||||
const struct vk_format_description *desc,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue