diff --git a/display/composer/common/include/display_vdi_adapter_interface.h b/display/composer/common/include/display_vdi_adapter_interface.h new file mode 100644 index 0000000000000000000000000000000000000000..c63850a68ea48dc2802a96352ff01ac2e763e02b --- /dev/null +++ b/display/composer/common/include/display_vdi_adapter_interface.h @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 )(the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_HDI_VDI_ADAPTER_INTERFACE_H +#define OHOS_HDI_VDI_ADAPTER_INTERFACE_H + +#include +#include +#include "base/buffer_handle.h" +#include "v1_0/include/idisplay_composer_interface.h" +#include "v1_0/display_composer_type.h" +#include "v1_2/display_composer_type.h" +#include "v1_1/imode_callback.h" +#include "v1_1/iseamless_change_callback.h" + +namespace OHOS { +namespace HDI { +namespace Display { +namespace Composer { +using namespace OHOS::HDI::Display::Composer::V1_0; +using namespace OHOS::HDI::Display::Composer::V1_1; +using namespace OHOS::HDI::Display::Composer::V1_2; +struct DisplayComposerVdiAdapter { + int32_t (*LoadVdiImpl)(); + int32_t (*DestroyVdiImpl)(); + int32_t (*RegHotPlugCallback)(HotPlugCallback cb, void* data); + int32_t (*GetDisplayCapability)(uint32_t devId, DisplayCapability& info); + int32_t (*GetDisplaySupportedModes)(uint32_t devId, std::vector& modes); + int32_t (*GetDisplayMode)(uint32_t devId, uint32_t& modeId); + int32_t (*SetDisplayMode)(uint32_t devId, uint32_t modeId); + int32_t (*GetDisplayPowerStatus)(uint32_t devId, V1_0::DispPowerStatus& status); + int32_t (*SetDisplayPowerStatus)(uint32_t devId, V1_0::DispPowerStatus status); + int32_t (*GetDisplayBacklight)(uint32_t devId, uint32_t& level); + int32_t (*SetDisplayBacklight)(uint32_t devId, uint32_t level); + int32_t (*GetDisplayProperty)(uint32_t devId, uint32_t id, uint64_t& value); + int32_t (*GetDisplayCompChange)(uint32_t devId, std::vector& layers, std::vector& types); + int32_t (*SetDisplayClientCrop)(uint32_t devId, const IRect& rect); + int32_t (*SetDisplayClientBuffer)(uint32_t devId, const BufferHandle& buffer, int32_t fence); + int32_t (*SetDisplayClientDamage)(uint32_t devId, std::vector& rects); + int32_t (*SetDisplayVsyncEnabled)(uint32_t devId, bool enabled); + int32_t (*RegDisplayVBlankCallback)(uint32_t devId, VBlankCallback cb, void* data); + int32_t (*GetDisplayReleaseFence)(uint32_t devId, std::vector& layers, std::vector& fences); + int32_t (*CreateVirtualDisplay)(uint32_t width, uint32_t height, int32_t& format, uint32_t& devId); + int32_t (*DestroyVirtualDisplay)(uint32_t devId); + int32_t (*SetVirtualDisplayBuffer)(uint32_t devId, const BufferHandle& buffer, const int32_t fence); + int32_t (*SetDisplayProperty)(uint32_t devId, uint32_t id, uint64_t value); + int32_t (*Commit)(uint32_t devId, int32_t& fence); + int32_t (*CreateLayer)(uint32_t devId, const LayerInfo& layerInfo, uint32_t& layerId); + int32_t (*DestroyLayer)(uint32_t devId, uint32_t layerId); + int32_t (*PrepareDisplayLayers)(uint32_t devId, bool& needFlushFb); + int32_t (*SetLayerAlpha)(uint32_t devId, uint32_t layerId, const LayerAlpha& alpha); + int32_t (*SetLayerRegion)(uint32_t devId, uint32_t layerId, const IRect& rect); + int32_t (*SetLayerCrop)(uint32_t devId, uint32_t layerId, const IRect& rect); + int32_t (*SetLayerZorder)(uint32_t devId, uint32_t layerId, uint32_t zorder); + int32_t (*SetLayerPreMulti)(uint32_t devId, uint32_t layerId, bool preMul); + int32_t (*SetLayerTransformMode)(uint32_t devId, uint32_t layerId, TransformType type); + int32_t (*SetLayerDirtyRegion)(uint32_t devId, uint32_t layerId, const std::vector& rects); + int32_t (*SetLayerVisibleRegion)(uint32_t devId, uint32_t layerId, std::vector& rects); + int32_t (*SetLayerBuffer)(uint32_t devId, uint32_t layerId, const BufferHandle& buffer, int32_t fence); + int32_t (*SetLayerCompositionType)(uint32_t devId, uint32_t layerId, V1_0::CompositionType type); + int32_t (*SetLayerBlendType)(uint32_t devId, uint32_t layerId, BlendType type); + int32_t (*SetLayerMaskInfo)(uint32_t devId, uint32_t layerId, const MaskInfo maskInfo); + int32_t (*SetLayerColor)(uint32_t devId, uint32_t layerId, const LayerColor& layerColor); + int32_t (*RegSeamlessChangeCallback)(SeamlessChangeCallback cb, void* data); + int32_t (*GetDisplaySupportedModesExt)(uint32_t devId, std::vector& modes); + int32_t (*SetDisplayModeAsync)(uint32_t devId, uint32_t modeId, ModeCallback cb, void *data); + int32_t (*GetDisplayVBlankPeriod)(uint32_t devId, uint64_t& period); + int32_t (*SetLayerPerFrameParameter)( + uint32_t devId, uint32_t layerId, const std::string& key, const std::vector& value); + int32_t (*GetSupportedLayerPerFrameParameterKey)(std::vector& keys); + int32_t (*SetDisplayOverlayResolution)(uint32_t devId, uint32_t width, uint32_t height); + int32_t (*RegRefreshCallback)(RefreshCallback cb, void* data); + int32_t (*GetDisplaySupportedColorGamuts)(uint32_t devId, std::vector& gamuts); + int32_t (*GetHDRCapabilityInfos)(uint32_t devId, HDRCapability& info); + int32_t (*RegDisplayVBlankIdleCallback)(VBlankIdleCallback cb, void* data); + int32_t (*SetDisplayConstraint)(uint32_t devId, uint64_t frameID, uint64_t ns, uint32_t type); + int32_t (*SetHardwareCursorPosition)(uint32_t devId, int32_t x, int32_t y); + int32_t (*EnableHardwareCursorStats)(uint32_t devId, bool enable); + int32_t (*GetHardwareCursorStats)(uint32_t devId, uint32_t& frameCount, uint32_t& vsyncCount); + int32_t (*SetDisplayActiveRegion)(uint32_t devId, const IRect& rect); +}; + +using LoadVdiImplFunc = int32_t (*)(); +using DestroyVdiImplFunc = int32_t (*)(); +using RegHotPlugCallbackFunc = int32_t (*)(HotPlugCallback cb, void* data); +using GetDisplayCapabilityFunc = int32_t (*)(uint32_t devId, DisplayCapability& info); +using GetDisplaySupportedModesFunc = int32_t (*)(uint32_t devId, std::vector& modes); +using GetDisplayModeFunc = int32_t (*)(uint32_t devId, uint32_t& modeId); +using SetDisplayModeFunc = int32_t (*)(uint32_t devId, uint32_t modeId); +using GetDisplayPowerStatusFunc = int32_t (*)(uint32_t devId, V1_0::DispPowerStatus& status); +using SetDisplayPowerStatusFunc = int32_t (*)(uint32_t devId, V1_0::DispPowerStatus status); +using GetDisplayBacklightFunc = int32_t (*)(uint32_t devId, uint32_t& level); +using SetDisplayBacklightFunc = int32_t (*)(uint32_t devId, uint32_t level); +using GetDisplayPropertyFunc = int32_t (*)(uint32_t devId, uint32_t id, uint64_t& value); +using GetDisplayCompChangeFunc = int32_t (*)( + uint32_t devId, std::vector& layers, std::vector& types); +using SetDisplayClientCropFunc = int32_t (*)(uint32_t devId, const IRect& rect); +using SetDisplayClientBufferFunc = int32_t (*)(uint32_t devId, const BufferHandle& buffer, int32_t fence); +using SetDisplayClientDamageFunc = int32_t (*)(uint32_t devId, std::vector& rects); +using SetDisplayVsyncEnabledFunc = int32_t (*)(uint32_t devId, bool enabled); +using RegDisplayVBlankCallbackFunc = int32_t (*)(uint32_t devId, VBlankCallback cb, void* data); +using GetDisplayReleaseFenceFunc = int32_t (*)( + uint32_t devId, std::vector& layers, std::vector& fences); +using CreateVirtualDisplayFunc = int32_t (*)(uint32_t width, uint32_t height, int32_t& format, uint32_t& devId); +using DestroyVirtualDisplayFunc = int32_t (*)(uint32_t devId); +using SetVirtualDisplayBufferFunc = int32_t (*)(uint32_t devId, const BufferHandle& buffer, const int32_t fence); +using SetDisplayPropertyFunc = int32_t (*)(uint32_t devId, uint32_t id, uint64_t value); +using CommitFunc = int32_t (*)(uint32_t devId, int32_t& fence); +using CreateLayerFunc = int32_t (*)(uint32_t devId, const LayerInfo& layerInfo, uint32_t& layerId); +using DestroyLayerFunc = int32_t (*)(uint32_t devId, uint32_t layerId); +using PrepareDisplayLayersFunc = int32_t (*)(uint32_t devId, bool& needFlushFb); +using SetLayerAlphaFunc = int32_t (*)(uint32_t devId, uint32_t layerId, const LayerAlpha& alpha); +using SetLayerRegionFunc = int32_t (*)(uint32_t devId, uint32_t layerId, const IRect& rect); +using SetLayerCropFunc = int32_t (*)(uint32_t devId, uint32_t layerId, const IRect& rect); +using SetLayerZorderFunc = int32_t (*)(uint32_t devId, uint32_t layerId, uint32_t zorder); +using SetLayerPreMultiFunc = int32_t (*)(uint32_t devId, uint32_t layerId, bool preMul); +using SetLayerTransformModeFunc = int32_t (*)(uint32_t devId, uint32_t layerId, TransformType type); +using SetLayerDirtyRegionFunc = int32_t (*)(uint32_t devId, uint32_t layerId, const std::vector& rects); +using SetLayerVisibleRegionFunc = int32_t (*)(uint32_t devId, uint32_t layerId, std::vector& rects); +using SetLayerBufferFunc = int32_t (*)(uint32_t devId, uint32_t layerId, const BufferHandle& buffer, int32_t fence); +using SetLayerCompositionTypeFunc = int32_t (*)(uint32_t devId, uint32_t layerId, V1_0::CompositionType type); +using SetLayerBlendTypeFunc = int32_t (*)(uint32_t devId, uint32_t layerId, BlendType type); +using SetLayerMaskInfoFunc = int32_t (*)(uint32_t devId, uint32_t layerId, const MaskInfo maskInfo); +using SetLayerColorFunc = int32_t (*)(uint32_t devId, uint32_t layerId, const LayerColor& layerColor); +using RegSeamlessChangeCallbackFunc = int32_t (*)(SeamlessChangeCallback cb, void* data); +using GetDisplaySupportedModesExtFunc = int32_t (*)(uint32_t devId, std::vector& modes); +using SetDisplayModeAsyncFunc = int32_t (*)(uint32_t devId, uint32_t modeId, ModeCallback cb, void *data); +using GetDisplayVBlankPeriodFunc = int32_t (*)(uint32_t devId, uint64_t& period); +using SetLayerPerFrameParameterFunc = int32_t (*)( + uint32_t devId, uint32_t layerId, const std::string& key, const std::vector& value); +using GetSupportedLayerPerFrameParameterKeyFunc = int32_t (*)(std::vector& keys); +using SetDisplayOverlayResolutionFunc = int32_t (*)(uint32_t devId, uint32_t width, uint32_t height); +using RegRefreshCallbackFunc = int32_t (*)(RefreshCallback cb, void* data); +using GetDisplaySupportedColorGamutsFunc = int32_t (*)(uint32_t devId, std::vector& gamuts); +using GetHDRCapabilityInfosFunc = int32_t (*)(uint32_t devId, HDRCapability& info); +using RegDisplayVBlankIdleCallbackFunc = int32_t (*)(VBlankIdleCallback cb, void* data); +using SetDisplayConstraintFunc = int32_t (*)(uint32_t devId, uint64_t frameID, uint64_t ns, uint32_t type); +using SetHardwareCursorPositionFunc = int32_t (*)(uint32_t devId, int32_t x, int32_t y); +using EnableHardwareCursorStatsFunc = int32_t (*)(uint32_t devId, bool enable); +using GetHardwareCursorStatsFunc = int32_t (*)(uint32_t devId, uint32_t& frameCount, uint32_t& vsyncCount); +using SetDisplayActiveRegionFunc = int32_t (*)(uint32_t devId, const IRect& rect); + +} // namespace Composer +} // namespace Display +} // namespace HDI +} // namespace OHOS +#endif // OHOS_HDI_VDI_ADAPTER_INTERFACE_H diff --git a/display/composer/v1_0/display_command/display_cmd_responser.h b/display/composer/v1_0/display_command/display_cmd_responser.h index efa0cf381ab8c1df64461c2e9c5294113a9aefbf..f07f3c4579c2ab7b556009ebd7a7efd8eb644f42 100755 --- a/display/composer/v1_0/display_command/display_cmd_responser.h +++ b/display/composer/v1_0/display_command/display_cmd_responser.h @@ -39,6 +39,7 @@ #include "parameter.h" #include "v1_0/display_composer_type.h" #include "v1_0/mapper_stub.h" +#include "common/include/display_vdi_adapter_interface.h" #define DISPLAY_TRACE HdfTrace trace(__func__, "HDI:DISP:") @@ -1138,7 +1139,7 @@ protected: std::mutex requestMutex_; std::mutex replyMutex_; }; -using HdiDisplayCmdResponser = DisplayCmdResponser, IDisplayComposerVdi>; +using HdiDisplayCmdResponser = DisplayCmdResponser, DisplayComposerVdiAdapter>; } // namespace V1_0 } // namespace Composer } // namespace Display diff --git a/display/composer/v1_1/display_command/display_cmd_responser.h b/display/composer/v1_1/display_command/display_cmd_responser.h index 63bc8c5b2a1f7fb77c541510beeaf92dacf29e2a..e8dc17d6bf084b789a7ddad29e39e2cf672eb7c8 100644 --- a/display/composer/v1_1/display_command/display_cmd_responser.h +++ b/display/composer/v1_1/display_command/display_cmd_responser.h @@ -47,7 +47,7 @@ public: private: using BaseType1_0 = V1_0::DisplayCmdResponser; }; -using HdiDisplayCmdResponser = DisplayCmdResponser, IDisplayComposerVdi>; +using HdiDisplayCmdResponser = DisplayCmdResponser, DisplayComposerVdiAdapter>; } // namespace V1_1 } // namespace Composer } // namespace Display diff --git a/display/composer/v1_2/IDisplayComposer.idl b/display/composer/v1_2/IDisplayComposer.idl index 6c690793cb7d9a163d94e600156d865747629a2b..974c8ea0ec36eadd91c2013d9b45ce8dd55f59b2 100644 --- a/display/composer/v1_2/IDisplayComposer.idl +++ b/display/composer/v1_2/IDisplayComposer.idl @@ -16,6 +16,7 @@ package ohos.hdi.display.composer.v1_2; import ohos.hdi.display.composer.v1_1.IDisplayComposer; +import ohos.hdi.display.composer.v1_0.DisplayComposerType; import ohos.hdi.display.composer.v1_2.DisplayComposerType; import ohos.hdi.display.composer.v1_2.IVBlankIdleCallback; @@ -94,4 +95,17 @@ interface IDisplayComposer extends ohos.hdi.display.composer.v1_1.IDisplayCompos * @version 1.0 */ GetHardwareCursorStats([in] unsigned int devId, [out] unsigned int frameCount, [out] unsigned int vsyncCount); + + /** + * @brief Set Display Active Region. + * + * @param devId Indicates the ID of the display device. + * @param rect Indicates the pointer to the cropped region of the client buffer. + * + * @return Returns 0 if the operation is successful; returns an error code defined + * in {@link DispErrCode} otherwise. + * @since 5.0 + * @version 1.2 + */ + SetDisplayActiveRegion([in] unsigned int devId, [in] struct IRect rect); } diff --git a/display/composer/v1_2/display_command/display_cmd_responser.h b/display/composer/v1_2/display_command/display_cmd_responser.h index 4be0dc8ecb62c2f241295765fb1ff1974fc6eafa..eec0cfbc84f4ea3897b18005084b184146fc88d5 100644 --- a/display/composer/v1_2/display_command/display_cmd_responser.h +++ b/display/composer/v1_2/display_command/display_cmd_responser.h @@ -40,7 +40,7 @@ typedef struct CommitInfo { std::vector fences; } CommitInfo; -template +template class DisplayCmdResponser : public V1_1::DisplayCmdResponser { public: static std::unique_ptr Create(VdiImpl* impl, std::shared_ptr cacheMgr) @@ -52,23 +52,8 @@ public: return std::make_unique(impl, cacheMgr); } - static std::unique_ptr CreateV1_1( - VdiImpl1_1* impl, std::shared_ptr cacheMgr) - { - DISPLAY_CHK_RETURN(impl == nullptr, nullptr, - HDF_LOGE("%{public}s: error, VdiImpl is nullptr", __func__)); - DISPLAY_CHK_RETURN(cacheMgr == nullptr, nullptr, - HDF_LOGE("%{public}s: error, VdiImpl is nullptr", __func__)); - return std::make_unique(cacheMgr, impl); - } - DisplayCmdResponser(VdiImpl* impl, std::shared_ptr cacheMgr) : BaseType1_1(impl, cacheMgr) {} - DisplayCmdResponser(std::shared_ptr cacheMgr, VdiImpl1_1* impl) - : BaseType1_1(impl, cacheMgr), - vdiImpl1_1_(impl) - {} - virtual ~DisplayCmdResponser() {} int32_t ProcessRequestCmd(CommandDataUnpacker& unpacker, int32_t cmd, @@ -314,10 +299,13 @@ REPLY: ret = unpacker.ReadUint32(type) ? HDF_SUCCESS : HDF_FAILURE; DISPLAY_CHECK(ret != HDF_SUCCESS, goto EXIT); - if (vdiImpl1_1_ != nullptr) { - ret = vdiImpl1_1_->SetDisplayConstraint(devId, frameID, ns, type); + if (impl_ != nullptr && impl_->SetDisplayConstraint != nullptr) { + ret = impl_->SetDisplayConstraint(devId, frameID, ns, type); + } + + if (ret != HDF_SUCCESS && ret != DISPLAY_NOT_SUPPORT && ret != HDF_ERR_NOT_SUPPORT) { + HDF_LOGE("SetDisplayConstraint failed with ret = %{public}d", ret); } - DISPLAY_CHECK(ret != HDF_SUCCESS && ret != DISPLAY_NOT_SUPPORT && ret != HDF_ERR_NOT_SUPPORT, goto EXIT); EXIT: if (ret != HDF_SUCCESS) { errMaps_.emplace(REQUEST_CMD_SET_DISPLAY_CONSTRAINT, ret); @@ -353,15 +341,11 @@ private: using BaseType1_1::OnSetLayerMaskInfo; using BaseType1_1::OnRequestEnd; using BaseType1_1::OnSetLayerColor; - VdiImpl1_1* vdiImpl1_1_ = nullptr; using BaseType1_1::requestMutex_; using BaseType1_1::replyMutex_; }; -using HdiDisplayCmdResponser = - DisplayCmdResponser, IDisplayComposerVdi, IDisplayComposerVdiV1_1>; -using HdiDisplayCmdResponser_1_1 = - DisplayCmdResponser, IDisplayComposerVdi, IDisplayComposerVdiV1_1>; +using HdiDisplayCmdResponser = DisplayCmdResponser, DisplayComposerVdiAdapter>; } // namespace V1_2 } // namespace Composer } // namespace Display diff --git a/display/composer/v1_2/hdi_impl/display_composer_hdi_impl.h b/display/composer/v1_2/hdi_impl/display_composer_hdi_impl.h index b6201f87a0be76b3cad1014ddcd4f45b356e9deb..9d6889eeeae165f9ea710006dba1657ce0d975ae 100644 --- a/display/composer/v1_2/hdi_impl/display_composer_hdi_impl.h +++ b/display/composer/v1_2/hdi_impl/display_composer_hdi_impl.h @@ -147,6 +147,13 @@ public: return ret; } + virtual int32_t SetDisplayActiveRegion(uint32_t devId, const IRect& rect) override + { + COMPOSER_CHECK_NULLPTR_RETURN(hdi_v1_2_); + int32_t ret = ToDispErrCode(hdi_v1_2_->SetDisplayActiveRegion(devId, rect)); + return ret; + } + protected: using BaseType1_1 = V1_1::DisplayComposerHdiImpl; using BaseType1_1::WAIT_TIME_INTERVAL; diff --git a/display/composer/v1_2/include/idisplay_composer_interface.h b/display/composer/v1_2/include/idisplay_composer_interface.h index 5a6252b19b5e2446e92fc4d5f4315995f0683750..b97b9845146afd8413e4a026fe07cbfdc4d57db7 100644 --- a/display/composer/v1_2/include/idisplay_composer_interface.h +++ b/display/composer/v1_2/include/idisplay_composer_interface.h @@ -71,6 +71,8 @@ public: virtual int32_t EnableHardwareCursorStats(uint32_t devId, bool enable) = 0; virtual int32_t GetHardwareCursorStats(uint32_t devId, uint32_t& frameCount, uint32_t& vsyncCount) = 0; + + virtual int32_t SetDisplayActiveRegion(uint32_t devId, const IRect& rect) = 0; }; } // V1_2 } // Composer