mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-03 03:28:09 +02:00
turnip: group all geometry constant draw states in one
Thus, we can free some draw state slots for future use. Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com> Reviewed-by: Eric Anholt <eric@anholt.net> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7186>
This commit is contained in:
parent
2c0c696f16
commit
88c7aa0b3e
2 changed files with 34 additions and 32 deletions
|
|
@ -962,15 +962,10 @@ tu6_emit_binning_pass(struct tu_cmd_buffer *cmd, struct tu_cs *cs)
|
|||
* only VS and GS are invalidated, as FS isn't emitted in binning pass,
|
||||
* and we don't use HW binning when tesselation is used
|
||||
*/
|
||||
tu_cs_emit_pkt7(cs, CP_SET_DRAW_STATE, 6);
|
||||
tu_cs_emit_pkt7(cs, CP_SET_DRAW_STATE, 3);
|
||||
tu_cs_emit(cs, CP_SET_DRAW_STATE__0_COUNT(0) |
|
||||
CP_SET_DRAW_STATE__0_DISABLE |
|
||||
CP_SET_DRAW_STATE__0_GROUP_ID(TU_DRAW_STATE_VS_CONST));
|
||||
tu_cs_emit(cs, CP_SET_DRAW_STATE__1_ADDR_LO(0));
|
||||
tu_cs_emit(cs, CP_SET_DRAW_STATE__2_ADDR_HI(0));
|
||||
tu_cs_emit(cs, CP_SET_DRAW_STATE__0_COUNT(0) |
|
||||
CP_SET_DRAW_STATE__0_DISABLE |
|
||||
CP_SET_DRAW_STATE__0_GROUP_ID(TU_DRAW_STATE_GS_CONST));
|
||||
CP_SET_DRAW_STATE__0_GROUP_ID(TU_DRAW_STATE_SHADER_GEOM_CONST));
|
||||
tu_cs_emit(cs, CP_SET_DRAW_STATE__1_ADDR_LO(0));
|
||||
tu_cs_emit(cs, CP_SET_DRAW_STATE__2_ADDR_HI(0));
|
||||
|
||||
|
|
@ -3207,6 +3202,28 @@ tu6_emit_consts(struct tu_cmd_buffer *cmd,
|
|||
return tu_cs_end_draw_state(&cmd->sub_cs, &cs);
|
||||
}
|
||||
|
||||
static struct tu_draw_state
|
||||
tu6_emit_consts_geom(struct tu_cmd_buffer *cmd,
|
||||
const struct tu_pipeline *pipeline,
|
||||
struct tu_descriptor_state *descriptors_state)
|
||||
{
|
||||
uint32_t dwords = 0;
|
||||
|
||||
for (uint32_t type = MESA_SHADER_VERTEX; type < MESA_SHADER_FRAGMENT; type++)
|
||||
dwords += tu6_user_consts_size(pipeline, descriptors_state, type);
|
||||
|
||||
if (dwords == 0)
|
||||
return (struct tu_draw_state) {};
|
||||
|
||||
struct tu_cs cs;
|
||||
tu_cs_begin_sub_stream(&cmd->sub_cs, dwords, &cs);
|
||||
|
||||
for (uint32_t type = MESA_SHADER_VERTEX; type < MESA_SHADER_FRAGMENT; type++)
|
||||
tu6_emit_user_consts(&cs, pipeline, descriptors_state, type, cmd->push_constants);
|
||||
|
||||
return tu_cs_end_draw_state(&cmd->sub_cs, &cs);
|
||||
}
|
||||
|
||||
static uint64_t
|
||||
get_tess_param_bo_size(const struct tu_pipeline *pipeline,
|
||||
uint32_t draw_count)
|
||||
|
|
@ -3550,15 +3567,9 @@ tu6_draw_common(struct tu_cmd_buffer *cmd,
|
|||
}
|
||||
|
||||
if (cmd->state.dirty & TU_CMD_DIRTY_SHADER_CONSTS) {
|
||||
cmd->state.shader_const[MESA_SHADER_VERTEX] =
|
||||
tu6_emit_consts(cmd, pipeline, descriptors_state, MESA_SHADER_VERTEX);
|
||||
cmd->state.shader_const[MESA_SHADER_TESS_CTRL] =
|
||||
tu6_emit_consts(cmd, pipeline, descriptors_state, MESA_SHADER_TESS_CTRL);
|
||||
cmd->state.shader_const[MESA_SHADER_TESS_EVAL] =
|
||||
tu6_emit_consts(cmd, pipeline, descriptors_state, MESA_SHADER_TESS_EVAL);
|
||||
cmd->state.shader_const[MESA_SHADER_GEOMETRY] =
|
||||
tu6_emit_consts(cmd, pipeline, descriptors_state, MESA_SHADER_GEOMETRY);
|
||||
cmd->state.shader_const[MESA_SHADER_FRAGMENT] =
|
||||
cmd->state.shader_const[0] =
|
||||
tu6_emit_consts_geom(cmd, pipeline, descriptors_state);
|
||||
cmd->state.shader_const[1] =
|
||||
tu6_emit_consts(cmd, pipeline, descriptors_state, MESA_SHADER_FRAGMENT);
|
||||
}
|
||||
|
||||
|
|
@ -3605,11 +3616,8 @@ tu6_draw_common(struct tu_cmd_buffer *cmd,
|
|||
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_VI_BINNING, pipeline->vi.binning_state);
|
||||
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_RAST, pipeline->rast_state);
|
||||
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_BLEND, pipeline->blend_state);
|
||||
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_VS_CONST, cmd->state.shader_const[MESA_SHADER_VERTEX]);
|
||||
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_HS_CONST, cmd->state.shader_const[MESA_SHADER_TESS_CTRL]);
|
||||
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_DS_CONST, cmd->state.shader_const[MESA_SHADER_TESS_EVAL]);
|
||||
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_GS_CONST, cmd->state.shader_const[MESA_SHADER_GEOMETRY]);
|
||||
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_FS_CONST, cmd->state.shader_const[MESA_SHADER_FRAGMENT]);
|
||||
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_SHADER_GEOM_CONST, cmd->state.shader_const[0]);
|
||||
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_FS_CONST, cmd->state.shader_const[1]);
|
||||
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_DESC_SETS, cmd->state.desc_sets);
|
||||
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);
|
||||
|
|
@ -3629,7 +3637,7 @@ tu6_draw_common(struct tu_cmd_buffer *cmd,
|
|||
bool emit_binding_stride = false;
|
||||
uint32_t draw_state_count =
|
||||
has_tess +
|
||||
((cmd->state.dirty & TU_CMD_DIRTY_SHADER_CONSTS) ? 5 : 0) +
|
||||
((cmd->state.dirty & TU_CMD_DIRTY_SHADER_CONSTS) ? 2 : 0) +
|
||||
((cmd->state.dirty & TU_CMD_DIRTY_DESC_SETS_LOAD) ? 1 : 0) +
|
||||
((cmd->state.dirty & TU_CMD_DIRTY_VERTEX_BUFFERS) ? 1 : 0) +
|
||||
(dirty_lrz ? 1 : 0) +
|
||||
|
|
@ -3648,11 +3656,8 @@ tu6_draw_common(struct tu_cmd_buffer *cmd,
|
|||
if (has_tess)
|
||||
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_TESS, tess_consts);
|
||||
if (cmd->state.dirty & TU_CMD_DIRTY_SHADER_CONSTS) {
|
||||
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_VS_CONST, cmd->state.shader_const[MESA_SHADER_VERTEX]);
|
||||
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_HS_CONST, cmd->state.shader_const[MESA_SHADER_TESS_CTRL]);
|
||||
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_DS_CONST, cmd->state.shader_const[MESA_SHADER_TESS_EVAL]);
|
||||
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_GS_CONST, cmd->state.shader_const[MESA_SHADER_GEOMETRY]);
|
||||
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_FS_CONST, cmd->state.shader_const[MESA_SHADER_FRAGMENT]);
|
||||
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_SHADER_GEOM_CONST, cmd->state.shader_const[0]);
|
||||
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_FS_CONST, cmd->state.shader_const[1]);
|
||||
}
|
||||
if (cmd->state.dirty & TU_CMD_DIRTY_DESC_SETS_LOAD)
|
||||
tu_cs_emit_draw_state(cs, TU_DRAW_STATE_DESC_SETS_LOAD, pipeline->load_state);
|
||||
|
|
|
|||
|
|
@ -479,10 +479,7 @@ enum tu_draw_state_group_id
|
|||
TU_DRAW_STATE_VI_BINNING,
|
||||
TU_DRAW_STATE_RAST,
|
||||
TU_DRAW_STATE_BLEND,
|
||||
TU_DRAW_STATE_VS_CONST,
|
||||
TU_DRAW_STATE_HS_CONST,
|
||||
TU_DRAW_STATE_DS_CONST,
|
||||
TU_DRAW_STATE_GS_CONST,
|
||||
TU_DRAW_STATE_SHADER_GEOM_CONST,
|
||||
TU_DRAW_STATE_FS_CONST,
|
||||
TU_DRAW_STATE_DESC_SETS,
|
||||
TU_DRAW_STATE_DESC_SETS_LOAD,
|
||||
|
|
@ -894,7 +891,7 @@ struct tu_cmd_state
|
|||
/* saved states to re-emit in TU_CMD_DIRTY_DRAW_STATE case */
|
||||
struct tu_draw_state dynamic_state[TU_DYNAMIC_STATE_COUNT];
|
||||
struct tu_draw_state vertex_buffers;
|
||||
struct tu_draw_state shader_const[MESA_SHADER_STAGES];
|
||||
struct tu_draw_state shader_const[2];
|
||||
struct tu_draw_state desc_sets;
|
||||
|
||||
struct tu_draw_state vs_params;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue