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: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6766>
This commit is contained in:
Iago Toral Quiroga 2020-04-22 08:27:58 +02:00 committed by Marge Bot
parent 689bac310f
commit 441d3911b9
3 changed files with 20 additions and 3 deletions

View File

@ -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? */

View File

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

View File

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