From 441d3911b990d1daa45816580f6c0ec0f3b7af85 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Wed, 22 Apr 2020 08:27:58 +0200 Subject: [PATCH] v3dv: save and restore descriptor state during meta operations if needed For now we have only been using meta operations for clears which don't need to bind descriptor sets, however meta blits will need to. Part-of: --- src/broadcom/vulkan/v3dv_cmd_buffer.c | 16 +++++++++++++++- src/broadcom/vulkan/v3dv_meta_clear.c | 2 +- src/broadcom/vulkan/v3dv_private.h | 5 ++++- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c index 7707a7eb9b9..b9480391149 100644 --- a/src/broadcom/vulkan/v3dv_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c @@ -2802,7 +2802,8 @@ emit_occlusion_query(struct v3dv_cmd_buffer *cmd_buffer) * a meta operation. */ void -v3dv_cmd_buffer_meta_state_push(struct v3dv_cmd_buffer *cmd_buffer) +v3dv_cmd_buffer_meta_state_push(struct v3dv_cmd_buffer *cmd_buffer, + bool push_descriptor_state) { struct v3dv_cmd_buffer_state *state = &cmd_buffer->state; @@ -2835,6 +2836,11 @@ v3dv_cmd_buffer_meta_state_push(struct v3dv_cmd_buffer *cmd_buffer) state->meta.pipeline = v3dv_pipeline_to_handle(state->pipeline); if (state->meta.pipeline) memcpy(&state->meta.dynamic, &state->dynamic, sizeof(state->dynamic)); + + if (push_descriptor_state && state->descriptor_state.valid != 0) { + memcpy(&state->meta.descriptor_state, &state->descriptor_state, + sizeof(state->descriptor_state)); + } } /* This restores command buffer state after a meta operation @@ -2876,10 +2882,18 @@ v3dv_cmd_buffer_meta_state_pop(struct v3dv_cmd_buffer *cmd_buffer, state->pipeline = VK_NULL_HANDLE; } + if (state->meta.descriptor_state.valid != 0) { + memcpy(&state->descriptor_state, &state->meta.descriptor_state, + sizeof(state->descriptor_state)); + } else { + state->descriptor_state.valid = 0; + } + state->meta.pipeline = VK_NULL_HANDLE; state->meta.framebuffer = VK_NULL_HANDLE; state->meta.pass = VK_NULL_HANDLE; state->meta.subpass_idx = -1; + state->meta.descriptor_state.valid = 0; } /* FIXME: C&P from v3dx_draw. Refactor to common place? */ diff --git a/src/broadcom/vulkan/v3dv_meta_clear.c b/src/broadcom/vulkan/v3dv_meta_clear.c index d8eb34f57c4..b08ee57dc1c 100644 --- a/src/broadcom/vulkan/v3dv_meta_clear.c +++ b/src/broadcom/vulkan/v3dv_meta_clear.c @@ -507,7 +507,7 @@ emit_color_clear_rect(struct v3dv_cmd_buffer *cmd_buffer, * it to emit the color clear pass and then finish the job for the * interrupted subpass. */ - v3dv_cmd_buffer_meta_state_push(cmd_buffer); + v3dv_cmd_buffer_meta_state_push(cmd_buffer, false); v3dv_cmd_buffer_finish_job(cmd_buffer); struct v3dv_framebuffer *subpass_fb = diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index 95caeface3f..de361945d21 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -768,6 +768,8 @@ struct v3dv_cmd_buffer_state { VkRect2D render_area; struct v3dv_dynamic_state dynamic; + + struct v3dv_descriptor_state descriptor_state; } meta; /* Command buffer state for queries */ @@ -867,7 +869,8 @@ struct v3dv_job *v3dv_cmd_buffer_subpass_resume(struct v3dv_cmd_buffer *cmd_buff void v3dv_cmd_buffer_subpass_finish(struct v3dv_cmd_buffer *cmd_buffer); -void v3dv_cmd_buffer_meta_state_push(struct v3dv_cmd_buffer *cmd_buffer); +void v3dv_cmd_buffer_meta_state_push(struct v3dv_cmd_buffer *cmd_buffer, + bool push_descriptor_state); void v3dv_cmd_buffer_meta_state_pop(struct v3dv_cmd_buffer *cmd_buffer, uint32_t dirty_dynamic_state);