radv: add new helper to suspend/resume user conditional rendering

Instead of duplicating same code everywhere.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34338>
This commit is contained in:
Samuel Pitoiset 2025-04-02 09:03:25 +02:00 committed by Marge Bot
parent 4d1d6d4147
commit 4bc971a0bd
3 changed files with 29 additions and 32 deletions

View file

@ -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);
}

View file

@ -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

View file

@ -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 */