tu: Split up tu6_update_msaa()
authorConnor Abbott <cwabbott0@gmail.com>
Thu, 29 Sep 2022 16:14:38 +0000 (18:14 +0200)
committerMarge Bot <emma+marge@anholt.net>
Thu, 3 Nov 2022 21:59:42 +0000 (21:59 +0000)
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>

src/freedreno/vulkan/tu_cmd_buffer.c

index 82fb0a7..73c0489 100644 (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);