From: Dan Stoza Date: Fri, 20 May 2016 21:02:39 +0000 (-0700) Subject: HWC2: Fix breakage from header change X-Git-Tag: android-x86-7.1-r1~145^2~42^2 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=5cf424bc129f01ee12c7a4fbea1664276d29f970;p=android-x86%2Fframeworks-native.git HWC2: Fix breakage from header change 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 --- diff --git a/services/surfaceflinger/DisplayHardware/HWC2.cpp b/services/surfaceflinger/DisplayHardware/HWC2.cpp index f898adad95..ed8cc08ff7 100644 --- a/services/surfaceflinger/DisplayHardware/HWC2.cpp +++ b/services/surfaceflinger/DisplayHardware/HWC2.cpp @@ -192,19 +192,21 @@ uint32_t Device::getMaxVirtualDisplayCount() const } Error Device::createVirtualDisplay(uint32_t width, uint32_t height, - std::shared_ptr* outDisplay) + android_pixel_format_t* format, std::shared_ptr* outDisplay) { ALOGI("Creating virtual display"); hwc2_display_t displayId = 0; + int32_t intFormat = static_cast(*format); int32_t intError = mCreateVirtualDisplay(mHwcDevice, width, height, - &displayId); + &intFormat, &displayId); auto error = static_cast(intError); if (error != Error::None) { return error; } ALOGI("Created virtual display"); + *format = static_cast(intFormat); *outDisplay = getDisplayById(displayId); (*outDisplay)->setVirtual(); return Error::None; @@ -780,9 +782,10 @@ Error Display::setActiveConfig(const std::shared_ptr& config) Error Display::setClientTarget(buffer_handle_t target, const sp& 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(dataspace)); + fenceFd, static_cast(dataspace), {0, nullptr}); return static_cast(intError); } diff --git a/services/surfaceflinger/DisplayHardware/HWC2.h b/services/surfaceflinger/DisplayHardware/HWC2.h index e40602fe62..8ab61e9ced 100644 --- a/services/surfaceflinger/DisplayHardware/HWC2.h +++ b/services/surfaceflinger/DisplayHardware/HWC2.h @@ -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* outDisplay); void registerHotplugCallback(HotplugCallback hotplug); diff --git a/services/surfaceflinger/DisplayHardware/HWC2On1Adapter.cpp b/services/surfaceflinger/DisplayHardware/HWC2On1Adapter.cpp index a90e07426d..2641ee6261 100644 --- a/services/surfaceflinger/DisplayHardware/HWC2On1Adapter.cpp +++ b/services/surfaceflinger/DisplayHardware/HWC2On1Adapter.cpp @@ -266,7 +266,7 @@ hwc2_function_pointer_t HWC2On1Adapter::doGetFunction( return asFP( displayHook); + int32_t, hwc_region_t>); case FunctionDescriptor::SetColorMode: return asFP( displayHook 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; } diff --git a/services/surfaceflinger/DisplayHardware/HWC2On1Adapter.h b/services/surfaceflinger/DisplayHardware/HWC2On1Adapter.h index caeb1884e0..dc7c355617 100644 --- a/services/surfaceflinger/DisplayHardware/HWC2On1Adapter.h +++ b/services/surfaceflinger/DisplayHardware/HWC2On1Adapter.h @@ -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(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, diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp index 0bec0b8152..26297943b5 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp +++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp @@ -249,14 +249,15 @@ void HWComposer::vsync(const std::shared_ptr& 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 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; diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.h b/services/surfaceflinger/DisplayHardware/HWComposer.h index d407877bf0..b88e2501fe 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.h +++ b/services/surfaceflinger/DisplayHardware/HWComposer.h @@ -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 createLayer(int32_t displayId); diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 91815f314e..466da8cfba 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -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( + intFormat); - mHwc->allocateVirtualDisplay(width, height, + mHwc->allocateVirtualDisplay(width, height, &format, &hwcId); + // TODO: Plumb requested format back up to consumer + sp vds = new VirtualDisplaySurface(*mHwc, hwcId, state.surface, bqProducer,