diff options
Diffstat (limited to 'services/surfaceflinger/DisplayDevice.h')
-rw-r--r-- | services/surfaceflinger/DisplayDevice.h | 218 |
1 files changed, 133 insertions, 85 deletions
diff --git a/services/surfaceflinger/DisplayDevice.h b/services/surfaceflinger/DisplayDevice.h index 7e4d92308c..cb467ea292 100644 --- a/services/surfaceflinger/DisplayDevice.h +++ b/services/surfaceflinger/DisplayDevice.h @@ -27,22 +27,21 @@ #include <math/mat4.h> #include <renderengine/RenderEngine.h> #include <system/window.h> -#include <ui/DisplayId.h> +#include <ui/DisplayInfo.h> #include <ui/DisplayState.h> #include <ui/GraphicTypes.h> #include <ui/HdrCapabilities.h> #include <ui/Region.h> -#include <ui/StaticDisplayInfo.h> #include <ui/Transform.h> -#include <utils/Errors.h> #include <utils/Mutex.h> #include <utils/RefBase.h> #include <utils/Timers.h> #include "DisplayHardware/DisplayIdentification.h" -#include "DisplayHardware/DisplayMode.h" #include "DisplayHardware/Hal.h" #include "DisplayHardware/PowerAdvisor.h" +#include "RenderArea.h" +#include "Scheduler/HwcStrongTypes.h" namespace android { @@ -60,21 +59,19 @@ class Display; class DisplaySurface; } // namespace compositionengine -class DisplayDevice : public RefBase { +class DisplayDevice : public LightRefBase<DisplayDevice> { public: constexpr static float sDefaultMinLumiance = 0.0; constexpr static float sDefaultMaxLumiance = 500.0; explicit DisplayDevice(DisplayDeviceCreationArgs& args); - - // Must be destroyed on the main thread because it may call into HWComposer. virtual ~DisplayDevice(); std::shared_ptr<compositionengine::Display> getCompositionDisplay() const { return mCompositionDisplay; } - std::optional<ui::DisplayConnectionType> getConnectionType() const { return mConnectionType; } + std::optional<DisplayConnectionType> getConnectionType() const { return mConnectionType; } bool isVirtual() const { return !mConnectionType; } bool isPrimary() const { return mIsPrimary; } @@ -96,28 +93,18 @@ public: static ui::Transform::RotationFlags getPrimaryDisplayRotationFlags(); - ui::Transform::RotationFlags getTransformHint() const; + ui::Transform::RotationFlags getTransformHint() const { + return static_cast<ui::Transform::RotationFlags>(getTransform().getOrientation()); + } + const ui::Transform& getTransform() const; - const Rect& getLayerStackSpaceRect() const; - const Rect& getOrientedDisplaySpaceRect() const; + const Rect& getViewport() const; + const Rect& getFrame() const; + const Rect& getSourceClip() const; bool needsFiltering() const; ui::LayerStack getLayerStack() const; - DisplayId getId() const; - - // Shorthand to upcast the ID of a display whose type is known as a precondition. - PhysicalDisplayId getPhysicalId() const { - const auto id = PhysicalDisplayId::tryCast(getId()); - LOG_FATAL_IF(!id); - return *id; - } - - VirtualDisplayId getVirtualId() const { - const auto id = VirtualDisplayId::tryCast(getId()); - LOG_FATAL_IF(!id); - return *id; - } - + const std::optional<DisplayId>& getId() const; const wp<IBinder>& getDisplayToken() const { return mDisplayToken; } int32_t getSequenceId() const { return mSequenceId; } @@ -132,15 +119,13 @@ public: bool hasHLGSupport() const; bool hasDolbyVisionSupport() const; - void overrideHdrTypes(const std::vector<ui::Hdr>& hdrTypes); - // The returned HdrCapabilities is the combination of HDR capabilities from // hardware composer and RenderEngine. When the DisplayDevice supports wide // color gamut, RenderEngine is able to simulate HDR support in Display P3 // color space for both PQ and HLG HDR contents. The minimum and maximum // luminance will be set to sDefaultMinLumiance and sDefaultMaxLumiance // respectively if hardware composer doesn't return meaningful values. - HdrCapabilities getHdrCapabilities() const; + const HdrCapabilities& getHdrCapabilities() const; // Return true if intent is supported by the display. bool hasRenderIntent(ui::RenderIntent intent) const; @@ -151,11 +136,6 @@ public: void setDisplayName(const std::string& displayName); const std::string& getDisplayName() const { return mDisplayName; } - void setDeviceProductInfo(std::optional<DeviceProductInfo> info); - const std::optional<DeviceProductInfo>& getDeviceProductInfo() const { - return mDeviceProductInfo; - } - /* ------------------------------------------------------------------------ * Display power mode management. */ @@ -163,33 +143,13 @@ public: void setPowerMode(hardware::graphics::composer::hal::PowerMode mode); bool isPoweredOn() const; - // Enables layer caching on this DisplayDevice - void enableLayerCaching(bool enable); - ui::Dataspace getCompositionDataSpace() const; /* ------------------------------------------------------------------------ - * Display mode management. + * Display active config management. */ - const DisplayModePtr& getActiveMode() const; - void setActiveMode(DisplayModeId); - status_t initiateModeChange(DisplayModeId modeId, - const hal::VsyncPeriodChangeConstraints& constraints, - hal::VsyncPeriodChangeTimeline* outTimeline) const; - - // Return the immutable list of supported display modes. The HWC may report different modes - // after a hotplug reconnect event, in which case the DisplayDevice object will be recreated. - // Hotplug reconnects are common for external displays. - const DisplayModes& getSupportedModes() const; - - // Returns nullptr if the given mode ID is not supported. A previously - // supported mode may be no longer supported for some devices like TVs and - // set-top boxes after a hotplug reconnect. - DisplayModePtr getMode(DisplayModeId) const; - - void onVsync(nsecs_t timestamp); - nsecs_t getVsyncPeriodFromHWC() const; - nsecs_t getRefreshTimestamp() const; + HwcConfigIndexType getActiveConfig() const; + void setActiveConfig(HwcConfigIndexType mode); // release HWC resources (if any) for removable displays void disconnect(); @@ -203,10 +163,9 @@ public: private: const sp<SurfaceFlinger> mFlinger; - HWComposer& mHwComposer; const wp<IBinder> mDisplayToken; const int32_t mSequenceId; - const std::optional<ui::DisplayConnectionType> mConnectionType; + const std::optional<DisplayConnectionType> mConnectionType; const std::shared_ptr<compositionengine::Display> mCompositionDisplay; @@ -219,27 +178,17 @@ private: hardware::graphics::composer::hal::PowerMode mPowerMode = hardware::graphics::composer::hal::PowerMode::OFF; - DisplayModePtr mActiveMode; - const DisplayModes mSupportedModes; - - std::atomic<nsecs_t> mLastHwVsync = 0; + HwcConfigIndexType mActiveConfig; // TODO(b/74619554): Remove special cases for primary display. const bool mIsPrimary; - - std::optional<DeviceProductInfo> mDeviceProductInfo; - - std::vector<ui::Hdr> mOverrideHdrTypes; }; struct DisplayDeviceState { struct Physical { - PhysicalDisplayId id; - ui::DisplayConnectionType type; + DisplayId id; + DisplayConnectionType type; hardware::graphics::composer::hal::HWDisplayId hwcDisplayId; - std::optional<DeviceProductInfo> deviceProductInfo; - DisplayModes supportedModes; - DisplayModePtr activeMode; bool operator==(const Physical& other) const { return id == other.id && type == other.type && hwcDisplayId == other.hwcDisplayId; @@ -252,8 +201,8 @@ struct DisplayDeviceState { std::optional<Physical> physical; sp<IGraphicBufferProducer> surface; ui::LayerStack layerStack = ui::NO_LAYER_STACK; - Rect layerStackSpaceRect; - Rect orientedDisplaySpaceRect; + Rect viewport; + Rect frame; ui::Rotation orientation = ui::ROTATION_0; uint32_t width = 0; uint32_t height = 0; @@ -267,16 +216,14 @@ private: struct DisplayDeviceCreationArgs { // We use a constructor to ensure some of the values are set, without // assuming a default value. - DisplayDeviceCreationArgs(const sp<SurfaceFlinger>&, HWComposer& hwComposer, - const wp<IBinder>& displayToken, + DisplayDeviceCreationArgs(const sp<SurfaceFlinger>&, const wp<IBinder>& displayToken, std::shared_ptr<compositionengine::Display>); const sp<SurfaceFlinger> flinger; - HWComposer& hwComposer; const wp<IBinder> displayToken; const std::shared_ptr<compositionengine::Display> compositionDisplay; int32_t sequenceId{0}; - std::optional<ui::DisplayConnectionType> connectionType; + std::optional<DisplayConnectionType> connectionType; bool isSecure{false}; sp<ANativeWindow> nativeWindow; sp<compositionengine::DisplaySurface> displaySurface; @@ -288,19 +235,120 @@ struct DisplayDeviceCreationArgs { hardware::graphics::composer::hal::PowerMode initialPowerMode{ hardware::graphics::composer::hal::PowerMode::ON}; bool isPrimary{false}; - DisplayModes supportedModes; }; -// Predicates for display lookup. +class DisplayRenderArea : public RenderArea { +public: + DisplayRenderArea(const sp<const DisplayDevice>& display, + RotationFlags rotation = ui::Transform::ROT_0) + : DisplayRenderArea(display, display->getBounds(), + static_cast<uint32_t>(display->getWidth()), + static_cast<uint32_t>(display->getHeight()), + display->getCompositionDataSpace(), rotation) {} + + DisplayRenderArea(sp<const DisplayDevice> display, const Rect& sourceCrop, uint32_t reqWidth, + uint32_t reqHeight, ui::Dataspace reqDataSpace, RotationFlags rotation, + bool allowSecureLayers = true) + : RenderArea(reqWidth, reqHeight, CaptureFill::OPAQUE, reqDataSpace, + display->getViewport(), applyDeviceOrientation(rotation, display)), + mDisplay(std::move(display)), + mSourceCrop(sourceCrop), + mAllowSecureLayers(allowSecureLayers) {} + + const ui::Transform& getTransform() const override { return mTransform; } + Rect getBounds() const override { return mDisplay->getBounds(); } + int getHeight() const override { return mDisplay->getHeight(); } + int getWidth() const override { return mDisplay->getWidth(); } + bool isSecure() const override { return mAllowSecureLayers && mDisplay->isSecure(); } + sp<const DisplayDevice> getDisplayDevice() const override { return mDisplay; } + + bool needsFiltering() const override { + // check if the projection from the logical render area + // to the physical render area requires filtering + const Rect& sourceCrop = getSourceCrop(); + int width = sourceCrop.width(); + int height = sourceCrop.height(); + if (getRotationFlags() & ui::Transform::ROT_90) { + std::swap(width, height); + } + return width != getReqWidth() || height != getReqHeight(); + } + + Rect getSourceCrop() const override { + // use the projected display viewport by default. + if (mSourceCrop.isEmpty()) { + return mDisplay->getSourceClip(); + } + + // If there is a source crop provided then it is assumed that the device + // was in portrait orientation. This may not logically be true, so + // correct for the orientation error by undoing the rotation + + ui::Rotation logicalOrientation = mDisplay->getOrientation(); + if (logicalOrientation == ui::Rotation::Rotation90) { + logicalOrientation = ui::Rotation::Rotation270; + } else if (logicalOrientation == ui::Rotation::Rotation270) { + logicalOrientation = ui::Rotation::Rotation90; + } + + const auto flags = ui::Transform::toRotationFlags(logicalOrientation); + int width = mDisplay->getSourceClip().getWidth(); + int height = mDisplay->getSourceClip().getHeight(); + ui::Transform rotation; + rotation.set(flags, width, height); + return rotation.transform(mSourceCrop); + } + +private: + static RotationFlags applyDeviceOrientation(RotationFlags orientationFlag, + const sp<const DisplayDevice>& device) { + uint32_t inverseRotate90 = 0; + uint32_t inverseReflect = 0; + + // Reverse the logical orientation. + ui::Rotation logicalOrientation = device->getOrientation(); + if (logicalOrientation == ui::Rotation::Rotation90) { + logicalOrientation = ui::Rotation::Rotation270; + } else if (logicalOrientation == ui::Rotation::Rotation270) { + logicalOrientation = ui::Rotation::Rotation90; + } + + const ui::Rotation orientation = device->getPhysicalOrientation() + logicalOrientation; + + switch (orientation) { + case ui::ROTATION_0: + return orientationFlag; + + case ui::ROTATION_90: + inverseRotate90 = ui::Transform::ROT_90; + inverseReflect = ui::Transform::ROT_180; + break; + + case ui::ROTATION_180: + inverseReflect = ui::Transform::ROT_180; + break; -struct WithLayerStack { - explicit WithLayerStack(ui::LayerStack layerStack) : layerStack(layerStack) {} + case ui::ROTATION_270: + inverseRotate90 = ui::Transform::ROT_90; + break; + } + + const uint32_t rotate90 = orientationFlag & ui::Transform::ROT_90; + uint32_t reflect = orientationFlag & ui::Transform::ROT_180; + + // Apply reflection for double rotation. + if (rotate90 & inverseRotate90) { + reflect = ~reflect & ui::Transform::ROT_180; + } - bool operator()(const DisplayDevice& display) const { - return display.getLayerStack() == layerStack; + return static_cast<RotationFlags>((rotate90 ^ inverseRotate90) | + (reflect ^ inverseReflect)); } - ui::LayerStack layerStack; + const sp<const DisplayDevice> mDisplay; + const Rect mSourceCrop; + const bool mAllowSecureLayers; + const ui::Transform mTransform = ui::Transform(); }; } // namespace android |