OSDN Git Service

New API for syncing hwc drm-commit.
authorShaofeng Tang <shaofeng.tang@intel.com>
Wed, 16 Jan 2019 12:47:08 +0000 (20:47 +0800)
committerLin Johnson <johnson.lin@intel.com>
Fri, 18 Jan 2019 08:32:52 +0000 (16:32 +0800)
A new API "EnableDRMCommit" is added for enabling/disabling drm commits
in HWC. And hwcserviceapi are updated for supporting the invocation
from C.

Change-Id: Id880956934c1743d7327c977867f25046a63c320
Tracked-On:https://jira.devtools.intel.com/browse/OAM-71647
Tests: Compile sucessful for Android, feature validation.
Signed-off-by: Shaofeng Tang <shaofeng.tang@intel.com>
15 files changed:
common/core/gpudevice.cpp
common/display/displayqueue.cpp
common/display/displayqueue.h
os/android/hwcservice.cpp
os/android/hwcservice.h
os/android/iahwc2.cpp
os/android/iahwc2.h
os/android/libhwcservice/hwcserviceapi.cpp
os/android/libhwcservice/hwcserviceapi.h
os/android/libhwcservice/icontrols.cpp
os/android/libhwcservice/icontrols.h
public/gpudevice.h
public/nativedisplay.h
wsi/physicaldisplay.cpp
wsi/physicaldisplay.h

index da983ff..4188660 100644 (file)
@@ -98,6 +98,15 @@ void GpuDevice::GetConnectedPhysicalDisplays(
   }
 }
 
+bool GpuDevice::EnableDRMCommit(bool enable, uint32_t display_id) {
+  // TODO clean all display for commit status
+  size_t size = total_displays_.size();
+  bool ret = false;
+  if (size > display_id)
+    ret = total_displays_.at(display_id)->EnableDRMCommit(enable);
+  return ret;
+}
+
 const std::vector<NativeDisplay *> &GpuDevice::GetAllDisplays() {
   return total_displays_;
 }
index cc624e6..556e514 100644 (file)
@@ -1589,7 +1589,10 @@ void DisplayQueue::HandleIdleCase() {
   power_mode_lock_.unlock();
   idle_tracker_.idle_lock_.unlock();
 }
