tu: Split up tu6_update_msaa()

Most of the time we will only be updating either the number of samples
or whether it should be disabled, not both, and we don't need to compare
both. With pipelines we were comparing both, but with dynamic
rasterization samples we want to only update disable when binding the
pipeline and only update samples when calling
vkCmdSetRasterizationSamplesEXT(). Stop optimizing the uncommon case
where both are changed when binding a pipeline, and split it into 2
parts while sharing the common part that records and emits the state
packet.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18912>
This commit is contained in:
Connor Abbott
2022-09-29 18:14:38 +02:00
committed by Marge Bot
parent ac051c556d
commit e61583f6f1
+30 -14
View File
@@ -609,7 +609,29 @@ tu6_emit_msaa(struct tu_cs *cs, VkSampleCountFlagBits vk_samples,
}
static void
tu6_update_msaa(struct tu_cmd_buffer *cmd, VkSampleCountFlagBits samples)
tu6_update_msaa(struct tu_cmd_buffer *cmd)
{
struct tu_cs cs;
cmd->state.msaa = tu_cs_draw_state(&cmd->sub_cs, &cs, 9);
tu6_emit_msaa(&cs, cmd->state.samples, cmd->state.msaa_disable);
if (!(cmd->state.dirty & TU_CMD_DIRTY_DRAW_STATE)) {
tu_cs_emit_pkt7(&cmd->draw_cs, CP_SET_DRAW_STATE, 3);
tu_cs_emit_draw_state(&cmd->draw_cs, TU_DRAW_STATE_MSAA, cmd->state.msaa);
}
}
static void
tu6_update_msaa_samples(struct tu_cmd_buffer *cmd, VkSampleCountFlagBits samples)
{
if (cmd->state.samples != samples) {
cmd->state.samples = samples;
tu6_update_msaa(cmd);
}
}
static void
tu6_update_msaa_disable(struct tu_cmd_buffer *cmd)
{
bool is_line =
tu6_primtype_line(cmd->state.primtype) ||
@@ -618,17 +640,9 @@ tu6_update_msaa(struct tu_cmd_buffer *cmd, VkSampleCountFlagBits samples)
cmd->state.pipeline->tess.patch_type == IR3_TESS_ISOLINES);
bool msaa_disable = is_line && cmd->state.line_mode == BRESENHAM;
if (cmd->state.msaa_disable != msaa_disable ||
cmd->state.samples != samples) {
struct tu_cs cs;
cmd->state.msaa = tu_cs_draw_state(&cmd->sub_cs, &cs, 9);
tu6_emit_msaa(&cs, samples, msaa_disable);
if (!(cmd->state.dirty & TU_CMD_DIRTY_DRAW_STATE)) {
tu_cs_emit_pkt7(&cmd->draw_cs, CP_SET_DRAW_STATE, 3);
tu_cs_emit_draw_state(&cmd->draw_cs, TU_DRAW_STATE_MSAA, cmd->state.msaa);
}
if (cmd->state.msaa_disable != msaa_disable) {
cmd->state.msaa_disable = msaa_disable;
cmd->state.samples = samples;
tu6_update_msaa(cmd);
}
}
@@ -2615,7 +2629,9 @@ tu_CmdBindPipeline(VkCommandBuffer commandBuffer,
cmd->state.tess_upper_left_domain_origin =
pipeline->tess.upper_left_domain_origin;
tu6_update_msaa(cmd, pipeline->output.samples);
tu6_update_msaa_disable(cmd);
tu6_update_msaa_samples(cmd, pipeline->output.samples);
if ((pipeline->dynamic_state_mask & BIT(VK_DYNAMIC_STATE_VIEWPORT)) &&
(pipeline->viewport.z_negative_one_to_one != cmd->state.z_negative_one_to_one)) {
@@ -2880,7 +2896,7 @@ tu_CmdSetPrimitiveTopologyEXT(VkCommandBuffer commandBuffer,
TU_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer);
cmd->state.primtype = tu6_primtype(primitiveTopology);
tu6_update_msaa(cmd, cmd->state.samples);
tu6_update_msaa_disable(cmd);
}
VKAPI_ATTR void VKAPI_CALL
@@ -3906,7 +3922,7 @@ tu_emit_subpass_begin(struct tu_cmd_buffer *cmd)
tu6_emit_zs(cmd, cmd->state.subpass, &cmd->draw_cs);
tu6_emit_mrt(cmd, cmd->state.subpass, &cmd->draw_cs);
if (cmd->state.subpass->samples != 0)
tu6_update_msaa(cmd, cmd->state.subpass->samples);
tu6_update_msaa_samples(cmd, cmd->state.subpass->samples);
tu6_emit_render_cntl(cmd, cmd->state.subpass, &cmd->draw_cs, false);
tu_set_input_attachments(cmd, cmd->state.subpass);