radv: rework suspend/resume user conditional rendering
Some checks are pending
macOS-CI / macOS-CI (dri) (push) Waiting to run
macOS-CI / macOS-CI (xlib) (push) Waiting to run

Better to suspend/resume in the top level function.

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:33:00 +02:00 committed by Marge Bot
parent 4bc971a0bd
commit ef3363ef71
8 changed files with 42 additions and 47 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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