+
 void DisplayQueue::ForceRefresh() {
+  if (idle_tracker_.state_ & FrameStateTracker::kForceIgnoreUpdates)
+    return;
   idle_tracker_.idle_lock_.lock();
   idle_tracker_.state_ &= ~FrameStateTracker::kIgnoreUpdates;
   idle_tracker_.state_ |= FrameStateTracker::kRevalidateLayers;
@@ -1602,6 +1605,16 @@ void DisplayQueue::ForceRefresh() {
   power_mode_lock_.unlock();
 }
 
+void DisplayQueue::ForceIgnoreUpdates(bool force) {
+  if (force) {
+    idle_tracker_.state_ |= FrameStateTracker::kForceIgnoreUpdates;
+    IgnoreUpdates();
+  } else {
+    idle_tracker_.state_ &= ~FrameStateTracker::kForceIgnoreUpdates;
+    ForceRefresh();
+  }
+}
+
 void DisplayQueue::DisplayConfigurationChanged() {
   // Mark it as needs modeset, so that in next queue update we do a modeset
   state_ |= kConfigurationChanged;
index 357c478..bbbc31b 100644 (file)
@@ -100,6 +100,8 @@ class DisplayQueue {
 
   void ForceRefresh();
 
+  void ForceIgnoreUpdates(bool force);
+
   void UpdateScalingRatio(uint32_t primary_width, uint32_t primary_height,
                           uint32_t display_width, uint32_t display_height);
 
@@ -179,10 +181,11 @@ class DisplayQueue {
                                     // if we are continously updating
       // frames, revalidate layers to use planes.
       kTrackingFrames =
-          1 << 4,              // Tracking frames to see when layers need to be
-                               // revalidated after
-                               // disabling overlays for idle case scenario.
-      kIgnoreUpdates = 1 << 5  // Ignore present display calls.
+          1 << 4,               // Tracking frames to see when layers need to be
+                                // revalidated after
+                                // disabling overlays for idle case scenario.
+      kIgnoreUpdates = 1 << 5,  // Ignore present display calls.
+      kForceIgnoreUpdates = 1 << 6  // Ignore all commits/updates.
     };
 
     uint32_t idle_frames_ = 0;
@@ -228,7 +231,11 @@ class DisplayQueue {
 
     void ResetTrackerState() {
       if (tracker_.state_ & FrameStateTracker::kIgnoreUpdates) {
-        tracker_.state_ = FrameStateTracker::kIgnoreUpdates;
+        if (tracker_.state_ & FrameStateTracker::kForceIgnoreUpdates) {
+          tracker_.state_ = FrameStateTracker::kIgnoreUpdates;
+          tracker_.state_ |= FrameStateTracker::kForceIgnoreUpdates;
+        } else
+          tracker_.state_ = FrameStateTracker::kIgnoreUpdates;
       } else {
         tracker_.state_ = 0;
       }
index ed5087c..44511f8 100644 (file)
@@ -405,6 +405,10 @@ uint32_t HwcService::Controls::GetDisplayIDFromConnectorID(
   return mHwc.GetDisplayIDFromConnectorID(connector_id);
 }
 
+bool HwcService::Controls::EnableDRMCommit(bool enable, uint32_t display_id) {
+  return mHwc.EnableDRMCommit(enable, display_id);
+}
+
 status_t HwcService::Controls::VideoEnableEncryptedSession(
     uint32_t sessionID, uint32_t instanceID) {
   mHwc.SetPAVPSessionStatus(true, sessionID, instanceID);
index dd63428..16192fd 100644 (file)
@@ -102,6 +102,7 @@ class HwcService : public BnService {
     status_t SetHDCPSRMForDisplay(uint32_t connector, const int8_t* SRM,
                                   uint32_t SRMLength);
     uint32_t GetDisplayIDFromConnectorID(uint32_t connector_id);
+    bool EnableDRMCommit(bool enable, uint32_t display_id);
     status_t VideoEnableEncryptedSession(uint32_t sessionID,
                                          uint32_t instanceID);
     status_t VideoDisableAllEncryptedSessions(uint32_t sessionID);
index 5d2d5d7..dc8eea9 100644 (file)
@@ -1277,6 +1277,10 @@ uint32_t IAHWC2::GetDisplayIDFromConnectorID(const uint32_t connector_id) {
   return device_.GetDisplayIDFromConnectorID(connector_id);
 }
 
+bool IAHWC2::EnableDRMCommit(bool enable, uint32_t display_id) {
+  return device_.EnableDRMCommit(enable, display_id);
+}
+
 void IAHWC2::SetHDCPSRMForDisplay(uint32_t connector, const int8_t *SRM,
                                   uint32_t SRMLength) {
   if (SRM == NULL) {
index d5c1a0e..4e9a573 100644 (file)
@@ -68,6 +68,8 @@ class IAHWC2 : public hwc2_device_t {
                             uint32_t SRMLength);
   uint32_t GetDisplayIDFromConnectorID(const uint32_t connector_id);
 
+  bool EnableDRMCommit(bool enable, uint32_t display_id);
+
  public:
   class Hwc2Layer {
    public:
index 1fe103a..76655e6 100644 (file)
@@ -285,6 +285,16 @@ uint32_t HwcService_GetDisplayIDFromConnectorID(HWCSHANDLE hwcs,
   return pContext->mControls->GetDisplayIDFromConnectorID(connector_id);
 }
 
+status_t HwcService_EnableDRMCommit(HWCSHANDLE hwcs, uint32_t enable,
+                                    uint32_t display_id) {
+  HwcsContext* pContext = static_cast<HwcsContext*>(hwcs);
+  if (!pContext) {
+    return android::BAD_VALUE;
+  }
+
+  return pContext->mControls->EnableDRMCommit(enable, display_id);
+}
+
 status_t HwcService_Video_DisableHDCPSession_AllDisplays(HWCSHANDLE hwcs) {
   HwcsContext* pContext = static_cast<HwcsContext*>(hwcs);
   if (!pContext) {
index 239f905..1a73de9 100644 (file)
@@ -18,9 +18,9 @@
 #define OS_ANDROID_HWC_HWCSERVICEAPI_H_
 
 #include <stdint.h>
-#include <vector>
 
 #ifdef __cplusplus
+#include <vector>
 extern "C" {
 #endif
 
@@ -158,12 +158,14 @@ typedef struct _HwcsDisplayModeInfo {
   uint32_t ydpi;
 } HwcsDisplayModeInfo;
 
+#ifdef __cplusplus
 /// query all available modes
 // If non-NULL: fills pModeList with up to modeCount modes.
 // Returns the number of modes available.
 status_t HwcService_DisplayMode_GetAvailableModes(
     HWCSHANDLE hwcs, uint32_t display,
     std::vector<HwcsDisplayModeInfo> &pModeList);
+#endif
 
 /// get current mode
 status_t HwcService_DisplayMode_GetMode(HWCSHANDLE hwcs, uint32_t display,
@@ -212,6 +214,9 @@ status_t HwcService_Video_SetHDCPSRM_AllDisplays(HWCSHANDLE hwcs,
 uint32_t HwcService_GetDisplayIDFromConnectorID(HWCSHANDLE hwcs,
                                                 uint32_t connector_id);
 
+status_t HwcService_EnableDRMCommit(HWCSHANDLE hwcs, uint32_t enable,
+                                    uint32_t display_id);
+
 // The control enables a the protected video subsystem to control when to
 // replace any
 // encrypted content with a default bitmap (usually black).
index 28b7145..4570d60 100644 (file)
@@ -57,6 +57,7 @@ class BpControls : public BpInterface<IControls> {
     TRANSACT_VIDEO_SET_HDCP_SRM_FOR_ALL_DISPLAYS,
     TRANSACT_VIDEO_SET_HDCP_SRM_FOR_DISPLAY,
     TRANSACT_GET_DISPLAYID_FROM_CONNECTORID,
+    TRANSACT_ENABLE_DRM_COMMIT,
     TRANSACT_VIDEO_ENABLE_ENCRYPTED_SESSION,
     TRANSACT_VIDEO_DISABLE_ENCRYPTED_SESSION,
     TRANSACT_VIDEO_DISABLE_ALL_ENCRYPTED_SESSIONS,
@@ -413,6 +414,20 @@ class BpControls : public BpInterface<IControls> {
     return (uint32_t)(reply.readInt32());
   }
 
+  bool EnableDRMCommit(bool enable, uint32_t display_id) override {
+    Parcel data;
+    Parcel reply;
+    data.writeInterfaceToken(IControls::getInterfaceDescriptor());
+    data.writeInt32(enable);
+    data.writeInt32(display_id);
+
+    status_t ret = remote()->transact(TRANSACT_ENABLE_DRM_COMMIT, data, &reply);
+    if (ret != NO_ERROR) {
+      ALOGW("%s() transact failed: %d", __FUNCTION__, ret);
+    }
+    return (uint32_t)(reply.readInt32());
+  }
+
   status_t VideoEnableEncryptedSession(uint32_t sessionID,
                                        uint32_t instanceID) override {
     Parcel data;
@@ -748,6 +763,14 @@ status_t BnControls::onTransact(uint32_t code, const Parcel &data,
       reply->writeInt32(display_id);
       return NO_ERROR;
     }
+    case BpControls::TRANSACT_ENABLE_DRM_COMMIT: {
+      CHECK_INTERFACE(IControls, data, reply);
+      bool enable = data.readInt32();
+      uint32_t display_id = data.readInt32();
+      bool ret = this->EnableDRMCommit(enable, display_id);
+      reply->writeInt32(ret);
+      return NO_ERROR;
+    }
     case BpControls::TRANSACT_VIDEO_ENABLE_ENCRYPTED_SESSION: {
       CHECK_INTERFACE(IControls, data, reply);
       uint32_t sessionID = data.readInt32();
index 74bcff1..7efba0e 100644 (file)
@@ -72,6 +72,9 @@ class IControls : public android::IInterface {
                                         uint32_t SRMLength) = 0;
 
   virtual uint32_t GetDisplayIDFromConnectorID(uint32_t connector_id) = 0;
+
+  virtual bool EnableDRMCommit(bool enable, uint32_t display_id) = 0;
+
   virtual status_t VideoEnableEncryptedSession(uint32_t sessionID,
                                                uint32_t instanceID) = 0;
   virtual status_t VideoDisableAllEncryptedSessions(uint32_t sessionID) = 0;
index 48e44ef..b0cd8c7 100644 (file)
@@ -91,6 +91,8 @@ class GpuDevice : public HWCThread {
 
   bool IsReservedDrmPlane();
 
+  bool EnableDRMCommit(bool enable, uint32_t display_id);
+
   std::vector<uint32_t> GetDisplayReservedPlanes(uint32_t display_id);
 
  private:
index f2f00b1..a33dc85 100644 (file)
@@ -425,6 +425,10 @@ class NativeDisplay {
     return false;
   }
 
+  virtual bool EnableDRMCommit(bool enable) {
+    return false;
+  }
+
  protected:
   friend class PhysicalDisplay;
   friend class GpuDevice;
index 69f02a7..cf1a4b2 100644 (file)
@@ -199,6 +199,14 @@ int PhysicalDisplay::GetDisplayPipe() {
   return pipe_;
 }
 
+bool PhysicalDisplay::EnableDRMCommit(bool enable) {
+  display_queue_->ForceIgnoreUpdates(!enable);
+  if (enable)
+    return !display_queue_->IsIgnoreUpdates();
+  else
+    return display_queue_->IsIgnoreUpdates();
+}
+
 bool PhysicalDisplay::SetActiveConfig(uint32_t config) {
   // update the activeConfig
   IHOTPLUGEVENTTRACE(
index f1eb4ec..239d6d2 100644 (file)
@@ -123,6 +123,8 @@ class PhysicalDisplay : public NativeDisplay, public DisplayPlaneHandler {
   bool GetDisplayConfigs(uint32_t *num_configs, uint32_t *configs) override;
   bool GetDisplayName(uint32_t *size, char *name) override;
 
+  bool EnableDRMCommit(bool enable) override;
+
   /**
    * API for composition to non-zero X coordinate.
    * This is applicable when float mode is enabled.