mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 19:30:11 +01:00
radv: rework suspend/resume user conditional rendering
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:
parent
4bc971a0bd
commit
ef3363ef71
8 changed files with 42 additions and 47 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue