Merge "display: Change the place to set color mode" into display.lnx.6.0
diff --git a/Android.bp b/Android.bp
index deb9176..578718f 100644
--- a/Android.bp
+++ b/Android.bp
@@ -5,7 +5,6 @@
         "-Wconversion",
         "-Wall",
         "-Werror",
-        "-std=c++14",
     ],
     shared_libs: [
         "liblog",
diff --git a/common.mk b/common.mk
index 16f736b..1aa8606 100644
--- a/common.mk
+++ b/common.mk
@@ -3,7 +3,7 @@
 
 #Common C flags
 common_flags := -Wno-missing-field-initializers
-common_flags += -Wall -Werror -std=c++14
+common_flags += -Wall -Werror
 common_flags += -DUSE_GRALLOC1
 ifeq ($(TARGET_IS_HEADLESS), true)
     common_flags += -DTARGET_HEADLESS
diff --git a/composer/Android.mk b/composer/Android.mk
index 733d15c..306a03a 100644
--- a/composer/Android.mk
+++ b/composer/Android.mk
@@ -16,8 +16,7 @@
 LOCAL_HEADER_LIBRARIES        := display_headers
 
 LOCAL_CFLAGS                  := -Wno-missing-field-initializers -Wno-unused-parameter \
-                                 -std=c++11 -fcolor-diagnostics \
-                                 -DLOG_TAG=\"SDM\" $(common_flags)
+                                 -DLOG_TAG=\"SDM\" $(common_flags) -fcolor-diagnostics
 LOCAL_CLANG                   := true
 
 LOCAL_SHARED_LIBRARIES        := libbinder libhardware libutils libcutils libsync \
@@ -47,7 +46,8 @@
                                  vendor.display.config@1.8 \
                                  vendor.display.config@1.9 \
                                  vendor.display.config@1.10 \
-                                 vendor.display.config@1.11
+                                 vendor.display.config@1.11 \
+                                 vendor.display.config@1.12
 
 LOCAL_SRC_FILES               := QtiComposer.cpp QtiComposerClient.cpp service.cpp \
                                  QtiComposerHandleImporter.cpp \
diff --git a/composer/QtiComposer.cpp b/composer/QtiComposer.cpp
index db7024d..4d0013d 100644
--- a/composer/QtiComposer.cpp
+++ b/composer/QtiComposer.cpp
@@ -38,6 +38,8 @@
 namespace V2_0 {
 namespace implementation {
 
+QtiComposerClient* QtiComposerClient::qti_composerclient_instance_ = nullptr;
+
 QtiComposer::QtiComposer() {
   hwc_session_ = HWCSession::GetInstance();
 }
@@ -99,7 +101,7 @@
 
 Return<void> QtiComposer::createClient(createClient_cb _hidl_cb) {
   // TODO(user): Implement combinedly w.r.t createClient_2_3
-  sp<IQtiComposerClient> composer_client = new QtiComposerClient();
+  sp<QtiComposerClient> composer_client = QtiComposerClient::CreateQtiComposerClientInstance();
   if (!composer_client) {
     _hidl_cb(Error::NO_RESOURCES, nullptr);
     return Void();
@@ -112,7 +114,7 @@
 
 // Methods from ::android::hardware::graphics::composer::V2_3::IComposer follow.
 Return<void> QtiComposer::createClient_2_3(createClient_2_3_cb _hidl_cb) {
-  sp<IQtiComposerClient> composer_client = new QtiComposerClient();
+  sp<QtiComposerClient> composer_client = QtiComposerClient::CreateQtiComposerClientInstance();
   if (!composer_client) {
     _hidl_cb(Error::NO_RESOURCES, nullptr);
     return Void();
diff --git a/composer/QtiComposerClient.cpp b/composer/QtiComposerClient.cpp
index ea209ab..9b66951 100644
--- a/composer/QtiComposerClient.cpp
+++ b/composer/QtiComposerClient.cpp
@@ -1015,6 +1015,103 @@
   : mClient(client), mWriter(client.mWriter) {
 }
 
+bool QtiComposerClient::CommandReader::parseCommonCmd(
+    IComposerClient::Command command, uint16_t length) {
+  bool parsed = false;
+
+  switch (command) {
+  // Commands from ::android::hardware::graphics::composer::V2_1::IComposerClient follow.
+  case IComposerClient::Command::SELECT_DISPLAY:
+    parsed = parseSelectDisplay(length);
+    break;
+  case IComposerClient::Command::SELECT_LAYER:
+    parsed = parseSelectLayer(length);
+    break;
+  case IComposerClient::Command::SET_COLOR_TRANSFORM:
+    parsed = parseSetColorTransform(length);
+    break;
+  case IComposerClient::Command::SET_CLIENT_TARGET:
+    parsed = parseSetClientTarget(length);
+    break;
+  case IComposerClient::Command::SET_OUTPUT_BUFFER:
+    parsed = parseSetOutputBuffer(length);
+    break;
+  case IComposerClient::Command::VALIDATE_DISPLAY:
+    parsed = parseValidateDisplay(length);
+    break;
+  case IComposerClient::Command::ACCEPT_DISPLAY_CHANGES:
+    parsed = parseAcceptDisplayChanges(length);
+    break;
+  case IComposerClient::Command::PRESENT_DISPLAY:
+    parsed = parsePresentDisplay(length);
+    break;
+  case IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY:
+    parsed = parsePresentOrValidateDisplay(length);
+    break;
+  case IComposerClient::Command::SET_LAYER_CURSOR_POSITION:
+    parsed = parseSetLayerCursorPosition(length);
+    break;
+  case IComposerClient::Command::SET_LAYER_BUFFER:
+    parsed = parseSetLayerBuffer(length);
+    break;
+  case IComposerClient::Command::SET_LAYER_SURFACE_DAMAGE:
+    parsed = parseSetLayerSurfaceDamage(length);
+    break;
+  case IComposerClient::Command::SET_LAYER_BLEND_MODE:
+    parsed = parseSetLayerBlendMode(length);
+    break;
+  case IComposerClient::Command::SET_LAYER_COLOR:
+    parsed = parseSetLayerColor(length);
+    break;
+  case IComposerClient::Command::SET_LAYER_COMPOSITION_TYPE:
+    parsed = parseSetLayerCompositionType(length);
+    break;
+  case IComposerClient::Command::SET_LAYER_DATASPACE:
+    parsed = parseSetLayerDataspace(length);
+    break;
+  case IComposerClient::Command::SET_LAYER_DISPLAY_FRAME:
+    parsed = parseSetLayerDisplayFrame(length);
+    break;
+  case IComposerClient::Command::SET_LAYER_PLANE_ALPHA:
+    parsed = parseSetLayerPlaneAlpha(length);
+    break;
+  case IComposerClient::Command::SET_LAYER_SIDEBAND_STREAM:
+    parsed = parseSetLayerSidebandStream(length);
+    break;
+  case IComposerClient::Command::SET_LAYER_SOURCE_CROP:
+    parsed = parseSetLayerSourceCrop(length);
+    break;
+  case IComposerClient::Command::SET_LAYER_TRANSFORM:
+    parsed = parseSetLayerTransform(length);
+    break;
+  case IComposerClient::Command::SET_LAYER_VISIBLE_REGION:
+    parsed = parseSetLayerVisibleRegion(length);
+    break;
+  case IComposerClient::Command::SET_LAYER_Z_ORDER:
+    parsed = parseSetLayerZOrder(length);
+    break;
+  // Commands from ::android::hardware::graphics::composer::V2_2::IComposerClient follow.
+  case IComposerClient::Command::SET_LAYER_PER_FRAME_METADATA:
+    parsed = parseSetLayerPerFrameMetadata(length);
+    break;
+  case IComposerClient::Command::SET_LAYER_FLOAT_COLOR:
+    parsed = parseSetLayerFloatColor(length);
+    break;
+  // Commands from ::android::hardware::graphics::composer::V2_3::IComposerClient follow.
+  case IComposerClient::Command::SET_LAYER_COLOR_TRANSFORM:
+    parsed = parseSetLayerColorTransform(length);
+    break;
+  case IComposerClient::Command::SET_LAYER_PER_FRAME_METADATA_BLOBS:
+    parsed = parseSetLayerPerFrameMetadataBlobs(length);
+    break;
+  default:
+    parsed = false;
+    break;
+  }
+
+  return parsed;
+}
+
 Error QtiComposerClient::CommandReader::parse() {
   IQtiComposerClient::Command qticommand;
   uint16_t length;
@@ -1025,107 +1122,20 @@
     }
 
     bool parsed = false;
-    IComposerClient::Command command = static_cast<IComposerClient::Command>(qticommand);
-    switch (command) {
-    // Commands from ::android::hardware::graphics::composer::V2_1::IComposerClient follow.
-    case IComposerClient::Command::SELECT_DISPLAY:
-      parsed = parseSelectDisplay(length);
-      // Displays will not be removed while processing the command queue.
-      if (parsed && mClient.mDisplayData.find(mDisplay) == mClient.mDisplayData.end()) {
-        ALOGW("Command::SELECT_DISPLAY: Display %lu not found. Dropping commands.", mDisplay);
-        mDisplay = sdm::HWCCallbacks::kNumDisplays;
-      }
-      break;
-    case IComposerClient::Command::SELECT_LAYER:
-      parsed = parseSelectLayer(length);
-      break;
-    case IComposerClient::Command::SET_COLOR_TRANSFORM:
-      parsed = parseSetColorTransform(length);
-      break;
-    case IComposerClient::Command::SET_CLIENT_TARGET:
-      parsed = parseSetClientTarget(length);
-      break;
-    case IComposerClient::Command::SET_OUTPUT_BUFFER:
-      parsed = parseSetOutputBuffer(length);
-      break;
-    case IComposerClient::Command::VALIDATE_DISPLAY:
-      parsed = parseValidateDisplay(length);
-      break;
-    case IComposerClient::Command::ACCEPT_DISPLAY_CHANGES:
-      parsed = parseAcceptDisplayChanges(length);
-      break;
-    case IComposerClient::Command::PRESENT_DISPLAY:
-      parsed = parsePresentDisplay(length);
-      break;
-    case IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY:
-      parsed = parsePresentOrValidateDisplay(length);
-      break;
-    case IComposerClient::Command::SET_LAYER_CURSOR_POSITION:
-      parsed = parseSetLayerCursorPosition(length);
-      break;
-    case IComposerClient::Command::SET_LAYER_BUFFER:
-      parsed = parseSetLayerBuffer(length);
-      break;
-    case IComposerClient::Command::SET_LAYER_SURFACE_DAMAGE:
-      parsed = parseSetLayerSurfaceDamage(length);
-      break;
-    case IComposerClient::Command::SET_LAYER_BLEND_MODE:
-      parsed = parseSetLayerBlendMode(length);
-      break;
-    case IComposerClient::Command::SET_LAYER_COLOR:
-      parsed = parseSetLayerColor(length);
-      break;
-    case IComposerClient::Command::SET_LAYER_COMPOSITION_TYPE:
-      parsed = parseSetLayerCompositionType(length);
-      break;
-    case IComposerClient::Command::SET_LAYER_DATASPACE:
-      parsed = parseSetLayerDataspace(length);
-      break;
-    case IComposerClient::Command::SET_LAYER_DISPLAY_FRAME:
-      parsed = parseSetLayerDisplayFrame(length);
-      break;
-    case IComposerClient::Command::SET_LAYER_PLANE_ALPHA:
-      parsed = parseSetLayerPlaneAlpha(length);
-      break;
-    case IComposerClient::Command::SET_LAYER_SIDEBAND_STREAM:
-      parsed = parseSetLayerSidebandStream(length);
-      break;
-    case IComposerClient::Command::SET_LAYER_SOURCE_CROP:
-      parsed = parseSetLayerSourceCrop(length);
-      break;
-    case IComposerClient::Command::SET_LAYER_TRANSFORM:
-      parsed = parseSetLayerTransform(length);
-      break;
-    case IComposerClient::Command::SET_LAYER_VISIBLE_REGION:
-      parsed = parseSetLayerVisibleRegion(length);
-      break;
-    case IComposerClient::Command::SET_LAYER_Z_ORDER:
-      parsed = parseSetLayerZOrder(length);
-      break;
-    // Commands from ::android::hardware::graphics::composer::V2_2::IComposerClient follow.
-    case IComposerClient::Command::SET_LAYER_PER_FRAME_METADATA:
-      parsed = parseSetLayerPerFrameMetadata(length);
-      break;
-    case IComposerClient::Command::SET_LAYER_FLOAT_COLOR:
-      parsed = parseSetLayerFloatColor(length);
-      break;
-    // Commands from ::android::hardware::graphics::composer::V2_3::IComposerClient follow.
-    case IComposerClient::Command::SET_LAYER_COLOR_TRANSFORM:
-      parsed = parseSetLayerColorTransform(length);
-      break;
-    case IComposerClient::Command::SET_LAYER_PER_FRAME_METADATA_BLOBS:
-      parsed = parseSetLayerPerFrameMetadataBlobs(length);
-      break;
-    default:
-      parsed = false;
-      break;
+    switch (qticommand) {
+      case IQtiComposerClient::Command::SET_LAYER_TYPE:
+        parsed = parseSetLayerType(length);
+        break;
+      default:
+        parsed = parseCommonCmd(static_cast<IComposerClient::Command>(qticommand), length);
+        break;
     }
 
     endCommand();
 
     if (!parsed) {
       ALOGE("failed to parse command 0x%x, length %" PRIu16,
-          command, length);
+          qticommand, length);
       break;
     }
   }
@@ -1630,6 +1640,20 @@
   return true;
 }
 
+bool QtiComposerClient::CommandReader::parseSetLayerType(uint16_t length) {
+  if (length != CommandWriter::kSetLayerTypeLength) {
+    return false;
+  }
+
+  auto err = mClient.hwc_session_->SetLayerType(mDisplay, mLayer,
+            static_cast<IQtiComposerClient::LayerType>(read()));
+  if (static_cast<Error>(err) != Error::NONE) {
+    mWriter.setError(getCommandLoc(), static_cast<Error>(err));
+  }
+
+  return true;
+}
+
 bool QtiComposerClient::CommandReader::parseSetLayerPerFrameMetadata(uint16_t length) {
   // (key, value) pairs
   if (length % 2 != 0) {
@@ -1845,7 +1869,7 @@
 // Methods from ::android::hidl::base::V1_0::IBase follow.
 
 IQtiComposerClient* HIDL_FETCH_IQtiComposerClient(const char* /* name */) {
-  return new QtiComposerClient();
+  return QtiComposerClient::CreateQtiComposerClientInstance();
 }
 
 }  // namespace implementation
diff --git a/composer/QtiComposerClient.h b/composer/QtiComposerClient.h
index 741dbf6..4b06900 100644
--- a/composer/QtiComposerClient.h
+++ b/composer/QtiComposerClient.h
@@ -82,10 +82,11 @@
 };
 
 class QtiComposerClient : public IQtiComposerClient {
- public:
   QtiComposerClient();
   virtual ~QtiComposerClient();
+  static QtiComposerClient* qti_composerclient_instance_;
 
+ public:
   // Methods from ::android::hardware::graphics::composer::V2_1::IComposerClient follow.
   Return<void> registerCallback(const sp<composer_V2_1::IComposerCallback>& callback) override;
   Return<uint32_t> getMaxVirtualDisplayCount() override;
@@ -206,6 +207,20 @@
     return (mCapabilities.count(capability) > 0);
   }
 
+  static QtiComposerClient* CreateQtiComposerClientInstance() {
+    if (!qti_composerclient_instance_) {
+      qti_composerclient_instance_ = new QtiComposerClient();
+      return qti_composerclient_instance_;
+    }
+    return nullptr;
+  }
+
+  void onLastStrongRef(const void* id) {
+    if (qti_composerclient_instance_) {
+      qti_composerclient_instance_ = nullptr;
+    }
+  }
+
  private:
   struct LayerBuffers {
     std::vector<BufferCacheEntry> Buffers;
@@ -260,6 +275,7 @@
     bool parseSetLayerTransform(uint16_t length);
     bool parseSetLayerVisibleRegion(uint16_t length);
     bool parseSetLayerZOrder(uint16_t length);
+    bool parseSetLayerType(uint16_t length);
 
     // Commands from ::android::hardware::graphics::composer::V2_2::IComposerClient follow.
     bool parseSetLayerPerFrameMetadata(uint16_t length);
@@ -269,6 +285,8 @@
     bool parseSetLayerColorTransform(uint16_t length);
     bool parseSetLayerPerFrameMetadataBlobs(uint16_t length);
 
+    bool parseCommonCmd(IComposerClient::Command command, uint16_t length);
+
     hwc_rect_t readRect();
     std::vector<hwc_rect_t> readRegion(size_t count);
     hwc_frect_t readFRect();
diff --git a/composer/QtiComposerCommandBuffer.h b/composer/QtiComposerCommandBuffer.h
index 755a90b..b352670 100644
--- a/composer/QtiComposerCommandBuffer.h
+++ b/composer/QtiComposerCommandBuffer.h
@@ -411,6 +411,13 @@
     endCommand();
   }
 
+  static constexpr uint16_t kSetLayerTypeLength = 1;
+  void setLayerType(uint32_t z) {
+    beginCommand(IQtiComposerClient::Command::SET_LAYER_TYPE, kSetLayerTypeLength);
+    write(z);
+    endCommand();
+  }
+
   // Commands from ::android::hardware::graphics::composer::V2_2::IComposerClient follow.
   static constexpr uint16_t kSetLayerFloatColorLength = 4;
   void setLayerFloatColor(IQtiComposerClient::FloatColor color) {
diff --git a/composer/hwc_display.cpp b/composer/hwc_display.cpp
index af2a57f..8f852fb 100644
--- a/composer/hwc_display.cpp
+++ b/composer/hwc_display.cpp
@@ -785,6 +785,11 @@
       layer->update_mask.set(kClientCompRequest);
     }
 
+    if (hwc_layer->GetType() == kLayerGame) {
+      layer->flags.is_game = true;
+      layer->input_buffer.flags.game = true;
+    }
+
     layer_stack_.layers.push_back(layer);
   }
 
@@ -824,6 +829,18 @@
   layer_stack_.layers.push_back(client_target_->GetSDMLayer());
 }
 
+HWC2::Error HWCDisplay::SetLayerType(hwc2_layer_t layer_id, IQtiComposerClient::LayerType type) {
+  const auto map_layer = layer_map_.find(layer_id);
+  if (map_layer == layer_map_.end()) {
+    DLOGE("[%" PRIu64 "] SetLayerType failed to find layer", id_);
+    return HWC2::Error::BadLayer;
+  }
+
+  const auto layer = map_layer->second;
+  layer->SetLayerType(type);
+  return HWC2::Error::None;
+}
+
 HWC2::Error HWCDisplay::SetLayerZOrder(hwc2_layer_t layer_id, uint32_t z) {
   const auto map_layer = layer_map_.find(layer_id);
   if (map_layer == layer_map_.end()) {
@@ -1259,12 +1276,13 @@
       break;
     }
     case kInvalidateDisplay:
-    case kThermalEvent:
-    case kPanelDeadEvent: {
+    case kThermalEvent: {
       SEQUENCE_WAIT_SCOPE_LOCK(HWCSession::locker_[id_]);
       validated_ = false;
     } break;
+    case kPanelDeadEvent:
     case kDisplayPowerResetEvent: {
+      SEQUENCE_WAIT_SCOPE_LOCK(HWCSession::locker_[id_]);
       validated_ = false;
       if (event_handler_) {
         event_handler_->DisplayPowerReset();
@@ -1785,7 +1803,7 @@
   }
 }
 
-int HWCDisplay::SetFrameBufferResolution(uint32_t x_pixels, uint32_t y_pixels) {
+int HWCDisplay::SetFrameBufferConfig(uint32_t x_pixels, uint32_t y_pixels) {
   if (x_pixels <= 0 || y_pixels <= 0) {
     DLOGW("Unsupported config: x_pixels=%d, y_pixels=%d", x_pixels, y_pixels);
     return -EINVAL;
@@ -1810,12 +1828,25 @@
   // Create rects to represent the new source and destination crops
   LayerRect crop = LayerRect(0, 0, FLOAT(x_pixels), FLOAT(y_pixels));
   hwc_rect_t scaled_display_frame = {0, 0, INT(x_pixels), INT(y_pixels)};
+  auto client_target_layer = client_target_->GetSDMLayer();
+  client_target_layer->src_rect = crop;
   ApplyScanAdjustment(&scaled_display_frame);
   client_target_->SetLayerDisplayFrame(scaled_display_frame);
   client_target_->ResetPerFrameData();
 
+  DLOGI("New framebuffer resolution (%dx%d)", fb_config.x_pixels, fb_config.y_pixels);
+
+  return 0;
+}
+
+int HWCDisplay::SetFrameBufferResolution(uint32_t x_pixels, uint32_t y_pixels) {
+  int error = SetFrameBufferConfig(x_pixels, y_pixels);
+  if (error < 0) {
+    DLOGV("SetFrameBufferConfig failed. Error = %d", error);
+    return error;
+  }
+
   auto client_target_layer = client_target_->GetSDMLayer();
-  client_target_layer->src_rect = crop;
 
   int aligned_width;
   int aligned_height;
@@ -1844,8 +1875,6 @@
   client_target_layer->input_buffer.unaligned_height = y_pixels;
   client_target_layer->plane_alpha = 255;
 
-  DLOGI("New framebuffer resolution (%dx%d)", fb_config.x_pixels, fb_config.y_pixels);
-
   return 0;
 }
 
diff --git a/composer/hwc_display.h b/composer/hwc_display.h
index b9632a2..8fea114 100644
--- a/composer/hwc_display.h
+++ b/composer/hwc_display.h
@@ -213,6 +213,10 @@
     return HWC2::Error::Unsupported;
   }
 
+  virtual bool IsSmartPanelConfig(uint32_t config_id) {
+    return false;
+  }
+
   // Display Configurations
   static uint32_t GetThrottlingRefreshRate() { return HWCDisplay::throttling_refresh_rate_; }
   static void SetThrottlingRefreshRate(uint32_t newRefreshRate)
@@ -329,6 +333,7 @@
   virtual HWC2::Error CreateLayer(hwc2_layer_t *out_layer_id);
   virtual HWC2::Error DestroyLayer(hwc2_layer_t layer_id);
   virtual HWC2::Error SetLayerZOrder(hwc2_layer_t layer_id, uint32_t z);
+  virtual HWC2::Error SetLayerType(hwc2_layer_t layer_id, IQtiComposerClient::LayerType type);
   virtual HWC2::Error Validate(uint32_t *out_num_types, uint32_t *out_num_requests) = 0;
   virtual HWC2::Error GetReleaseFences(uint32_t *out_num_elements, hwc2_layer_t *out_layers,
                                        int32_t *out_fences);
@@ -398,6 +403,7 @@
   uint32_t SanitizeRefreshRate(uint32_t req_refresh_rate);
   virtual void GetUnderScanConfig() { }
   int32_t SetClientTargetDataSpace(int32_t dataspace);
+  int SetFrameBufferConfig(uint32_t x_pixels, uint32_t y_pixels);
 
   bool validated_ = false;
   bool layer_stack_invalid_ = true;
diff --git a/composer/hwc_display_builtin.cpp b/composer/hwc_display_builtin.cpp
index e6f33ba..85cdda6 100644
--- a/composer/hwc_display_builtin.cpp
+++ b/composer/hwc_display_builtin.cpp
@@ -965,9 +965,28 @@
   }
 
   Layer *sdm_layer = client_target_->GetSDMLayer();
-  SetFrameBufferResolution(sdm_layer->input_buffer.unaligned_width,
-                           sdm_layer->input_buffer.unaligned_height);
+  uint32_t fb_width = 0, fb_height = 0;
+
+  GetFrameBufferResolution(&fb_width, &fb_height);
+
+  if (fb_width != sdm_layer->input_buffer.unaligned_width ||
+      fb_height != sdm_layer->input_buffer.unaligned_height) {
+    if (SetFrameBufferConfig(sdm_layer->input_buffer.unaligned_width,
+                             sdm_layer->input_buffer.unaligned_height)) {
+      return HWC2::Error::BadParameter;
+    }
+  }
 
   return HWC2::Error::None;
 }
+
+bool HWCDisplayBuiltIn::IsSmartPanelConfig(uint32_t config_id) {
+  if (config_id < hwc_config_map_.size()) {
+    uint32_t index = hwc_config_map_.at(config_id);
+    return variable_config_map_.at(index).smart_panel;
+  }
+
+  return false;
+}
+
 }  // namespace sdm
diff --git a/composer/hwc_display_builtin.h b/composer/hwc_display_builtin.h
index 6838fda..a3ed162 100644
--- a/composer/hwc_display_builtin.h
+++ b/composer/hwc_display_builtin.h
@@ -100,6 +100,7 @@
   virtual HWC2::Error UpdatePowerMode(HWC2::PowerMode mode);
   virtual HWC2::Error SetClientTarget(buffer_handle_t target, int32_t acquire_fence,
                                       int32_t dataspace, hwc_region_t damage);
+  virtual bool IsSmartPanelConfig(uint32_t config_id);
 
  private:
   HWCDisplayBuiltIn(CoreInterface *core_intf, BufferAllocator *buffer_allocator,
diff --git a/composer/hwc_layers.cpp b/composer/hwc_layers.cpp
index 0b9e609..84e947f 100644
--- a/composer/hwc_layers.cpp
+++ b/composer/hwc_layers.cpp
@@ -546,6 +546,30 @@
   return HWC2::Error::None;
 }
 
+HWC2::Error HWCLayer::SetLayerType(IQtiComposerClient::LayerType type) {
+  LayerTypes layer_type = kLayerUnknown;
+  switch (type) {
+    case IQtiComposerClient::LayerType::UNKNOWN:
+      layer_type = kLayerUnknown;
+      break;
+    case IQtiComposerClient::LayerType::APP:
+      layer_type = kLayerApp;
+      break;
+    case IQtiComposerClient::LayerType::GAME:
+      layer_type = kLayerGame;
+      break;
+    case IQtiComposerClient::LayerType::BROWSER:
+      layer_type = kLayerBrowser;
+      break;
+    default:
+      DLOGW("Unsupported layer type %d", layer_type);
+      break;
+  }
+
+  type_ = layer_type;
+  return HWC2::Error::None;
+}
+
 HWC2::Error HWCLayer::SetLayerColorTransform(const float *matrix) {
   if (std::memcmp(matrix, layer_->color_transform_matrix, sizeof(layer_->color_transform_matrix))) {
     std::memcpy(layer_->color_transform_matrix, matrix, sizeof(layer_->color_transform_matrix));
diff --git a/composer/hwc_layers.h b/composer/hwc_layers.h
index 44d3ae1..ac6c21f 100644
--- a/composer/hwc_layers.h
+++ b/composer/hwc_layers.h
@@ -34,6 +34,7 @@
 #undef HWC2_INCLUDE_STRINGIFICATION
 #undef HWC2_USE_CPP11
 #include <android/hardware/graphics/composer/2.2/IComposerClient.h>
+#include <vendor/qti/hardware/display/composer/2.0/IQtiComposerClient.h>
 #include <deque>
 #include <map>
 #include <set>
@@ -42,6 +43,7 @@
 
 using PerFrameMetadataKey =
     android::hardware::graphics::composer::V2_2::IComposerClient::PerFrameMetadataKey;
+using vendor::qti::hardware::display::composer::V2_0::IQtiComposerClient;
 
 namespace sdm {
 
@@ -67,12 +69,20 @@
   kBufferGeometry = 0x200,
 };
 
+enum LayerTypes {
+  kLayerUnknown = 0,
+  kLayerApp = 1,
+  kLayerGame = 2,
+  kLayerBrowser = 3,
+};
+
 class HWCLayer {
  public:
   explicit HWCLayer(hwc2_display_t display_id, HWCBufferAllocator *buf_allocator);
   ~HWCLayer();
   uint32_t GetZ() const { return z_; }
   hwc2_layer_t GetId() const { return id_; }
+  LayerTypes GetType() const { return type_; }
   Layer *GetSDMLayer() { return layer_; }
   void ResetPerFrameData();
 
@@ -91,6 +101,7 @@
   HWC2::Error SetLayerPerFrameMetadata(uint32_t num_elements, const PerFrameMetadataKey *keys,
                                        const float *metadata);
   HWC2::Error SetLayerZOrder(uint32_t z);
+  HWC2::Error SetLayerType(IQtiComposerClient::LayerType type);
   HWC2::Error SetLayerColorTransform(const float *matrix);
   void SetComposition(const LayerComposition &sdm_composition);
   HWC2::Composition GetClientRequestedCompositionType() { return client_requested_; }
@@ -121,6 +132,7 @@
 
  private:
   Layer *layer_ = nullptr;
+  LayerTypes type_ = kLayerUnknown;
   uint32_t z_ = 0;
   const hwc2_layer_t id_;
   const hwc2_display_t display_id_;
diff --git a/composer/hwc_session.cpp b/composer/hwc_session.cpp
index bea3d00..d405bbc 100644
--- a/composer/hwc_session.cpp
+++ b/composer/hwc_session.cpp
@@ -903,6 +903,11 @@
   return CallDisplayFunction(display, &HWCDisplay::SetLayerZOrder, layer, z);
 }
 
+int32_t HWCSession::SetLayerType(hwc2_display_t display, hwc2_layer_t layer,
+                                 IQtiComposerClient::LayerType type) {
+  return CallDisplayFunction(display, &HWCDisplay::SetLayerType, layer, type);
+}
+
 int32_t HWCSession::SetLayerColorTransform(hwc2_display_t display, hwc2_layer_t layer,
                                            const float *matrix) {
   return CallLayerFunction(display, layer, &HWCLayer::SetLayerColorTransform, matrix);
@@ -1907,7 +1912,6 @@
   PPPendingParams pending_action;
   PPDisplayAPIPayload resp_payload, req_payload;
   uint8_t *disp_id = NULL;
-  bool invalidate_needed = true;
   int32_t *mode_id = NULL;
 
   if (!color_mgr_) {
@@ -1945,10 +1949,7 @@
       DLOGV_IF(kTagQDCM, "pending action = %d, display_id = %d", BITMAP(count), display_id);
       switch (BITMAP(count)) {
         case kInvalidating:
-          {
-            invalidate_needed = false;
-            callbacks_.Refresh(display_id);
-          }
+          callbacks_.Refresh(display_id);
           break;
         case kEnterQDCMMode:
           ret = color_mgr_->EnableQDCMMode(true, hwc_display_[display_id]);
@@ -2064,9 +2065,7 @@
   resp_payload.DestroyPayload();
 
   SEQUENCE_WAIT_SCOPE_LOCK(locker_[display_id]);
-  if (invalidate_needed) {
-    hwc_display_[display_id]->ResetValidation();
-  }
+  hwc_display_[display_id]->ResetValidation();
 
   return ret;
 }
diff --git a/composer/hwc_session.h b/composer/hwc_session.h
index f75d97e..87ebbe0 100644
--- a/composer/hwc_session.h
+++ b/composer/hwc_session.h
@@ -20,7 +20,8 @@
 #ifndef __HWC_SESSION_H__
 #define __HWC_SESSION_H__
 
-#include <vendor/display/config/1.11/IDisplayConfig.h>
+#include <vendor/display/config/1.12/IDisplayConfig.h>
+#include <vendor/qti/hardware/display/composer/2.0/IQtiComposerClient.h>
 
 #include <core/core_interface.h>
 #include <utils/locker.h>
@@ -47,7 +48,7 @@
 
 namespace sdm {
 
-using vendor::display::config::V1_11::IDisplayConfig;
+using vendor::display::config::V1_12::IDisplayConfig;
 using vendor::display::config::V1_10::IDisplayCWBCallback;
 
 using ::android::hardware::Return;
@@ -56,6 +57,8 @@
 using ::android::hardware::hidl_vec;
 using ::android::sp;
 
+using vendor::qti::hardware::display::composer::V2_0::IQtiComposerClient;
+
 int32_t GetDataspaceFromColorMode(ColorMode mode);
 
 // Create a singleton uevent listener thread valid for life of hardware composer process.
@@ -232,6 +235,8 @@
   int32_t SetLayerSourceCrop(hwc2_display_t display, hwc2_layer_t layer, hwc_frect_t crop);
   int32_t SetLayerTransform(hwc2_display_t display, hwc2_layer_t layer, int32_t int_transform);
   int32_t SetLayerZOrder(hwc2_display_t display, hwc2_layer_t layer, uint32_t z);
+  int32_t SetLayerType(hwc2_display_t display, hwc2_layer_t layer,
+                       IQtiComposerClient::LayerType type);
   int32_t SetLayerSurfaceDamage(hwc2_display_t display, hwc2_layer_t layer, hwc_region_t damage);
   int32_t SetLayerVisibleRegion(hwc2_display_t display, hwc2_layer_t layer, hwc_region_t damage);
   int32_t SetLayerCompositionType(hwc2_display_t display, hwc2_layer_t layer, int32_t int_type);
@@ -393,6 +398,7 @@
                                      uint32_t disp_id, const Rect &rect, bool post_processed,
                                      const hidl_handle& buffer) override;
   Return<int32_t> setQsyncMode(uint32_t disp_id, IDisplayConfig::QsyncMode mode) override;
+  Return<bool> isSmartPanelConfig(uint32_t disp_id, uint32_t config_id) override;
 
   // QClient methods
   virtual android::status_t notifyCallback(uint32_t command, const android::Parcel *input_parcel,
diff --git a/composer/hwc_session_services.cpp b/composer/hwc_session_services.cpp
index d639371..4ff1bdf 100644
--- a/composer/hwc_session_services.cpp
+++ b/composer/hwc_session_services.cpp
@@ -923,6 +923,20 @@
   return cwb_.PostBuffer(callback, post_processed, buffer);
 }
 
+Return<bool> HWCSession::isSmartPanelConfig(uint32_t disp_id, uint32_t config_id) {
+  if (disp_id != qdutils::DISPLAY_PRIMARY) {
+    return false;
+  }
+
+  SCOPE_LOCK(locker_[disp_id]);
+  if (!hwc_display_[disp_id]) {
+    DLOGE("Display %d is not created yet.", disp_id);
+    return false;
+  }
+
+  return hwc_display_[disp_id]->IsSmartPanelConfig(config_id);
+}
+
 int32_t HWCSession::CWB::PostBuffer(const sp<IDisplayCWBCallback> &callback, bool post_processed,
                                     const hidl_handle& buffer) {
   SCOPE_LOCK(queue_lock_);
diff --git a/composer/vendor.qti.hardware.display.composer-service.xml b/composer/vendor.qti.hardware.display.composer-service.xml
index 7789fd3..3f0431a 100644
--- a/composer/vendor.qti.hardware.display.composer-service.xml
+++ b/composer/vendor.qti.hardware.display.composer-service.xml
@@ -48,7 +48,7 @@
     <hal format="hidl">
         <name>vendor.display.config</name>
         <transport>hwbinder</transport>
-        <version>1.11</version>
+        <version>1.12</version>
         <interface>
             <name>IDisplayConfig</name>
             <instance>default</instance>
diff --git a/config/display-product.mk b/config/display-product.mk
index 586b7f7..8a1d367 100644
--- a/config/display-product.mk
+++ b/config/display-product.mk
@@ -26,6 +26,8 @@
     vendor.display.config@1.8.vendor \
     vendor.display.config@1.9.vendor \
     vendor.display.config@1.10.vendor \
+    vendor.display.config@1.11.vendor \
+    vendor.display.config@1.12.vendor \
     vendor.qti.hardware.display.mapper@2.0.vendor \
     vendor.qti.hardware.display.mapper@3.0.vendor \
     modetest
diff --git a/gpu_tonemapper/Android.mk b/gpu_tonemapper/Android.mk
index 13217f1..ec59eef 100644
--- a/gpu_tonemapper/Android.mk
+++ b/gpu_tonemapper/Android.mk
@@ -19,7 +19,7 @@
 LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
 
 LOCAL_CFLAGS              := $(version_flag) -Wno-missing-field-initializers -Wall \
-                             -Wno-unused-parameter -std=c++11 -DLOG_TAG=\"GPU_TONEMAPPER\"
+                             -Wno-unused-parameter -DLOG_TAG=\"GPU_TONEMAPPER\"
 
 LOCAL_SRC_FILES           := TonemapFactory.cpp \
                              glengine.cpp \
diff --git a/include/Android.mk b/include/Android.mk
index f787fbc..51f742c 100644
--- a/include/Android.mk
+++ b/include/Android.mk
@@ -9,6 +9,7 @@
 LOCAL_COPY_HEADERS_TO         := $(common_header_export_path)
 LOCAL_COPY_HEADERS            := display_color_processing.h \
                                  display_properties.h \
+                                 dpps_control_interface.h \
                                  ../libqdutils/qd_utils.h \
                                  ../libqdutils/display_config.h \
                                  ../libqservice/QServiceUtils.h \
diff --git a/include/display_color_processing.h b/include/display_color_processing.h
index 4ff1a77..ce6ea21 100644
--- a/include/display_color_processing.h
+++ b/include/display_color_processing.h
@@ -84,6 +84,52 @@
   struct rgb entries[LUT1D_ENTRIES_SIZE];
 };
 
+static const uint32_t kDeTuningFlagSharpFactor = 0x01;
+static const uint32_t kDeTuningFlagClip = 0x02;
+static const uint32_t kDeTuningFlagThrQuiet = 0x04;
+static const uint32_t kDeTuningFlagThrDieout = 0x08;
+static const uint32_t kDeTuningFlagThrLow = 0x10;
+static const uint32_t kDeTuningFlagThrHigh = 0x20;
+static const uint32_t kDeTuningFlagContentQualLevel = 0x40;
+static const uint32_t kDeTuningFlagDeBlend = 0x80;
+
+typedef enum {
+  kDeContentQualUnknown,
+  kDeContentQualLow,
+  kDeContentQualMedium,
+  kDeContentQualHigh,
+  kDeContentQualMax,
+} PPDEContentQualLevel;
+
+typedef enum {
+  kDeContentTypeUnknown,
+  kDeContentTypeVideo,
+  kDeContentTypeGraphics,
+  kDeContentTypeMax,
+} PPDEContentType;
+
+/*
+struct PPDETuningCfg
+*/
+struct PPDETuningCfg {
+  uint32_t flags;
+  int32_t sharp_factor;
+  uint16_t thr_quiet;
+  uint16_t thr_dieout;
+  uint16_t thr_low;
+  uint16_t thr_high;
+  uint16_t clip;
+  PPDEContentQualLevel quality;
+  PPDEContentType content_type;
+  uint32_t de_blend;
+};
+
+struct PPDETuningCfgData {
+  uint32_t cfg_en;
+  struct PPDETuningCfg params;
+  bool cfg_pending;
+};
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/sdm/include/private/dpps_control_interface.h b/include/dpps_control_interface.h
similarity index 89%
rename from sdm/include/private/dpps_control_interface.h
rename to include/dpps_control_interface.h
index 8a44907..df27e65 100644
--- a/sdm/include/private/dpps_control_interface.h
+++ b/include/dpps_control_interface.h
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2016, The Linux Foundation. All rights reserved.
+* Copyright (c) 2016, 2019, 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:
@@ -25,13 +25,16 @@
 #ifndef __DPPS_CONTROL_INTERFACE_H__
 #define __DPPS_CONTROL_INTERFACE_H__
 
+#include <string>
+
 namespace sdm {
 
 class DppsControlInterface {
  public:
   virtual ~DppsControlInterface() { }
-  virtual DisplayError On() = 0;
-  virtual DisplayError Off() = 0;
+  virtual int On() = 0;
+  virtual int Off() = 0;
+  virtual int ApplyCommand(const std::string &command) = 0;
 };
 
 }  // namespace sdm
diff --git a/libdebug/Android.mk b/libdebug/Android.mk
index 273b83d..4d18804 100644
--- a/libdebug/Android.mk
+++ b/libdebug/Android.mk
@@ -6,7 +6,7 @@
 LOCAL_VENDOR_MODULE           := true
 LOCAL_MODULE_TAGS             := optional
 LOCAL_SHARED_LIBRARIES        := libdl
-LOCAL_CFLAGS                  := -DLOG_TAG=\"SDM\" -Wall -std=c++11 -Werror -fno-operator-names
+LOCAL_CFLAGS                  := -DLOG_TAG=\"SDM\" -Wall -Werror -fno-operator-names
 LOCAL_CLANG                   := true
 LOCAL_SRC_FILES               := debug_handler.cpp
 LOCAL_COPY_HEADERS_TO         := qcom/display
diff --git a/libdrmutils/Android.mk b/libdrmutils/Android.mk
index 94325fe..f881a4b 100644
--- a/libdrmutils/Android.mk
+++ b/libdrmutils/Android.mk
@@ -10,7 +10,7 @@
                                  $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include
 LOCAL_HEADER_LIBRARIES        := display_headers
 LOCAL_SHARED_LIBRARIES        := libdrm libdl libdisplaydebug
-LOCAL_CFLAGS                  := -DLOG_TAG=\"DRMUTILS\" -Wall -std=c++11 -Werror -fno-operator-names
+LOCAL_CFLAGS                  := -DLOG_TAG=\"DRMUTILS\" -Wall -Werror -fno-operator-names
 LOCAL_CLANG                   := true
 LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
 LOCAL_SRC_FILES               := drm_master.cpp drm_res_mgr.cpp drm_lib_loader.cpp
diff --git a/sde-drm/Android.mk b/sde-drm/Android.mk
index 775a0fa..39490d3 100644
--- a/sde-drm/Android.mk
+++ b/sde-drm/Android.mk
@@ -13,7 +13,7 @@
                              -isystem external/libdrm
 LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
 LOCAL_CFLAGS              := -Wno-missing-field-initializers -Wall -Werror -fno-operator-names \
-                             -Wno-unused-parameter -std=c++11 -DLOG_TAG=\"SDE_DRM\"
+                             -Wno-unused-parameter -DLOG_TAG=\"SDE_DRM\"
 LOCAL_CLANG               := true
 LOCAL_SRC_FILES           := drm_manager.cpp \
                              drm_connector.cpp \
@@ -36,4 +36,4 @@
 
 LOCAL_VENDOR_MODULE       := true
 include $(BUILD_SHARED_LIBRARY)
-endif
\ No newline at end of file
+endif
diff --git a/sde-drm/drm_dpps_mgr_imp.cpp b/sde-drm/drm_dpps_mgr_imp.cpp
index bd88d30..68ed4a5 100644
--- a/sde-drm/drm_dpps_mgr_imp.cpp
+++ b/sde-drm/drm_dpps_mgr_imp.cpp
@@ -379,9 +379,15 @@
           ret = drmIoctl(info.drm_fd, DRM_IOCTL_MSM_REGISTER_EVENT, &event_req);
         else
           ret = drmIoctl(info.drm_fd, DRM_IOCTL_MSM_DEREGISTER_EVENT, &event_req);
-        if (ret)
-          DRM_LOGE("Failed to set event 0x%x, object_id %u, object_type 0x%x, enable %d",
-              event_req.event, event_req.object_id, info.object_type, info.enable);
+        if (ret) {
+          if (ret == -EALREADY) {
+            DRM_LOGI("Duplicated request to set event 0x%x, object_id %u, object_type 0x%x, enable %d",
+                      event_req.event, event_req.object_id, info.object_type, info.enable);
+          } else {
+            DRM_LOGE("Failed to set event 0x%x, object_id %u, object_type 0x%x, enable %d, ret %d",
+                      event_req.event, event_req.object_id, info.object_type, info.enable, ret);
+          }
+        }
         it = dpps_dirty_event_.erase(it);
       } else {
         it++;
diff --git a/sdm/include/core/display_interface.h b/sdm/include/core/display_interface.h
index 2cfdb40..6506056 100644
--- a/sdm/include/core/display_interface.h
+++ b/sdm/include/core/display_interface.h
@@ -216,11 +216,12 @@
   uint32_t fps = 0;               //!< Frame rate per second.
   uint32_t vsync_period_ns = 0;   //!< VSync period in nanoseconds.
   bool is_yuv = false;            //!< If the display output is in YUV format.
+  bool smart_panel = false;       //!< If the display config has smart panel.
 
   bool operator==(const DisplayConfigVariableInfo& info) const {
     return ((x_pixels == info.x_pixels) && (y_pixels == info.y_pixels) && (x_dpi == info.x_dpi) &&
             (y_dpi == info.y_dpi) && (fps == info.fps) && (vsync_period_ns == info.vsync_period_ns)
-            && (is_yuv == info.is_yuv));
+            && (is_yuv == info.is_yuv) && (smart_panel == info.smart_panel));
   }
 };
 
diff --git a/sdm/include/core/layer_buffer.h b/sdm/include/core/layer_buffer.h
index 1f55913..af158f7 100644
--- a/sdm/include/core/layer_buffer.h
+++ b/sdm/include/core/layer_buffer.h
@@ -214,6 +214,9 @@
       uint32_t mask_layer : 1;      //!< This flag shall be set by client to indicate that the layer
                                     //!< is union of solid fill regions typically transparent pixels
                                     //!< and black pixels.
+
+      uint32_t game : 1;            //!< This flag shall be set by the client to indicate that the
+                                    //!< the content is game.
     };
 
     uint32_t flags = 0;             //!< For initialization purpose only.
diff --git a/sdm/include/core/layer_stack.h b/sdm/include/core/layer_stack.h
index 8859784..8a03bfc 100644
--- a/sdm/include/core/layer_stack.h
+++ b/sdm/include/core/layer_stack.h
@@ -166,6 +166,9 @@
 
       uint32_t color_transform : 1;  //!< This flag will be set by SDM when the layer
                                      //!< has a custom matrix
+
+      uint32_t is_game : 1;  //!< This flag shall be set by client to indicate that this layer
+                             //!< is a game layer.
     };
 
     uint32_t flags = 0;       //!< For initialization purpose only.
diff --git a/sdm/include/private/color_params.h b/sdm/include/private/color_params.h
index 573e741..cdc6577 100644
--- a/sdm/include/private/color_params.h
+++ b/sdm/include/private/color_params.h
@@ -32,6 +32,8 @@
 
 #include <stdio.h>
 #include <string.h>
+#include <display_color_processing.h>
+#include <dpps_control_interface.h>
 #include <utils/locker.h>
 #include <utils/constants.h>
 #include <core/sdm_types.h>
@@ -186,9 +188,11 @@
 struct PPHWAttributes : HWResourceInfo, HWPanelInfo, DisplayConfigVariableInfo {
   char panel_name[256] = "generic_panel";
   PPFeatureVersion version;
+  DppsControlInterface *dpps_intf = NULL;
 
   void Set(const HWResourceInfo &hw_res, const HWPanelInfo &panel_info,
-           const DisplayConfigVariableInfo &attr, const PPFeatureVersion &feature_ver);
+           const DisplayConfigVariableInfo &attr, const PPFeatureVersion &feature_ver,
+           DppsControlInterface *dpps_intf);
 };
 
 struct PPDisplayAPIPayload {
@@ -272,49 +276,6 @@
   uint32_t buffer_size;
 };
 
-static const uint32_t kDeTuningFlagSharpFactor = 0x01;
-static const uint32_t kDeTuningFlagClip = 0x02;
-static const uint32_t kDeTuningFlagThrQuiet = 0x04;
-static const uint32_t kDeTuningFlagThrDieout = 0x08;
-static const uint32_t kDeTuningFlagThrLow = 0x10;
-static const uint32_t kDeTuningFlagThrHigh = 0x20;
-static const uint32_t kDeTuningFlagContentQualLevel = 0x40;
-static const uint32_t kDeTuningFlagDeBlend = 0x80;
-
-typedef enum {
-  kDeContentQualUnknown,
-  kDeContentQualLow,
-  kDeContentQualMedium,
-  kDeContentQualHigh,
-  kDeContentQualMax,
-} PPDEContentQualLevel;
-
-typedef enum {
-  kDeContentTypeUnknown,
-  kDeContentTypeVideo,
-  kDeContentTypeGraphics,
-  kDeContentTypeMax,
-} PPDEContentType;
-
-struct PPDETuningCfg {
-  uint32_t flags = 0;
-  int32_t sharp_factor = 0;
-  uint16_t thr_quiet = 0;
-  uint16_t thr_dieout = 0;
-  uint16_t thr_low = 0;
-  uint16_t thr_high = 0;
-  uint16_t clip = 0;
-  PPDEContentQualLevel quality = kDeContentQualUnknown;
-  PPDEContentType content_type = kDeContentTypeUnknown;
-  uint32_t de_blend = 0;
-};
-
-struct PPDETuningCfgData {
-  uint32_t cfg_en = 0;
-  PPDETuningCfg params;
-  bool cfg_pending = false;
-};
-
 struct SDEGamutCfg {
   static const int kGamutTableNum = 4;
   static const int kGamutScaleoffTableNum = 3;
diff --git a/sdm/include/private/hw_info_types.h b/sdm/include/private/hw_info_types.h
index 007767e..0daf0ef 100644
--- a/sdm/include/private/hw_info_types.h
+++ b/sdm/include/private/hw_info_types.h
@@ -667,6 +667,7 @@
   DestScaleInfoMap dest_scale_info_map = {};
   HWHDRLayerInfo hdr_layer_info = {};
   Handle pvt_data = NULL;   // Private data used by sdm extension only.
+  bool game_present = false;  // Indicates there is game layer or not
 };
 
 struct HWQosData {
diff --git a/sdm/include/utils/constants.h b/sdm/include/utils/constants.h
index e34ce60..691e88c 100644
--- a/sdm/include/utils/constants.h
+++ b/sdm/include/utils/constants.h
@@ -43,6 +43,7 @@
 #define UINT32(exp) static_cast<uint32_t>(exp)
 #define INT32(exp) static_cast<int32_t>(exp)
 #define UINT64(exp) static_cast<uint64_t>(exp)
+#define DOUBLE(exp) static_cast<double>(exp)
 
 #define ROUND_UP(number, step) ((((number) + ((step) - 1)) / (step)) * (step))
 
diff --git a/sdm/libs/core/Android.mk b/sdm/libs/core/Android.mk
index 5b88f60..5840821 100644
--- a/sdm/libs/core/Android.mk
+++ b/sdm/libs/core/Android.mk
@@ -74,6 +74,5 @@
                                  $(SDM_HEADER_PATH)/private/hw_info_types.h \
                                  $(SDM_HEADER_PATH)/private/partial_update_interface.h \
                                  $(SDM_HEADER_PATH)/private/resource_interface.h \
-                                 $(SDM_HEADER_PATH)/private/strategy_interface.h \
-                                 $(SDM_HEADER_PATH)/private/dpps_control_interface.h
+                                 $(SDM_HEADER_PATH)/private/strategy_interface.h
 include $(BUILD_COPY_HEADERS)
diff --git a/sdm/libs/core/color_manager.cpp b/sdm/libs/core/color_manager.cpp
index f9e353a..b9a33e8 100644
--- a/sdm/libs/core/color_manager.cpp
+++ b/sdm/libs/core/color_manager.cpp
@@ -252,7 +252,8 @@
 ColorManagerProxy *ColorManagerProxy::CreateColorManagerProxy(DisplayType type,
                                                               HWInterface *hw_intf,
                                                               const HWDisplayAttributes &attribute,
-                                                              const HWPanelInfo &panel_info) {
+                                                              const HWPanelInfo &panel_info,
+                                                              DppsControlInterface *dpps_intf) {
   DisplayError error = kErrorNone;
   PPFeatureVersion versions;
   int32_t display_id = -1;
@@ -274,7 +275,7 @@
     if (error != kErrorNone) {
       DLOGW("Fail to get DSPP feature versions");
     } else {
-      hw_attr.Set(hw_res_info_, panel_info, attribute, versions);
+      hw_attr.Set(hw_res_info_, panel_info, attribute, versions, dpps_intf);
       DLOGI("PAV2 version is versions = %d, version = %d ",
             hw_attr.version.version[kGlobalColorFeaturePaV2],
             versions.version[kGlobalColorFeaturePaV2]);
@@ -371,7 +372,8 @@
 void PPHWAttributes::Set(const HWResourceInfo &hw_res,
                          const HWPanelInfo &panel_info,
                          const DisplayConfigVariableInfo &attr,
-                         const PPFeatureVersion &feature_ver) {
+                         const PPFeatureVersion &feature_ver,
+                         DppsControlInterface *intf) {
   HWResourceInfo &res = *this;
   res = hw_res;
   HWPanelInfo &panel = *this;
@@ -379,6 +381,7 @@
   DisplayConfigVariableInfo &attributes = *this;
   attributes = attr;
   version = feature_ver;
+  dpps_intf = intf;
 
   if (strlen(panel_info.panel_name)) {
     snprintf(&panel_name[0], sizeof(panel_name), "%s", &panel_info.panel_name[0]);
diff --git a/sdm/libs/core/color_manager.h b/sdm/libs/core/color_manager.h
index c84c032..c8f47e9 100644
--- a/sdm/libs/core/color_manager.h
+++ b/sdm/libs/core/color_manager.h
@@ -128,7 +128,8 @@
    */
   static ColorManagerProxy *CreateColorManagerProxy(DisplayType type, HWInterface *hw_intf,
                                                     const HWDisplayAttributes &attribute,
-                                                    const HWPanelInfo &panel_info);
+                                                    const HWPanelInfo &panel_info,
+                                                    DppsControlInterface *dpps_intf);
 
   /* need reverse the effect of CreateColorManagerProxy. */
   ~ColorManagerProxy();
diff --git a/sdm/libs/core/comp_manager.cpp b/sdm/libs/core/comp_manager.cpp
index 919e57f..6980820 100644
--- a/sdm/libs/core/comp_manager.cpp
+++ b/sdm/libs/core/comp_manager.cpp
@@ -559,7 +559,15 @@
   // DPPS feature and HDR using SSPP tone mapping can co-exist
   // DPPS feature and HDR using DSPP tone mapping are mutually exclusive
   if (dpps_ctrl_intf_ && hw_res_info_.src_tone_map.none()) {
-    return enable ? dpps_ctrl_intf_->On() : dpps_ctrl_intf_->Off();
+    int err = 0;
+    if (enable) {
+      err = dpps_ctrl_intf_->On();
+    } else {
+      err = dpps_ctrl_intf_->Off();
+    }
+    if (err) {
+      return kErrorUndefined;
+    }
   }
 
   return kErrorNone;
diff --git a/sdm/libs/core/comp_manager.h b/sdm/libs/core/comp_manager.h
index d804cd0..b7a15c3 100644
--- a/sdm/libs/core/comp_manager.h
+++ b/sdm/libs/core/comp_manager.h
@@ -87,6 +87,7 @@
   bool IsSafeMode() { return safe_mode_; }
   void GenerateROI(Handle display_ctx, HWLayers *hw_layers);
   DisplayError CheckEnforceSplit(Handle comp_handle, uint32_t new_refresh_rate);
+  DppsControlInterface* GetDppsControlIntf() { return dpps_ctrl_intf_; }
 
  private:
   static const int kMaxThermalLevel = 3;
diff --git a/sdm/libs/core/display_base.cpp b/sdm/libs/core/display_base.cpp
index 05e8b0e..e2c2dab 100644
--- a/sdm/libs/core/display_base.cpp
+++ b/sdm/libs/core/display_base.cpp
@@ -132,8 +132,10 @@
 
   // ColorManager supported for built-in display.
   if (kBuiltIn == display_type_) {
+    DppsControlInterface *dpps_intf = comp_manager_->GetDppsControlIntf();
     color_mgr_ = ColorManagerProxy::CreateColorManagerProxy(display_type_, hw_intf_,
-                                                            display_attributes_, hw_panel_info_);
+                                                            display_attributes_, hw_panel_info_,
+                                                            dpps_intf);
 
     if (color_mgr_) {
       if (InitializeColorModes() != kErrorNone) {
@@ -221,11 +223,16 @@
       hw_layers_info.wide_color_primaries.push_back(
           layer->input_buffer.color_metadata.colorPrimaries);
     }
+    if (layer->flags.is_game) {
+        hw_layers_info.game_present = true;
+    }
   }
 
   DLOGD_IF(kTagDisplay,
-           "LayerStack layer_count: %d, app_layer_count: %d, gpu_target_index: %d, display: %d-%d",
-           layers.size(), hw_layers_info.app_layer_count, hw_layers_info.gpu_target_index,
+           "LayerStack layer_count: %d, app_layer_count: %d, "
+           "gpu_target_index: %d, game_present: %d, display: %d-%d",
+           layers.size(), hw_layers_info.app_layer_count,
+           hw_layers_info.gpu_target_index, hw_layers_info.game_present,
            display_id_, display_type_);
 
   if (!hw_layers_info.app_layer_count) {
diff --git a/sdm/libs/core/display_builtin.cpp b/sdm/libs/core/display_builtin.cpp
index 81a27e1..c223ce2 100644
--- a/sdm/libs/core/display_builtin.cpp
+++ b/sdm/libs/core/display_builtin.cpp
@@ -134,11 +134,6 @@
   uint32_t new_mixer_height = 0;
   uint32_t display_width = display_attributes_.x_pixels;
   uint32_t display_height = display_attributes_.y_pixels;
-  if (reset_panel_) {
-    DLOGW("panel is in bad state, resetting the panel");
-    ResetPanel();
-    reset_panel_ = false;
-  }
 
   DTRACE_SCOPED();
   if (NeedsMixerReconfiguration(layer_stack, &new_mixer_width, &new_mixer_height)) {
diff --git a/sdm/libs/core/drm/hw_device_drm.cpp b/sdm/libs/core/drm/hw_device_drm.cpp
index d3fd241..62f5923 100644
--- a/sdm/libs/core/drm/hw_device_drm.cpp
+++ b/sdm/libs/core/drm/hw_device_drm.cpp
@@ -588,6 +588,9 @@
     mm_width = connector_info_.mmWidth;
     mm_height = connector_info_.mmHeight;
     topology = connector_info_.modes[index].topology;
+    if (mode.flags & DRM_MODE_FLAG_CMD_MODE_PANEL) {
+      display_attributes_[index].smart_panel = true;
+    }
   }
 
   display_attributes_[index].x_pixels = mode.hdisplay;
diff --git a/sdm/libs/utils/rect.cpp b/sdm/libs/utils/rect.cpp
index 1e0db28..3ea436f 100644
--- a/sdm/libs/utils/rect.cpp
+++ b/sdm/libs/utils/rect.cpp
@@ -255,19 +255,19 @@
   int y_offset = INT(src_domain.top);
 
   LayerRect modified_in_rect = Reposition(in_rect, -x_offset, -y_offset);
-  float src_domain_width = src_domain.right - src_domain.left;
-  float src_domain_height = src_domain.bottom - src_domain.top;
-  float dst_domain_width = dst_domain.right - dst_domain.left;
-  float dst_domain_height = dst_domain.bottom - dst_domain.top;
+  double src_domain_width = DOUBLE(src_domain.right - src_domain.left);
+  double src_domain_height = DOUBLE(src_domain.bottom - src_domain.top);
+  double dst_domain_width = DOUBLE(dst_domain.right - dst_domain.left);
+  double dst_domain_height = DOUBLE(dst_domain.bottom - dst_domain.top);
 
-  float width_ratio = dst_domain_width / src_domain_width;
-  float height_ratio = dst_domain_height / src_domain_height;
+  double width_ratio = DOUBLE(dst_domain_width / src_domain_width);
+  double height_ratio = DOUBLE(dst_domain_height / src_domain_height);
 
   // using floorf for all since ceilf on float will round to next int value.
-  out_rect->left = floorf(dst_domain.left + (width_ratio * modified_in_rect.left));
-  out_rect->top = floorf(dst_domain.top + (height_ratio * modified_in_rect.top));
-  out_rect->right = floorf(dst_domain.left + (width_ratio * modified_in_rect.right));
-  out_rect->bottom = floorf(dst_domain.top + (height_ratio * modified_in_rect.bottom));
+  out_rect->left = floor(dst_domain.left + (width_ratio * modified_in_rect.left));
+  out_rect->top = floor(dst_domain.top + (height_ratio * modified_in_rect.top));
+  out_rect->right = floor(dst_domain.left + (width_ratio * modified_in_rect.right));
+  out_rect->bottom = floor(dst_domain.top + (height_ratio * modified_in_rect.bottom));
 }
 
 void TransformHV(const LayerRect &src_domain, const LayerRect &in_rect,