turnip: enable LRZ
v2: * Use sub_cs when creating the IB in tu6_build_lrz(). (Jonathan Marek) * Emit tu6_build_lrz() only when pipeline state changes or there is a clear. (Jonathan Marek) v3: * Don't modify tu_pipeline object, track the changes in command buffer state. Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5146>
This commit is contained in:
parent
1d83f5ae84
commit
3c07a14998
|
@ -3185,6 +3185,48 @@ tu6_emit_tess_consts(struct tu_cmd_buffer *cmd,
|
||||||
return VK_SUCCESS;
|
return VK_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct tu_draw_state
|
||||||
|
tu6_build_lrz(struct tu_cmd_buffer *cmd)
|
||||||
|
{
|
||||||
|
const uint32_t a = cmd->state.subpass->depth_stencil_attachment.attachment;
|
||||||
|
struct tu_cs lrz_cs;
|
||||||
|
struct tu_draw_state ds = tu_cs_draw_state(&cmd->sub_cs, &lrz_cs, 4);
|
||||||
|
|
||||||
|
if (cmd->state.pipeline->lrz.invalidate) {
|
||||||
|
/* LRZ is not valid for next draw commands, so don't use it until cleared */
|
||||||
|
cmd->state.lrz.valid = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (a == VK_ATTACHMENT_UNUSED || !cmd->state.lrz.valid) {
|
||||||
|
tu_cs_emit_regs(&lrz_cs, A6XX_GRAS_LRZ_CNTL(0));
|
||||||
|
tu_cs_emit_regs(&lrz_cs, A6XX_RB_LRZ_CNTL(0));
|
||||||
|
return ds;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Disable LRZ writes when blend is enabled, since the
|
||||||
|
* resulting pixel value from the blend-draw
|
||||||
|
* depends on an earlier draw, which LRZ in the draw pass
|
||||||
|
* could early-reject if the previous blend-enabled draw wrote LRZ.
|
||||||
|
*
|
||||||
|
* TODO: We need to disable LRZ writes only for the binning pass.
|
||||||
|
* Therefore, we need to emit it in a separate draw state. We keep
|
||||||
|
* it disabled for sysmem path as well for the moment.
|
||||||
|
*/
|
||||||
|
bool lrz_write = cmd->state.pipeline->lrz.write;
|
||||||
|
if (cmd->state.pipeline->lrz.blend_disable_write)
|
||||||
|
lrz_write = false;
|
||||||
|
|
||||||
|
tu_cs_emit_regs(&lrz_cs, A6XX_GRAS_LRZ_CNTL(
|
||||||
|
.enable = cmd->state.pipeline->lrz.enable,
|
||||||
|
.greater = cmd->state.pipeline->lrz.greater,
|
||||||
|
.lrz_write = lrz_write,
|
||||||
|
.z_test_enable = cmd->state.pipeline->lrz.z_test_enable,
|
||||||
|
));
|
||||||
|
|
||||||
|
tu_cs_emit_regs(&lrz_cs, A6XX_RB_LRZ_CNTL(.enable = cmd->state.pipeline->lrz.enable));
|
||||||
|
return ds;
|
||||||
|
}
|
||||||
|
|
||||||
static VkResult
|
static VkResult
|
||||||
tu6_draw_common(struct tu_cmd_buffer *cmd,
|
tu6_draw_common(struct tu_cmd_buffer *cmd,
|
||||||
struct tu_cs *cs,
|
struct tu_cs *cs,
|
||||||
|
@ -3200,7 +3242,8 @@ tu6_draw_common(struct tu_cmd_buffer *cmd,
|
||||||
|
|
||||||
tu_emit_cache_flush_renderpass(cmd, cs);
|
tu_emit_cache_flush_renderpass(cmd, cs);
|
||||||
|
|
||||||
/* TODO lrz */
|
if (cmd->state.dirty & TU_CMD_DIRTY_LRZ)
|
||||||
|
cmd->state.lrz.state = tu6_build_lrz(cmd);
|
||||||
|
|
||||||
tu_cs_emit_regs(cs, A6XX_PC_PRIMITIVE_CNTL_0(
|
tu_cs_emit_regs(cs, A6XX_PC_PRIMITIVE_CNTL_0(
|
||||||
.primitive_restart =
|
.primitive_restart =
|
||||||
|
@ -3298,6 +3341,8 @@ tu6_draw_common(struct tu_cmd_buffer *cmd,
|
||||||
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_DESC_SETS_LOAD, pipeline->load_state);
|
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_DESC_SETS_LOAD, pipeline->load_state);
|
||||||
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_VB, cmd->state.vertex_buffers);
|
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_VB, cmd->state.vertex_buffers);
|
||||||
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_VS_PARAMS, cmd->state.vs_params);
|
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_VS_PARAMS, cmd->state.vs_params);
|
||||||
|
if (cmd->state.dirty & TU_CMD_DIRTY_LRZ)
|
||||||
|
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_LRZ, cmd->state.lrz.state);
|
||||||
|
|
||||||
for (uint32_t i = 0; i < ARRAY_SIZE(cmd->state.dynamic_state); i++) {
|
for (uint32_t i = 0; i < ARRAY_SIZE(cmd->state.dynamic_state); i++) {
|
||||||
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_DYNAMIC + i,
|
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_DYNAMIC + i,
|
||||||
|
@ -3315,6 +3360,7 @@ tu6_draw_common(struct tu_cmd_buffer *cmd,
|
||||||
((cmd->state.dirty & TU_CMD_DIRTY_SHADER_CONSTS) ? 5 : 0) +
|
((cmd->state.dirty & TU_CMD_DIRTY_SHADER_CONSTS) ? 5 : 0) +
|
||||||
((cmd->state.dirty & TU_CMD_DIRTY_DESC_SETS_LOAD) ? 1 : 0) +
|
((cmd->state.dirty & TU_CMD_DIRTY_DESC_SETS_LOAD) ? 1 : 0) +
|
||||||
((cmd->state.dirty & TU_CMD_DIRTY_VERTEX_BUFFERS) ? 1 : 0) +
|
((cmd->state.dirty & TU_CMD_DIRTY_VERTEX_BUFFERS) ? 1 : 0) +
|
||||||
|
((cmd->state.dirty & TU_CMD_DIRTY_LRZ) ? 1 : 0) +
|
||||||
1; /* vs_params */
|
1; /* vs_params */
|
||||||
|
|
||||||
if ((cmd->state.dirty & TU_CMD_DIRTY_VB_STRIDE) &&
|
if ((cmd->state.dirty & TU_CMD_DIRTY_VB_STRIDE) &&
|
||||||
|
@ -3345,6 +3391,9 @@ tu6_draw_common(struct tu_cmd_buffer *cmd,
|
||||||
cmd->state.dynamic_state[TU_DYNAMIC_STATE_VB_STRIDE]);
|
cmd->state.dynamic_state[TU_DYNAMIC_STATE_VB_STRIDE]);
|
||||||
}
|
}
|
||||||
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_VS_PARAMS, cmd->state.vs_params);
|
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_VS_PARAMS, cmd->state.vs_params);
|
||||||
|
|
||||||
|
if (cmd->state.dirty & TU_CMD_DIRTY_LRZ)
|
||||||
|
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_LRZ, cmd->state.lrz.state);
|
||||||
}
|
}
|
||||||
|
|
||||||
tu_cs_sanity_check(cs);
|
tu_cs_sanity_check(cs);
|
||||||
|
|
|
@ -490,6 +490,7 @@ enum tu_draw_state_group_id
|
||||||
TU_DRAW_STATE_VS_PARAMS,
|
TU_DRAW_STATE_VS_PARAMS,
|
||||||
TU_DRAW_STATE_INPUT_ATTACHMENTS_GMEM,
|
TU_DRAW_STATE_INPUT_ATTACHMENTS_GMEM,
|
||||||
TU_DRAW_STATE_INPUT_ATTACHMENTS_SYSMEM,
|
TU_DRAW_STATE_INPUT_ATTACHMENTS_SYSMEM,
|
||||||
|
TU_DRAW_STATE_LRZ,
|
||||||
|
|
||||||
/* dynamic state related draw states */
|
/* dynamic state related draw states */
|
||||||
TU_DRAW_STATE_DYNAMIC,
|
TU_DRAW_STATE_DYNAMIC,
|
||||||
|
@ -852,6 +853,7 @@ struct tu_lrz_state
|
||||||
/* Depth/Stencil image currently on use to do LRZ */
|
/* Depth/Stencil image currently on use to do LRZ */
|
||||||
struct tu_image *image;
|
struct tu_image *image;
|
||||||
bool valid : 1;
|
bool valid : 1;
|
||||||
|
struct tu_draw_state state;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct tu_cmd_state
|
struct tu_cmd_state
|
||||||
|
|
Loading…
Reference in New Issue