diff options
| author | 2020-09-10 17:22:18 +0000 | |
|---|---|---|
| committer | 2020-09-10 17:22:18 +0000 | |
| commit | cdb6b16dec3a541b455be99d075004cb2f0a0cd7 (patch) | |
| tree | f7110d50445c67a337105034b1f2db3946a88fef /services/surfaceflinger/DisplayDevice.cpp | |
| parent | 171cac1b603e4bb83412eb596d05a500af5d7a76 (diff) | |
| parent | ac07d0f5ab16bb9e8bbbabb589d1c7d36817baa9 (diff) | |
Merge "Merge Android R"
Diffstat (limited to 'services/surfaceflinger/DisplayDevice.cpp')
| -rw-r--r-- | services/surfaceflinger/DisplayDevice.cpp | 226 |
1 files changed, 97 insertions, 129 deletions
diff --git a/services/surfaceflinger/DisplayDevice.cpp b/services/surfaceflinger/DisplayDevice.cpp index 5700d72cae..730f29744a 100644 --- a/services/surfaceflinger/DisplayDevice.cpp +++ b/services/surfaceflinger/DisplayDevice.cpp @@ -14,6 +14,10 @@ * limitations under the License. */ +// TODO(b/129481165): remove the #pragma below and fix conversion issues +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wconversion" + // #define LOG_NDEBUG 0 #undef LOG_TAG #define LOG_TAG "DisplayDevice" @@ -39,32 +43,26 @@ namespace android { -using android::base::StringAppendF; +namespace hal = hardware::graphics::composer::hal; -/* - * Initialize the display to the specified values. - * - */ +using android::base::StringAppendF; -uint32_t DisplayDevice::sPrimaryDisplayOrientation = 0; +ui::Transform::RotationFlags DisplayDevice::sPrimaryDisplayRotationFlags = ui::Transform::ROT_0; -DisplayDeviceCreationArgs::DisplayDeviceCreationArgs(const sp<SurfaceFlinger>& flinger, - const wp<IBinder>& displayToken, - const std::optional<DisplayId>& displayId) - : flinger(flinger), displayToken(displayToken), displayId(displayId) {} +DisplayDeviceCreationArgs::DisplayDeviceCreationArgs( + const sp<SurfaceFlinger>& flinger, const wp<IBinder>& displayToken, + std::shared_ptr<compositionengine::Display> compositionDisplay) + : flinger(flinger), displayToken(displayToken), compositionDisplay(compositionDisplay) {} -DisplayDevice::DisplayDevice(DisplayDeviceCreationArgs&& args) +DisplayDevice::DisplayDevice(DisplayDeviceCreationArgs& args) : mFlinger(args.flinger), mDisplayToken(args.displayToken), mSequenceId(args.sequenceId), - mDisplayInstallOrientation(args.displayInstallOrientation), - mCompositionDisplay{mFlinger->getCompositionEngine().createDisplay( - compositionengine::DisplayCreationArgs{args.isSecure, args.isVirtual, - args.displayId})}, - mIsVirtual(args.isVirtual), - mOrientation(), - mActiveConfig(0), + mConnectionType(args.connectionType), + mCompositionDisplay{args.compositionDisplay}, + mPhysicalOrientation(args.physicalOrientation), mIsPrimary(args.isPrimary) { + mCompositionDisplay->editState().isSecure = args.isSecure; mCompositionDisplay->createRenderSurface( compositionengine::RenderSurfaceCreationArgs{ANativeWindow_getWidth( args.nativeWindow.get()), @@ -72,6 +70,12 @@ DisplayDevice::DisplayDevice(DisplayDeviceCreationArgs&& args) args.nativeWindow.get()), args.nativeWindow, args.displaySurface}); + if (!mFlinger->mDisableClientCompositionCache && + SurfaceFlinger::maxFrameBufferAcquiredBuffers > 0) { + mCompositionDisplay->createClientCompositionCache( + static_cast<uint32_t>(SurfaceFlinger::maxFrameBufferAcquiredBuffers)); + } + mCompositionDisplay->createDisplayColorProfile( compositionengine::DisplayColorProfileCreationArgs{args.hasWideColorGamut, std::move(args.hdrCapabilities), @@ -87,7 +91,7 @@ DisplayDevice::DisplayDevice(DisplayDeviceCreationArgs&& args) setPowerMode(args.initialPowerMode); // initialize the display orientation transform. - setProjection(DisplayState::eOrientationDefault, Rect::INVALID_RECT, Rect::INVALID_RECT); + setProjection(ui::ROTATION_0, Rect::INVALID_RECT, Rect::INVALID_RECT); } DisplayDevice::~DisplayDevice() = default; @@ -117,106 +121,56 @@ uint32_t DisplayDevice::getPageFlipCount() const { } // ---------------------------------------------------------------------------- - -void DisplayDevice::setVisibleLayersSortedByZ(const Vector< sp<Layer> >& layers) { - mVisibleLayersSortedByZ = layers; -} - -const Vector< sp<Layer> >& DisplayDevice::getVisibleLayersSortedByZ() const { - return mVisibleLayersSortedByZ; -} - -void DisplayDevice::setLayersNeedingFences(const Vector< sp<Layer> >& layers) { - mLayersNeedingFences = layers; -} - -const Vector< sp<Layer> >& DisplayDevice::getLayersNeedingFences() const { - return mLayersNeedingFences; -} - -// ---------------------------------------------------------------------------- -void DisplayDevice::setPowerMode(int mode) { +void DisplayDevice::setPowerMode(hal::PowerMode mode) { mPowerMode = mode; - getCompositionDisplay()->setCompositionEnabled(mPowerMode != HWC_POWER_MODE_OFF); + getCompositionDisplay()->setCompositionEnabled(mPowerMode != hal::PowerMode::OFF); } -int DisplayDevice::getPowerMode() const { +hal::PowerMode DisplayDevice::getPowerMode() const { return mPowerMode; } bool DisplayDevice::isPoweredOn() const { - return mPowerMode != HWC_POWER_MODE_OFF; + return mPowerMode != hal::PowerMode::OFF; } -// ---------------------------------------------------------------------------- -void DisplayDevice::setActiveConfig(int mode) { +void DisplayDevice::setActiveConfig(HwcConfigIndexType mode) { mActiveConfig = mode; } -int DisplayDevice::getActiveConfig() const { +HwcConfigIndexType DisplayDevice::getActiveConfig() const { return mActiveConfig; } -// ---------------------------------------------------------------------------- - ui::Dataspace DisplayDevice::getCompositionDataSpace() const { return mCompositionDisplay->getState().dataspace; } -// ---------------------------------------------------------------------------- - -void DisplayDevice::setLayerStack(uint32_t stack) { +void DisplayDevice::setLayerStack(ui::LayerStack stack) { mCompositionDisplay->setLayerStackFilter(stack, isPrimary()); } -// ---------------------------------------------------------------------------- - -uint32_t DisplayDevice::displayStateOrientationToTransformOrientation(int orientation) { - switch (orientation) { - case DisplayState::eOrientationDefault: - return ui::Transform::ROT_0; - case DisplayState::eOrientation90: - return ui::Transform::ROT_90; - case DisplayState::eOrientation180: - return ui::Transform::ROT_180; - case DisplayState::eOrientation270: - return ui::Transform::ROT_270; - default: - return ui::Transform::ROT_INVALID; - } -} - -status_t DisplayDevice::orientationToTransfrom(int orientation, int w, int h, ui::Transform* tr) { - uint32_t flags = displayStateOrientationToTransformOrientation(orientation); - if (flags == ui::Transform::ROT_INVALID) { - return BAD_VALUE; - } - tr->set(flags, w, h); - return NO_ERROR; +void DisplayDevice::setDisplaySize(int width, int height) { + mCompositionDisplay->setBounds(ui::Size(width, height)); } -void DisplayDevice::setDisplaySize(const int newWidth, const int newHeight) { - mCompositionDisplay->setBounds(ui::Size(newWidth, newHeight)); -} - -void DisplayDevice::setProjection(int orientation, - const Rect& newViewport, const Rect& newFrame) { - Rect viewport(newViewport); - Rect frame(newFrame); - +void DisplayDevice::setProjection(ui::Rotation orientation, Rect viewport, Rect frame) { mOrientation = orientation; const Rect& displayBounds = getCompositionDisplay()->getState().bounds; - const int w = displayBounds.width(); - const int h = displayBounds.height(); + const int displayWidth = displayBounds.width(); + const int displayHeight = displayBounds.height(); - ui::Transform R; - DisplayDevice::orientationToTransfrom(orientation, w, h, &R); + ui::Transform rotation; + if (const auto flags = ui::Transform::toRotationFlags(orientation); + flags != ui::Transform::ROT_INVALID) { + rotation.set(flags, displayWidth, displayHeight); + } if (!frame.isValid()) { // the destination frame can be invalid if it has never been set, // in that case we assume the whole display frame. - frame = Rect(w, h); + frame = Rect(displayWidth, displayHeight); } if (viewport.isEmpty()) { @@ -224,86 +178,97 @@ void DisplayDevice::setProjection(int orientation, // we assume the whole display size. // it's also invalid to have an empty viewport, so we handle that // case in the same way. - viewport = Rect(w, h); - if (R.getOrientation() & ui::Transform::ROT_90) { + viewport = Rect(displayWidth, displayHeight); + if (rotation.getOrientation() & ui::Transform::ROT_90) { // viewport is always specified in the logical orientation // of the display (ie: post-rotation). std::swap(viewport.right, viewport.bottom); } } - ui::Transform TL, TP, S; - float src_width = viewport.width(); - float src_height = viewport.height(); - float dst_width = frame.width(); - float dst_height = frame.height(); - if (src_width != dst_width || src_height != dst_height) { - float sx = dst_width / src_width; - float sy = dst_height / src_height; - S.set(sx, 0, 0, sy); + ui::Transform logicalTranslation, physicalTranslation, scale; + const float sourceWidth = viewport.width(); + const float sourceHeight = viewport.height(); + const float destWidth = frame.width(); + const float destHeight = frame.height(); + if (sourceWidth != destWidth || sourceHeight != destHeight) { + const float scaleX = destWidth / sourceWidth; + const float scaleY = destHeight / sourceHeight; + scale.set(scaleX, 0, 0, scaleY); } - float src_x = viewport.left; - float src_y = viewport.top; - float dst_x = frame.left; - float dst_y = frame.top; - TL.set(-src_x, -src_y); - TP.set(dst_x, dst_y); + const float sourceX = viewport.left; + const float sourceY = viewport.top; + const float destX = frame.left; + const float destY = frame.top; + logicalTranslation.set(-sourceX, -sourceY); + physicalTranslation.set(destX, destY); // need to take care of primary display rotation for globalTransform // for case if the panel is not installed aligned with device orientation if (isPrimary()) { - DisplayDevice::orientationToTransfrom( - (orientation + mDisplayInstallOrientation) % (DisplayState::eOrientation270 + 1), - w, h, &R); + if (const auto flags = ui::Transform::toRotationFlags(orientation + mPhysicalOrientation); + flags != ui::Transform::ROT_INVALID) { + rotation.set(flags, displayWidth, displayHeight); + } } // The viewport and frame are both in the logical orientation. // Apply the logical translation, scale to physical size, apply the // physical translation and finally rotate to the physical orientation. - ui::Transform globalTransform = R * TP * S * TL; + ui::Transform globalTransform = rotation * physicalTranslation * scale * logicalTranslation; const uint8_t type = globalTransform.getType(); const bool needsFiltering = (!globalTransform.preserveRects() || (type >= ui::Transform::SCALE)); - Rect scissor = globalTransform.transform(viewport); - if (scissor.isEmpty()) { - scissor = displayBounds; + const Rect& sourceClip = viewport; + Rect destinationClip = globalTransform.transform(viewport); + if (destinationClip.isEmpty()) { + destinationClip = displayBounds; } + // Make sure the destination clip is contained in the display bounds + destinationClip.intersect(displayBounds, &destinationClip); uint32_t transformOrientation; if (isPrimary()) { - sPrimaryDisplayOrientation = displayStateOrientationToTransformOrientation(orientation); - transformOrientation = displayStateOrientationToTransformOrientation( - (orientation + mDisplayInstallOrientation) % (DisplayState::eOrientation270 + 1)); + sPrimaryDisplayRotationFlags = ui::Transform::toRotationFlags(orientation); + transformOrientation = ui::Transform::toRotationFlags(orientation + mPhysicalOrientation); } else { - transformOrientation = displayStateOrientationToTransformOrientation(orientation); + transformOrientation = ui::Transform::toRotationFlags(orientation); } - getCompositionDisplay()->setProjection(globalTransform, transformOrientation, - frame, viewport, scissor, needsFiltering); + getCompositionDisplay()->setProjection(globalTransform, transformOrientation, frame, viewport, + sourceClip, destinationClip, needsFiltering); } -uint32_t DisplayDevice::getPrimaryDisplayOrientationTransform() { - return sPrimaryDisplayOrientation; +ui::Transform::RotationFlags DisplayDevice::getPrimaryDisplayRotationFlags() { + return sPrimaryDisplayRotationFlags; } std::string DisplayDevice::getDebugName() const { - const auto id = getId() ? to_string(*getId()) + ", " : std::string(); - return base::StringPrintf("DisplayDevice{%s%s%s\"%s\"}", id.c_str(), - isPrimary() ? "primary, " : "", isVirtual() ? "virtual, " : "", - mDisplayName.c_str()); + std::string displayId; + if (const auto id = getId()) { + displayId = to_string(*id) + ", "; + } + + const char* type = "virtual"; + if (mConnectionType) { + type = *mConnectionType == DisplayConnectionType::Internal ? "internal" : "external"; + } + + return base::StringPrintf("DisplayDevice{%s%s%s, \"%s\"}", displayId.c_str(), type, + isPrimary() ? ", primary" : "", mDisplayName.c_str()); } void DisplayDevice::dump(std::string& result) const { StringAppendF(&result, "+ %s\n", getDebugName().c_str()); result.append(" "); - StringAppendF(&result, "powerMode=%d, ", mPowerMode); - StringAppendF(&result, "activeConfig=%d, ", mActiveConfig); - StringAppendF(&result, "numLayers=%zu\n", mVisibleLayersSortedByZ.size()); + StringAppendF(&result, "powerMode=%s (%d), ", to_string(mPowerMode).c_str(), + static_cast<int32_t>(mPowerMode)); + StringAppendF(&result, "activeConfig=%d, ", mActiveConfig.value()); getCompositionDisplay()->dump(result); } @@ -333,7 +298,7 @@ bool DisplayDevice::needsFiltering() const { return mCompositionDisplay->getState().needsFiltering; } -uint32_t DisplayDevice::getLayerStack() const { +ui::LayerStack DisplayDevice::getLayerStack() const { return mCompositionDisplay->getState().layerStackId; } @@ -349,8 +314,8 @@ const Rect& DisplayDevice::getFrame() const { return mCompositionDisplay->getState().frame; } -const Rect& DisplayDevice::getScissor() const { - return mCompositionDisplay->getState().scissor; +const Rect& DisplayDevice::getSourceClip() const { + return mCompositionDisplay->getState().sourceClip; } bool DisplayDevice::hasWideColorGamut() const { @@ -384,3 +349,6 @@ const HdrCapabilities& DisplayDevice::getHdrCapabilities() const { std::atomic<int32_t> DisplayDeviceState::sNextSequenceId(1); } // namespace android + +// TODO(b/129481165): remove the #pragma below and fix conversion issues +#pragma clang diagnostic pop // ignored "-Wconversion" |