OSDN Git Service

HWC2: Fix breakage from header change
authorDan Stoza <stoza@google.com>
Fri, 20 May 2016 21:02:39 +0000 (14:02 -0700)
committerDan Stoza <stoza@google.com>
Fri, 20 May 2016 21:13:35 +0000 (14:13 -0700)
Updates the shim and adapter to handle the header changes introduced
by "HWC2: Add format to VD create, surface damage" in libhardware.

Bug: 22767098
Change-Id: I8142301c121d9b5602a4455f3fbadefefd685cf0

services/surfaceflinger/DisplayHardware/HWC2.cpp
services/surfaceflinger/DisplayHardware/HWC2.h
services/surfaceflinger/DisplayHardware/HWC2On1Adapter.cpp
services/surfaceflinger/DisplayHardware/HWC2On1Adapter.h
services/surfaceflinger/DisplayHardware/HWComposer.cpp
services/surfaceflinger/DisplayHardware/HWComposer.h
services/surfaceflinger/SurfaceFlinger.cpp

index f898ada..ed8cc08 100644 (file)
@@ -192,19 +192,21 @@ uint32_t Device::getMaxVirtualDisplayCount() const
 }
 
 Error Device::createVirtualDisplay(uint32_t width, uint32_t height,
-        std::shared_ptr<Display>* outDisplay)
+        android_pixel_format_t* format, std::shared_ptr<Display>* outDisplay)
 {
     ALOGI("Creating virtual display");
 
     hwc2_display_t displayId = 0;
+    int32_t intFormat = static_cast<int32_t>(*format);
     int32_t intError = mCreateVirtualDisplay(mHwcDevice, width, height,
-            &displayId);
+            &intFormat, &displayId);
     auto error = static_cast<Error>(intError);
     if (error != Error::None) {
         return error;
     }
 
     ALOGI("Created virtual display");
+    *format = static_cast<android_pixel_format_t>(intFormat);
     *outDisplay = getDisplayById(displayId);
     (*outDisplay)->setVirtual();
     return Error::None;
@@ -780,9 +782,10 @@ Error Display::setActiveConfig(const std::shared_ptr<const Config>& config)
 Error Display::setClientTarget(buffer_handle_t target,
         const sp<Fence>& acquireFence, android_dataspace_t dataspace)
 {
+    // TODO: Properly encode client target surface damage
     int32_t fenceFd = acquireFence->dup();
     int32_t intError = mDevice.mSetClientTarget(mDevice.mHwcDevice, mId, target,
-            fenceFd, static_cast<int32_t>(dataspace));
+            fenceFd, static_cast<int32_t>(dataspace), {0, nullptr});
     return static_cast<Error>(intError);
 }
 
index e40602f..8ab61e9 100644 (file)
@@ -72,6 +72,7 @@ public:
 
     uint32_t getMaxVirtualDisplayCount() const;
     Error createVirtualDisplay(uint32_t width, uint32_t height,
+            android_pixel_format_t* format,
             std::shared_ptr<Display>* outDisplay);
 
     void registerHotplugCallback(HotplugCallback hotplug);
index a90e074..2641ee6 100644 (file)
@@ -266,7 +266,7 @@ hwc2_function_pointer_t HWC2On1Adapter::doGetFunction(
             return asFP<HWC2_PFN_SET_CLIENT_TARGET>(
                     displayHook<decltype(&Display::setClientTarget),
                     &Display::setClientTarget, buffer_handle_t, int32_t,
-                    int32_t>);
+                    int32_t, hwc_region_t>);
         case FunctionDescriptor::SetColorMode:
             return asFP<HWC2_PFN_SET_COLOR_MODE>(
                     displayHook<decltype(&Display::setColorMode),
@@ -883,14 +883,14 @@ Error HWC2On1Adapter::Display::setActiveConfig(hwc2_config_t configId)
 }
 
 Error HWC2On1Adapter::Display::setClientTarget(buffer_handle_t target,
-        int32_t acquireFence, int32_t /*dataspace*/)
+        int32_t acquireFence, int32_t /*dataspace*/, hwc_region_t /*damage*/)
 {
     std::unique_lock<std::recursive_mutex> lock(mStateMutex);
 
     ALOGV("[%" PRIu64 "] setClientTarget(%p, %d)", mId, target, acquireFence);
     mClientTarget.setBuffer(target);
     mClientTarget.setFence(acquireFence);
-    // dataspace can't be used by HWC1, so ignore it
+    // dataspace and damage can't be used by HWC1, so ignore them
     return Error::None;
 }
 
