radv: fix meta save/restore state with non renderable images

For non renderable images, the driver performs some transfer operations
with compute shaders on the gfx queue, but it was saving the gfx state
instead of the compute state.

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/9474>
This commit is contained in:
Samuel Pitoiset 2021-03-09 14:02:11 +01:00 committed by Marge Bot
parent b42204e4d0
commit 9863ed9bf3
2 changed files with 16 additions and 12 deletions

View File

@ -2229,11 +2229,6 @@ radv_cmd_clear_image(struct radv_cmd_buffer *cmd_buffer,
internal_clear_value.color.uint32[0] = (r << 4) | (g & 0xf);
}
if (format == VK_FORMAT_R32G32B32_UINT ||
format == VK_FORMAT_R32G32B32_SINT ||
format == VK_FORMAT_R32G32B32_SFLOAT)
cs = true;
for (uint32_t r = 0; r < range_count; r++) {
const VkImageSubresourceRange *range = &ranges[r];
@ -2282,7 +2277,12 @@ void radv_CmdClearColorImage(
RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
RADV_FROM_HANDLE(radv_image, image, image_h);
struct radv_meta_saved_state saved_state;
bool cs = cmd_buffer->queue_family_index == RADV_QUEUE_COMPUTE;
bool cs;
cs = cmd_buffer->queue_family_index == RADV_QUEUE_COMPUTE ||
image->vk_format == VK_FORMAT_R32G32B32_UINT ||
image->vk_format == VK_FORMAT_R32G32B32_SINT ||
image->vk_format == VK_FORMAT_R32G32B32_SFLOAT;
if (cs) {
radv_meta_save(&saved_state, cmd_buffer,

View File

@ -127,15 +127,18 @@ copy_buffer_to_image(struct radv_cmd_buffer *cmd_buffer,
VkImageLayout layout,
const VkBufferImageCopy2KHR* region)
{
bool cs = cmd_buffer->queue_family_index == RADV_QUEUE_COMPUTE;
struct radv_meta_saved_state saved_state;
bool old_predicating;
bool cs;
/* The Vulkan 1.0 spec says "dstImage must have a sample count equal to
* VK_SAMPLE_COUNT_1_BIT."
*/
assert(image->info.samples == 1);
cs = cmd_buffer->queue_family_index == RADV_QUEUE_COMPUTE ||
!image_is_renderable(cmd_buffer->device, image);
radv_meta_save(&saved_state, cmd_buffer,
(cs ? RADV_META_SAVE_COMPUTE_PIPELINE :
RADV_META_SAVE_GRAPHICS_PIPELINE) |
@ -224,8 +227,7 @@ copy_buffer_to_image(struct radv_cmd_buffer *cmd_buffer,
/* Perform Blit */
if (cs ||
!image_is_renderable(cmd_buffer->device, img_bsurf.image)) {
if (cs) {
radv_meta_buffer_to_image_cs(cmd_buffer, &buf_bsurf, &img_bsurf, 1, &rect);
} else {
radv_meta_blit2d(cmd_buffer, NULL, &buf_bsurf, &img_bsurf, 1, &rect);
@ -459,9 +461,9 @@ copy_image(struct radv_cmd_buffer *cmd_buffer,
VkImageLayout dst_image_layout,
const VkImageCopy2KHR *region)
{
bool cs = cmd_buffer->queue_family_index == RADV_QUEUE_COMPUTE;
struct radv_meta_saved_state saved_state;
bool old_predicating;
bool cs;
/* From the Vulkan 1.0 spec:
*
@ -470,6 +472,9 @@ copy_image(struct radv_cmd_buffer *cmd_buffer,
*/
assert(src_image->info.samples == dst_image->info.samples);
cs = cmd_buffer->queue_family_index == RADV_QUEUE_COMPUTE ||
!image_is_renderable(cmd_buffer->device, dst_image);
radv_meta_save(&saved_state, cmd_buffer,
(cs ? RADV_META_SAVE_COMPUTE_PIPELINE :
RADV_META_SAVE_GRAPHICS_PIPELINE) |
@ -582,8 +587,7 @@ copy_image(struct radv_cmd_buffer *cmd_buffer,
rect.src_y = src_offset_el.y;
/* Perform Blit */
if (cs ||
!image_is_renderable(cmd_buffer->device, b_dst.image)) {
if (cs) {
radv_meta_image_to_image_cs(cmd_buffer, &b_src, &b_dst, 1, &rect);
} else {
radv_meta_blit2d(cmd_buffer, &b_src, NULL, &b_dst, 1, &rect);