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