So far we have been only restoring dirty dynamic states used by meta
pipelines however, static state from meta pipelines will also clear
dirty flags, preventing follow-up draw calls in the command buffer
to honor these if they are flagged as dynamic states in their
pipelines. Fix this by always resetting all dirty state flags after
a meta operation so we re-emit all the state we need with the next draw
call.
Fixes:
dEQP-VK.dynamic_state.monolithic.image.clear
cc: mesa-stable
Reviewed-by: Alejandro PiƱeiro <apinheiro@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20356>
(cherry picked from commit
df8611e816295eb27139ce966a6d37d78893fa65)
"description": "v3dv: be more careful when restoring dirty state after meta operations",
"nominated": true,
"nomination_type": 0,
- "resolution": 0,
+ "resolution": 1,
"main_sha": null,
"because_sha": null
},
*/
void
v3dv_cmd_buffer_meta_state_pop(struct v3dv_cmd_buffer *cmd_buffer,
- uint32_t dirty_dynamic_state,
bool needs_subpass_resume)
{
struct v3dv_cmd_buffer_state *state = &cmd_buffer->state;
state->gfx.pipeline = NULL;
}
- if (dirty_dynamic_state) {
- memcpy(&state->dynamic, &state->meta.dynamic, sizeof(state->dynamic));
- state->dirty |= dirty_dynamic_state;
- }
+ /* Restore dynamic state */
+ memcpy(&state->dynamic, &state->meta.dynamic, sizeof(state->dynamic));
+ state->dirty = ~0;
if (state->meta.has_descriptor_state) {
if (state->meta.gfx.descriptor_state.valid != 0) {
v3dv_CmdDispatch(commandBuffer, 1, 1, 1);
- v3dv_cmd_buffer_meta_state_pop(cmd_buffer, 0, false);
+ v3dv_cmd_buffer_meta_state_pop(cmd_buffer, false);
}
static void
v3dv_CmdDispatch(commandBuffer, 1, 1, 1);
- v3dv_cmd_buffer_meta_state_pop(cmd_buffer, 0, false);
+ v3dv_cmd_buffer_meta_state_pop(cmd_buffer, false);
}
VKAPI_ATTR void VKAPI_CALL
VK_PIPELINE_BIND_POINT_GRAPHICS,
pipeline->pipeline);
- uint32_t dynamic_states = V3DV_CMD_DIRTY_VIEWPORT | V3DV_CMD_DIRTY_SCISSOR;
-
for (uint32_t i = 0; i < rect_count; i++) {
const VkViewport viewport = {
.x = rects[i].rect.offset.x,
cmd_buffer, (uintptr_t)pipeline,
(v3dv_cmd_buffer_private_obj_destroy_cb) destroy_color_clear_pipeline);
- v3dv_cmd_buffer_meta_state_pop(cmd_buffer, dynamic_states, false);
+ v3dv_cmd_buffer_meta_state_pop(cmd_buffer, false);
}
/* Emits a scissored quad, clearing the depth aspect by writing to gl_FragDepth
VK_PIPELINE_BIND_POINT_GRAPHICS,
pipeline->pipeline);
- uint32_t dynamic_states = V3DV_CMD_DIRTY_VIEWPORT | V3DV_CMD_DIRTY_SCISSOR;
if (aspects & VK_IMAGE_ASPECT_STENCIL_BIT) {
v3dv_CmdSetStencilReference(cmd_buffer_handle,
VK_STENCIL_FACE_FRONT_AND_BACK,
VK_STENCIL_FACE_FRONT_AND_BACK, 0xff);
v3dv_CmdSetStencilCompareMask(cmd_buffer_handle,
VK_STENCIL_FACE_FRONT_AND_BACK, 0xff);
- dynamic_states |= VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK |
- VK_DYNAMIC_STATE_STENCIL_WRITE_MASK |
- VK_DYNAMIC_STATE_STENCIL_REFERENCE;
}
for (uint32_t i = 0; i < rect_count; i++) {
}
}
- v3dv_cmd_buffer_meta_state_pop(cmd_buffer, dynamic_states, false);
+ v3dv_cmd_buffer_meta_state_pop(cmd_buffer, false);
}
static void
/* Push command buffer state before starting meta operation */
v3dv_cmd_buffer_meta_state_push(cmd_buffer, true);
- uint32_t dirty_dynamic_state = 0;
/* Bind common state for all layers and regions */
VkCommandBuffer _cmd_buffer = v3dv_cmd_buffer_to_handle(cmd_buffer);
}
/* For each region */
- dirty_dynamic_state = V3DV_CMD_DIRTY_VIEWPORT | V3DV_CMD_DIRTY_SCISSOR;
for (uint32_t r = 0; r < region_count; r++) {
const VkBufferImageCopy2 *region = ®ions[r];
} /* For each layer */
fail:
- v3dv_cmd_buffer_meta_state_pop(cmd_buffer, dirty_dynamic_state, true);
+ v3dv_cmd_buffer_meta_state_pop(cmd_buffer, true);
return handled;
}
{
bool handled = true;
VkResult result;
- uint32_t dirty_dynamic_state = 0;
/* We don't support rendering to linear depth/stencil, this should have
* been rewritten to a compatible color blit by the caller.
};
v3dv_CmdEndRenderPass2(_cmd_buffer, &sp_end_info);
- dirty_dynamic_state = V3DV_CMD_DIRTY_VIEWPORT | V3DV_CMD_DIRTY_SCISSOR;
}
fail:
- v3dv_cmd_buffer_meta_state_pop(cmd_buffer, dirty_dynamic_state, true);
+ v3dv_cmd_buffer_meta_state_pop(cmd_buffer, true);
return handled;
}
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,
bool needs_subpass_resume);
void v3dv_cmd_buffer_reset_queries(struct v3dv_cmd_buffer *cmd_buffer,