Merge "hwc2: Avoid overwriting metadata refresh rate."
diff --git a/config/sdm845.mk b/config/sdm845.mk
index c0767fd..34f6fdf 100644
--- a/config/sdm845.mk
+++ b/config/sdm845.mk
@@ -34,12 +34,11 @@
     debug.mdpcomp.logs=0 \
     debug.sf.enable_hwc_vds=0 \
     persist.demo.hdmirotationlock=false \
-    ro.qualcomm.cabl=1 \
-    debug.gralloc.gfx_ubwc_disable=0 \
-    sdm.debug.disable_scalar=0 \
-    sdm.debug.disable_inline_rotator=1 \
-    sdm.debug.prefersplit=1 \
-    sdm.debug.disable_dest_scalar=0 \
+    ro.vendor.display.cabl=2 \
+    vendor.gralloc.disable_ubwc=0 \
+    vendor.display.disable_scaler=0 \
+    vendor.display.disable_secure_inline_rotator=1 \
+    vendor.display.prefer_source_split=1 \
     debug.sf.hw=0 \
     debug.egl.hw=0 \
     debug.sf.latch_unsignaled=1
diff --git a/include/Android.mk b/include/Android.mk
index 6e529cd..3e9ccd3 100644
--- a/include/Android.mk
+++ b/include/Android.mk
@@ -4,7 +4,7 @@
 
 LOCAL_VENDOR_MODULE           := true
 LOCAL_COPY_HEADERS_TO         := $(common_header_export_path)
-LOCAL_COPY_HEADERS            := color_metadata.h
+LOCAL_COPY_HEADERS            := display_properties.h color_metadata.h
 
 include $(BUILD_COPY_HEADERS)
 
