diff --git a/src/amd/vulkan/meta/radv_meta_buffer.c b/src/amd/vulkan/meta/radv_meta_buffer.c index 4b4bfe39038..5c63d77b0aa 100644 --- a/src/amd/vulkan/meta/radv_meta_buffer.c +++ b/src/amd/vulkan/meta/radv_meta_buffer.c @@ -232,20 +232,14 @@ radv_CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSi { VK_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer); VK_FROM_HANDLE(radv_buffer, dst_buffer, dstBuffer); - bool old_predicating; - /* VK_EXT_conditional_rendering says that copy commands should not be - * affected by conditional rendering. - */ - old_predicating = cmd_buffer->state.predicating; - cmd_buffer->state.predicating = false; + radv_suspend_conditional_rendering(cmd_buffer); fillSize = vk_buffer_range(&dst_buffer->vk, dstOffset, fillSize) & ~3ull; radv_fill_buffer(cmd_buffer, NULL, dst_buffer->bo, vk_buffer_address(&dst_buffer->vk, dstOffset), fillSize, data); - /* Restore conditional rendering. */ - cmd_buffer->state.predicating = old_predicating; + radv_resume_conditional_rendering(cmd_buffer); } void @@ -270,13 +264,8 @@ radv_CmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 *pCop VK_FROM_HANDLE(radv_buffer, src_buffer, pCopyBufferInfo->srcBuffer); VK_FROM_HANDLE(radv_buffer, dst_buffer, pCopyBufferInfo->dstBuffer); struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); - bool old_predicating; - /* VK_EXT_conditional_rendering says that copy commands should not be - * affected by conditional rendering. - */ - old_predicating = cmd_buffer->state.predicating; - cmd_buffer->state.predicating = false; + radv_suspend_conditional_rendering(cmd_buffer); radv_cs_add_buffer(device->ws, cmd_buffer->cs, src_buffer->bo); radv_cs_add_buffer(device->ws, cmd_buffer->cs, dst_buffer->bo); @@ -289,8 +278,7 @@ radv_CmdCopyBuffer2(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2 *pCop radv_copy_memory(cmd_buffer, src_va, dst_va, region->size); } - /* Restore conditional rendering. */ - cmd_buffer->state.predicating = old_predicating; + radv_resume_conditional_rendering(cmd_buffer); } void @@ -347,18 +335,12 @@ radv_CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDevice VK_FROM_HANDLE(radv_buffer, dst_buffer, dstBuffer); struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); const uint64_t dst_va = vk_buffer_address(&dst_buffer->vk, dstOffset); - bool old_predicating; - /* VK_EXT_conditional_rendering says that copy commands should not be - * affected by conditional rendering. - */ - old_predicating = cmd_buffer->state.predicating; - cmd_buffer->state.predicating = false; + radv_suspend_conditional_rendering(cmd_buffer); radv_cs_add_buffer(device->ws, cmd_buffer->cs, dst_buffer->bo); radv_update_memory(cmd_buffer, dst_va, dataSize, pData); - /* Restore conditional rendering. */ - cmd_buffer->state.predicating = old_predicating; + radv_resume_conditional_rendering(cmd_buffer); } diff --git a/src/amd/vulkan/meta/radv_meta_resolve.c b/src/amd/vulkan/meta/radv_meta_resolve.c index c232339a613..9d1d07a7503 100644 --- a/src/amd/vulkan/meta/radv_meta_resolve.c +++ b/src/amd/vulkan/meta/radv_meta_resolve.c @@ -407,13 +407,8 @@ radv_CmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2 * VkImageLayout src_image_layout = pResolveImageInfo->srcImageLayout; VkImageLayout dst_image_layout = pResolveImageInfo->dstImageLayout; enum radv_resolve_method resolve_method = pdev->info.gfx_level >= GFX11 ? RESOLVE_FRAGMENT : RESOLVE_HW; - bool old_predicating; - /* VK_EXT_conditional_rendering says that resolve commands should not be affected by conditional - * rendering. - */ - old_predicating = cmd_buffer->state.predicating; - cmd_buffer->state.predicating = false; + radv_suspend_conditional_rendering(cmd_buffer); /* we can use the hw resolve only for single full resolves */ if (pResolveImageInfo->regionCount == 1) { @@ -440,8 +435,7 @@ radv_CmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2 * resolve_image(cmd_buffer, src_image, src_image_layout, dst_image, dst_image_layout, region, resolve_method); } - /* Restore conditional rendering. */ - cmd_buffer->state.predicating = old_predicating; + radv_resume_conditional_rendering(cmd_buffer); } static void diff --git a/src/amd/vulkan/radv_cmd_buffer.h b/src/amd/vulkan/radv_cmd_buffer.h index 9205961665f..64fb1af40ed 100644 --- a/src/amd/vulkan/radv_cmd_buffer.h +++ b/src/amd/vulkan/radv_cmd_buffer.h @@ -407,6 +407,8 @@ struct radv_cmd_state { uint64_t predication_va; uint64_t mec_inv_pred_va; /* For inverted predication when using MEC. */ bool mec_inv_pred_emitted; /* To ensure we don't have to repeat inverting the VA. */ + bool saved_user_cond_render; + bool is_user_cond_render_suspended; /* Inheritance info. */ VkQueryPipelineStatisticFlags inherited_pipeline_statistics; @@ -801,4 +803,23 @@ void radv_emit_compute_shader(const struct radv_physical_device *pdev, struct ra void radv_upload_indirect_descriptor_sets(struct radv_cmd_buffer *cmd_buffer, struct radv_descriptor_state *descriptors_state); +static inline void +radv_suspend_conditional_rendering(struct radv_cmd_buffer *cmd_buffer) +{ + assert(!cmd_buffer->state.is_user_cond_render_suspended); + + cmd_buffer->state.saved_user_cond_render = cmd_buffer->state.predicating; + cmd_buffer->state.predicating = false; + cmd_buffer->state.is_user_cond_render_suspended = true; +} + +static inline void +radv_resume_conditional_rendering(struct radv_cmd_buffer *cmd_buffer) +{ + assert(cmd_buffer->state.is_user_cond_render_suspended); + + cmd_buffer->state.predicating = cmd_buffer->state.saved_user_cond_render; + cmd_buffer->state.is_user_cond_render_suspended = false; +} + #endif /* RADV_CMD_BUFFER_H */