index caeb188..dc7c355 100644 (file)
@@ -77,7 +77,10 @@ private:
     HWC2::Error createVirtualDisplay(uint32_t width, uint32_t height,
             hwc2_display_t* outDisplay);
     static int32_t createVirtualDisplayHook(hwc2_device_t* device,
-            uint32_t width, uint32_t height, hwc2_display_t* outDisplay) {
+            uint32_t width, uint32_t height, int32_t* /*format*/,
+            hwc2_display_t* outDisplay) {
+        // HWC1 implementations cannot override the buffer format requested by
+        // the consumer
         auto error = getAdapter(device)->createVirtualDisplay(width, height,
                 outDisplay);
         return static_cast<int32_t>(error);
@@ -208,7 +211,8 @@ private:
             HWC2::Error present(int32_t* outRetireFence);
             HWC2::Error setActiveConfig(hwc2_config_t configId);
             HWC2::Error setClientTarget(buffer_handle_t target,
-                    int32_t acquireFence, int32_t dataspace);
+                    int32_t acquireFence, int32_t dataspace,
+                    hwc_region_t damage);
             HWC2::Error setColorMode(int32_t mode);
             HWC2::Error setColorTransform(android_color_transform_t hint);
             HWC2::Error setOutputBuffer(buffer_handle_t buffer,
index 0bec0b8..2629794 100644 (file)
@@ -249,14 +249,15 @@ void HWComposer::vsync(const std::shared_ptr<HWC2::Display>& display,
 }
 
 status_t HWComposer::allocateVirtualDisplay(uint32_t width, uint32_t height,
-        int32_t *outId) {
+        android_pixel_format_t* format, int32_t *outId) {
     if (mRemainingHwcVirtualDisplays == 0) {
         ALOGE("allocateVirtualDisplay: No remaining virtual displays");
         return NO_MEMORY;
     }
 
     std::shared_ptr<HWC2::Display> display;
-    auto error = mHwcDevice->createVirtualDisplay(width, height, &display);
+    auto error = mHwcDevice->createVirtualDisplay(width, height, format,
+            &display);
     if (error != HWC2::Error::None) {
         ALOGE("allocateVirtualDisplay: Failed to create HWC virtual display");
         return NO_MEMORY;
index d407877..b88e250 100644 (file)
@@ -84,7 +84,7 @@ public:
     // Attempts to allocate a virtual display. If the virtual display is created
     // on the HWC device, outId will contain its HWC ID.
     status_t allocateVirtualDisplay(uint32_t width, uint32_t height,
-            int32_t* outId);
+            android_pixel_format_t* format, int32_t* outId);
 
     // Attempts to create a new layer on this display
     std::shared_ptr<HWC2::Layer> createLayer(int32_t displayId);
index 91815f3..466da8c 100644 (file)
@@ -1477,10 +1477,19 @@ void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
                                     NATIVE_WINDOW_HEIGHT, &height);
                             ALOGE_IF(status != NO_ERROR,
                                     "Unable to query height (%d)", status);
+                            int intFormat = 0;
+                            status = state.surface->query(
+                                    NATIVE_WINDOW_FORMAT, &intFormat);
+                            ALOGE_IF(status != NO_ERROR,
+                                    "Unable to query format (%d)", status);
+                            auto format = static_cast<android_pixel_format_t>(
+                                    intFormat);
 
-                            mHwc->allocateVirtualDisplay(width, height,
+                            mHwc->allocateVirtualDisplay(width, height, &format,
                                     &hwcId);
 
+                            // TODO: Plumb requested format back up to consumer
+
                             sp<VirtualDisplaySurface> vds =
                                     new VirtualDisplaySurface(*mHwc,
                                             hwcId, state.surface, bqProducer,