mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-06-18 06:28:21 +02:00
radv: rework radv_layout_fmask_compressed
Rename radv_layout_fmask_compressed and make it return an enum. We will add partial compression (fmask decompressed and not expanded) in a following commit. Drop the check for VK_IMAGE_USAGE_STORAGE_BIT and VK_IMAGE_USAGE_TRANSFER_DST_BIT. When transitioning to VK_IMAGE_LAYOUT_GENERAL, we should decompress and expand FMASK even when those usage bits are not set. Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21615>
This commit is contained in:
parent
8e84a23697
commit
3cf7ac4e9c
3 changed files with 33 additions and 19 deletions
|
|
@ -2665,10 +2665,10 @@ radv_emit_fb_color_state(struct radv_cmd_buffer *cmd_buffer, int index,
|
|||
}
|
||||
}
|
||||
|
||||
if (!radv_layout_fmask_compressed(
|
||||
cmd_buffer->device, image, layout,
|
||||
radv_image_queue_family_mask(image, cmd_buffer->qf,
|
||||
cmd_buffer->qf))) {
|
||||
const enum radv_fmask_compression fmask_comp =
|
||||
radv_layout_fmask_compression(cmd_buffer->device, image, layout,
|
||||
radv_image_queue_family_mask(image, cmd_buffer->qf, cmd_buffer->qf));
|
||||
if (fmask_comp == RADV_FMASK_COMPRESSION_NONE) {
|
||||
cb_color_info &= C_028C70_COMPRESSION;
|
||||
}
|
||||
|
||||
|
|
@ -10301,10 +10301,14 @@ radv_handle_color_image_transition(struct radv_cmd_buffer *cmd_buffer, struct ra
|
|||
}
|
||||
|
||||
/* MSAA color decompress. */
|
||||
if (radv_image_has_fmask(image) &&
|
||||
(image->vk.usage & (VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT)) &&
|
||||
radv_layout_fmask_compressed(cmd_buffer->device, image, src_layout, src_queue_mask) &&
|
||||
!radv_layout_fmask_compressed(cmd_buffer->device, image, dst_layout, dst_queue_mask)) {
|
||||
const enum radv_fmask_compression src_fmask_comp = radv_layout_fmask_compression(cmd_buffer->device,
|
||||
image, src_layout, src_queue_mask);
|
||||
const enum radv_fmask_compression dst_fmask_comp = radv_layout_fmask_compression(cmd_buffer->device,
|
||||
image, dst_layout, dst_queue_mask);
|
||||
if (src_fmask_comp <= dst_fmask_comp)
|
||||
return;
|
||||
|
||||
if (src_fmask_comp == RADV_FMASK_COMPRESSION_FULL) {
|
||||
if (radv_dcc_enabled(image, range->baseMipLevel) &&
|
||||
!radv_image_use_dcc_image_stores(cmd_buffer->device, image) && !dcc_decompressed) {
|
||||
/* A DCC decompress is required before expanding FMASK
|
||||
|
|
@ -10319,7 +10323,9 @@ radv_handle_color_image_transition(struct radv_cmd_buffer *cmd_buffer, struct ra
|
|||
*/
|
||||
radv_fast_clear_flush_image_inplace(cmd_buffer, image, range);
|
||||
}
|
||||
}
|
||||
|
||||
if (dst_fmask_comp == RADV_FMASK_COMPRESSION_NONE) {
|
||||
struct radv_barrier_data barrier = {0};
|
||||
barrier.layout_transitions.fmask_color_expand = 1;
|
||||
radv_describe_layout_transition(cmd_buffer, &barrier);
|
||||
|
|
|
|||
|
|
@ -2449,23 +2449,25 @@ radv_layout_dcc_compressed(const struct radv_device *device, const struct radv_i
|
|||
return device->physical_device->rad_info.gfx_level >= GFX10 || layout != VK_IMAGE_LAYOUT_GENERAL;
|
||||
}
|
||||
|
||||
bool
|
||||
radv_layout_fmask_compressed(const struct radv_device *device, const struct radv_image *image,
|
||||
VkImageLayout layout, unsigned queue_mask)
|
||||
enum radv_fmask_compression
|
||||
radv_layout_fmask_compression(const struct radv_device *device, const struct radv_image *image,
|
||||
VkImageLayout layout, unsigned queue_mask)
|
||||
{
|
||||
if (!radv_image_has_fmask(image))
|
||||
return false;
|
||||
return RADV_FMASK_COMPRESSION_NONE;
|
||||
|
||||
if (layout == VK_IMAGE_LAYOUT_GENERAL)
|
||||
return RADV_FMASK_COMPRESSION_NONE;
|
||||
|
||||
/* Don't compress compute transfer dst because image stores ignore FMASK and it needs to be
|
||||
* expanded before.
|
||||
*/
|
||||
if ((layout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL || layout == VK_IMAGE_LAYOUT_GENERAL) &&
|
||||
(queue_mask & (1u << RADV_QUEUE_COMPUTE)))
|
||||
return false;
|
||||
if (layout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL && (queue_mask & (1u << RADV_QUEUE_COMPUTE)))
|
||||
return RADV_FMASK_COMPRESSION_NONE;
|
||||
|
||||
/* Only compress concurrent images if TC-compat CMASK is enabled (no FMASK decompression). */
|
||||
return layout != VK_IMAGE_LAYOUT_GENERAL &&
|
||||
(queue_mask == (1u << RADV_QUEUE_GENERAL) || radv_image_is_tc_compat_cmask(image));
|
||||
return (queue_mask == (1u << RADV_QUEUE_GENERAL) || radv_image_is_tc_compat_cmask(image)) ?
|
||||
RADV_FMASK_COMPRESSION_FULL : RADV_FMASK_COMPRESSION_NONE;
|
||||
}
|
||||
|
||||
unsigned
|
||||
|
|
|
|||
|
|
@ -2547,8 +2547,14 @@ bool radv_layout_can_fast_clear(const struct radv_device *device, const struct r
|
|||
bool radv_layout_dcc_compressed(const struct radv_device *device, const struct radv_image *image,
|
||||
unsigned level, VkImageLayout layout, unsigned queue_mask);
|
||||
|
||||
bool radv_layout_fmask_compressed(const struct radv_device *device, const struct radv_image *image,
|
||||
VkImageLayout layout, unsigned queue_mask);
|
||||
enum radv_fmask_compression {
|
||||
RADV_FMASK_COMPRESSION_NONE,
|
||||
RADV_FMASK_COMPRESSION_FULL,
|
||||
};
|
||||
|
||||
enum radv_fmask_compression radv_layout_fmask_compression(
|
||||
const struct radv_device *device, const struct radv_image *image, VkImageLayout layout,
|
||||
unsigned queue_mask);
|
||||
|
||||
/**
|
||||
* Return whether the image has CMASK metadata for color surfaces.
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue