diff --git a/display/interfaces/hdi_cpp/server/BUILD.gn b/display/interfaces/hdi_cpp/server/BUILD.gn index 4ef529c59b956684ec2172904955aed0fb7b8814..1dd9e1136a72faaf192978f9d92502a857878077 100644 --- a/display/interfaces/hdi_cpp/server/BUILD.gn +++ b/display/interfaces/hdi_cpp/server/BUILD.gn @@ -32,7 +32,7 @@ ohos_shared_library("libhdi_display_layer_service") { sources = [ "display_hdi_driver.cpp", - "display_layer_service_impl_test.cpp", + "display_layer_service_impl.cpp", "display_layer_service_stub.cpp", ] @@ -43,6 +43,8 @@ ohos_shared_library("libhdi_display_layer_service") { "//drivers/adapter/uhdf2/osal:libhdf_utils", "//foundation/communication/ipc/interfaces/innerkits/ipc_core:ipc_core", "//foundation/graphic/standard/utils:buffer_handle", + "//drivers/peripheral/display/hal:hdi_display_layer", + "//device/hisilicon/hardware/display/libs:hdi_display" ] if (is_standard_system) { diff --git a/display/interfaces/hdi_cpp/server/display_layer_service_impl_test.cpp b/display/interfaces/hdi_cpp/server/display_layer_service_impl.cpp similarity index 32% rename from display/interfaces/hdi_cpp/server/display_layer_service_impl_test.cpp rename to display/interfaces/hdi_cpp/server/display_layer_service_impl.cpp index 35b9adb19f755ca5b35c4a194001438f0ffaa9cc..af59b13a8149dce19e183d0b82ea7309f01628ef 100644 --- a/display/interfaces/hdi_cpp/server/display_layer_service_impl_test.cpp +++ b/display/interfaces/hdi_cpp/server/display_layer_service_impl.cpp @@ -1,121 +1,236 @@ -/* - * Copyright (c) 2021 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. - */ - -#include "display_layer_service_impl_test.h" -#include -#include - -namespace OHOS { -namespace HDI { -namespace Display { -namespace V1_0 { - -DispErrCode DisplayLayerService::InitDisplay(unsigned int devId) -{ - HDF_LOGE("[service]--%{public}s: enter, devId = %{public}d", __func__, devId); - return DISPLAY_SUCCESS; -} - -DispErrCode DisplayLayerService::DeinitDisplay(unsigned int devId) -{ - HDF_LOGE("[service]--%{public}s: enter, devId = %{public}d", __func__, devId); - return DISPLAY_SUCCESS; -} - -DispErrCode DisplayLayerService::GetDisplayInfo(unsigned int devId, std::shared_ptr &dispInfo) -{ - dispInfo->width = 480; // x-solution - dispInfo->height = 800; // y-solution - dispInfo->rotAngle = 0; - HDF_LOGE("[service]--%{public}s: width = %{public}d, height = %{public}d, rotAngle = %{public}d", - __func__, dispInfo->width, dispInfo->height, dispInfo->rotAngle); - return DISPLAY_SUCCESS; -} - -DispErrCode DisplayLayerService::CreateLayer(unsigned int devId, LayerInfo &layerInfo, unsigned int &layerId) -{ - layerId = 0; - HDF_LOGE("[service]--%{public}s: width= %{public}d, height = %{public}d, type = %{public}d, bpp = %{public}d", - __func__, layerInfo.width, layerInfo.height, layerInfo.type, layerInfo.bpp); - return DISPLAY_SUCCESS; -} - -DispErrCode DisplayLayerService::CloseLayer(unsigned int devId, unsigned int layerId) -{ - HDF_LOGE("[service]--%{public}s: enter, devId = %{public}d", __func__, devId); - return DISPLAY_SUCCESS; -} - -DispErrCode DisplayLayerService::SetLayerVisible(unsigned int devId, unsigned int layerId, bool visible) -{ - HDF_LOGE("[service]--%{public}s: devId = %{public}d, visible = %{public}d", __func__, devId, visible); - return DISPLAY_SUCCESS; -} - -DispErrCode DisplayLayerService::GetLayerVisibleState(unsigned int devId, unsigned int layerId, bool &visible) -{ - visible = true; - HDF_LOGE("[service]--%{public}s: devId = %{public}d, visible is true", __func__, devId); - return DISPLAY_SUCCESS; -} - -DispErrCode DisplayLayerService::SetLayerRect(unsigned int devId, unsigned int layerId, IRect &rect) -{ - HDF_LOGE("[service]--%{public}s: [x,y,w,h]= [%{public}d, %{public}d, %{public}d, %{public}d]", - __func__, rect.x, rect.y, rect.w, rect.h); - return DISPLAY_SUCCESS; -} - -DispErrCode DisplayLayerService::GetLayerRect(unsigned int devId, unsigned int layerId, std::shared_ptr &rect) -{ - rect->x = 0; - rect->y = 0; - rect->w = 480; // x-solution - rect->h = 800; // y-solution - HDF_LOGE("[service]--%{public}s: [x,y,w,h] = [%{public}d, %{public}d, %{public}d, %{public}d]", - __func__, rect->x, rect->y, rect->w, rect->h); - return DISPLAY_SUCCESS; -} - -DispErrCode DisplayLayerService::SetLayerZorder(unsigned int devId, unsigned int layerId, unsigned int zorder) -{ - HDF_LOGE("[service]--%{public}s: devId = %{public}d, zorder = %{public}d", __func__, devId, zorder); - return DISPLAY_SUCCESS; -} - -DispErrCode DisplayLayerService::GetLayerZorder(unsigned int devId, unsigned int layerId, unsigned int &zorder) -{ - zorder = 3; // specific zorder - HDF_LOGE("[service]--%{public}s: devId = %{public}d, zorder is 3", __func__, devId); - return DISPLAY_SUCCESS; -} - -DispErrCode DisplayLayerService::SetTransformMode(unsigned int devId, unsigned int layerId, TransformType &type) -{ - HDF_LOGE("[service]--%{public}s: devId = %{public}d, transformType = %{public}d", __func__, devId, type); - return DISPLAY_SUCCESS; -} - -DispErrCode DisplayLayerService::SetLayerBuffer(unsigned int devId, unsigned int layerId, const BufferHandle &buffer, int fence) -{ - HDF_LOGE("[service]--%{public}s: fd= %{public}d, w= %{public}d, h= %{public}d, size= %{public}d, fmt= %{public}d", - __func__, buffer.fd, buffer.width, buffer.height, buffer.size, buffer.format); - return DISPLAY_SUCCESS; -} - -} // namespace V1_0 -} // namespace Display -} // namespace HDI -} // namespace OHOS +/* + * Copyright (c) 2021 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. + */ + +#include "display_layer_service_impl.h" +#include +#include +#include "display_gralloc.h" +#include "display_layer.h" + +namespace OHOS { +namespace HDI { +namespace Display { +namespace V1_0 { + +static LayerFuncs *g_layerFuncs = nullptr; +static GrallocFuncs *g_grallocFuncs = nullptr; + +DispErrCode DisplayLayerService::InitDisplay(unsigned int devId) +{ + HDF_LOGI("[service]--%{public}s: enter, devId = %{public}d", __func__, devId); + if (g_layerFuncs != nullptr) { + return DISPLAY_SUCCESS; + } + + int32_t ret = LayerInitialize(&g_layerFuncs); + if (ret != DISPLAY_SUCCESS || g_layerFuncs == nullptr) { + HDF_LOGE("layer init fail, ret=%{public}d", ret); + return DISPLAY_FAILURE; + } + + if (g_layerFuncs->InitDisplay == nullptr || g_layerFuncs->CreateLayer == nullptr || + g_layerFuncs->GetDisplayInfo == nullptr) { + HDF_LOGE("layer func is invalid"); + return DISPLAY_FAILURE; + } + + ret = g_layerFuncs->InitDisplay(devId); + if (ret != DISPLAY_SUCCESS) { + HDF_LOGE("init display fail, ret=%{public}d", ret); + return DISPLAY_FAILURE; + } + + if (g_grallocFuncs == nullptr){ + ret = GrallocInitialize(&g_grallocFuncs); + if (ret != DISPLAY_SUCCESS || g_grallocFuncs == nullptr) { + LayerUninitialize(g_layerFuncs); + g_layerFuncs = nullptr; + HDF_LOGE("%{public}s: GrallocInitialize fail, ret=%{public}d",__func__, ret); + return DISPLAY_FAILURE; + } + } + return DISPLAY_SUCCESS; +} + +DispErrCode DisplayLayerService::DeinitDisplay(unsigned int devId) +{ + HDF_LOGI("[service]--%{public}s: enter, devId = %{public}d", __func__, devId); + if (g_layerFuncs != nullptr && g_layerFuncs->DeinitDisplay != nullptr) { + (void)g_layerFuncs->DeinitDisplay(devId); + } + return DISPLAY_SUCCESS; +} + +DispErrCode DisplayLayerService::GetDisplayInfo(unsigned int devId, std::shared_ptr &dispInfo) +{ + HDF_LOGI("[service]--%{public}s: enter, devId = %{public}d", __func__, devId); + if (g_layerFuncs == nullptr) { + HDF_LOGE("video display not inited"); + return DISPLAY_FAILURE; + } + + int32_t ret = g_layerFuncs->GetDisplayInfo(devId, dispInfo.get()); + if (ret != DISPLAY_SUCCESS) { + HDF_LOGE("get display info fail, ret=%{public}d", ret); + return DISPLAY_FAILURE; + } + + HDF_LOGI("[service]--%{public}s: width = %{public}d, height = %{public}d, rotAngle = %{public}d", + __func__, dispInfo->width, dispInfo->height, dispInfo->rotAngle); + return DISPLAY_SUCCESS; +} + +DispErrCode DisplayLayerService::CreateLayer(unsigned int devId, LayerInfo &layerInfo, unsigned int &layerId) +{ + int32_t ret; + LayerInfo info = layerInfo; + HDF_LOGI("[service]--%{public}s: width= %{public}d, height = %{public}d, type = %{public}d, bpp = %{public}d", + __func__, layerInfo.width, layerInfo.height, layerInfo.type, layerInfo.bpp); + if (g_layerFuncs == nullptr) { + ret = InitDisplay(devId); + if (ret != DISPLAY_SUCCESS) { + HDF_LOGE("InitDisplay fail, ret=%{public}d", ret); + return DISPLAY_FAILURE; + } + std::shared_ptr dispInfo = std::make_shared(); + ret = GetDisplayInfo(devId, dispInfo); + if (ret != DISPLAY_SUCCESS) { + HDF_LOGE("InitDisplay fail, ret=%{public}d", ret); + return DISPLAY_FAILURE; + } + if (info.height == 0 && info.width == 0) { + info.width = dispInfo->width; + info.height = dispInfo->height; + } + } + + ret = g_layerFuncs->CreateLayer(devId, &info, &layerId); + if (ret != DISPLAY_SUCCESS) { + HDF_LOGE("create layer fail, ret=%{public}d", ret); + return DISPLAY_FAILURE; + } + return DISPLAY_SUCCESS; +} + +DispErrCode DisplayLayerService::CloseLayer(unsigned int devId, unsigned int layerId) +{ + HDF_LOGI("[service]--%{public}s: enter, devId = %{public}d", __func__, devId); + if (g_layerFuncs == nullptr || g_layerFuncs->CloseLayer == nullptr) { + HDF_LOGE("may not inited or CloseLayer nullptr"); + return DISPLAY_FAILURE; + } + (void)g_layerFuncs->CloseLayer(devId, layerId); + return DISPLAY_SUCCESS; +} + +DispErrCode DisplayLayerService::SetLayerVisible(unsigned int devId, unsigned int layerId, bool visible) +{ + HDF_LOGI("[service]--%{public}s: devId = %{public}d, visible = %{public}d", __func__, devId, visible); + if (g_layerFuncs == nullptr || g_layerFuncs->SetLayerVisible == nullptr) { + HDF_LOGE("may not inited or SetLayerVisible nullptr"); + return DISPLAY_FAILURE; + } + int32_t ret = g_layerFuncs->SetLayerVisible(devId, layerId, visible); + return (ret == DISPLAY_SUCCESS) ? DISPLAY_SUCCESS : DISPLAY_FAILURE; +} + +DispErrCode DisplayLayerService::GetLayerVisibleState(unsigned int devId, unsigned int layerId, bool &visible) +{ + HDF_LOGI("[service]--%{public}s: devId = %{public}d, visible is true", __func__, devId); + if (g_layerFuncs == nullptr || g_layerFuncs->GetLayerVisibleState == nullptr) { + HDF_LOGE("may not inited or GetLayerVisibleState nullptr"); + return DISPLAY_FAILURE; + } + int32_t ret = g_layerFuncs->GetLayerVisibleState(devId, layerId, &visible); + return (ret == DISPLAY_SUCCESS) ? DISPLAY_SUCCESS : DISPLAY_FAILURE; +} + +DispErrCode DisplayLayerService::SetLayerRect(unsigned int devId, unsigned int layerId, IRect &rect) +{ + HDF_LOGI("[service]--%{public}s: [x,y,w,h]= [%{public}d, %{public}d, %{public}d, %{public}d]", + __func__, rect.x, rect.y, rect.w, rect.h); + if (g_layerFuncs == nullptr || g_layerFuncs->SetLayerSize == nullptr) { + HDF_LOGE("may not inited or SetLayerSize nullptr"); + return DISPLAY_FAILURE; + } + int32_t ret = g_layerFuncs->SetLayerSize(devId, layerId, &rect); + return (ret == DISPLAY_SUCCESS) ? DISPLAY_SUCCESS : DISPLAY_FAILURE; +} + +DispErrCode DisplayLayerService::GetLayerRect(unsigned int devId, unsigned int layerId, std::shared_ptr &rect) +{ + if (g_layerFuncs == nullptr || g_layerFuncs->GetLayerSize == nullptr) { + HDF_LOGE("may not inited or GetLayerSize nullptr"); + return DISPLAY_FAILURE; + } + int32_t ret = g_layerFuncs->GetLayerSize(devId, layerId, rect.get()); + + HDF_LOGI("[service]--%{public}s: [x,y,w,h] = [%{public}d, %{public}d, %{public}d, %{public}d]", + __func__, rect->x, rect->y, rect->w, rect->h); + return (ret == DISPLAY_SUCCESS) ? DISPLAY_SUCCESS : DISPLAY_FAILURE; +} + +DispErrCode DisplayLayerService::SetLayerZorder(unsigned int devId, unsigned int layerId, unsigned int zorder) +{ + HDF_LOGI("[service]--%{public}s: devId = %{public}d, zorder = %{public}d", __func__, devId, zorder); + if (g_layerFuncs == nullptr || g_layerFuncs->SetLayerZorder == nullptr) { + HDF_LOGE("may not inited or SetLayerZorder nullptr"); + return DISPLAY_FAILURE; + } + int32_t ret = g_layerFuncs->SetLayerZorder(devId, layerId, zorder); + return (ret == DISPLAY_SUCCESS) ? DISPLAY_SUCCESS : DISPLAY_FAILURE; +} + +DispErrCode DisplayLayerService::GetLayerZorder(unsigned int devId, unsigned int layerId, unsigned int &zorder) +{ + HDF_LOGI("[service]--%{public}s: devId = %{public}d, zorder is 3", __func__, devId); + if (g_layerFuncs == nullptr || g_layerFuncs->GetLayerZorder == nullptr) { + HDF_LOGE("may not inited or GetLayerZorder nullptr"); + return DISPLAY_FAILURE; + } + int32_t ret = g_layerFuncs->GetLayerZorder(devId, layerId, &zorder); + return (ret == DISPLAY_SUCCESS) ? DISPLAY_SUCCESS : DISPLAY_FAILURE; +} + +DispErrCode DisplayLayerService::SetTransformMode(unsigned int devId, unsigned int layerId, TransformType &type) +{ + HDF_LOGI("[service]--%{public}s: devId = %{public}d, transformType = %{public}d", __func__, devId, type); + if (g_layerFuncs == nullptr || g_layerFuncs->SetTransformMode == nullptr) { + HDF_LOGE("may not inited or SetTransformMode nullptr"); + return DISPLAY_FAILURE; + } + int32_t ret = g_layerFuncs->SetTransformMode(devId, layerId, type); + return (ret == DISPLAY_SUCCESS) ? DISPLAY_SUCCESS : DISPLAY_FAILURE; +} + +DispErrCode DisplayLayerService::SetLayerBuffer(unsigned int devId, unsigned int layerId, const BufferHandle &buffer, int fence) +{ + HDF_LOGD("[service]--%{public}s: fd= %{public}d, w= %{public}d, h= %{public}d, size= %{public}d, fmt= %{public}d", + __func__, buffer.fd, buffer.width, buffer.height, buffer.size, buffer.format); + if (g_layerFuncs == nullptr || g_layerFuncs->SetLayerBuffer == nullptr) { + HDF_LOGE("may not inited or SetLayerBuffer nullptr"); + return DISPLAY_FAILURE; + } + BufferHandle bufferTemp = buffer; + bufferTemp.virAddr = g_grallocFuncs->Mmap(&bufferTemp); + int32_t ret = g_layerFuncs->SetLayerBuffer(devId, layerId, &bufferTemp, fence); + (void)g_grallocFuncs->Unmap(&bufferTemp); + return (ret == DISPLAY_SUCCESS) ? DISPLAY_SUCCESS : DISPLAY_FAILURE; +} + +} // namespace V1_0 +} // namespace Display +} // namespace HDI +} // namespace OHOS diff --git a/display/interfaces/hdi_cpp/server/display_layer_service_impl_test.h b/display/interfaces/hdi_cpp/server/display_layer_service_impl.h similarity index 98% rename from display/interfaces/hdi_cpp/server/display_layer_service_impl_test.h rename to display/interfaces/hdi_cpp/server/display_layer_service_impl.h index 54630f71cd067379b8adb1dc71cdf6caba919cc5..e2a2d2c99e24fea769574e95be63d9fc6f4e12df 100644 --- a/display/interfaces/hdi_cpp/server/display_layer_service_impl_test.h +++ b/display/interfaces/hdi_cpp/server/display_layer_service_impl.h @@ -1,49 +1,49 @@ -/* - * Copyright (c) 2021 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_DISPLAY_LAYER_V1_0_INTERFACE_SERVICE_H -#define OHOS_HDI_DISPLAY_LAYER_V1_0_INTERFACE_SERVICE_H - -#include "idisplay_layer.h" - -namespace OHOS { -namespace HDI { -namespace Display { -namespace V1_0 { - -class DisplayLayerService : public IDisplayLayer { -public: - - virtual DispErrCode InitDisplay(unsigned int devId) override; - virtual DispErrCode DeinitDisplay(unsigned int devId) override; - virtual DispErrCode GetDisplayInfo(unsigned int devId, std::shared_ptr &dispInfo) override; - virtual DispErrCode CreateLayer(unsigned int devId, LayerInfo &layerInfo, unsigned int &layerId) override; - virtual DispErrCode CloseLayer(unsigned int devId, unsigned int layerId) override; - virtual DispErrCode SetLayerVisible(unsigned int devId, unsigned int layerId, bool visible) override; - virtual DispErrCode GetLayerVisibleState(unsigned int devId, unsigned int layerId, bool &visible) override; - virtual DispErrCode SetLayerRect(unsigned int devId, unsigned int layerId, IRect &rect) override; - virtual DispErrCode GetLayerRect(unsigned int devId, unsigned int layerId, std::shared_ptr &rect) override; - virtual DispErrCode SetLayerZorder(unsigned int devId, unsigned int layerId, unsigned int zorder) override; - virtual DispErrCode GetLayerZorder(unsigned int devId, unsigned int layerId, unsigned int &zorder) override; - virtual DispErrCode SetTransformMode(unsigned int devId, unsigned int layerId, TransformType &type) override; - virtual DispErrCode SetLayerBuffer(unsigned int devId, unsigned int layerId, const BufferHandle &buffer, int fence) override; -}; - -} // namespace V1_0 -} // namespace Display -} // namespace HDI -} // namespace OHOS - +/* + * Copyright (c) 2021 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_DISPLAY_LAYER_V1_0_INTERFACE_SERVICE_H +#define OHOS_HDI_DISPLAY_LAYER_V1_0_INTERFACE_SERVICE_H + +#include "idisplay_layer.h" + +namespace OHOS { +namespace HDI { +namespace Display { +namespace V1_0 { + +class DisplayLayerService : public IDisplayLayer { +public: + + virtual DispErrCode InitDisplay(unsigned int devId) override; + virtual DispErrCode DeinitDisplay(unsigned int devId) override; + virtual DispErrCode GetDisplayInfo(unsigned int devId, std::shared_ptr &dispInfo) override; + virtual DispErrCode CreateLayer(unsigned int devId, LayerInfo &layerInfo, unsigned int &layerId) override; + virtual DispErrCode CloseLayer(unsigned int devId, unsigned int layerId) override; + virtual DispErrCode SetLayerVisible(unsigned int devId, unsigned int layerId, bool visible) override; + virtual DispErrCode GetLayerVisibleState(unsigned int devId, unsigned int layerId, bool &visible) override; + virtual DispErrCode SetLayerRect(unsigned int devId, unsigned int layerId, IRect &rect) override; + virtual DispErrCode GetLayerRect(unsigned int devId, unsigned int layerId, std::shared_ptr &rect) override; + virtual DispErrCode SetLayerZorder(unsigned int devId, unsigned int layerId, unsigned int zorder) override; + virtual DispErrCode GetLayerZorder(unsigned int devId, unsigned int layerId, unsigned int &zorder) override; + virtual DispErrCode SetTransformMode(unsigned int devId, unsigned int layerId, TransformType &type) override; + virtual DispErrCode SetLayerBuffer(unsigned int devId, unsigned int layerId, const BufferHandle &buffer, int fence) override; +}; + +} // namespace V1_0 +} // namespace Display +} // namespace HDI +} // namespace OHOS + #endif // OHOS_HDI_DISPLAY_LAYER_V1_0_INTERFACE_SERVICE_H \ No newline at end of file diff --git a/display/interfaces/hdi_cpp/server/display_layer_service_stub.h b/display/interfaces/hdi_cpp/server/display_layer_service_stub.h index 2ec22ac7374d6df2b4d740d574305bd019bd436d..9a8546f056b49adf336dcf81a9b02c71420f41b9 100644 --- a/display/interfaces/hdi_cpp/server/display_layer_service_stub.h +++ b/display/interfaces/hdi_cpp/server/display_layer_service_stub.h @@ -20,7 +20,7 @@ #include #include #include "idisplay_layer.h" -#include "display_layer_service_impl_test.h" +#include "display_layer_service_impl.h" namespace OHOS { namespace HDI {