diff --git a/src/amd/vulkan/meta/radv_meta.c b/src/amd/vulkan/meta/radv_meta.c index 2e95a31335d..23e5f74aa8a 100644 --- a/src/amd/vulkan/meta/radv_meta.c +++ b/src/amd/vulkan/meta/radv_meta.c @@ -148,11 +148,6 @@ radv_meta_save(struct radv_meta_saved_state *state, struct radv_cmd_buffer *cmd_ radv_cmd_buffer_reset_rendering(cmd_buffer); } - if (state->flags & RADV_META_SUSPEND_PREDICATING) { - state->predicating = cmd_buffer->state.predicating; - cmd_buffer->state.predicating = false; - } - radv_suspend_queries(state, cmd_buffer); } @@ -222,9 +217,6 @@ radv_meta_restore(const struct radv_meta_saved_state *state, struct radv_cmd_buf cmd_buffer->state.dirty |= RADV_CMD_DIRTY_FRAMEBUFFER; } - if (state->flags & RADV_META_SUSPEND_PREDICATING) - cmd_buffer->state.predicating = state->predicating; - radv_resume_queries(state, cmd_buffer); } diff --git a/src/amd/vulkan/meta/radv_meta.h b/src/amd/vulkan/meta/radv_meta.h index dcd76b83275..35017b41b6a 100644 --- a/src/amd/vulkan/meta/radv_meta.h +++ b/src/amd/vulkan/meta/radv_meta.h @@ -39,7 +39,6 @@ enum radv_meta_save_flags { RADV_META_SAVE_DESCRIPTORS = (1 << 2), RADV_META_SAVE_GRAPHICS_PIPELINE = (1 << 3), RADV_META_SAVE_COMPUTE_PIPELINE = (1 << 4), - RADV_META_SUSPEND_PREDICATING = (1 << 5), }; struct radv_meta_saved_state { @@ -64,8 +63,6 @@ struct radv_meta_saved_state { unsigned active_emulated_prims_gen_queries; unsigned active_emulated_prims_xfb_queries; unsigned active_occlusion_queries; - - bool predicating; }; enum radv_blit_ds_layout { diff --git a/src/amd/vulkan/meta/radv_meta_astc_decode.c b/src/amd/vulkan/meta/radv_meta_astc_decode.c index b1a4c555ae1..4a277274669 100644 --- a/src/amd/vulkan/meta/radv_meta_astc_decode.c +++ b/src/amd/vulkan/meta/radv_meta_astc_decode.c @@ -99,8 +99,7 @@ radv_meta_decode_astc(struct radv_cmd_buffer *cmd_buffer, struct radv_image *ima struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); struct radv_meta_saved_state saved_state; radv_meta_save(&saved_state, cmd_buffer, - RADV_META_SAVE_COMPUTE_PIPELINE | RADV_META_SAVE_CONSTANTS | RADV_META_SAVE_DESCRIPTORS | - RADV_META_SUSPEND_PREDICATING); + RADV_META_SAVE_COMPUTE_PIPELINE | RADV_META_SAVE_CONSTANTS | RADV_META_SAVE_DESCRIPTORS); const bool is_3d = image->vk.image_type == VK_IMAGE_TYPE_3D; const uint32_t base_slice = is_3d ? offset.z : subresource->baseArrayLayer; diff --git a/src/amd/vulkan/meta/radv_meta_blit.c b/src/amd/vulkan/meta/radv_meta_blit.c index f6231dd7d23..7fde2677f6a 100644 --- a/src/amd/vulkan/meta/radv_meta_blit.c +++ b/src/amd/vulkan/meta/radv_meta_blit.c @@ -386,12 +386,8 @@ blit_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image, VkI }, &cmd_buffer->vk.pool->alloc, &sampler); - /* VK_EXT_conditional_rendering says that blit commands should not be - * affected by conditional rendering. - */ radv_meta_save(&saved_state, cmd_buffer, - RADV_META_SAVE_GRAPHICS_PIPELINE | RADV_META_SAVE_CONSTANTS | RADV_META_SAVE_DESCRIPTORS | - RADV_META_SUSPEND_PREDICATING); + RADV_META_SAVE_GRAPHICS_PIPELINE | RADV_META_SAVE_CONSTANTS | RADV_META_SAVE_DESCRIPTORS); unsigned dst_start, dst_end; if (dst_image->vk.image_type == VK_IMAGE_TYPE_3D) { @@ -532,8 +528,12 @@ radv_CmdBlitImage2(VkCommandBuffer commandBuffer, const VkBlitImageInfo2 *pBlitI VK_FROM_HANDLE(radv_image, src_image, pBlitImageInfo->srcImage); VK_FROM_HANDLE(radv_image, dst_image, pBlitImageInfo->dstImage); + radv_suspend_conditional_rendering(cmd_buffer); + for (unsigned r = 0; r < pBlitImageInfo->regionCount; r++) { blit_image(cmd_buffer, src_image, pBlitImageInfo->srcImageLayout, dst_image, pBlitImageInfo->dstImageLayout, &pBlitImageInfo->pRegions[r], pBlitImageInfo->filter); } + + radv_resume_conditional_rendering(cmd_buffer); } diff --git a/src/amd/vulkan/meta/radv_meta_clear.c b/src/amd/vulkan/meta/radv_meta_clear.c index 58406633273..33ea7691ac0 100644 --- a/src/amd/vulkan/meta/radv_meta_clear.c +++ b/src/amd/vulkan/meta/radv_meta_clear.c @@ -1624,9 +1624,9 @@ radv_cmd_buffer_clear_rendering(struct radv_cmd_buffer *cmd_buffer, const VkRend if (!radv_rendering_needs_clear(pRenderingInfo)) return; - /* Subpass clear should not be affected by conditional rendering. */ - radv_meta_save(&saved_state, cmd_buffer, - RADV_META_SAVE_GRAPHICS_PIPELINE | RADV_META_SAVE_CONSTANTS | RADV_META_SUSPEND_PREDICATING); + radv_suspend_conditional_rendering(cmd_buffer); + + radv_meta_save(&saved_state, cmd_buffer, RADV_META_SAVE_GRAPHICS_PIPELINE | RADV_META_SAVE_CONSTANTS); assert(render->color_att_count == pRenderingInfo->colorAttachmentCount); for (uint32_t i = 0; i < render->color_att_count; i++) { @@ -1667,6 +1667,8 @@ radv_cmd_buffer_clear_rendering(struct radv_cmd_buffer *cmd_buffer, const VkRend radv_meta_restore(&saved_state, cmd_buffer); cmd_buffer->state.flush_bits |= post_flush; + + radv_resume_conditional_rendering(cmd_buffer); } static void @@ -1909,11 +1911,11 @@ radv_CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image_h, VkImageL struct radv_meta_saved_state saved_state; bool cs; + radv_suspend_conditional_rendering(cmd_buffer); + cs = cmd_buffer->qf == RADV_QUEUE_COMPUTE || !radv_image_is_renderable(device, image); - /* Clear commands (except vkCmdClearAttachments) should not be affected by conditional rendering. - */ - enum radv_meta_save_flags save_flags = RADV_META_SAVE_CONSTANTS | RADV_META_SUSPEND_PREDICATING; + enum radv_meta_save_flags save_flags = RADV_META_SAVE_CONSTANTS; if (cs) save_flags |= RADV_META_SAVE_COMPUTE_PIPELINE | RADV_META_SAVE_DESCRIPTORS; else @@ -1924,6 +1926,8 @@ radv_CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image_h, VkImageL radv_cmd_clear_image(cmd_buffer, image, imageLayout, (const VkClearValue *)pColor, rangeCount, pRanges, cs); radv_meta_restore(&saved_state, cmd_buffer); + + radv_resume_conditional_rendering(cmd_buffer); } VKAPI_ATTR void VKAPI_CALL @@ -1935,14 +1939,16 @@ radv_CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image_h, V VK_FROM_HANDLE(radv_image, image, image_h); struct radv_meta_saved_state saved_state; - /* Clear commands (except vkCmdClearAttachments) should not be affected by conditional rendering. */ - radv_meta_save(&saved_state, cmd_buffer, - RADV_META_SAVE_GRAPHICS_PIPELINE | RADV_META_SAVE_CONSTANTS | RADV_META_SUSPEND_PREDICATING); + radv_suspend_conditional_rendering(cmd_buffer); + + radv_meta_save(&saved_state, cmd_buffer, RADV_META_SAVE_GRAPHICS_PIPELINE | RADV_META_SAVE_CONSTANTS); radv_cmd_clear_image(cmd_buffer, image, imageLayout, (const VkClearValue *)pDepthStencil, rangeCount, pRanges, false); radv_meta_restore(&saved_state, cmd_buffer); + + radv_resume_conditional_rendering(cmd_buffer); } VKAPI_ATTR void VKAPI_CALL diff --git a/src/amd/vulkan/meta/radv_meta_copy.c b/src/amd/vulkan/meta/radv_meta_copy.c index c4ea6976a94..831f0e002f1 100644 --- a/src/amd/vulkan/meta/radv_meta_copy.c +++ b/src/amd/vulkan/meta/radv_meta_copy.c @@ -116,12 +116,9 @@ copy_memory_to_image(struct radv_cmd_buffer *cmd_buffer, uint64_t buffer_addr, u cs = cmd_buffer->qf == RADV_QUEUE_COMPUTE || !radv_image_is_renderable(device, image); - /* VK_EXT_conditional_rendering says that copy commands should not be - * affected by conditional rendering. - */ radv_meta_save(&saved_state, cmd_buffer, (cs ? RADV_META_SAVE_COMPUTE_PIPELINE : RADV_META_SAVE_GRAPHICS_PIPELINE) | RADV_META_SAVE_CONSTANTS | - RADV_META_SAVE_DESCRIPTORS | RADV_META_SUSPEND_PREDICATING); + RADV_META_SAVE_DESCRIPTORS); /** * From the Vulkan 1.0.6 spec: 18.3 Copying Data Between Images @@ -222,6 +219,8 @@ radv_CmdCopyBufferToImage2(VkCommandBuffer commandBuffer, const VkCopyBufferToIm struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); const struct radv_physical_device *pdev = radv_device_physical(device); + radv_suspend_conditional_rendering(cmd_buffer); + radv_cs_add_buffer(device->ws, cmd_buffer->cs, src_buffer->bo); for (unsigned r = 0; r < pCopyBufferToImageInfo->regionCount; r++) { @@ -257,6 +256,8 @@ radv_CmdCopyBufferToImage2(VkCommandBuffer commandBuffer, const VkCopyBufferToIm } } } + + radv_resume_conditional_rendering(cmd_buffer); } static void @@ -271,12 +272,8 @@ copy_image_to_memory(struct radv_cmd_buffer *cmd_buffer, uint64_t buffer_addr, u struct radv_meta_saved_state saved_state; - /* VK_EXT_conditional_rendering says that copy commands should not be - * affected by conditional rendering. - */ radv_meta_save(&saved_state, cmd_buffer, - RADV_META_SAVE_COMPUTE_PIPELINE | RADV_META_SAVE_CONSTANTS | RADV_META_SAVE_DESCRIPTORS | - RADV_META_SUSPEND_PREDICATING); + RADV_META_SAVE_COMPUTE_PIPELINE | RADV_META_SAVE_CONSTANTS | RADV_META_SAVE_DESCRIPTORS); /** * From the Vulkan 1.0.6 spec: 18.3 Copying Data Between Images @@ -371,6 +368,8 @@ radv_CmdCopyImageToBuffer2(VkCommandBuffer commandBuffer, const VkCopyImageToBuf VK_FROM_HANDLE(radv_buffer, dst_buffer, pCopyImageToBufferInfo->dstBuffer); struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); + radv_suspend_conditional_rendering(cmd_buffer); + radv_cs_add_buffer(device->ws, cmd_buffer->cs, dst_buffer->bo); for (unsigned r = 0; r < pCopyImageToBufferInfo->regionCount; r++) { @@ -383,6 +382,8 @@ radv_CmdCopyImageToBuffer2(VkCommandBuffer commandBuffer, const VkCopyImageToBuf copy_image_to_memory(cmd_buffer, dst_buffer->vk.device_address, dst_buffer->vk.size, src_image, pCopyImageToBufferInfo->srcImageLayout, region); } + + radv_resume_conditional_rendering(cmd_buffer); } static void @@ -472,12 +473,9 @@ copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image, VkI cs = cmd_buffer->qf == RADV_QUEUE_COMPUTE || !radv_image_is_renderable(device, dst_image); - /* VK_EXT_conditional_rendering says that copy commands should not be - * affected by conditional rendering. - */ radv_meta_save(&saved_state, cmd_buffer, (cs ? RADV_META_SAVE_COMPUTE_PIPELINE : RADV_META_SAVE_GRAPHICS_PIPELINE) | RADV_META_SAVE_CONSTANTS | - RADV_META_SAVE_DESCRIPTORS | RADV_META_SUSPEND_PREDICATING); + RADV_META_SAVE_DESCRIPTORS); if (cs) { /* For partial copies, HTILE should be decompressed before copying because the metadata is @@ -650,6 +648,8 @@ radv_CmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyI struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); const struct radv_physical_device *pdev = radv_device_physical(device); + radv_suspend_conditional_rendering(cmd_buffer); + for (unsigned r = 0; r < pCopyImageInfo->regionCount; r++) { const VkImageCopy2 *region = &pCopyImageInfo->pRegions[r]; const VkImageAspectFlags src_aspect_mask = region->srcSubresource.aspectMask; @@ -691,4 +691,6 @@ radv_CmdCopyImage2(VkCommandBuffer commandBuffer, const VkCopyImageInfo2 *pCopyI } } } + + radv_resume_conditional_rendering(cmd_buffer); } diff --git a/src/amd/vulkan/meta/radv_meta_etc_decode.c b/src/amd/vulkan/meta/radv_meta_etc_decode.c index 3b85d973c1f..2966aaf9969 100644 --- a/src/amd/vulkan/meta/radv_meta_etc_decode.c +++ b/src/amd/vulkan/meta/radv_meta_etc_decode.c @@ -74,8 +74,7 @@ radv_meta_decode_etc(struct radv_cmd_buffer *cmd_buffer, struct radv_image *imag struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); struct radv_meta_saved_state saved_state; radv_meta_save(&saved_state, cmd_buffer, - RADV_META_SAVE_COMPUTE_PIPELINE | RADV_META_SAVE_CONSTANTS | RADV_META_SAVE_DESCRIPTORS | - RADV_META_SUSPEND_PREDICATING); + RADV_META_SAVE_COMPUTE_PIPELINE | RADV_META_SAVE_CONSTANTS | RADV_META_SAVE_DESCRIPTORS); const bool is_3d = image->vk.image_type == VK_IMAGE_TYPE_3D; const uint32_t base_slice = is_3d ? offset.z : subresource->baseArrayLayer; diff --git a/src/amd/vulkan/radv_query.c b/src/amd/vulkan/radv_query.c index 6a29af3b6f7..21654fd7e86 100644 --- a/src/amd/vulkan/radv_query.c +++ b/src/amd/vulkan/radv_query.c @@ -1832,11 +1832,7 @@ radv_query_shader(struct radv_cmd_buffer *cmd_buffer, VkQueryType query_type, st return; } - /* VK_EXT_conditional_rendering says that copy commands should not be - * affected by conditional rendering. - */ - radv_meta_save(&saved_state, cmd_buffer, - RADV_META_SAVE_COMPUTE_PIPELINE | RADV_META_SAVE_CONSTANTS | RADV_META_SUSPEND_PREDICATING); + radv_meta_save(&saved_state, cmd_buffer, RADV_META_SAVE_COMPUTE_PIPELINE | RADV_META_SAVE_CONSTANTS); radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer), VK_PIPELINE_BIND_POINT_COMPUTE, pipeline); @@ -2453,6 +2449,8 @@ radv_CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPoo if (!queryCount) return; + radv_suspend_conditional_rendering(cmd_buffer); + radv_cs_add_buffer(device->ws, cmd_buffer->cs, pool->bo); radv_cs_add_buffer(device->ws, cmd_buffer->cs, dst_buffer->bo); @@ -2498,6 +2496,8 @@ radv_CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPoo default: unreachable("trying to get results of unhandled query type"); } + + radv_resume_conditional_rendering(cmd_buffer); } static uint32_t