1 /* 2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef RS_SCREEN 17 #define RS_SCREEN 18 19 #include <memory> 20 #include <mutex> 21 #include <optional> 22 #include <unordered_set> 23 #include <shared_mutex> 24 25 #include <common/rs_rect.h> 26 #include <surface_type.h> 27 #include <hdi_output.h> 28 #include <hdi_screen.h> 29 #include <hdi_display_type.h> 30 #include <screen_manager/screen_types.h> 31 32 namespace OHOS { 33 namespace Rosen { 34 struct VirtualScreenConfigs { 35 ScreenId id = INVALID_SCREEN_ID; 36 ScreenId mirrorId = INVALID_SCREEN_ID; 37 std::string name; 38 uint32_t width = 0; 39 uint32_t height = 0; 40 sptr<Surface> surface = nullptr; 41 GraphicPixelFormat pixelFormat = GRAPHIC_PIXEL_FMT_RGBA_8888; 42 int32_t flags = 0; // reserve flag. 43 std::unordered_set<uint64_t> whiteList = {}; 44 std::unordered_set<uint64_t> blackListSet = {}; 45 }; 46 47 class RSScreen { 48 public: 49 RSScreen() = default; 50 virtual ~RSScreen() noexcept = default; 51 52 virtual ScreenId Id() const = 0; 53 virtual ScreenId MirrorId() const = 0; 54 virtual void SetMirror(ScreenId mirrorId) = 0; 55 virtual const std::string& Name() const = 0; 56 virtual uint32_t Width() const = 0; 57 virtual uint32_t Height() const = 0; 58 virtual uint32_t PhyWidth() const = 0; 59 virtual uint32_t PhyHeight() const = 0; 60 virtual bool IsSamplingOn() const = 0; 61 virtual float GetSamplingTranslateX() const = 0; 62 virtual float GetSamplingTranslateY() const = 0; 63 virtual float GetSamplingScale() const = 0; 64 virtual RectI GetActiveRect() const = 0; 65 virtual RectI GetMaskRect() const = 0; 66 virtual RectI GetReviseRect() const = 0; 67 virtual bool CalculateMaskRectAndReviseRect(const GraphicIRect& activeRect, GraphicIRect& reviseRect) = 0; 68 virtual bool IsEnable() const = 0; 69 virtual bool IsVirtual() const = 0; 70 virtual uint32_t SetActiveMode(uint32_t modeId) = 0; 71 virtual uint32_t SetScreenActiveRect(const GraphicIRect& activeRect) = 0; 72 virtual int32_t SetResolution(uint32_t width, uint32_t height) = 0; 73 virtual void SetRogResolution(uint32_t width, uint32_t height) = 0; 74 virtual int32_t SetPowerStatus(uint32_t powerStatus) = 0; 75 virtual std::optional<GraphicDisplayModeInfo> GetActiveMode() const = 0; 76 virtual const std::vector<GraphicDisplayModeInfo>& GetSupportedModes() const = 0; 77 virtual const GraphicDisplayCapability& GetCapability() const = 0; 78 virtual uint32_t GetPowerStatus() = 0; 79 virtual std::shared_ptr<HdiOutput> GetOutput() const = 0; 80 virtual sptr<Surface> GetProducerSurface() const = 0; 81 virtual void SetProducerSurface(sptr<Surface> producerSurface) = 0; 82 virtual bool GetAndResetVirtualSurfaceUpdateFlag() = 0; 83 virtual void DisplayDump(int32_t screenIndex, std::string& dumpString) = 0; 84 virtual void SurfaceDump(int32_t screenIndex, std::string& dumpString) = 0; 85 virtual void FpsDump(int32_t screenIndex, std::string& dumpString, std::string& arg) = 0; 86 virtual void ClearFpsDump(int32_t screenIndex, std::string& dumpString, std::string& arg) = 0; 87 virtual void HitchsDump(int32_t screenIndex, std::string& dumpString, std::string& arg) = 0; 88 virtual void SetScreenBacklight(uint32_t level) = 0; 89 virtual int32_t GetScreenBacklight() const = 0; 90 virtual void ResizeVirtualScreen(uint32_t width, uint32_t height) = 0; 91 virtual int32_t GetScreenSupportedColorGamuts(std::vector<ScreenColorGamut> &mode) const = 0; 92 virtual int32_t GetScreenSupportedMetaDataKeys(std::vector<ScreenHDRMetadataKey> &keys) const = 0; 93 virtual bool GetCanvasRotation() const = 0; 94 virtual ScreenScaleMode GetScaleMode() const = 0; 95 virtual int32_t GetScreenColorGamut(ScreenColorGamut &mode) const = 0; 96 virtual int32_t SetScreenColorGamut(int32_t modeIdx) = 0; 97 virtual int32_t SetScreenGamutMap(ScreenGamutMap mode) = 0; 98 virtual ScreenRotation GetScreenCorrection() const = 0; 99 virtual int32_t GetScreenGamutMap(ScreenGamutMap &mode) const = 0; 100 virtual int32_t GetActiveModePosByModeId(int32_t modeId) const = 0; 101 virtual const GraphicHDRCapability& GetHDRCapability() = 0; 102 virtual const RSScreenType& GetScreenType() const = 0; 103 virtual void SetScreenCorrection(ScreenRotation screenRotation) = 0; 104 virtual void SetScreenSkipFrameInterval(uint32_t skipFrameInterval) = 0; 105 virtual uint32_t GetScreenSkipFrameInterval() const = 0; 106 virtual void SetScreenExpectedRefreshRate(uint32_t expectedRefreshRate) = 0; 107 virtual uint32_t GetScreenExpectedRefreshRate() const = 0; 108 virtual SkipFrameStrategy GetScreenSkipFrameStrategy() const = 0; 109 virtual void SetEqualVsyncPeriod(bool isEqualVsyncPeriod) = 0; 110 virtual bool GetEqualVsyncPeriod() const = 0; 111 virtual void SetScreenVsyncEnabled(bool enabled) const = 0; 112 virtual bool SetVirtualMirrorScreenCanvasRotation(bool canvasRotation) = 0; 113 virtual bool SetVirtualMirrorScreenScaleMode(ScreenScaleMode scaleMode) = 0; 114 virtual int32_t GetScreenSupportedHDRFormats(std::vector<ScreenHDRFormat>& hdrFormats) const = 0; 115 virtual int32_t GetScreenHDRFormat(ScreenHDRFormat& hdrFormat) const = 0; 116 virtual int32_t SetScreenHDRFormat(int32_t modeIdx) = 0; 117 virtual int32_t GetPixelFormat(GraphicPixelFormat& pixelFormat) const = 0; 118 virtual int32_t SetPixelFormat(GraphicPixelFormat pixelFormat) = 0; 119 virtual int32_t GetScreenSupportedColorSpaces(std::vector<GraphicCM_ColorSpaceType>& colorSpaces) const = 0; 120 virtual int32_t GetScreenColorSpace(GraphicCM_ColorSpaceType& colorSpace) const = 0; 121 virtual int32_t SetScreenColorSpace(GraphicCM_ColorSpaceType colorSpace) = 0; 122 virtual const std::unordered_set<uint64_t>& GetWhiteList() const = 0; 123 virtual void SetBlackList(const std::unordered_set<uint64_t>& blackList) = 0; 124 virtual void AddBlackList(const std::vector<uint64_t>& blackList) = 0; 125 virtual void RemoveBlackList(const std::vector<uint64_t>& blackList) = 0; 126 virtual void SetCastScreenEnableSkipWindow(bool enable) = 0; 127 virtual const std::unordered_set<uint64_t>& GetBlackList() const = 0; 128 virtual bool GetCastScreenEnableSkipWindow() = 0; 129 virtual int32_t SetScreenConstraint(uint64_t frameId, uint64_t timestamp, ScreenConstraintType type) = 0; 130 virtual bool SetVirtualScreenStatus(VirtualScreenStatus screenStatus) = 0; 131 virtual VirtualScreenStatus GetVirtualScreenStatus() const = 0; 132 virtual bool GetDisplayPropertyForHardCursor() = 0; 133 virtual void SetSecurityExemptionList(const std::vector<uint64_t>& securityExemptionList) = 0; 134 virtual const std::vector<uint64_t>& GetSecurityExemptionList() const = 0; 135 virtual int32_t SetSecurityMask(std::shared_ptr<Media::PixelMap> securityMask) = 0; 136 virtual std::shared_ptr<Media::PixelMap> GetSecurityMask() const = 0; 137 virtual void SetEnableVisibleRect(bool enable) = 0; 138 virtual bool GetEnableVisibleRect() const = 0; 139 virtual void SetMainScreenVisibleRect(const Rect& mainScreenRect) = 0; 140 virtual Rect GetMainScreenVisibleRect() const = 0; 141 virtual void SetHasProtectedLayer(bool hasProtectedLayer) = 0; 142 virtual bool GetHasProtectedLayer() = 0; 143 virtual bool GetVisibleRectSupportRotation() const = 0; 144 virtual void SetVisibleRectSupportRotation(bool supportRotation) = 0; 145 virtual int32_t GetDisplayIdentificationData(uint8_t& outPort, std::vector<uint8_t>& edidData) const = 0; 146 virtual int32_t SetScreenLinearMatrix(const std::vector<float>& matrix) = 0; 147 }; 148 149 namespace impl { 150 class RSScreen : public OHOS::Rosen::RSScreen { 151 public: 152 RSScreen( 153 ScreenId id, 154 bool isVirtual, 155 std::shared_ptr<HdiOutput> output, 156 sptr<Surface> surface); 157 RSScreen(const VirtualScreenConfigs &configs); 158 ~RSScreen() noexcept override; 159 160 RSScreen(const RSScreen &) = delete; 161 RSScreen &operator=(const RSScreen &) = delete; 162 163 ScreenId Id() const override; 164 ScreenId MirrorId() const override; 165 void SetMirror(ScreenId mirrorId) override; 166 const std::string& Name() const override; 167 // render resolution 168 uint32_t Width() const override; 169 uint32_t Height() const override; 170 // physical screen resolution 171 uint32_t PhyWidth() const override; 172 uint32_t PhyHeight() const override; 173 bool IsSamplingOn() const override; 174 float GetSamplingTranslateX() const override; 175 float GetSamplingTranslateY() const override; 176 float GetSamplingScale() const override; 177 RectI GetActiveRect() const override; 178 RectI GetMaskRect() const override; 179 RectI GetReviseRect() const override; 180 bool CalculateMaskRectAndReviseRect(const GraphicIRect& activeRect, GraphicIRect& reviseRect) override; 181 bool IsEnable() const override; 182 bool IsVirtual() const override; 183 uint32_t SetActiveMode(uint32_t modeId) override; 184 uint32_t SetScreenActiveRect(const GraphicIRect& activeRect) override; 185 int32_t SetResolution(uint32_t width, uint32_t height) override; 186 void SetRogResolution(uint32_t width, uint32_t height) override; 187 int32_t SetPowerStatus(uint32_t powerStatus) override; 188 std::optional<GraphicDisplayModeInfo> GetActiveMode() const override; 189 const std::vector<GraphicDisplayModeInfo>& GetSupportedModes() const override; 190 const GraphicDisplayCapability& GetCapability() const override; 191 uint32_t GetPowerStatus() override; 192 std::shared_ptr<HdiOutput> GetOutput() const override; 193 sptr<Surface> GetProducerSurface() const override; 194 void SetProducerSurface(sptr<Surface> producerSurface) override; 195 bool GetAndResetVirtualSurfaceUpdateFlag() override; 196 void DisplayDump(int32_t screenIndex, std::string& dumpString) override; 197 void SurfaceDump(int32_t screenIndex, std::string& dumpString) override; 198 void FpsDump(int32_t screenIndex, std::string& dumpString, std::string& arg) override; 199 void ClearFpsDump(int32_t screenIndex, std::string& dumpString, std::string& arg) override; 200 void HitchsDump(int32_t screenIndex, std::string& dumpString, std::string& arg) override; 201 void ResizeVirtualScreen(uint32_t width, uint32_t height) override; 202 void SetScreenBacklight(uint32_t level) override; 203 int32_t GetScreenBacklight() const override; 204 int32_t GetScreenSupportedColorGamuts(std::vector<ScreenColorGamut> &mode) const override; 205 int32_t GetScreenSupportedMetaDataKeys(std::vector<ScreenHDRMetadataKey> &keys) const override; 206 bool GetCanvasRotation() const override; 207 ScreenScaleMode GetScaleMode() const override; 208 int32_t GetScreenColorGamut(ScreenColorGamut &mode) const override; 209 int32_t SetScreenColorGamut(int32_t modeIdx) override; 210 int32_t SetScreenGamutMap(ScreenGamutMap mode) override; 211 void SetScreenCorrection(ScreenRotation screenRotation) override; 212 ScreenRotation GetScreenCorrection() const override; 213 int32_t GetScreenGamutMap(ScreenGamutMap &mode) const override; 214 int32_t GetActiveModePosByModeId(int32_t modeId) const override; 215 const GraphicHDRCapability& GetHDRCapability() override; 216 const RSScreenType& GetScreenType() const override; 217 void SetScreenSkipFrameInterval(uint32_t skipFrameInterval) override; 218 uint32_t GetScreenSkipFrameInterval() const override; 219 void SetScreenExpectedRefreshRate(uint32_t expectedRefreshRate) override; 220 uint32_t GetScreenExpectedRefreshRate() const override; 221 SkipFrameStrategy GetScreenSkipFrameStrategy() const override; 222 void SetEqualVsyncPeriod(bool isEqualVsyncPeriod) override; 223 bool GetEqualVsyncPeriod() const override; 224 void SetScreenVsyncEnabled(bool enabled) const override; 225 bool SetVirtualMirrorScreenCanvasRotation(bool canvasRotation) override; 226 bool SetVirtualMirrorScreenScaleMode(ScreenScaleMode scaleMode) override; 227 int32_t GetScreenSupportedHDRFormats(std::vector<ScreenHDRFormat>& hdrFormats) const override; 228 int32_t GetScreenHDRFormat(ScreenHDRFormat& hdrFormat) const override; 229 int32_t SetScreenHDRFormat(int32_t modeIdx) override; 230 int32_t GetPixelFormat(GraphicPixelFormat& pixelFormat) const override; 231 int32_t SetPixelFormat(GraphicPixelFormat pixelFormat) override; 232 int32_t GetScreenSupportedColorSpaces(std::vector<GraphicCM_ColorSpaceType>& colorSpaces) const override; 233 int32_t GetScreenColorSpace(GraphicCM_ColorSpaceType& colorSpace) const override; 234 int32_t SetScreenColorSpace(GraphicCM_ColorSpaceType colorSpace) override; 235 const std::unordered_set<uint64_t>& GetWhiteList() const override; 236 void SetBlackList(const std::unordered_set<uint64_t>& blackList) override; 237 void AddBlackList(const std::vector<uint64_t>& blackList) override; 238 void RemoveBlackList(const std::vector<uint64_t>& blackList) override; 239 void SetCastScreenEnableSkipWindow(bool enable) override; 240 const std::unordered_set<uint64_t>& GetBlackList() const override; 241 bool GetCastScreenEnableSkipWindow() override; 242 int32_t SetScreenConstraint(uint64_t frameId, uint64_t timestamp, ScreenConstraintType type) override; 243 bool SetVirtualScreenStatus(VirtualScreenStatus screenStatus) override; 244 VirtualScreenStatus GetVirtualScreenStatus() const override; 245 bool GetDisplayPropertyForHardCursor() override; 246 void SetSecurityExemptionList(const std::vector<uint64_t>& securityExemptionList) override; 247 const std::vector<uint64_t>& GetSecurityExemptionList() const override; 248 int32_t SetSecurityMask(std::shared_ptr<Media::PixelMap> securityMask) override; 249 std::shared_ptr<Media::PixelMap> GetSecurityMask() const override; 250 void SetEnableVisibleRect(bool enable) override; 251 bool GetEnableVisibleRect() const override; 252 void SetMainScreenVisibleRect(const Rect& mainScreenRect) override; 253 Rect GetMainScreenVisibleRect() const override; 254 void SetHasProtectedLayer(bool hasProtectedLayer) override; 255 bool GetHasProtectedLayer() override; 256 bool GetVisibleRectSupportRotation() const override; 257 void SetVisibleRectSupportRotation(bool supportRotation) override; 258 int32_t GetDisplayIdentificationData(uint8_t& outPort, std::vector<uint8_t>& edidData) const override; 259 int32_t SetScreenLinearMatrix(const std::vector<float>& matrix) override; 260 261 private: 262 // create hdiScreen and get some information from drivers. 263 void PhysicalScreenInit() noexcept; 264 void ScreenCapabilityInit() noexcept; 265 266 void VirtualScreenInit() noexcept; 267 void ModeInfoDump(std::string& dumpString); 268 void CapabilityDump(std::string& dumpString); 269 void PropDump(std::string& dumpString); 270 void PowerStatusDump(std::string& dumpString); 271 void CapabilityTypeDump(GraphicInterfaceType capabilityType, std::string& dumpString); 272 void ScreenTypeDump(std::string& dumpString); 273 void WriteHisyseventEpsLcdInfo(GraphicDisplayModeInfo& activeMode); 274 275 // ScreenId for this screen. 276 ScreenId id_ = INVALID_SCREEN_ID; 277 // If this screen is the mirror of other screen, this member would be a valid id. 278 ScreenId mirrorId_ = INVALID_SCREEN_ID; 279 280 std::string name_; 281 282 mutable std::shared_mutex screenMutex_; 283 uint32_t width_ = 0; 284 uint32_t height_ = 0; 285 uint32_t phyWidth_ = 0; 286 uint32_t phyHeight_ = 0; 287 bool isSamplingOn_ = false; 288 float samplingTranslateX_ = 0.f; 289 float samplingTranslateY_ = 0.f; 290 float samplingScale_ = 1.f; 291 int32_t screenBacklightLevel_ = INVALID_BACKLIGHT_VALUE; 292 RectI activeRect_ = {}; 293 RectI maskRect_ = {}; 294 RectI reviseRect_ = {}; 295 296 std::atomic<VirtualScreenStatus> screenStatus_ = VIRTUAL_SCREEN_PLAY; 297 298 bool isVirtual_ = true; 299 bool isVirtualSurfaceUpdateFlag_ = false; 300 std::shared_ptr<HdiOutput> hdiOutput_ = nullptr; // has value if the screen is physical 301 std::unique_ptr<HdiScreen> hdiScreen_ = nullptr; // has value if the screen is physical 302 std::vector<GraphicDisplayModeInfo> supportedModes_; 303 GraphicDisplayCapability capability_ = {"test1", GRAPHIC_DISP_INTF_HDMI, 1921, 1081, 0, 0, true, 0}; 304 GraphicHDRCapability hdrCapability_; 305 sptr<Surface> producerSurface_ = nullptr; // has value if the screen is virtual 306 ScreenPowerStatus powerStatus_ = ScreenPowerStatus::INVALID_POWER_STATUS; 307 GraphicPixelFormat pixelFormat_; 308 309 std::vector<ScreenColorGamut> supportedVirtualColorGamuts_ = { 310 COLOR_GAMUT_SRGB, 311 COLOR_GAMUT_DCI_P3, 312 COLOR_GAMUT_ADOBE_RGB, 313 COLOR_GAMUT_DISPLAY_P3 }; 314 std::vector<ScreenColorGamut> supportedPhysicalColorGamuts_; 315 std::atomic<int32_t> currentVirtualColorGamutIdx_ = 0; 316 std::atomic<int32_t> currentPhysicalColorGamutIdx_ = 0; 317 std::atomic<ScreenGamutMap> currentVirtualGamutMap_ = GAMUT_MAP_CONSTANT; 318 int32_t currentVirtualHDRFormatIdx_ = 0; 319 int32_t currentPhysicalHDRFormatIdx_ = 0; 320 std::vector<ScreenHDRFormat> supportedVirtualHDRFormats_ = { 321 NOT_SUPPORT_HDR }; 322 std::vector<ScreenHDRFormat> supportedPhysicalHDRFormats_; 323 RSScreenType screenType_ = RSScreenType::UNKNOWN_TYPE_SCREEN; 324 325 mutable std::shared_mutex skipFrameMutex_; 326 uint32_t skipFrameInterval_ = DEFAULT_SKIP_FRAME_INTERVAL; 327 uint32_t expectedRefreshRate_ = INVALID_EXPECTED_REFRESH_RATE; 328 SkipFrameStrategy skipFrameStrategy_ = SKIP_FRAME_BY_INTERVAL; 329 bool isEqualVsyncPeriod_ = true; 330 331 std::atomic<ScreenRotation> screenRotation_ = ScreenRotation::ROTATION_0; 332 bool canvasRotation_ = false; // just for virtual screen to use 333 ScreenScaleMode scaleMode_ = ScreenScaleMode::UNISCALE_MODE; // just for virtual screen to use 334 static std::map<GraphicColorGamut, GraphicCM_ColorSpaceType> RS_TO_COMMON_COLOR_SPACE_TYPE_MAP; 335 static std::map<GraphicCM_ColorSpaceType, GraphicColorGamut> COMMON_COLOR_SPACE_TYPE_TO_RS_MAP; 336 static std::map<GraphicHDRFormat, ScreenHDRFormat> HDI_HDR_FORMAT_TO_RS_MAP; 337 static std::map<ScreenHDRFormat, GraphicHDRFormat> RS_TO_HDI_HDR_FORMAT_MAP; 338 std::unordered_set<uint64_t> whiteList_ = {}; 339 std::unordered_set<uint64_t> blackList_ = {}; 340 std::vector<uint64_t> securityExemptionList_ = {}; 341 std::shared_ptr<Media::PixelMap> securityMask_ = nullptr; 342 bool enableVisibleRect_ = false; 343 Rect mainScreenVisibleRect_ = {}; 344 std::atomic<bool> skipWindow_ = false; 345 346 std::once_flag hardCursorSupportedFlag_; 347 bool isHardCursorSupport_ = false; 348 349 bool isSupportRotation_ = false; 350 bool hasProtectedLayer_ = false; 351 352 std::shared_mutex linearMatrixMutex_; 353 std::vector<float> linearMatrix_ = {1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f}; 354 }; 355 } // namespace impl 356 } // namespace Rosen 357 } // namespace OHOS 358 359 #endif // RS_SCREEN 360