From: Poornima Date: Thu, 23 Mar 2017 05:07:59 +0000 (+0530) Subject: Format check in the getclienttargetsupport API X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=aeef6753f0a4478e94f5218fe49bea7a965ced03;p=android-x86%2Fexternal-IA-Hardware-Composer.git Format check in the getclienttargetsupport API Querying whether the client target format can be supported by device. Jira: https://01.org/jira/browse/IAHWC-12 Test: No regression observed on Android. Signed-off-by: Poornima --- diff --git a/common/display/display.cpp b/common/display/display.cpp index 1dded21..130f3cb 100644 --- a/common/display/display.cpp +++ b/common/display/display.cpp @@ -220,4 +220,8 @@ void Display::VSyncControl(bool enabled) { flip_handler_->VSyncControl(enabled); } +bool Display::CheckPlaneFormat(uint32_t format) { + return display_queue_->CheckPlaneFormat(format); +} + } // namespace hwcomposer diff --git a/common/display/display.h b/common/display/display.h index 26c998e..ef82d89 100644 --- a/common/display/display.h +++ b/common/display/display.h @@ -55,11 +55,11 @@ class Display : public NativeDisplay { return pipe_; } - int32_t Width() const override { + uint32_t Width() const override { return width_; } - int32_t Height() const override { + uint32_t Height() const override { return height_; } @@ -87,6 +87,7 @@ class Display : public NativeDisplay { uint32_t display_id) override; void VSyncControl(bool enabled) override; + bool CheckPlaneFormat(uint32_t format) override; protected: uint32_t CrtcId() const override { diff --git a/common/display/displayplanemanager.cpp b/common/display/displayplanemanager.cpp index c4b86b5..527bd6d 100644 --- a/common/display/displayplanemanager.cpp +++ b/common/display/displayplanemanager.cpp @@ -509,4 +509,8 @@ std::unique_ptr DisplayPlaneManager::CreatePlane( new DisplayPlane(plane_id, possible_crtcs)); } +bool DisplayPlaneManager::CheckPlaneFormat(uint32_t format) { + return primary_plane_->IsSupportedFormat(format); +} + } // namespace hwcomposer diff --git a/common/display/displayplanemanager.h b/common/display/displayplanemanager.h index e93c2e2..fbf4013 100644 --- a/common/display/displayplanemanager.h +++ b/common/display/displayplanemanager.h @@ -62,6 +62,7 @@ class DisplayPlaneManager { void DisablePipe(drmModeAtomicReqPtr property_set); void EndFrameUpdate(); + bool CheckPlaneFormat(uint32_t format); protected: struct OverlayPlane { diff --git a/common/display/displayqueue.cpp b/common/display/displayqueue.cpp index c681fe9..f86ffe6 100644 --- a/common/display/displayqueue.cpp +++ b/common/display/displayqueue.cpp @@ -317,4 +317,8 @@ void DisplayQueue::GetDrmObjectProperty(const char* name, ETRACE("Could not find property %s", name); } +bool DisplayQueue::CheckPlaneFormat(uint32_t format) { + return display_plane_manager_->CheckPlaneFormat(format); +} + } // namespace hwcomposer diff --git a/common/display/displayqueue.h b/common/display/displayqueue.h index dd56f94..e8181a5 100644 --- a/common/display/displayqueue.h +++ b/common/display/displayqueue.h @@ -52,6 +52,7 @@ class DisplayQueue { bool QueueUpdate(std::vector& source_layers); bool SetPowerMode(uint32_t power_mode); + bool CheckPlaneFormat(uint32_t format); void HandleExit(); diff --git a/common/display/headless.cpp b/common/display/headless.cpp index 4fca20d..67a62b7 100644 --- a/common/display/headless.cpp +++ b/common/display/headless.cpp @@ -129,4 +129,9 @@ int Headless::RegisterVsyncCallback(std::shared_ptr /*callback*/, void Headless::VSyncControl(bool /*enabled*/) { } +bool Headless::CheckPlaneFormat(uint32_t /*format*/) { + // assuming that virtual display supports the format + return true; +} + } // namespace hwcomposer diff --git a/common/display/headless.h b/common/display/headless.h index 3d8e223..05807d0 100644 --- a/common/display/headless.h +++ b/common/display/headless.h @@ -41,11 +41,11 @@ class Headless : public NativeDisplay { return 0; } - int32_t Width() const override { + uint32_t Width() const override { return 1; } - int32_t Height() const override { + uint32_t Height() const override { return 1; } @@ -73,6 +73,7 @@ class Headless : public NativeDisplay { uint32_t display_id) override; void VSyncControl(bool enabled) override; + bool CheckPlaneFormat(uint32_t format) override; protected: uint32_t CrtcId() const override { diff --git a/os/android/drmhwctwo.cpp b/os/android/drmhwctwo.cpp index 26084a2..913763b 100644 --- a/os/android/drmhwctwo.cpp +++ b/os/android/drmhwctwo.cpp @@ -18,6 +18,7 @@ #define LOG_TAG "hwc-drm-two" #include "drmhwctwo.h" +#include "drmutils.h" #include @@ -264,16 +265,28 @@ HWC2::Error DrmHwcTwo::HwcDisplay::GetChangedCompositionTypes( return HWC2::Error::None; } -HWC2::Error DrmHwcTwo::HwcDisplay::GetClientTargetSupport(uint32_t /*width*/, - uint32_t /*height*/, - int32_t /*format*/, +HWC2::Error DrmHwcTwo::HwcDisplay::GetClientTargetSupport(uint32_t width, + uint32_t height, + int32_t format, int32_t dataspace) { - if (dataspace != HAL_DATASPACE_UNKNOWN && - dataspace != HAL_DATASPACE_STANDARD_UNSPECIFIED) + if (width != display_->Width() || height != display_->Height()) { return HWC2::Error::Unsupported; + } - // TODO: Validate format can be handled by either GL or planes - return HWC2::Error::None; + if (format == HAL_PIXEL_FORMAT_RGBA_8888 && + (dataspace == HAL_DATASPACE_UNKNOWN || + dataspace == HAL_DATASPACE_STANDARD_UNSPECIFIED)) { + return HWC2::Error::None; + } else { + // Convert HAL to fourcc-based DRM formats + uint32_t drm_format = GetDrmFormat(format); + if (display_->CheckPlaneFormat(drm_format) && + (dataspace == HAL_DATASPACE_UNKNOWN || + dataspace == HAL_DATASPACE_STANDARD_UNSPECIFIED)) + return HWC2::Error::None; + } + + return HWC2::Error::Unsupported; } HWC2::Error DrmHwcTwo::HwcDisplay::GetColorModes(uint32_t *num_modes, diff --git a/os/android/drmutils.h b/os/android/drmutils.h new file mode 100644 index 0000000..865600b --- /dev/null +++ b/os/android/drmutils.h @@ -0,0 +1,56 @@ + +/* +// Copyright (c) 2017 Intel Corporation +// +// 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 OS_ANDROID_DRMUTILS_H_ +#define OS_ANDROID_DRMUTILS_H_ + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define DRM_FORMAT_NONE fourcc_code('0', '0', '0', '0') + +// Conversion from HAL to fourcc-based DRM formats +uint32_t GetDrmFormat(int format) { + switch (format) { + case HAL_PIXEL_FORMAT_RGBA_8888: + return DRM_FORMAT_BGRA8888; + case HAL_PIXEL_FORMAT_RGBX_8888: + return DRM_FORMAT_BGRX8888; + case HAL_PIXEL_FORMAT_RGB_888: + return DRM_FORMAT_BGR888; + case HAL_PIXEL_FORMAT_RGB_565: + return DRM_FORMAT_BGR565; + case HAL_PIXEL_FORMAT_BGRA_8888: + return DRM_FORMAT_ARGB8888; + case HAL_PIXEL_FORMAT_YV12: + return DRM_FORMAT_YVU420; + default: + break; + } + + return DRM_FORMAT_NONE; +} + +#ifdef __cplusplus +} +#endif +#endif diff --git a/public/nativedisplay.h b/public/nativedisplay.h index 4944763..4d411be 100644 --- a/public/nativedisplay.h +++ b/public/nativedisplay.h @@ -51,9 +51,9 @@ class NativeDisplay { virtual uint32_t Pipe() const = 0; - virtual int32_t Width() const = 0; + virtual uint32_t Width() const = 0; - virtual int32_t Height() const = 0; + virtual uint32_t Height() const = 0; virtual int32_t GetRefreshRate() const = 0; @@ -82,6 +82,11 @@ class NativeDisplay { virtual void SetOutputBuffer(HWCNativeHandle /*buffer*/, int32_t /*acquire_fence*/) { } + /** + * API to check the format support on the device + * @param format valid DRM formats found in drm_fourcc.h. + */ + virtual bool CheckPlaneFormat(uint32_t format) = 0; protected: virtual uint32_t CrtcId() const = 0;