diff --git a/include/display_properties.h b/include/display_properties.h
new file mode 100644
index 0000000..7295899
--- /dev/null
+++ b/include/display_properties.h
@@ -0,0 +1,99 @@
+/*
+* Copyright (c) 2018, The Linux Foundation. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are
+* met:
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above
+*       copyright notice, this list of conditions and the following
+*       disclaimer in the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of The Linux Foundation nor the names of its
+*       contributors may be used to endorse or promote products derived
+*       from this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef __DISPLAY_PROPERTIES_H__
+#define __DISPLAY_PROPERTIES_H__
+
+#define DISP_PROP_PREFIX                     "vendor.display."
+#define GRALLOC_PROP_PREFIX                  "vendor.gralloc."
+#define RO_DISP_PROP_PREFIX                  "ro.vendor.display."
+#define PERSIST_DISP_PROP_PREFIX             "persist.vendor.display."
+
+#define DISPLAY_PROP(prop_name)              DISP_PROP_PREFIX prop_name
+#define GRALLOC_PROP(prop_name)              GRALLOC_PROP_PREFIX prop_name
+#define RO_DISPLAY_PROP(prop_name)           RO_DISP_PROP_PREFIX prop_name
+#define PERSIST_DISPLAY_PROP(prop_name)      PERSIST_DISP_PROP_PREFIX prop_name
+
+#define COMPOSITION_MASK_PROP                DISPLAY_PROP("comp_mask")
+#define HDMI_CONFIG_INDEX_PROP               DISPLAY_PROP("hdmi_cfg_idx")
+#define IDLE_TIME_PROP                       DISPLAY_PROP("idle_time")
+#define IDLE_TIME_INACTIVE_PROP              DISPLAY_PROP("idle_time_inactive")
+#define BOOT_ANIMATION_LAYER_COUNT_PROP      DISPLAY_PROP("boot_anim_layer_count")
+#define DISABLE_ROTATOR_DOWNSCALE_PROP       DISPLAY_PROP("disable_rotator_downscale")
+#define DISABLE_DECIMATION_PROP              DISPLAY_PROP("disable_decimation")
+#define PRIMARY_MIXER_STAGES_PROP            DISPLAY_PROP("primary_mixer_stages")
+#define EXTERNAL_MIXER_STAGES_PROP           DISPLAY_PROP("external_mixer_stages")
+#define VIRTUAL_MIXER_STAGES_PROP            DISPLAY_PROP("virtual_mixer_stages")
+#define MAX_UPSCALE_PROP                     DISPLAY_PROP("max_upscale")
+#define VIDEO_MODE_PANEL_PROP                DISPLAY_PROP("video_mode_panel")
+#define DISABLE_ROTATOR_UBWC_PROP            DISPLAY_PROP("disable_rotator_ubwc")
+#define DISABLE_ROTATOR_SPLIT_PROP           DISPLAY_PROP("disable_rotator_split")
+#define DISABLE_SCALER_PROP                  DISPLAY_PROP("disable_scaler")
+#define DISABLE_AVR_PROP                     DISPLAY_PROP("disable_avr")
+#define DISABLE_EXTERNAL_ANIMATION_PROP      DISPLAY_PROP("disable_ext_anim")
+#define DISABLE_PARTIAL_SPLIT_PROP           DISPLAY_PROP("disable_partial_split")
+#define PREFER_SOURCE_SPLIT_PROP             DISPLAY_PROP("prefer_source_split")
+#define MIXER_RESOLUTION_PROP                DISPLAY_PROP("mixer_resolution")
+#define SIMULATED_CONFIG_PROP                DISPLAY_PROP("simulated_config")
+#define MAX_EXTERNAL_LAYERS_PROP             DISPLAY_PROP("max_external_layers")
+#define PERF_HINT_WINDOW_PROP                DISPLAY_PROP("perf_hint_window")
+#define ENABLE_EXTERNAL_DOWNSCALE_PROP       DISPLAY_PROP("enable_external_downscale")
+#define EXTERNAL_ACTION_SAFE_WIDTH_PROP      DISPLAY_PROP("external_action_safe_width")
+#define EXTERNAL_ACTION_SAFE_HEIGHT_PROP     DISPLAY_PROP("external_action_safe_height")
+#define FB_WIDTH_PROP                        DISPLAY_PROP("fb_width")
+#define FB_HEIGHT_PROP                       DISPLAY_PROP("fb_height")
+#define DISABLE_METADATA_DYNAMIC_FPS_PROP    DISPLAY_PROP("disable_metadata_dynamic_fps")
+#define DISABLE_BLIT_COMPOSITION_PROP        DISPLAY_PROP("disable_blit_comp")
+#define DISABLE_SKIP_VALIDATE_PROP           DISPLAY_PROP("disable_skip_validate")
+#define HDMI_S3D_MODE_PROP                   DISPLAY_PROP("hdmi_s3d_mode")
+#define DISABLE_DESTINATION_SCALER_PROP      DISPLAY_PROP("disable_dest_scaler")
+#define ENABLE_PARTIAL_UPDATE_PROP           DISPLAY_PROP("enable_partial_update")
+#define DISABLE_UBWC_PROP                    GRALLOC_PROP("disable_ubwc")
+#define ENABLE_FB_UBWC_PROP                  GRALLOC_PROP("enable_fb_ubwc")
+#define MAP_FB_MEMORY_PROP                   GRALLOC_PROP("map_fb_memory")
+
+#define MAX_BLIT_FACTOR_PROP                 DISPLAY_PROP("max_blit_factor")
+#define DISABLE_SECURE_INLINE_ROTATOR_PROP   DISPLAY_PROP("disable_secure_inline_rotator")
+#define DISABLE_MULTIRECT_PROP               DISPLAY_PROP("disable_multirect")
+#define DISABLE_UBWC_FF_VOTING_PROP          DISPLAY_PROP("disable_ubwc_ff_voting")
+#define DISABLE_INLINE_ROTATOR_PROP          DISPLAY_PROP("disable_inline_rotator")
+#define DISABLE_FB_CROPPING_PROP             DISPLAY_PROP("disable_fb_cropping")
+#define PRIORITIZE_CACHE_COMPOSITION_PROP    DISPLAY_PROP("prioritize_cache_comp")
+
+#define DISABLE_HDR_LUT_GEN                  DISPLAY_PROP("disable_hdr_lut_gen")
+#define ENABLE_DEFAULT_COLOR_MODE            DISPLAY_PROP("enable_default_color_mode")
+#define DISABLE_HDR                          DISPLAY_PROP("disable_hdr")
+
+#define HDR_CONFIG_PROP                      RO_DISPLAY_PROP("hdr.config")
+#define QDCM_PCC_TRANS_PROP                  DISPLAY_PROP("qdcm.pcc_for_trans")
+#define QDCM_DIAGONAL_MATRIXMODE_PROP        DISPLAY_PROP("qdcm.diagonal_matrix_mode")
+#define QDCM_DISABLE_TIMEOUT_PROP            PERSIST_DISPLAY_PROP("qdcm.disable_timeout")
+
+
+#endif  // __DISPLAY_PROPERTIES_H__
diff --git a/sdm/include/utils/debug.h b/sdm/include/utils/debug.h
index a1e765a..78daa12 100644
--- a/sdm/include/utils/debug.h
+++ b/sdm/include/utils/debug.h
@@ -34,6 +34,7 @@
 #include <core/sdm_types.h>
 #include <core/debug_interface.h>
 #include <core/display_interface.h>
+#include <display_properties.h>
 
 #define DLOG(tag, method, format, ...) Debug::Get()->method(tag, __CLASS__ "::%s: " format, \
                                                             __FUNCTION__, ##__VA_ARGS__)
@@ -54,56 +55,6 @@
 #define DTRACE_END() Debug::Get()->EndTrace()
 #define DTRACE_SCOPED() ScopeTracer <Debug> scope_tracer(__CLASS__, __FUNCTION__)
 
-#define DISP_PROP_PREFIX        "vendor.display."
-#define GRALLOC_PROP_PREFIX     "vendor.gralloc."
-#define DISPLAY_PROP(prop_name) DISP_PROP_PREFIX prop_name
-#define GRALLOC_PROP(prop_name) GRALLOC_PROP_PREFIX prop_name
-
-#define COMPOSITION_MASK_PROP                DISPLAY_PROP("comp_mask")
-#define HDMI_CONFIG_INDEX_PROP               DISPLAY_PROP("hdmi_cfg_idx")
-#define IDLE_TIME_PROP                       DISPLAY_PROP("idle_time")
-#define IDLE_TIME_INACTIVE_PROP              DISPLAY_PROP("idle_time_inactive")
-#define BOOT_ANIMATION_LAYER_COUNT_PROP      DISPLAY_PROP("boot_anim_layer_count")
-#define DISABLE_ROTATOR_DOWNSCALE_PROP       DISPLAY_PROP("disable_rotator_downscale")
-#define DISABLE_DECIMATION_PROP              DISPLAY_PROP("disable_decimation")
-#define PRIMARY_MIXER_STAGES_PROP            DISPLAY_PROP("primary_mixer_stages")
-#define EXTERNAL_MIXER_STAGES_PROP           DISPLAY_PROP("external_mixer_stages")
-#define VIRTUAL_MIXER_STAGES_PROP            DISPLAY_PROP("virtual_mixer_stages")
-#define MAX_UPSCALE_PROP                     DISPLAY_PROP("max_upscale")
-#define VIDEO_MODE_PANEL_PROP                DISPLAY_PROP("video_mode_panel")
-#define DISABLE_ROTATOR_UBWC_PROP            DISPLAY_PROP("disable_rotator_ubwc")
-#define DISABLE_ROTATOR_SPLIT_PROP           DISPLAY_PROP("disable_rotator_split")
-#define DISABLE_SCALER_PROP                  DISPLAY_PROP("disable_scaler")
-#define DISABLE_AVR_PROP                     DISPLAY_PROP("disable_avr")
-#define DISABLE_EXTERNAL_ANIMATION_PROP      DISPLAY_PROP("disable_ext_anim")
-#define DISABLE_PARTIAL_SPLIT_PROP           DISPLAY_PROP("disable_partial_split")
-#define PREFER_SOURCE_SPLIT_PROP             DISPLAY_PROP("prefer_source_split")
-#define MIXER_RESOLUTION_PROP                DISPLAY_PROP("mixer_resolution")
-#define SIMULATED_CONFIG_PROP                DISPLAY_PROP("simulated_config")
-#define MAX_EXTERNAL_LAYERS_PROP             DISPLAY_PROP("max_external_layers")
-#define PERF_HINT_WINDOW_PROP                DISPLAY_PROP("perf_hint_window")
-#define ENABLE_EXTERNAL_DOWNSCALE_PROP       DISPLAY_PROP("enable_external_downscale")
-#define EXTERNAL_ACTION_SAFE_WIDTH_PROP      DISPLAY_PROP("external_action_safe_width")
-#define EXTERNAL_ACTION_SAFE_HEIGHT_PROP     DISPLAY_PROP("external_action_safe_height")
-#define FB_WIDTH_PROP                        DISPLAY_PROP("fb_width")
-#define FB_HEIGHT_PROP                       DISPLAY_PROP("fb_height")
-#define DISABLE_METADATA_DYNAMIC_FPS_PROP    DISPLAY_PROP("disable_metadata_dynamic_fps")
-#define DISABLE_BLIT_COMPOSITION_PROP        DISPLAY_PROP("disable_blit_comp")
-#define DISABLE_SKIP_VALIDATE_PROP           DISPLAY_PROP("disable_skip_validate")
-#define HDMI_S3D_MODE_PROP                   DISPLAY_PROP("hdmi_s3d_mode")
-#define DISABLE_DESTINATION_SCALER_PROP      DISPLAY_PROP("disable_dest_scaler")
-#define DISABLE_UBWC_PROP                    GRALLOC_PROP("disable_ubwc")
-#define ENABLE_FB_UBWC_PROP                  GRALLOC_PROP("enable_fb_ubwc")
-#define MAP_FB_MEMORY_PROP                   GRALLOC_PROP("map_fb_memory")
-
-#define MAX_BLIT_FACTOR_PROP                 DISPLAY_PROP("max_blit_factor")
-#define DISABLE_SECURE_INLINE_ROTATOR_PROP   DISPLAY_PROP("disable_secure_inline_rotator")
-#define DISABLE_MULTIRECT_PROP               DISPLAY_PROP("disable_multirect")
-#define DISABLE_UBWC_FF_VOTING_PROP          DISPLAY_PROP("disable_ubwc_ff_voting")
-#define DISABLE_INLINE_ROTATOR_PROP          DISPLAY_PROP("disable_inline_rotator")
-#define DISABLE_FB_CROPPING_PROP             DISPLAY_PROP("disable_fb_cropping")
-#define PRIORITIZE_CACHE_COMPOSITION_PROP    DISPLAY_PROP("prioritize_cache_comp")
-
 namespace sdm {
 
 class Debug {
diff --git a/sdm/libs/core/display_base.cpp b/sdm/libs/core/display_base.cpp
index 3bb3441..3ab4e55 100644
--- a/sdm/libs/core/display_base.cpp
+++ b/sdm/libs/core/display_base.cpp
@@ -114,7 +114,7 @@
     DisplayBase::SetMaxMixerStages(max_mixer_stages);
   }
 
-  Debug::Get()->GetProperty("sdm.disable_hdr_lut_gen", &disable_hdr_lut_gen_);
+  Debug::Get()->GetProperty(DISABLE_HDR_LUT_GEN, &disable_hdr_lut_gen_);
   // TODO(user): Temporary changes, to be removed when DRM driver supports
   // Partial update with Destination scaler enabled.
   SetPUonDestScaler();
@@ -928,6 +928,7 @@
 
 DisplayError DisplayBase::SetColorTransform(const uint32_t length, const double *color_transform) {
   lock_guard<recursive_mutex> obj(recursive_mutex_);
+  DisplayError ret = kErrorNone;
   if (!color_mgr_) {
     return kErrorNotSupported;
   }
@@ -936,7 +937,12 @@
     return kErrorParameters;
   }
 
-  return color_mgr_->ColorMgrSetColorTransform(length, color_transform);
+  color_transform_active_ = false;
+  ret = color_mgr_->ColorMgrSetColorTransform(length, color_transform);
+  if (!ret) {
+    CopyColorTransformMatrix(color_transform);
+  }
+  return ret;
 }
 
 DisplayError DisplayBase::GetDefaultColorMode(std::string *color_mode) {
@@ -1477,6 +1483,9 @@
     }
     DLOGI("Setting color mode = %s", color_mode.c_str());
     error = SetColorModeInternal(color_mode);
+    if (color_transform_active_) {
+      color_mgr_->ColorMgrSetColorTransform(kColorTransformlength_, color_transform_);
+    }
   }
 
   // DPPS and HDR features are mutually exclusive
diff --git a/sdm/libs/core/display_base.h b/sdm/libs/core/display_base.h
index 5e697d9..66f3707 100644
--- a/sdm/libs/core/display_base.h
+++ b/sdm/libs/core/display_base.h
@@ -147,6 +147,12 @@
   DisplayState GetLastPowerMode();
   void SetPUonDestScaler();
   void ClearColorInfo();
+  void CopyColorTransformMatrix(const double *input_matrix) {
+    for (uint32_t i = 0; i < kColorTransformlength_; i++) {
+      color_transform_[i] = input_matrix[i];
+    }
+    color_transform_active_ = true;
+  }
 
   recursive_mutex recursive_mutex_;
   DisplayType display_type_;
@@ -192,6 +198,9 @@
   bool drop_hw_vsync_ = false;
   uint32_t current_refresh_rate_ = 0;
   bool drop_skewed_vsync_ = false;
+  static const uint32_t kColorTransformlength_ = 16;
+  double color_transform_[kColorTransformlength_] = {0};
+  bool color_transform_active_ = false;
 };
 
 }  // namespace sdm
diff --git a/sdm/libs/hwc2/hwc_display.cpp b/sdm/libs/hwc2/hwc_display.cpp
index 8f3a507..39daa13 100644
--- a/sdm/libs/hwc2/hwc_display.cpp
+++ b/sdm/libs/hwc2/hwc_display.cpp
@@ -364,7 +364,7 @@
   }
 
   validated_ = false;
-  HWCDebugHandler::Get()->GetProperty("sys.hwc_disable_hdr", &disable_hdr_handling_);
+  HWCDebugHandler::Get()->GetProperty(DISABLE_HDR, &disable_hdr_handling_);
   if (disable_hdr_handling_) {
     DLOGI("HDR Handling disabled");
   }
diff --git a/sdm/libs/hwc2/hwc_display_primary.cpp b/sdm/libs/hwc2/hwc_display_primary.cpp
index b8a4c7c..75ac0f9 100644
--- a/sdm/libs/hwc2/hwc_display_primary.cpp
+++ b/sdm/libs/hwc2/hwc_display_primary.cpp
@@ -113,8 +113,7 @@
   }
   color_mode_ = new HWCColorMode(display_intf_);
   color_mode_->Init();
-  HWCDebugHandler::Get()->GetProperty("vendor.display.enable_default_color_mode",
-                                      &default_mode_status_);
+  HWCDebugHandler::Get()->GetProperty(ENABLE_DEFAULT_COLOR_MODE, &default_mode_status_);
 
   return status;
 }
diff --git a/sdm/libs/hwc2/hwc_tonemapper.cpp b/sdm/libs/hwc2/hwc_tonemapper.cpp
index 2ae1afc..22896f9 100644
--- a/sdm/libs/hwc2/hwc_tonemapper.cpp
+++ b/sdm/libs/hwc2/hwc_tonemapper.cpp
@@ -333,7 +333,7 @@
 
 DisplayError HWCToneMapper::AcquireToneMapSession(Layer *layer, uint32_t *session_index,
                                                   PrimariesTransfer blend_cs) {
-  // When the property sdm.disable_hdr_lut_gen is set, the lutEntries and gridEntries in
+  // When the property vendor.display.disable_hdr_lut_gen is set, the lutEntries and gridEntries in
   // the Lut3d will be NULL, clients needs to allocate the memory and set correct 3D Lut
   // for Tonemapping.
   if (!layer->lut_3d.lutEntries || !layer->lut_3d.dim) {