Loading services/surfaceflinger/DisplayHardware/HWC2.cpp +6 −3 Original line number Original line Diff line number Diff line Loading @@ -192,19 +192,21 @@ uint32_t Device::getMaxVirtualDisplayCount() const } } Error Device::createVirtualDisplay(uint32_t width, uint32_t height, 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"); ALOGI("Creating virtual display"); hwc2_display_t displayId = 0; hwc2_display_t displayId = 0; int32_t intFormat = static_cast<int32_t>(*format); int32_t intError = mCreateVirtualDisplay(mHwcDevice, width, height, int32_t intError = mCreateVirtualDisplay(mHwcDevice, width, height, &displayId); &intFormat, &displayId); auto error = static_cast<Error>(intError); auto error = static_cast<Error>(intError); if (error != Error::None) { if (error != Error::None) { return error; return error; } } ALOGI("Created virtual display"); ALOGI("Created virtual display"); *format = static_cast<android_pixel_format_t>(intFormat); *outDisplay = getDisplayById(displayId); *outDisplay = getDisplayById(displayId); (*outDisplay)->setVirtual(); (*outDisplay)->setVirtual(); return Error::None; return Error::None; Loading Loading @@ -780,9 +782,10 @@ Error Display::setActiveConfig(const std::shared_ptr<const Config>& config) Error Display::setClientTarget(buffer_handle_t target, Error Display::setClientTarget(buffer_handle_t target, const sp<Fence>& acquireFence, android_dataspace_t dataspace) const sp<Fence>& acquireFence, android_dataspace_t dataspace) { { // TODO: Properly encode client target surface damage int32_t fenceFd = acquireFence->dup(); int32_t fenceFd = acquireFence->dup(); int32_t intError = mDevice.mSetClientTarget(mDevice.mHwcDevice, mId, target, 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); return static_cast<Error>(intError); } } Loading services/surfaceflinger/DisplayHardware/HWC2.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -72,6 +72,7 @@ public: uint32_t getMaxVirtualDisplayCount() const; uint32_t getMaxVirtualDisplayCount() const; Error createVirtualDisplay(uint32_t width, uint32_t height, Error createVirtualDisplay(uint32_t width, uint32_t height, android_pixel_format_t* format, std::shared_ptr<Display>* outDisplay); std::shared_ptr<Display>* outDisplay); void registerHotplugCallback(HotplugCallback hotplug); void registerHotplugCallback(HotplugCallback hotplug); Loading services/surfaceflinger/DisplayHardware/HWC2On1Adapter.cpp +3 −3 Original line number Original line Diff line number Diff line Loading @@ -266,7 +266,7 @@ hwc2_function_pointer_t HWC2On1Adapter::doGetFunction( return asFP<HWC2_PFN_SET_CLIENT_TARGET>( return asFP<HWC2_PFN_SET_CLIENT_TARGET>( displayHook<decltype(&Display::setClientTarget), displayHook<decltype(&Display::setClientTarget), &Display::setClientTarget, buffer_handle_t, int32_t, &Display::setClientTarget, buffer_handle_t, int32_t, int32_t>); int32_t, hwc_region_t>); case FunctionDescriptor::SetColorMode: case FunctionDescriptor::SetColorMode: return asFP<HWC2_PFN_SET_COLOR_MODE>( return asFP<HWC2_PFN_SET_COLOR_MODE>( displayHook<decltype(&Display::setColorMode), displayHook<decltype(&Display::setColorMode), Loading Loading @@ -883,14 +883,14 @@ Error HWC2On1Adapter::Display::setActiveConfig(hwc2_config_t configId) } } Error HWC2On1Adapter::Display::setClientTarget(buffer_handle_t target, 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); std::unique_lock<std::recursive_mutex> lock(mStateMutex); ALOGV("[%" PRIu64 "] setClientTarget(%p, %d)", mId, target, acquireFence); ALOGV("[%" PRIu64 "] setClientTarget(%p, %d)", mId, target, acquireFence); mClientTarget.setBuffer(target); mClientTarget.setBuffer(target); mClientTarget.setFence(acquireFence); 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; return Error::None; } } Loading services/surfaceflinger/DisplayHardware/HWC2On1Adapter.h +6 −2 Original line number Original line Diff line number Diff line Loading @@ -77,7 +77,10 @@ private: HWC2::Error createVirtualDisplay(uint32_t width, uint32_t height, HWC2::Error createVirtualDisplay(uint32_t width, uint32_t height, hwc2_display_t* outDisplay); hwc2_display_t* outDisplay); static int32_t createVirtualDisplayHook(hwc2_device_t* device, 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, auto error = getAdapter(device)->createVirtualDisplay(width, height, outDisplay); outDisplay); return static_cast<int32_t>(error); return static_cast<int32_t>(error); Loading Loading @@ -208,7 +211,8 @@ private: HWC2::Error present(int32_t* outRetireFence); HWC2::Error present(int32_t* outRetireFence); HWC2::Error setActiveConfig(hwc2_config_t configId); HWC2::Error setActiveConfig(hwc2_config_t configId); HWC2::Error setClientTarget(buffer_handle_t target, 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 setColorMode(int32_t mode); HWC2::Error setColorTransform(android_color_transform_t hint); HWC2::Error setColorTransform(android_color_transform_t hint); HWC2::Error setOutputBuffer(buffer_handle_t buffer, HWC2::Error setOutputBuffer(buffer_handle_t buffer, Loading services/surfaceflinger/DisplayHardware/HWComposer.cpp +3 −2 Original line number Original line Diff line number Diff line Loading @@ -249,14 +249,15 @@ void HWComposer::vsync(const std::shared_ptr<HWC2::Display>& display, } } status_t HWComposer::allocateVirtualDisplay(uint32_t width, uint32_t height, status_t HWComposer::allocateVirtualDisplay(uint32_t width, uint32_t height, int32_t *outId) { android_pixel_format_t* format, int32_t *outId) { if (mRemainingHwcVirtualDisplays == 0) { if (mRemainingHwcVirtualDisplays == 0) { ALOGE("allocateVirtualDisplay: No remaining virtual displays"); ALOGE("allocateVirtualDisplay: No remaining virtual displays"); return NO_MEMORY; return NO_MEMORY; } } std::shared_ptr<HWC2::Display> display; 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) { if (error != HWC2::Error::None) { ALOGE("allocateVirtualDisplay: Failed to create HWC virtual display"); ALOGE("allocateVirtualDisplay: Failed to create HWC virtual display"); return NO_MEMORY; return NO_MEMORY; Loading Loading
services/surfaceflinger/DisplayHardware/HWC2.cpp +6 −3 Original line number Original line Diff line number Diff line Loading @@ -192,19 +192,21 @@ uint32_t Device::getMaxVirtualDisplayCount() const } } Error Device::createVirtualDisplay(uint32_t width, uint32_t height, 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"); ALOGI("Creating virtual display"); hwc2_display_t displayId = 0; hwc2_display_t displayId = 0; int32_t intFormat = static_cast<int32_t>(*format); int32_t intError = mCreateVirtualDisplay(mHwcDevice, width, height, int32_t intError = mCreateVirtualDisplay(mHwcDevice, width, height, &displayId); &intFormat, &displayId); auto error = static_cast<Error>(intError); auto error = static_cast<Error>(intError); if (error != Error::None) { if (error != Error::None) { return error; return error; } } ALOGI("Created virtual display"); ALOGI("Created virtual display"); *format = static_cast<android_pixel_format_t>(intFormat); *outDisplay = getDisplayById(displayId); *outDisplay = getDisplayById(displayId); (*outDisplay)->setVirtual(); (*outDisplay)->setVirtual(); return Error::None; return Error::None; Loading Loading @@ -780,9 +782,10 @@ Error Display::setActiveConfig(const std::shared_ptr<const Config>& config) Error Display::setClientTarget(buffer_handle_t target, Error Display::setClientTarget(buffer_handle_t target, const sp<Fence>& acquireFence, android_dataspace_t dataspace) const sp<Fence>& acquireFence, android_dataspace_t dataspace) { { // TODO: Properly encode client target surface damage int32_t fenceFd = acquireFence->dup(); int32_t fenceFd = acquireFence->dup(); int32_t intError = mDevice.mSetClientTarget(mDevice.mHwcDevice, mId, target, 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); return static_cast<Error>(intError); } } Loading
services/surfaceflinger/DisplayHardware/HWC2.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -72,6 +72,7 @@ public: uint32_t getMaxVirtualDisplayCount() const; uint32_t getMaxVirtualDisplayCount() const; Error createVirtualDisplay(uint32_t width, uint32_t height, Error createVirtualDisplay(uint32_t width, uint32_t height, android_pixel_format_t* format, std::shared_ptr<Display>* outDisplay); std::shared_ptr<Display>* outDisplay); void registerHotplugCallback(HotplugCallback hotplug); void registerHotplugCallback(HotplugCallback hotplug); Loading
services/surfaceflinger/DisplayHardware/HWC2On1Adapter.cpp +3 −3 Original line number Original line Diff line number Diff line Loading @@ -266,7 +266,7 @@ hwc2_function_pointer_t HWC2On1Adapter::doGetFunction( return asFP<HWC2_PFN_SET_CLIENT_TARGET>( return asFP<HWC2_PFN_SET_CLIENT_TARGET>( displayHook<decltype(&Display::setClientTarget), displayHook<decltype(&Display::setClientTarget), &Display::setClientTarget, buffer_handle_t, int32_t, &Display::setClientTarget, buffer_handle_t, int32_t, int32_t>); int32_t, hwc_region_t>); case FunctionDescriptor::SetColorMode: case FunctionDescriptor::SetColorMode: return asFP<HWC2_PFN_SET_COLOR_MODE>( return asFP<HWC2_PFN_SET_COLOR_MODE>( displayHook<decltype(&Display::setColorMode), displayHook<decltype(&Display::setColorMode), Loading Loading @@ -883,14 +883,14 @@ Error HWC2On1Adapter::Display::setActiveConfig(hwc2_config_t configId) } } Error HWC2On1Adapter::Display::setClientTarget(buffer_handle_t target, 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); std::unique_lock<std::recursive_mutex> lock(mStateMutex); ALOGV("[%" PRIu64 "] setClientTarget(%p, %d)", mId, target, acquireFence); ALOGV("[%" PRIu64 "] setClientTarget(%p, %d)", mId, target, acquireFence); mClientTarget.setBuffer(target); mClientTarget.setBuffer(target); mClientTarget.setFence(acquireFence); 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; return Error::None; } } Loading
services/surfaceflinger/DisplayHardware/HWC2On1Adapter.h +6 −2 Original line number Original line Diff line number Diff line Loading @@ -77,7 +77,10 @@ private: HWC2::Error createVirtualDisplay(uint32_t width, uint32_t height, HWC2::Error createVirtualDisplay(uint32_t width, uint32_t height, hwc2_display_t* outDisplay); hwc2_display_t* outDisplay); static int32_t createVirtualDisplayHook(hwc2_device_t* device, 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, auto error = getAdapter(device)->createVirtualDisplay(width, height, outDisplay); outDisplay); return static_cast<int32_t>(error); return static_cast<int32_t>(error); Loading Loading @@ -208,7 +211,8 @@ private: HWC2::Error present(int32_t* outRetireFence); HWC2::Error present(int32_t* outRetireFence); HWC2::Error setActiveConfig(hwc2_config_t configId); HWC2::Error setActiveConfig(hwc2_config_t configId); HWC2::Error setClientTarget(buffer_handle_t target, 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 setColorMode(int32_t mode); HWC2::Error setColorTransform(android_color_transform_t hint); HWC2::Error setColorTransform(android_color_transform_t hint); HWC2::Error setOutputBuffer(buffer_handle_t buffer, HWC2::Error setOutputBuffer(buffer_handle_t buffer, Loading
services/surfaceflinger/DisplayHardware/HWComposer.cpp +3 −2 Original line number Original line Diff line number Diff line Loading @@ -249,14 +249,15 @@ void HWComposer::vsync(const std::shared_ptr<HWC2::Display>& display, } } status_t HWComposer::allocateVirtualDisplay(uint32_t width, uint32_t height, status_t HWComposer::allocateVirtualDisplay(uint32_t width, uint32_t height, int32_t *outId) { android_pixel_format_t* format, int32_t *outId) { if (mRemainingHwcVirtualDisplays == 0) { if (mRemainingHwcVirtualDisplays == 0) { ALOGE("allocateVirtualDisplay: No remaining virtual displays"); ALOGE("allocateVirtualDisplay: No remaining virtual displays"); return NO_MEMORY; return NO_MEMORY; } } std::shared_ptr<HWC2::Display> display; 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) { if (error != HWC2::Error::None) { ALOGE("allocateVirtualDisplay: Failed to create HWC virtual display"); ALOGE("allocateVirtualDisplay: Failed to create HWC virtual display"); return NO_MEMORY; return NO_MEMORY; Loading