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 <optional> 21 #include <unordered_set> 22 23 #include <surface_type.h> 24 #include <hdi_output.h> 25 #include <hdi_screen.h> 26 #include <hdi_display_type.h> 27 #include <screen_manager/screen_types.h> 28 29 namespace OHOS { 30 namespace Rosen { 31 struct VirtualScreenConfigs { 32 ScreenId id = INVALID_SCREEN_ID; 33 ScreenId mirrorId = INVALID_SCREEN_ID; 34 std::string name; 35 uint32_t width = 0; 36 uint32_t height = 0; 37 sptr<Surface> surface = nullptr; 38 GraphicPixelFormat pixelFormat = GRAPHIC_PIXEL_FMT_RGBA_8888; 39 int32_t flags = 0; // reserve flag. 40 std::unordered_set<uint64_t> filteredAppSet = {}; 41 }; 42 43 class RSScreen { 44 public: 45 RSScreen() = default; 46 virtual ~RSScreen() noexcept = default; 47 48 virtual ScreenId Id() const = 0; 49 virtual ScreenId MirrorId() const = 0; 50 virtual void SetMirror(ScreenId mirrorId) = 0; 51 virtual const std::string& Name() const = 0; 52 virtual uint32_t Width() const = 0; 53 virtual uint32_t Height() const = 0; 54 virtual uint32_t PhyWidth() const = 0; 55 virtual uint32_t PhyHeight() const = 0; 56 virtual bool IsEnable() const = 0; 57 virtual bool IsVirtual() const = 0; 58 virtual void SetActiveMode(uint32_t modeId) = 0; 59 virtual void SetResolution(uint32_t width, uint32_t height) = 0; 60 virtual void SetRogResolution(uint32_t width, uint32_t height) = 0; 61 virtual void SetPowerStatus(uint32_t powerStatus) = 0; 62 virtual std::optional<GraphicDisplayModeInfo> GetActiveMode() const = 0; 63 virtual const std::vector<GraphicDisplayModeInfo>& GetSupportedModes() const = 0; 64 virtual const GraphicDisplayCapability& GetCapability() const = 0; 65 virtual uint32_t GetPowerStatus() const = 0; 66 virtual std::shared_ptr<HdiOutput> GetOutput() const = 0; 67 virtual sptr<Surface> GetProducerSurface() const = 0; 68 virtual void SetProducerSurface(sptr<Surface> producerSurface) = 0; 69 virtual void DisplayDump(int32_t screenIndex, std::string& dumpString) = 0; 70 virtual void SurfaceDump(int32_t screenIndex, std::string& dumpString) = 0; 71 virtual void FpsDump(int32_t screenIndex, std::string& dumpString, std::string& arg) = 0; 72 virtual void ClearFpsDump(int32_t screenIndex, std::string& dumpString, std::string& arg) = 0; 73 virtual void SetScreenBacklight(uint32_t level) = 0; 74 virtual int32_t GetScreenBacklight() const = 0; 75 virtual void ResizeVirtualScreen(uint32_t width, uint32_t height) = 0; 76 virtual int32_t GetScreenSupportedColorGamuts(std::vector<ScreenColorGamut> &mode) const = 0; 77 virtual int32_t GetScreenSupportedMetaDataKeys(std::vector<ScreenHDRMetadataKey> &keys) const = 0; 78 virtual bool GetCanvasRotation() const = 0; 79 virtual int32_t GetScreenColorGamut(ScreenColorGamut &mode) const = 0; 80 virtual int32_t SetScreenColorGamut(int32_t modeIdx) = 0; 81 virtual int32_t SetScreenGamutMap(ScreenGamutMap mode) = 0; 82 virtual ScreenRotation GetScreenCorrection() const = 0; 83 virtual int32_t GetScreenGamutMap(ScreenGamutMap &mode) const = 0; 84 virtual int32_t GetActiveModePosByModeId(int32_t modeId) const = 0; 85 virtual const GraphicHDRCapability& GetHDRCapability() = 0; 86 virtual const RSScreenType& GetScreenType() const = 0; 87 virtual void SetScreenCorrection(ScreenRotation screenRotation) = 0; 88 virtual void SetScreenSkipFrameInterval(uint32_t skipFrameInterval) = 0; 89 virtual uint32_t GetScreenSkipFrameInterval() const = 0; 90 virtual void SetScreenVsyncEnabled(bool enabled) const = 0; 91 virtual bool SetVirtualMirrorScreenCanvasRotation(bool canvasRotation) = 0; 92 virtual int32_t GetScreenSupportedHDRFormats(std::vector<ScreenHDRFormat>& hdrFormats) const = 0; 93 virtual int32_t GetScreenHDRFormat(ScreenHDRFormat& hdrFormat) const = 0; 94 virtual int32_t SetScreenHDRFormat(int32_t modeIdx) = 0; 95 virtual int32_t GetPixelFormat(GraphicPixelFormat& pixelFormat) const = 0; 96 virtual int32_t SetPixelFormat(GraphicPixelFormat pixelFormat) = 0; 97 virtual int32_t GetScreenSupportedColorSpaces(std::vector<GraphicCM_ColorSpaceType>& colorSpaces) const = 0; 98 virtual int32_t GetScreenColorSpace(GraphicCM_ColorSpaceType& colorSpace) const = 0; 99 virtual int32_t SetScreenColorSpace(GraphicCM_ColorSpaceType colorSpace) = 0; 100 virtual const std::unordered_set<uint64_t>& GetFilteredAppSet() const = 0; 101 }; 102 103 namespace impl { 104 class RSScreen : public OHOS::Rosen::RSScreen { 105 public: 106 RSScreen( 107 ScreenId id, 108 bool isVirtual, 109 std::shared_ptr<HdiOutput> output, 110 sptr<Surface> surface); 111 RSScreen(const VirtualScreenConfigs &configs); 112 ~RSScreen() noexcept override; 113 114 RSScreen(const RSScreen &) = delete; 115 RSScreen &operator=(const RSScreen &) = delete; 116 117 ScreenId Id() const override; 118 ScreenId MirrorId() const override; 119 void SetMirror(ScreenId mirrorId) override; 120 const std::string& Name() const override; 121 // render resolution 122 uint32_t Width() const override; 123 uint32_t Height() const override; 124 // physical screen resolution 125 uint32_t PhyWidth() const override; 126 uint32_t PhyHeight() const override; 127 bool IsEnable() const override; 128 bool IsVirtual() const override; 129 void SetActiveMode(uint32_t modeId) override; 130 void SetResolution(uint32_t width, uint32_t height) override; 131 void SetRogResolution(uint32_t width, uint32_t height) override; 132 void SetPowerStatus(uint32_t powerStatus) override; 133 std::optional<GraphicDisplayModeInfo> GetActiveMode() const override; 134 const std::vector<GraphicDisplayModeInfo>& GetSupportedModes() const override; 135 const GraphicDisplayCapability& GetCapability() const override; 136 uint32_t GetPowerStatus() const override; 137 std::shared_ptr<HdiOutput> GetOutput() const override; 138 sptr<Surface> GetProducerSurface() const override; 139 void SetProducerSurface(sptr<Surface> producerSurface) override; 140 void DisplayDump(int32_t screenIndex, std::string& dumpString) override; 141 void SurfaceDump(int32_t screenIndex, std::string& dumpString) override; 142 void FpsDump(int32_t screenIndex, std::string& dumpString, std::string& arg) override; 143 void ClearFpsDump(int32_t screenIndex, std::string& dumpString, std::string& arg) override; 144 void ResizeVirtualScreen(uint32_t width, uint32_t height) override; 145 void SetScreenBacklight(uint32_t level) override; 146 int32_t GetScreenBacklight() const override; 147 int32_t GetScreenSupportedColorGamuts(std::vector<ScreenColorGamut> &mode) const override; 148 int32_t GetScreenSupportedMetaDataKeys(std::vector<ScreenHDRMetadataKey> &keys) const override; 149 bool GetCanvasRotation() const override; 150 int32_t GetScreenColorGamut(ScreenColorGamut &mode) const override; 151 int32_t SetScreenColorGamut(int32_t modeIdx) override; 152 int32_t SetScreenGamutMap(ScreenGamutMap mode) override; 153 void SetScreenCorrection(ScreenRotation screenRotation) override; 154 ScreenRotation GetScreenCorrection() const override; 155 int32_t GetScreenGamutMap(ScreenGamutMap &mode) const override; 156 int32_t GetActiveModePosByModeId(int32_t modeId) const override; 157 const GraphicHDRCapability& GetHDRCapability() override; 158 const RSScreenType& GetScreenType() const override; 159 void SetScreenSkipFrameInterval(uint32_t skipFrameInterval) override; 160 uint32_t GetScreenSkipFrameInterval() const override; 161 void SetScreenVsyncEnabled(bool enabled) const override; 162 bool SetVirtualMirrorScreenCanvasRotation(bool canvasRotation) override; 163 int32_t GetScreenSupportedHDRFormats(std::vector<ScreenHDRFormat>& hdrFormats) const override; 164 int32_t GetScreenHDRFormat(ScreenHDRFormat& hdrFormat) const override; 165 int32_t SetScreenHDRFormat(int32_t modeIdx) override; 166 int32_t GetPixelFormat(GraphicPixelFormat& pixelFormat) const override; 167 int32_t SetPixelFormat(GraphicPixelFormat pixelFormat) override; 168 int32_t GetScreenSupportedColorSpaces(std::vector<GraphicCM_ColorSpaceType>& colorSpaces) const override; 169 int32_t GetScreenColorSpace(GraphicCM_ColorSpaceType& colorSpace) const override; 170 int32_t SetScreenColorSpace(GraphicCM_ColorSpaceType colorSpace) override; 171 const std::unordered_set<uint64_t>& GetFilteredAppSet() const override; 172 173 private: 174 // create hdiScreen and get some information from drivers. 175 void PhysicalScreenInit() noexcept; 176 void ScreenCapabilityInit() noexcept; 177 178 void VirtualScreenInit() noexcept; 179 void ModeInfoDump(std::string& dumpString); 180 void CapabilityDump(std::string& dumpString); 181 void PropDump(std::string& dumpString); 182 void PowerStatusDump(std::string& dumpString); 183 void CapabilityTypeDump(GraphicInterfaceType capabilityType, std::string& dumpString); 184 void ScreenTypeDump(std::string& dumpString); 185 186 // ScreenId for this screen. 187 ScreenId id_ = INVALID_SCREEN_ID; 188 // If this screen is the mirror of other screen, this member would be a valid id. 189 ScreenId mirrorId_ = INVALID_SCREEN_ID; 190 191 std::string name_; 192 193 uint32_t width_ = 0; 194 uint32_t height_ = 0; 195 uint32_t phyWidth_ = 0; 196 uint32_t phyHeight_ = 0; 197 198 bool isVirtual_ = true; 199 std::shared_ptr<HdiOutput> hdiOutput_; // has value if the screen is physical 200 std::unique_ptr<HdiScreen> hdiScreen_; // has value if the screen is physical 201 std::vector<GraphicDisplayModeInfo> supportedModes_; 202 GraphicDisplayCapability capability_ = {"test1", GRAPHIC_DISP_INTF_HDMI, 1921, 1081, 0, 0, true, 0}; 203 GraphicHDRCapability hdrCapability_; 204 sptr<Surface> producerSurface_; // has value if the screen is virtual 205 GraphicDispPowerStatus powerStatus_ = GraphicDispPowerStatus::GRAPHIC_POWER_STATUS_ON; 206 GraphicPixelFormat pixelFormat_; 207 208 std::vector<ScreenColorGamut> supportedVirtualColorGamuts_ = { 209 COLOR_GAMUT_SRGB, 210 COLOR_GAMUT_DCI_P3, 211 COLOR_GAMUT_ADOBE_RGB }; 212 std::vector<ScreenColorGamut> supportedPhysicalColorGamuts_; 213 int32_t currentVirtualColorGamutIdx_ = 0; 214 int32_t currentPhysicalColorGamutIdx_ = 0; 215 ScreenGamutMap currentVirtualGamutMap_ = GAMUT_MAP_CONSTANT; 216 int32_t currentVirtualHDRFormatIdx_ = 0; 217 int32_t currentPhysicalHDRFormatIdx_ = 0; 218 std::vector<ScreenHDRFormat> supportedVirtualHDRFormats_ = { 219 NOT_SUPPORT_HDR }; 220 std::vector<ScreenHDRFormat> supportedPhysicalHDRFormats_; 221 RSScreenType screenType_ = RSScreenType::UNKNOWN_TYPE_SCREEN; 222 uint32_t skipFrameInterval_ = DEFAULT_SKIP_FRAME_INTERVAL; 223 ScreenRotation screenRotation_ = ScreenRotation::ROTATION_0; 224 bool canvasRotation_ = false; 225 static std::map<GraphicColorGamut, GraphicCM_ColorSpaceType> RS_TO_COMMON_COLOR_SPACE_TYPE_MAP; 226 static std::map<GraphicCM_ColorSpaceType, GraphicColorGamut> COMMON_COLOR_SPACE_TYPE_TO_RS_MAP; 227 static std::map<GraphicHDRFormat, ScreenHDRFormat> HDI_HDR_FORMAT_TO_RS_MAP; 228 static std::map<ScreenHDRFormat, GraphicHDRFormat> RS_TO_HDI_HDR_FORMAT_MAP; 229 std::unordered_set<uint64_t> filteredAppSet_ = {}; 230 }; 231 } // namespace impl 232 } // namespace Rosen 233 } // namespace OHOS 234 235 #endif // RS_SCREEN 236