mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-08 19:20:12 +01:00
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:
parent
4d1d6d4147
commit
4bc971a0bd
3 changed files with 29 additions and 32 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue