[amlogic][display] Factor out CCM programming.

The FlipOnVsync method is difficult to read because it is so long.
Move the color correction bit-twiddling out.

Test: toggle a11y settings on a local device

Change-Id: I1c8216173d885b4dc1da7ee563ad8126846a9292
Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/560402
Commit-Queue: Randall Bosetti <rlb@google.com>
Reviewed-by: Arman Uguray <armansito@google.com>
diff --git a/src/graphics/display/drivers/amlogic-display/osd.cc b/src/graphics/display/drivers/amlogic-display/osd.cc
index 825c5d9..61f11e6 100644
--- a/src/graphics/display/drivers/amlogic-display/osd.cc
+++ b/src/graphics/display/drivers/amlogic-display/osd.cc
@@ -286,6 +286,90 @@
   return -1;
 }
 
+void Osd::SetColorCorrection(uint32_t rdma_table_idx,
+                             const display_config_t* config) {
+  if (!config->cc_flags) {
+    // Disable color conversion engine
+    SetRdmaTableValue(rdma_table_idx, IDX_MATRIX_EN_CTRL,
+                      vpu_mmio_->Read32(VPU_VPP_POST_MATRIX_EN_CTRL) & ~(1 << 0));
+    return;
+  }
+
+  // Set enable bit
+  SetRdmaTableValue(rdma_table_idx, IDX_MATRIX_EN_CTRL,
+                    vpu_mmio_->Read32(VPU_VPP_POST_MATRIX_EN_CTRL) | (1 << 0));
+
+  // Load PreOffset values (or 0 if none entered)
+  auto offset0_1 = (config->cc_flags & COLOR_CONVERSION_PREOFFSET
+                    ? (FloatToFixed2_10(config->cc_preoffsets[0]) << 16 |
+                       FloatToFixed2_10(config->cc_preoffsets[1]) << 0)
+                    : 0);
+  SetRdmaTableValue(rdma_table_idx, IDX_MATRIX_PRE_OFFSET0_1, offset0_1);
+  auto offset2 = (config->cc_flags & COLOR_CONVERSION_PREOFFSET
+                  ? (FloatToFixed2_10(config->cc_preoffsets[2]) << 0)
+                  : 0);
+  SetRdmaTableValue(rdma_table_idx, IDX_MATRIX_PRE_OFFSET2, offset2);
+  // TODO(b/182481217): remove when this bug is closed.
+  DISP_SPEW("pre offset0_1=%u offset2=%u\n", offset0_1, offset2);
+
+  // Load PostOffset values (or 0 if none entered)
+  offset0_1 = (config->cc_flags & COLOR_CONVERSION_POSTOFFSET
+               ? (FloatToFixed2_10(config->cc_postoffsets[0]) << 16 |
+                  FloatToFixed2_10(config->cc_postoffsets[1]) << 0)
+               : 0);
+  offset2 = (config->cc_flags & COLOR_CONVERSION_PREOFFSET
+             ? (FloatToFixed2_10(config->cc_postoffsets[2]) << 0)
+             : 0);
+  SetRdmaTableValue(rdma_table_idx, IDX_MATRIX_OFFSET0_1, offset0_1);
+  SetRdmaTableValue(rdma_table_idx, IDX_MATRIX_OFFSET2, offset2);
+  // TODO(b/182481217): remove when this bug is closed.
+  DISP_SPEW("post offset0_1=%u offset2=%u\n", offset0_1, offset2);
+
+  float identity[3][3] = {
+    {
+      1,
+      0,
+      0,
+    },
+    {
+      0,
+      1,
+      0,
+    },
+    {
+      0,
+      0,
+      1,
+    },
+  };
+
+  // This will include either the entered coefficient matrix or the identity matrix
+  float final[3][3] = {};
+
+  for (uint32_t i = 0; i < 3; i++) {
+    for (uint32_t j = 0; j < 3; j++) {
+      final[i][j] = config->cc_flags & COLOR_CONVERSION_COEFFICIENTS
+                    ? config->cc_coefficients[i][j]
+                    : identity[i][j];
+    }
+  }
+
+  // Load up the coefficient matrix registers
+  auto coef00_01 = FloatToFixed3_10(final[0][0]) << 16 | FloatToFixed3_10(final[0][1]) << 0;
+  auto coef02_10 = FloatToFixed3_10(final[0][2]) << 16 | FloatToFixed3_10(final[1][0]) << 0;
+  auto coef11_12 = FloatToFixed3_10(final[1][1]) << 16 | FloatToFixed3_10(final[1][2]) << 0;
+  auto coef20_21 = FloatToFixed3_10(final[2][0]) << 16 | FloatToFixed3_10(final[2][1]) << 0;
+  auto coef22 = FloatToFixed3_10(final[2][2]) << 0;
+  SetRdmaTableValue(rdma_table_idx, IDX_MATRIX_COEF00_01, coef00_01);
+  SetRdmaTableValue(rdma_table_idx, IDX_MATRIX_COEF02_10, coef02_10);
+  SetRdmaTableValue(rdma_table_idx, IDX_MATRIX_COEF11_12, coef11_12);
+  SetRdmaTableValue(rdma_table_idx, IDX_MATRIX_COEF20_21, coef20_21);
+  SetRdmaTableValue(rdma_table_idx, IDX_MATRIX_COEF22, coef22);
+  // TODO(b/182481217): remove when this bug is closed.
+  DISP_SPEW("color correction regs 00_01=%xu 02_12=%xu 11_12=%xu 20_21=%u 22=%xu\n", coef00_01, coef02_10,
+            coef11_12, coef20_21, coef22);
+}
+
 void Osd::FlipOnVsync(uint8_t idx, const display_config_t* config) {
   auto info = reinterpret_cast<ImageInfo*>(config[0].layer_list[0]->cfg.primary.image.handle);
   const int next_table_idx = GetNextAvailableRdmaTableIndex();
@@ -432,86 +516,7 @@
     SetAfbcRdmaTableValue(AfbcCommandReg::Get().FromValue(0).set_direct_swap(0).reg_value());
   }
 
-  // Perform color correction if needed
-  if (config->cc_flags) {
-    // Set enable bit
-    SetRdmaTableValue(next_table_idx, IDX_MATRIX_EN_CTRL,
-                      vpu_mmio_->Read32(VPU_VPP_POST_MATRIX_EN_CTRL) | (1 << 0));
-
-    // Load PreOffset values (or 0 if none entered)
-    auto offset0_1 = (config->cc_flags & COLOR_CONVERSION_PREOFFSET
-                          ? (FloatToFixed2_10(config->cc_preoffsets[0]) << 16 |
-                             FloatToFixed2_10(config->cc_preoffsets[1]) << 0)
-                          : 0);
-    SetRdmaTableValue(next_table_idx, IDX_MATRIX_PRE_OFFSET0_1, offset0_1);
-    auto offset2 = (config->cc_flags & COLOR_CONVERSION_PREOFFSET
-                        ? (FloatToFixed2_10(config->cc_preoffsets[2]) << 0)
-                        : 0);
-    SetRdmaTableValue(next_table_idx, IDX_MATRIX_PRE_OFFSET2, offset2);
-    // TODO(b/182481217): remove when this bug is closed.
-    DISP_SPEW("pre offset0_1=%u offset2=%u\n", offset0_1, offset2);
-
-    // Load PostOffset values (or 0 if none entered)
-    offset0_1 = (config->cc_flags & COLOR_CONVERSION_POSTOFFSET
-                     ? (FloatToFixed2_10(config->cc_postoffsets[0]) << 16 |
-                        FloatToFixed2_10(config->cc_postoffsets[1]) << 0)
-                     : 0);
-    offset2 = (config->cc_flags & COLOR_CONVERSION_PREOFFSET
-                   ? (FloatToFixed2_10(config->cc_postoffsets[2]) << 0)
-                   : 0);
-    SetRdmaTableValue(next_table_idx, IDX_MATRIX_OFFSET0_1, offset0_1);
-    SetRdmaTableValue(next_table_idx, IDX_MATRIX_OFFSET2, offset2);
-    // TODO(b/182481217): remove when this bug is closed.
-    DISP_SPEW("post offset0_1=%u offset2=%u\n", offset0_1, offset2);
-
-    float identity[3][3] = {
-        {
-            1,
-            0,
-            0,
-        },
-        {
-            0,
-            1,
-            0,
-        },
-        {
-            0,
-            0,
-            1,
-        },
-    };
-
-    // This will include either the entered coefficient matrix or the identity matrix
-    float final[3][3] = {};
-
-    for (uint32_t i = 0; i < 3; i++) {
-      for (uint32_t j = 0; j < 3; j++) {
-        final[i][j] = config->cc_flags & COLOR_CONVERSION_COEFFICIENTS
-                          ? config->cc_coefficients[i][j]
-                          : identity[i][j];
-      }
-    }
-
-    // Load up the coefficient matrix registers
-    auto coef00_01 = FloatToFixed3_10(final[0][0]) << 16 | FloatToFixed3_10(final[0][1]) << 0;
-    auto coef02_10 = FloatToFixed3_10(final[0][2]) << 16 | FloatToFixed3_10(final[1][0]) << 0;
-    auto coef11_12 = FloatToFixed3_10(final[1][1]) << 16 | FloatToFixed3_10(final[1][2]) << 0;
-    auto coef20_21 = FloatToFixed3_10(final[2][0]) << 16 | FloatToFixed3_10(final[2][1]) << 0;
-    auto coef22 = FloatToFixed3_10(final[2][2]) << 0;
-    SetRdmaTableValue(next_table_idx, IDX_MATRIX_COEF00_01, coef00_01);
-    SetRdmaTableValue(next_table_idx, IDX_MATRIX_COEF02_10, coef02_10);
-    SetRdmaTableValue(next_table_idx, IDX_MATRIX_COEF11_12, coef11_12);
-    SetRdmaTableValue(next_table_idx, IDX_MATRIX_COEF20_21, coef20_21);
-    SetRdmaTableValue(next_table_idx, IDX_MATRIX_COEF22, coef22);
-    // TODO(b/182481217): remove when this bug is closed.
-    DISP_SPEW("ccm 00_01=%xu 02_12=%xu 11_12=%xu 20_21=%u 22=%xu\n", coef00_01, coef02_10,
-              coef11_12, coef20_21, coef22);
-  } else {
-    // Disable color conversion engine
-    SetRdmaTableValue(next_table_idx, IDX_MATRIX_EN_CTRL,
-                      vpu_mmio_->Read32(VPU_VPP_POST_MATRIX_EN_CTRL) & ~(1 << 0));
-  }
+  SetColorCorrection(next_table_idx, config);
 
   // update last element of table which will be used to indicate whether RDMA operation was
   // completed or not
diff --git a/src/graphics/display/drivers/amlogic-display/osd.h b/src/graphics/display/drivers/amlogic-display/osd.h
index be88a24..3a2d7ff 100644
--- a/src/graphics/display/drivers/amlogic-display/osd.h
+++ b/src/graphics/display/drivers/amlogic-display/osd.h
@@ -218,6 +218,7 @@
   void DisableGamma();
   zx_status_t ConfigAfbc();
   zx_status_t SetGamma(GammaChannel channel, const float* data);
+  void SetColorCorrection(uint32_t rdma_table_idx, const display_config_t* config);
   zx_status_t WaitForGammaAddressReady();
   zx_status_t WaitForGammaWriteReady();
   void WaitForRdmaIdle() __TA_REQUIRES(rdma_lock_);