OSDN Git Service

android-x86/external-drm_hwcomposer.git
3 years agodrm_hwcomposer: Add support for color encoding and range properties
Matvii Zorin [Tue, 8 Sep 2020 13:12:51 +0000 (16:12 +0300)]
drm_hwcomposer: Add support for color encoding and range properties

Starting from the linux-v4.17, the DRM module has support for different
non-RGB color encodings that are controlled through plane-specific
COLOR_ENCODING and COLOR_RANGE properties.

This patch creates a matching between the HWC layer dataspace which is
supported by DRM driver and DRM plane properties.

Signed-off-by: Matvii Zorin <matvii.zorin@globallogic.com>
3 years agodrm_hwcomposer: Add minigbm video and format_modifier support
Roman Stratiienko [Sun, 13 Dec 2020 15:41:04 +0000 (17:41 +0200)]
drm_hwcomposer: Add minigbm video and format_modifier support

Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
3 years agodrm_hwcomposer: Support unique fd for every YUV plane
Roman Stratiienko [Fri, 8 Jan 2021 16:30:31 +0000 (18:30 +0200)]
drm_hwcomposer: Support unique fd for every YUV plane

Fixes video playback on DEVICE while using minigbm gralloc[0,3,4],
and other grallocs that have more than 1 prime_fd for YUV buffers.

Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
3 years agodrm_hwcomposer: Ensure composer has master access to DRM/KMS
Roman Stratiienko [Wed, 13 Jan 2021 08:32:04 +0000 (10:32 +0200)]
drm_hwcomposer: Ensure composer has master access to DRM/KMS

Allocator service is always loaded before Composer service.
Kernel will assign master access to the first client that
opened /dev/dri/cardX node.

Allocator should immediately execute drmDropMaster() to
allow Composer service to acquire master privileges.

If this does not happen, the composer should gracefully exit,
otherwise a lot of DRM ioctls will fail without displaying anything
on the UI.

Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
3 years agodrm_hwcomposer: Reorganize modifiers handling logic
Roman Stratiienko [Fri, 20 Nov 2020 14:21:55 +0000 (16:21 +0200)]
drm_hwcomposer: Reorganize modifiers handling logic

Reasons for this change:
1. Remove redundant code lines.
2. Workaround for cases when DRM_FORMAT_MOD_INVALID is set by gralloc.

Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
3 years agodrm_hwcomposer: libdrmgetter: fix RGB565 format translation
Roman Stratiienko [Fri, 30 Oct 2020 11:53:00 +0000 (13:53 +0200)]
drm_hwcomposer: libdrmgetter: fix RGB565 format translation

FOSS graphic components (gbm_gralloc, mesa3d) are translating
HAL_PIXEL_FORMAT_RGB_565 to DRM_FORMAT_RGB565 without swapping
the R and B components. Same must be done here.

Fixes wrong colors in some games (i.e. Pixel Wheels).

Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
3 years agodrm_hwcomposer: check ConvertBoInfo errors before importing
Jason Macnak [Mon, 2 Nov 2020 15:04:11 +0000 (07:04 -0800)]
drm_hwcomposer: check ConvertBoInfo errors before importing

Signed-off-by: Jason Macnak <natsu@google.com>
3 years agodrm_hwcomposer: implement Gralloc 4 BufferInfoMapperMetadata
Dennis Tsiang [Fri, 30 Oct 2020 08:43:33 +0000 (08:43 +0000)]
drm_hwcomposer: implement Gralloc 4 BufferInfoMapperMetadata

Implements the BufferInfoMapperMetadata that uses the
GraphicBufferMapper to set the fields of the hwc_drm_bo_t struct.

New class function GetFds created to obtain the file descriptors from
the native_handle_t. Function is marked weak so that vendors can
override it to match their system if required.

Change-Id: I74445487dec6bda2915b21f4b63804832bfead23
Signed-off-by: Dennis Tsiang <dennis.tsiang@arm.com>
Reviewed-by: Roman Stratiienko <r.stratiienko@gmail.com>
3 years agodrm_hwcomposer: stop using pixel_stride
Roman Stratiienko [Fri, 23 Oct 2020 19:28:38 +0000 (22:28 +0300)]
drm_hwcomposer: stop using pixel_stride

pixel_stride is used only to validate buffer when importing using
GraphicBufferMapper::importBuffer() method.

The problem is we can't always get this value from buffer_handle_t.
Libdrm and MapperMetadata getters can only calculate this value based
on byte stride and buffer format. But this calculation isn't always
possible, which causes importBuffer() to fail.

Instead we can use GrallocMapper::importBuffer() method,
which doesn't require to validate the buffer.

This commit is not compatible with Android-P.

Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
3 years agodrm_hwcomposer: Set correct source crop for the client layer
Roman Stratiienko [Sat, 10 Oct 2020 20:06:36 +0000 (23:06 +0300)]
drm_hwcomposer: Set correct source crop for the client layer

Android supports limiting client buffer size using system properties:
"ro.surface_flinger.max_graphics_width"
"ro.surface_flinger.max_graphics_height"

If properties are set, client layer buffer size can no longer be equal to the
display size, which causes composition with CLIENT buffer to fail.

Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
3 years agodrm_hwcomposer: refactor platform directory
Roman Stratiienko [Sat, 3 Oct 2020 07:52:36 +0000 (10:52 +0300)]
drm_hwcomposer: refactor platform directory

Motivation:

Platform term meaning used in drm_hwcomposer does not correspond to the
content of the platform directory. Platform directory consists of:
1. Buffer information getters for different gralloc (currently called platform).
2. Composition planner logic (which has flaws and should be reworked into
   layer->plane mapping during validation stage logic).
3. DrmGenericImpoter with reference counting logic.

Android-11 IMapper@4 metadata API offers a generic way to access buffer
information which makes other gralloc buffer information getters obsolete.
Legacy getters should be maintained for some time until all known users
will migrate to Mapper@4 API.

Implementation:

1. Split 'PlatformImporter' logic to 'Importer' only and 'Buffer Getter' logic.
   a. Remove buffer_handle_t parameter from ImportBuffer(). Instead user should
      get BufferInfo using ConvertBoInfo to struct hwc_drm_bo_t, then use it for
      ImportBuffer().
   b. Move DrmGenericImporter.{cpp/h} into the drm directory.

2. Isolate planner code in single file and move it to compositor directory as
   compositor/Planner.{cpp/h}

3. Rename platform definition
   a. Rename platform directory to bufferinfo.
   b. Rename/move bufferinfo/platorm*.{cpp,h} getters to
      bufferinfo/legacy/BufferInfo*.{cpp,h}. Align class names/includes.

4. Split legacy/metadata getters logic.
   a. Apply existing bufferinfogetter base class only for legacy getters.
   b. Combine legacy/generic gettera under new base class.
   c. Create a placeholder for generic(metadata) getter.

Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
3 years agodrm_hwcomposer: extract platform-libdrm code from platform-generic
Roman Stratiienko [Fri, 2 Oct 2020 16:01:10 +0000 (19:01 +0300)]
drm_hwcomposer: extract platform-libdrm code from platform-generic

Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
3 years agodrm_hwcomposer: Check parameter range in SetColorMode()
Roman Stratiienko [Sun, 4 Oct 2020 20:56:46 +0000 (23:56 +0300)]
drm_hwcomposer: Check parameter range in SetColorMode()

Fix GraphicsComposerHidlTest#SetColorModeBadParameter VTS test.

Fixes: 27d2ed670bb34 ("drm_hwcomposer: Fix SetColorMode() and SetColorModeWithIntent()")
Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
3 years agodrm_hwcomposer: Fix SetColorMode() and SetColorModeWithIntent()
Roman Stratiienko [Sat, 26 Sep 2020 20:59:19 +0000 (23:59 +0300)]
drm_hwcomposer: Fix SetColorMode() and SetColorModeWithIntent()

SetColorMode() should return HWC2_ERROR_UNSUPPORTED [1]

SetColorModeWithIntent() should return HWC2_ERROR_UNSUPPORTED [2]
Parameters range shoud be also checked to pass VTS.

Fixes VtsHalGraphicsComposerV2_2TargetTest:
 - PerInstance/GraphicsComposerHidlTest#SetColorMode_2_2*

============================================
================= Results ==================
    arm64-v8a VtsHalGraphicsComposerV2_2TargetTest: 39s
    armeabi-v7a VtsHalGraphicsComposerV2_2TargetTest: 36s
=============== Summary ===============
2/2 modules completed
Total Tests       : 78
PASSED            : 78
FAILED            : 0
============================================

[1] - https://cs.android.com/android/platform/superproject/+/master:hardware/libhardware/include/hardware/hwcomposer2.h;l=1925;drc=d5f2f67cd2ae63abeccabd0d5339dacd469569cd
[2] - https://cs.android.com/android/platform/superproject/+/master:hardware/libhardware/include/hardware/hwcomposer2.h;l=1952;drc=d5f2f67cd2ae63abeccabd0d5339dacd469569cd
Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
3 years agodrm_hwcomposer: Fix RegisterCallback() function
Roman Stratiienko [Fri, 25 Sep 2020 23:08:41 +0000 (02:08 +0300)]
drm_hwcomposer: Fix RegisterCallback() function

- Fixes segfault during client switch.
- Allows to run VTS on Android-11.

VTS Results:
============================================
    arm64-v8a VtsHalGraphicsComposerV2_1TargetTest: [53 tests / 42808 msec]
    armeabi-v7a VtsHalGraphicsComposerV2_1TargetTest: [53 tests / 33353 msec]
=============== Summary ===============
2/2 modules completed
Total Tests       : 106
PASSED            : 106
FAILED            : 0
============================================

Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
3 years agodrm_hwcomposer: Return error from GetEdidBlob if blob is null
Marijn Suijten [Sat, 19 Sep 2020 10:12:03 +0000 (12:12 +0200)]
drm_hwcomposer: Return error from GetEdidBlob if blob is null

drmModeGetPropertyBlob can return NULL blobs resulting in a segfault in
GetDisplayIdentificationData which expects blob to be set to a valid
pointer when GetEdidBlob returns 0.

Fixes: adc5d8229b9ce25f1bf0e4d02bb838eae62b89fc

Signed-off-by: Marijn Suijten <marijns95@gmail.com>
3 years agodrm_hwcomposer: fix build error after fbf5c0ca45b3
Roman Stratiienko [Wed, 23 Sep 2020 08:51:12 +0000 (11:51 +0300)]
drm_hwcomposer: fix build error after fbf5c0ca45b3

'warning' preprocessor directive is interpreted as build error.
Replace it with ALOGW.

Fixes: fbf5c0ca45b3 ("drm_hwcomposer: libdrm gralloc_handle: modifiers and YUV support")
Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
3 years agodrm_hwcomposer: Add check for format support during plane validation
Roman Kovalivskyi [Thu, 10 Sep 2020 09:07:37 +0000 (12:07 +0300)]
drm_hwcomposer: Add check for format support during plane validation

Some layers have pixel format that aren't supported by a hardware. In
such case it is better to reject plane that doesn't supports such
format, so we could handle it in future, rather than accepting it,
passing to the kernel side and failing whole composition.

Signed-off-by: Roman Kovalivskyi <roman.kovalivskyi@globallogic.com>
3 years agodrm_hwcomposer: Add supported formats list to DrmPlane
Roman Kovalivskyi [Thu, 26 Mar 2020 03:03:39 +0000 (05:03 +0200)]
drm_hwcomposer: Add supported formats list to DrmPlane

There are some use-cases for checking formats supported by given
plane. drmModePlane already contains reqired data, so it simply could
be saved into DrmPlane, no need to query any additional stuff.

Signed-off-by: Roman Kovalivskyi <roman.kovalivskyi@globallogic.com>
3 years agodrm_hwcomposer: add drm-mediatek to client-backend list
Mattijs Korpershoek [Tue, 22 Sep 2020 15:52:06 +0000 (17:52 +0200)]
drm_hwcomposer: add drm-mediatek to client-backend list

Since mediatek-drm has no support for premultiplied alpha buffers, we
can have issues with transparency.

Disable off-loading by adding "mediatek-drm" to the
client-backend list.

Change-Id: I12b034ecd5ae961264d01b6effaa4f4010036ac9
Suggested-by: Roman Stratiienko <r.stratiienko@gmail.com>
Signed-off-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
3 years agodrm_hwcomposer: Add MediaTek platform support
Mattijs Korpershoek [Mon, 21 Sep 2020 11:03:35 +0000 (11:03 +0000)]
drm_hwcomposer: Add MediaTek platform support

This platform handler is dedicated for the i500 MediaTek SoC [1].
i500 has a Mali-G72 MP3 GPU.

OpenGL/Mali integration is based on ARM Gralloc module, version
BX304L01B-SW-99005-r20p0-01rel0, without additional patches.

This platformmediatek is based on platformmeson, without the additional
usage flag in the private_handle_t.
AFBC support has also been removed as it's unsupported.

External Android.bp file should be created in order to build this
module:

```
cc_library_shared {
    name: "hwcomposer.drm_mediatek",
    defaults: ["hwcomposer.drm_defaults"],
    srcs: [":drm_hwcomposer_platformmediatek"],
    whole_static_libs: ["drm_hwcomposer"],
}
```

[1] https://www.mediatek.com/products/AIoT/i500
Change-Id: I3ea7a980d76ba5c5ff583b5d4f21e1989875bafb
Signed-off-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
3 years agodrm_hwcomposer: remove vendor.hwc.drm.exclude_non_hwfb_imports property
Roman Stratiienko [Sat, 29 Aug 2020 19:28:07 +0000 (22:28 +0300)]
drm_hwcomposer: remove vendor.hwc.drm.exclude_non_hwfb_imports property

This property was used to force composition on 'client' side.
After adding Backends support, it can be replaced with more straightforward
property definition: 'vendor.hwc.backend_override=client'.

Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
Change-Id: I896da41abe8b777166a485c06a11c163ceaeb3f0

3 years agodrm_hwcomposer: always use PlanStageGreedy
Roman Stratiienko [Sat, 29 Aug 2020 19:16:21 +0000 (22:16 +0300)]
drm_hwcomposer: always use PlanStageGreedy

Only PlatformHisi has custom planner. It doesn't makes much sense since
for HISI all composition is done on client side and planner should never
get buffers with usage flag other than GRALLOC_USAGE_HW_FB.

Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
Change-Id: I3db3f96165f4c3aacb8bc43c8ee3ebc877163e1b

3 years agodrm_hwcomposer: Fix EDID fetch from DRM
Andrii Chepurnyi [Fri, 10 Jul 2020 13:07:03 +0000 (16:07 +0300)]
drm_hwcomposer: Fix EDID fetch from DRM

EDID fetch procedure consist of two steps:
1) get appropriate blob_id
2) fetch EDID blob using blob_id
Those steps should be done sequentially, in
other case drivers can update EDID and blob_id
won't be actual.

Signed-off-by: Andrii Chepurnyi <andrii_chepurnyi@epam.com>
3 years agodrm_hwcomposer: use CamelCase in source/header files related to class
Roman Stratiienko [Sat, 29 Aug 2020 18:35:39 +0000 (21:35 +0300)]
drm_hwcomposer: use CamelCase in source/header files related to class

Main goal is to increase readability of file names.
AOSP uses camelcase for files in many projects.
Lets do the same for drm_hwcomposer.

Keep platform/ directory as is, since class names is different from file names.

Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
Change-Id: I7e992357851c2a86711f4da1241c4d507359e56b

3 years agodrm_hwcomposer: move header files into source directory
Roman Stratiienko [Sat, 29 Aug 2020 08:26:16 +0000 (11:26 +0300)]
drm_hwcomposer: move header files into source directory

... to improve navigation between source/header file.
Unnecessary dependencies also removed.

Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
Change-Id: I2c3bf993b8c5f356490433fd94e90011487a1276

3 years agodrm_hwcomposer: libdrm gralloc_handle: modifiers and YUV support
Roman Stratiienko [Mon, 24 Aug 2020 08:27:48 +0000 (11:27 +0300)]
drm_hwcomposer: libdrm gralloc_handle: modifiers and YUV support

1. Import DRM modifier field from libdrm's gralloc_habdle.
2. Recently lock_ycrcb() was added to gbm_gralloc() [1], mesa3d uses
   this function to obtain CrCb plane data (offsets, strides).
   Use the same alhorythm in drm_hwcomposer. This allows GPU offloading
   during video playback. (Tested using Gallery app and SkyTube).

[1] - https://github.com/robherring/gbm_gralloc/pull/15
[2] - https://gitlab.freedesktop.org/mesa/mesa/-/blob/68957a82562d13b3f0d21a04ce633ffd236e6036/src/egl/drivers/dri2/platform_android.c#L202

Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
Change-Id: I8ec177ac782f27174443cebcb6e773070c1505cc

3 years agodrm_hwcomposer: fix incorrect layer_count usage
Roman Stratiienko [Tue, 1 Sep 2020 10:39:17 +0000 (13:39 +0300)]
drm_hwcomposer: fix incorrect layer_count usage

According to [1] DRM YCrCb planes is not the same as gralloc layers.
DRMHWC2 has no information about number of layers used in the buffer.
Also supplying value other than 1 will allways fail validation on
passthrough MapperHal@2.1 and probably other passthrough implementations [2].

[1] - https://cs.android.com/android/platform/superproject/+/master:hardware/libhardware/include/hardware/gralloc1.h;l=467;drc=1155c41d016a118801fe97b55af9918e531f7f84
[2] - https://cs.android.com/android/platform/superproject/+/master:hardware/interfaces/graphics/mapper/2.1/utils/passthrough/include/mapper-passthrough/2.1/Gralloc0Hal.h;l=40;drc=e308ceb1e9940d1d90a11177782a7cfe8630bb95

Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
Change-Id: Idbfea8eaa74a557b98ecdff728e6c67aeea9cea6

3 years agodrm_hwcomposer: Add rcar-du display backend
Matvii Zorin [Tue, 11 Aug 2020 12:33:03 +0000 (15:33 +0300)]
drm_hwcomposer: Add rcar-du display backend

ABGR8888 pixel format and layer scaling are unsupported for rcar-du
platform.

Handle and filter out the layers by overriding the IsClientLayer method
for additional checks. That will force layers that require scaling or have
the unsupported pixel format to be merged by GPU, and allow other layers
to be merged by DRM.

Signed-off-by: Matvii Zorin <matvii.zorin@globallogic.com>
3 years agodrm_hwcomposer: Add composition skipping backend
Matvii Zorin [Tue, 11 Aug 2020 12:29:21 +0000 (15:29 +0300)]
drm_hwcomposer: Add composition skipping backend

This display backend may be chosen by setting the hwc.backend_override
system property to the "client" value.

Suggested-by: Andrii Chepurnyi <andrii_chepurnyi@epam.com>
Signed-off-by: Matvii Zorin <matvii.zorin@globallogic.com>
3 years agodrm_hwcomposer: Add backend-dependent validation for HwcDisplay class
Matvii Zorin [Tue, 11 Aug 2020 12:15:44 +0000 (15:15 +0300)]
drm_hwcomposer: Add backend-dependent validation for HwcDisplay class

Different DRM/KMS backends have a variable set of limitations, which is
not always exposed via DRM ioctls.

This implementation of backend-dependent validation provides a register
of platform-specific inherited backend class to the map by BackendManager
class. ValidateDisplay function is moved to generic backend
implementantion and separated into 2 additional methods.

The map key is a string that contains the corresponding DRM driver name.
During DrmHwcTwo class initialization the vendor.hwc.backend_override
system property and driver name will be checked and a backend will be set
for the appropriate display. If the map does not have any backend for the
named driver, the generic backend will be used.

Signed-off-by: Matvii Zorin <matvii.zorin@globallogic.com>
3 years agodrm_hwcomposer: Expand access to HwcDisplay class members
Matvii Zorin [Tue, 11 Aug 2020 11:05:12 +0000 (14:05 +0300)]
drm_hwcomposer: Expand access to HwcDisplay class members

Move the private methods and Stats structure into the public section
to have access outside the class. Create get functions for private
members. Access changing is needed to move display validation to
the Backend class.

Signed-off-by: Matvii Zorin <matvii.zorin@globallogic.com>
3 years agodrm_hwcomposer: Move DrmHwcTwo internal classes outside private section
Matvii Zorin [Mon, 27 Jul 2020 15:35:39 +0000 (18:35 +0300)]
drm_hwcomposer: Move DrmHwcTwo internal classes outside private section

Making backend-validation for HwcDisplay is required access to
the internal class outside DrmHwcTwo. There is no need to keep other
internal classes in the private section in this case.

Signed-off-by: Matvii Zorin <matvii.zorin@globallogic.com>
3 years agodrm_hwcomposer: Add include guard into drmhwctwo.h
Matvii Zorin [Mon, 27 Jul 2020 15:29:15 +0000 (18:29 +0300)]
drm_hwcomposer: Add include guard into drmhwctwo.h

Include guard was missed for the file.

Signed-off-by: Matvii Zorin <matvii.zorin@globallogic.com>
3 years agodrm_hwcomposer: Move properties into vendor namespace
Jason Macnak [Thu, 20 Aug 2020 18:49:51 +0000 (11:49 -0700)]
drm_hwcomposer: Move properties into vendor namespace

... to fix VTS VtsTrebleSysProp#testVendorPropertyNames.

Signed-off-by: Jason Macnak <natsu@google.com>
3 years agodrm_hwcomposer: Add feature to search for KMS DRI card
Matvii Zorin [Fri, 17 Jul 2020 09:08:45 +0000 (12:08 +0300)]
drm_hwcomposer: Add feature to search for KMS DRI card

Most modern SOCs have separate IP cores for GPU and Display Unit (KMS).
Also, there is no warranty that the KMS card will always have
/dev/dri/card0 path and GPU - /dev/dri/card1, but drm_hwcomposer should
open only KMS device. The order can depend on many factors. For example:
on the rpi4 board, it was observed that enabling the WIFI kernel module
swapping the card order. Therefore searching for the KMS card is the only
efficient solution.

The IsKMSDev function returns true when the file descriptor on the path
is successfully opened, the drmlib function is returned resources and
the target device has at least one CTRC, connector, and encoder. Also,
the patch enables finding KMS devices in the case of the absence of
the system property specification.

Signed-off-by: Matvii Zorin <matvii.zorin@globallogic.com>
Reviewed-by: Roman Stratiienko <r.stratiienko@gmail.com>
Change-Id: I8874a50188207833389fadd4815b42a80bf69240

3 years agodrm_hwcomposer: Implement *DisplayBrightness* stubs
Andrii Chepurnyi [Fri, 3 Jul 2020 08:21:33 +0000 (11:21 +0300)]
drm_hwcomposer: Implement *DisplayBrightness* stubs

Implement *DisplayBrightness* stub to be able boot
Android 11 using android.hardware.graphics.composer@2.3-service.
This change caused by error during boot:
failed to get hwcomposer2 function 61
61 is equal to SetDisplayBrightness.
GetDisplayBrightnessSupport is a companion of it.

Signed-off-by: Andrii Chepurnyi <andrii_chepurnyi@epam.com>
Signed-off-by: John Stultz <john.stultz@linaro.org>
Change-Id: Idacb32abdcf7ac399ef989f24ab7a360248466f9

3 years agodrm_hwcomposer: Implement SetColorModeWithIntent stub
Andrii Chepurnyi [Wed, 29 Apr 2020 20:15:28 +0000 (23:15 +0300)]
drm_hwcomposer: Implement SetColorModeWithIntent stub

Fix VTS test GraphicsComposerHidlTest.SetColorMode_2_2BadParameter.

Signed-off-by: Andrii Chepurnyi <andrii_chepurnyi@epam.com>
Signed-off-by: John Stultz <john.stultz@linaro.org>
Change-Id: Ia8ae6c0d7cb2a6bf09c205a04963ed359c5126a3

3 years agodrm_hwcomposer: Implement GetRenderIntents stub
Andrii Chepurnyi [Fri, 24 Apr 2020 11:20:24 +0000 (14:20 +0300)]
drm_hwcomposer: Implement GetRenderIntents stub

Fix VTS test GraphicsComposerHidlTest.GetRenderIntentsBadDisplay.

Signed-off-by: Andrii Chepurnyi <andrii_chepurnyi@epam.com>
Signed-off-by: John Stultz <john.stultz@linaro.org>
Change-Id: I5ceec735b5684581178070e75d96f5961b774f5f

3 years agodrm_hwcomposer: Fix ValidateDisplay() when lowest z-order is nonzero
Liviu Dudau [Mon, 15 Jun 2020 16:08:33 +0000 (17:08 +0100)]
drm_hwcomposer: Fix ValidateDisplay() when lowest z-order is nonzero

ValidateDisplay()'s algorithm for achieving minimal GPU load assumes
that the lowest z-order is zero and that layers have sequential z-orders.
CalcPixOps() and MarkValidated() are also written with the same assumption.
However, there is no such guarantee provided by SurfaceFlinger and VTS
tests like PRESENT_DISPLAY_NO_LAYER_STATE_CHANGES fail as they only have
one layer with z-order of 10.

Normalise the mapping between layers and z-order so that the algorithm works
as intended.

Signed-off-by: Liviu Dudau <liviu.dudau@arm.com>
Fixes commit b7b81cfba252 ("drm_hwcomposer: Choose client layer range to
achieve minimal GPU load")
Signed-off-by: John Stultz <john.stultz@linaro.org>
Change-Id: I71b76b9d151bf506ad6026f5b1f9de6b6c0dc7c1

3 years agodrm_hwcomposer: Run test commit only when it actually needed
Matvii Zorin [Mon, 6 Apr 2020 16:03:03 +0000 (19:03 +0300)]
drm_hwcomposer: Run test commit only when it actually needed

Composition testing is expensive. We do not need to spend CPU time when:

* All layers are marked as a client.

The patch skips CommitFrame function called by the ValidateDisplay
method in this case.

Signed-off-by: Matvii Zorin <matvii.zorin@globallogic.com>
3 years agodrm_hwcomposer: Fix invalid buffer_handle_t pointer
Paul Howgego [Tue, 9 Jun 2020 17:21:45 +0000 (18:21 +0100)]
drm_hwcomposer: Fix invalid buffer_handle_t pointer

In Android 11, at boot time, I see the following sequence of
calls from SurfaceFlinger that trigger this:

  // Composition type for layer is saved in DRM HWC Layer validated_type_
  validateDisplay()

  // Layer composition type saved in DRM HWC Layer sf_type_
  acceptDisplayChanges()

  // Composition type in Layer sf_type_ is now "client" so DRM HWC doesn't
  // update the Layer buffer pointer
  setLayerBuffer()

  // DRM HWC Layer sf_type_ is now changed back to "device"
  setLayerCompositionType()

  // DRM HWC iterates through the layers and finds that Layer composition
  // type in sf_type_ is "device"  so thinks it is fine to calls
  // importBuffer() but this Layer now has an invalid pointer as the
  // setLayerBuffer() was ignored.
  validateDisplay()

Thus this patch, changes the logic to always update the
buffer_handle_t pointer in setLayerBuffer regardless of
composition type rather than keeping the invalid buffer_handle_t
in the Layer obect. The composition type may be changed back to
device composition by setLayerCompositionType at which point the
Layer object needs to have saved the buffer_handle_t.

Not sure how we could reproduce the same sequence of calls on
another Android version.

Signed-off-by: Paul Howgego <paul.howgego@arm.com>
[jstultz: Reword and add context from merge request to the commit message]
Signed-off-by: John Stultz <john.stultz@linaro.org>
Change-Id: I88a11ee2fee742d6154a482455a8532a95e681d3

3 years agodrm_hwcomposer: Propagate PLATFORM_SDK_VERSION to cflags
Andrii Chepurnyi [Thu, 23 Apr 2020 17:48:13 +0000 (20:48 +0300)]
drm_hwcomposer: Propagate PLATFORM_SDK_VERSION to cflags

PLATFORM_SDK_VERSION is needed for already present
code (GetDisplayIdentificationData/GetDisplayCapabilities),
which implements some of the android.hardware.graphics.composer@2.3 API.

Signed-off-by: Andrii Chepurnyi <andrii_chepurnyi@epam.com>
Signed-off-by: John Stultz <john.stultz@linaro.org>
Change-Id: I1a5019e9d8ae327db41f55cee0ba3636f913928f

4 years agodrm_hwcomposer: Fix GetDisplayIdentificationData
Andrii Chepurnyi [Tue, 14 Apr 2020 10:03:57 +0000 (13:03 +0300)]
drm_hwcomposer: Fix GetDisplayIdentificationData

Fix GetDisplayIdentificationData, introduced
by commit: b3d817815fad.
Edid data should be copied instead of assign.

Signed-off-by: Andrii Chepurnyi <andrii_chepurnyi@epam.com>
4 years agodrm_hwcomposer: Relax failure when no EDID property is found
John Stultz [Fri, 21 Feb 2020 05:56:34 +0000 (05:56 +0000)]
drm_hwcomposer: Relax failure when no EDID property is found

Crosvm doesn't implement EDID virtio cmd, so when commit
b3d817815fad ("drm_hwcomposer: Add GetDisplayCapabilities
and getDisplayIdentificationData") landed, it broke crosvm
targets using --gpu_mode=drm_virgl

This patch tries to ease that restriction, so a lack of EDID
isn't considered fatal.

Change-Id: I8ce899fc71d2b1187d364918328473ef1890d52d
Signed-off-by: John Stultz <john.stultz@linaro.org>
4 years agodrm_hwcomposer: Improve error messages.
Peter Collingbourne [Wed, 19 Feb 2020 19:25:08 +0000 (11:25 -0800)]
drm_hwcomposer: Improve error messages.

- Don't negate errno before passing to strerror, at least on
  bionic this results in "Unknown error -x" instead of the actual
  error.
- Fix another error message to print strerror(errno) instead of the
  returned fd which will always be -1.
- Fix another error message to call strerror for consistency.

Signed-off-by: Peter Collingbourne <pcc@google.com>
4 years agodrm_hwcomposer: Add statistics on flattening to dump message
Roman Kovalivskyi [Mon, 3 Feb 2020 16:13:57 +0000 (18:13 +0200)]
drm_hwcomposer: Add statistics on flattening to dump message

We need some way to verify that current composition is not failed to
compose, but instead sent to flatten on GPU.

Dump message shows current flattening state. It also displays how
often do compositor switches into flattening.

Signed-off-by: Roman Kovalivskyi <roman.kovalivskyi@globallogic.com>
4 years agodrm_hwcomposer: Add fallback to client for layers flattening
Roman Kovalivskyi [Thu, 30 Jan 2020 18:20:47 +0000 (20:20 +0200)]
drm_hwcomposer: Add fallback to client for layers flattening

Google recommends to delegate composition to GLES instead of HWC when
screen isn't updating to conserve power, as stated on page
https://source.android.com/devices/graphics/implement-hwc.

Current implementation of hwcomposer has flattening of layers if after
some time there were no updates of frames, but it uses writeback
connector. Not every device has a support of writeback feature, so
some sort of fallback should be provided.

It is possible to fallback to client composition in case if writeback
isn't available. This is used to reduce power consumption since
squashing layers into a single layer on GPU and then using that buffer
is more efficient than loading drm device.

Signed-off-by: Roman Kovalivskyi <roman.kovalivskyi@globallogic.com>
4 years agodrm_hwcomposer: Add property that allows disabling of hardware scaling
Roman Stratiienko [Fri, 20 Dec 2019 15:04:01 +0000 (17:04 +0200)]
drm_hwcomposer: Add property that allows disabling of hardware scaling

Set `hwc.drm.scale_with_gpu` property to 1 in case composer hardware
do not have scaling support.

That will force layers that require scaling to be merged by GPU,
and allow other layers to be merged by DRM.

Signed-off-by: Roman Stratiienko <roman.stratiienko@globallogic.com>
4 years agodrm_hwcomposer: Try to fix build with older Android Pie releases
John Stultz [Fri, 7 Feb 2020 21:31:08 +0000 (21:31 +0000)]
drm_hwcomposer: Try to fix build with older Android Pie releases

Try to fix build regressions for P that were introduced with
commit b3d81781 ("drm_hwcomposer: Add GetDisplayCapabilities and
getDisplayIdentificationData") as noted in issue #30
  https://gitlab.freedesktop.org/drm-hwcomposer/drm-hwcomposer/issues/30

Change-Id: I4bfeb952cff19d4c3511ead69df1186d3a04cc87
Signed-off-by: John Stultz <john.stultz@linaro.org>
4 years agodrm_hwcomposer: Extract more BO data by Imagination importer v2
Roman Stratiienko [Thu, 23 Jan 2020 16:17:41 +0000 (18:17 +0200)]
drm_hwcomposer: Extract more BO data by Imagination importer v2

Fields bo->hal_format and bo->pixel_stride should be set to pass validation
by Mapper HAL v2.1 and v3.0. Otherwise UI is missing and the following
message appears in the logcat:

```
2576 E GraphicBufferMapper: validateBufferSize(0xe663b3637400) failed: 7
2576 E hwc-drm-utils: Failed to import buffer handle err: 7
2576 E hwc-drm-two: Failed to import layer, ret=7
```

Fixes: e3ed48d728aa ("drm_hwcomposer: Add Imagination platform support")
Signed-off-by: Roman Stratiienko <roman.stratiienko@globallogic.com>
4 years agodrm_hwcomposer: Revert "drm_hwcomposer: Extract more BO data by Imagination importer"
John Stultz [Tue, 4 Feb 2020 21:53:13 +0000 (21:53 +0000)]
drm_hwcomposer: Revert "drm_hwcomposer: Extract more BO data by Imagination importer"

This reverts commit b2f2baeb9db0d0f4cbc0cac3184058d3fce85ea6.

I'm trying to utilize a policy of lighter reviews w/ quick reverts
when there are issues to keep things moving. So with that in mind
I'm reverting "Extract more BO data by Imagination importer" since
its breaking the build in AOSP.

See:
  https://android-review.googlesource.com/c/platform/external/drm_hwcomposer/+/1225155/-1..1#message-828f83ed7fa89b3bdfff7b0b5b1dd7364c822892
  https://android-review.googlesource.com/c/platform/external/drm_hwcomposer/+/1225916

This breakage is due to the importer code being tightly tied to
the gralloc private handle definitions, which is a common problem
as the gralloc and drm_hwcomposers are separately maintained.
The beagle_x15 gralloc is apparently older, and doesn't have
the newly utilized fields.

So for now, revert this to stay in sync w/ AOSP. I'm happy to
re-apply as soon as a fix is in place which adds some sort of
versioning checks so hopefully drm_hwc can work with different
versions of the gralloc code.

Once users of the old gralloc code are updated, we can remove
such version checks if needed.

Change-Id: Ie72561061ea12cb58d3ba9616a62d05f4ffe78b0
Signed-off-by: John Stultz <john.stultz@linaro.org>
4 years agodrm_hwcomposer: Extract more BO data by Imagination importer
Roman Stratiienko [Thu, 23 Jan 2020 16:17:41 +0000 (18:17 +0200)]
drm_hwcomposer: Extract more BO data by Imagination importer

Fields bo->hal_format and bo->pixel_stride should be set to pass validation
by Mapper HAL v2.1 and v3.0. Otherwise UI is missing and the following
message appears in the logcat:

```
2576 E GraphicBufferMapper: validateBufferSize(0xe663b3637400) failed: 7
2576 E hwc-drm-utils: Failed to import buffer handle err: 7
2576 E hwc-drm-two: Failed to import layer, ret=7
```

Also copy suballocs data for future usage.

Fixes: e3ed48d728aa ("drm_hwcomposer: Add Imagination platform support")
Signed-off-by: Roman Stratiienko <roman.stratiienko@globallogic.com>
4 years agodrm_hwcomposer: Remove redundant hotplug call
Roman Kovalivskyi [Thu, 21 Nov 2019 15:15:02 +0000 (17:15 +0200)]
drm_hwcomposer: Remove redundant hotplug call

Initial hotplug state is reported back during callback registration,
but during VTS tests we've noticed error that is caused by calling
hotplug with same display twice.

HandleInitialHotplugState calls hotplug function for each connected
display, so it covers HWC_DISPLAY_PRIMARY too, therefore first call
should be removed, as it is redundant and causes minor error.

Signed-off-by: Roman Kovalivskyi <roman.kovalivskyi@globallogic.com>
4 years agodrm_hwcomposer: Add check to vsync routine to avoid crash on callback
Roman Kovalivskyi [Fri, 3 Jan 2020 18:26:45 +0000 (20:26 +0200)]
drm_hwcomposer: Add check to vsync routine to avoid crash on callback

Vsync could be disabled during routine being running and this could
potentially lead to crash on callback invocation. Crash happens if
VSyncControl(false) was called when Routine has cached callback and
unlocked mutex but haven't callback yet. At this point we can't be
sure that callback is still valid so invoking it is incorrect
behaviour.

Second check if vsync is enabled drastically shortens window when we
could go into invalid state, from the whole vblank invocation to
several machine instructions between check and invocation.

Please note that we can't check against cached value in this case,
therefore operations on this flag should be atomic instead.

Signed-off-by: Roman Kovalivskyi <roman.kovalivskyi@globallogic.com>
4 years agodrm_hwcomposer: Add GetDisplayCapabilities and getDisplayIdentificationData
Lowry Li (Arm Technology China) [Wed, 18 Dec 2019 06:28:22 +0000 (14:28 +0800)]
drm_hwcomposer: Add GetDisplayCapabilities and getDisplayIdentificationData

Implement GetDisplayCapabilities() to get a list of supported capabilities.
The drm core doesn't support layer CTM property yet and CRTC not having the
CTM property member neither. So for this patch, we just return 0 for now.
It can fix the segment fault while booting the Android on HWC2.3, caused by
lack of this API.

Implement getDisplayIdentificationData() to get the EDID blob data
along with the size and port.
Add edid property in DrmConnector.

Signed-off-by: Lowry Li (Arm Technology China) <lowry.li@arm.com>
4 years agodrm_hwcomposer: Extract ConvertBoInfo() from ImportBuffer() method
Roman Stratiienko [Fri, 6 Dec 2019 10:30:28 +0000 (12:30 +0200)]
drm_hwcomposer: Extract ConvertBoInfo() from ImportBuffer() method

To check either BO could be imported on validation stage, we need to
get more information regarding buffer (format, size, etc.)

This extraction also allows us to make ImportBuffer() and CanImport()
methods generic for all platforms.

In case BO can't be imported due to already existant checks in ImportBuffer(),
validator only marks single layer to be elaborated by GPU instead of whole
composition.

Signed-off-by: Roman Stratiienko <roman.stratiienko@globallogic.com>
4 years agodrm_hwcomposer: Choose client layer range to achieve minimal GPU load
Roman Stratiienko [Fri, 13 Dec 2019 17:28:56 +0000 (19:28 +0200)]
drm_hwcomposer: Choose client layer range to achieve minimal GPU load

1. Allow CLIENT layer at any position.
2. Check all possible layer combination and choose most efficient
   based on total pixel operations value.

Use case 1 - Layer count is greater than available planes
Table shows difference before and after this commit for 4 or 2 planes cases:

```
z_order   layer      size        pixels  before(4)  after(4) before(2) after(2)
-
0         Wallpaper  1960x1080   2MiP    CLIENT     DEVICE   CLIENT    DEVICE
1         Launcher   1960x1080   2MiP    CLIENT     DEVICE   CLIENT    CLIENT
2         Status bar 1960x80     0.15MiP DEVICE     DEVICE   CLIENT    CLIENT
3         Nav. bar   1960x80     0.15MiP DEVICE     CLIENT   CLIENT    CLIENT
4         Cursor     24x24       576P    DEVICE     CLIENT   DEVICE    CLIENT

Total pixels merged by CLIENT (GPU)      4MiP  ->   0.15MiP  4.3MiP -> 2.3MiP
```

Use case 2 - Unsupported layer type in the middle (Dim layer, etc):
Table shows difference before and after this commit for 4 or 2 planes cases:

```
z_order   layer      size        pixels  before(4)  after(4) before(2) after(2)
-
0         App        1960x1080   2MiP    CLIENT     DEVICE   CLIENT    DEVICE
1         Status bar 1960x80     0.15MiP CLIENT     DEVICE   CLIENT    CLIENT
2         Nav. bar   1960x80     0.15MiP CLIENT     DEVICE   CLIENT    CLIENT
3         Dim layer  1960x1080   2MiP    CLIENT     CLIENT   CLIENT    CLIENT
4         Dialog     1000x500    0.5MiP  DEVICE     CLIENT   DEVICE    CLIENT

Total pixels merged by CLIENT (GPU)      4.3MiP ->  2.5MiP   4.3MiP -> 2.8MiP
```

Signed-off-by: Roman Stratiienko <roman.stratiienko@globallogic.com>
4 years agodrm_hwcomposer: Add simplistic SetColorTransform implementation
Roman Kovalivskyi [Wed, 11 Dec 2019 17:09:51 +0000 (19:09 +0200)]
drm_hwcomposer: Add simplistic SetColorTransform implementation

VTS tests for SET_COLOR_TRANSFORM fails for now since
SetColorTransform is marked as unsupported function. this commit tries
to address this issue. We can't make complete implementation of those
features for our platform for now, so we'd just save arguments for
future use and force client composition if any color transformation is
requested. This is perfectly acceptable way to pass VTS testcase for
SET_COLOR_TRANSFORM.

Commit da5839cf9258 ("drm_hwcomposer: Add support for GetColorModes &
SetCursorPosition") implements GetColorModes and SetCursorPosition
simply by adding fields that store this values for future
uses. Therefore we assume that it is okay to use this approach to at
least support interface part.

Please note that if transform hint is identity then no
transformation should be applied. If hint is arbitrary matrix then
given matrix should be applier after composition, though for now we'd
just force client composition instead. This behavior is required by
HAL interface as stated in
hardware/interfaces/graphics/composer/2.1/IComposerClient.hal, line
738 from repository
https://android.googlesource.com/platform/hardware/interfaces, tag
android-10.0.0_r14

Please note that color transform matrix argument is an array that has
16 elements by contract, as it is 4x4 matrix. This is why
MATRIX_SIZE has such value.

Signed-off-by: Roman Kovalivskyi <roman.kovalivskyi@globallogic.com>
4 years agodrm_hwcomposer: Add simplistic SetLayerColor implementation
Roman Kovalivskyi [Wed, 11 Dec 2019 15:48:44 +0000 (17:48 +0200)]
drm_hwcomposer: Add simplistic SetLayerColor implementation

VTS tests for SET_LAYER_COLOR fails for now since SetLayerColor is
unsupported function. Tis commit tries to address this issue. We can't
fully implement it for now, therefore simplistic implementation that
just saves argument for future uses and satisfies the interface could
be used instead, for now.

Commit da5839cf9258 ("drm_hwcomposer: Add support for GetColorModes &
SetCursorPosition") implements GetColorModes and SetCursorPosition in
the same fashion, simply by adding fields that store this values for
future uses, therefore we assume that it is okay to use this approach
here too.

Signed-off-by: Roman Kovalivskyi <roman.kovalivskyi@globallogic.com>
4 years agodrm_hwcomposer: Add refcount for GEM handle
Vincent Donnefort [Fri, 2 Aug 2019 10:18:35 +0000 (11:18 +0100)]
drm_hwcomposer: Add refcount for GEM handle

The linux kernel doesn't provide reference counting for the handle
returned by FD_TO_HANDLE ioctl. It means that if the same Gralloc buffer
is imported twice, the first GEM_CLOSE will destroy the handle even if it
is still in use by another import.

Remedy this issue by doing the reference counting directly in the DRM
generic platform support: ImportHandle() will increase the reference,
while ReleaseHandle() will decrease and close it, if necessary.

Signed-off-by: Vincent Donnefort <vincent.donnefort@arm.com>
4 years agodrm_hwcomposer: Introduce dumpsys metrics
Roman Stratiienko [Thu, 28 Nov 2019 15:51:16 +0000 (17:51 +0200)]
drm_hwcomposer: Introduce dumpsys metrics

To make optimal performance/power consumption ratio we want to use composing by
dedicated hardware to merge as much as possible composition cases.
We are going to continuously optimize and improve drm_hwcomposer HAL, that
makes high demand on formal validation process.

Introduce "pixel operation" definition. It should be in direct ratio with power
consumption, but currently it roughly calculated as sum of pixels merged by
each layer.
In some future we should apply some average gains depending of operation type
to calculate pixops more precisely. (e.g. scaling should take more pixops than
blending, and blending should take more that copying, etc.).
Using pixops could be very helpful when drm_hwc HAL have a choice which layer
sets to merge by GPU, making possible minimal energy model based planning.

Create statistics of the following events:
1. Total frames count
2. Total pixel operations
3. Pixel operations validated to use GPU (CLIENT)
4. Calculate composer efficiency: DEVICE/TOTAL operations ratio
5. Failed atomic validation commits count
6. Failed atomic presenting commits count

Usage:
 - $ adb shell dumpsys SurfaceFlinger
Statistics will be shown at the end of the dump in 2 forms:
1. Since system launched
2. Since last dumpsys command called

Using statistics for the regression slope monitoring example:
1. Boot the board without the change
2. Use touch or keyboard (avoid using of mouse pointer) to do some predefined
actions (open application, start video, etc.)
3. Save the metrics
4. Boot the board with the change
5. Do exactly the same actions as in (2)
6. Save the metrics
7. Use metrics before and after change to indicate regression slope

Signed-off-by: Roman Stratiienko <roman.stratiienko@globallogic.com>
4 years agodrm_hwcomposer: Fix returned fence in PresentDisplay
Matteo Franchin [Tue, 3 Dec 2019 17:10:38 +0000 (17:10 +0000)]
drm_hwcomposer: Fix returned fence in PresentDisplay

DrmHwcTwo::HwcDisplay::PresentDisplay was always returning -1 as the
present fence. This commits ensures the fence fd is correctly retrieved
after doing the commit-frame operation. It also updates outdated logic
that caused PresentDisplay to return the retire fence rather than the
present fence.

DrmHwcTwo::HwcDisplay::AddFenceToPresentFence is also changed so that
it assumes it is given ownership of the file descriptor it receives as
argument. This function was indeed called consistently with this
behaviour, which meant the dup led to leakage of file descriptors.

With the changes above this patch fixes a failure in the CTS test
dEQP-VK.wsi.android.display_timing.fifo.display_timing (for example
running Android 10 on HiKey960). The test failed with the error
"Unexpectedly received invalid timestamp." reported multiple times in
the logcat output.

Change-Id: If662e5239895b8b0e2ea31fd99747855f901a427
Signed-off-by: Matteo Franchin <matteo.franchin@arm.com>
4 years agodrm_hwcomposer: Add safe guard for unknown connector type
Roman Kovalivskyi [Mon, 25 Nov 2019 17:17:53 +0000 (19:17 +0200)]
drm_hwcomposer: Add safe guard for unknown connector type

There is potential possibility that new connector type will be added
into DRM and it won't be handled by drm_hwcomposer immediately so it's
better to be safe and report error via logcat than crash with
out-of-bounds.

Signed-off-by: Roman Kovalivskyi <roman.kovalivskyi@globallogic.com>
4 years agodrm_hwcomposer: Fix compilation issues with Android 9
Roman Kovalivskyi [Mon, 25 Nov 2019 17:13:05 +0000 (19:13 +0200)]
drm_hwcomposer: Fix compilation issues with Android 9

It appears that class template argument deduction is unavailable on
all target platform compilers, therefore it would be better to come
back to explicit template parameters.

Signed-off-by: Roman Kovalivskyi <roman.kovalivskyi@globallogic.com>
4 years agodrm_hwcomposer: Fix missing definition build error on P and earlier
Roman Stratiienko [Wed, 27 Nov 2019 17:23:03 +0000 (19:23 +0200)]
drm_hwcomposer: Fix missing definition build error on P and earlier

DRM_FORMAT_INVALID was introduced after libdrm-2.4.94, and does not exists in
Android-P and earlier.

Fixes: f63726cabf3f ("drm_hwcomposer: avoid using signed errno on uint32 type")
Signed-off-by: Roman Stratiienko <roman.stratiienko@globallogic.com>
4 years agodrm_hwcomposer: Add property hwc.drm.primary_display_order
Roman Kovalivskyi [Mon, 4 Nov 2019 15:54:31 +0000 (17:54 +0200)]
drm_hwcomposer: Add property hwc.drm.primary_display_order

There are cases when primary display lookup order should be
overriden. This could be achieved with adding system property
hwc.drm.primary_display_order.

Example of primary_display_order property usage:
hwc.drm.primary_display_order=HDMI-A-2,HDMI-A-1,...

This means that first priority goes to HDMI-A-2 connector, then
HDMI-A-1 connector, then everything else. Internal connectors have
higher priority than any other connectors not mentioned in property.

Connected connector with highest priority would be selected as a
primary display.

Signed-off-by: Roman Kovalivskyi <roman.kovalivskyi@globallogic.com>
4 years agodrm_hwcomposer: Add DrmConnector::name function
Roman Kovalivskyi [Mon, 4 Nov 2019 15:43:40 +0000 (17:43 +0200)]
drm_hwcomposer: Add DrmConnector::name function

Connectors usually are referred by names, but libdrm stores type and
id only as a numbers so for more convenience conversion function from
integerst to string should be added.

Signed-off-by: Roman Kovalivskyi <roman.kovalivskyi@globallogic.com>
4 years agodrm_hwcomposer: Apply same logic for 'CURSOR' layers as for 'DEVICE'
Roman Stratiienko [Fri, 8 Nov 2019 15:16:11 +0000 (17:16 +0200)]
drm_hwcomposer: Apply same logic for 'CURSOR' layers as for 'DEVICE'

Cursor usually is most top layer. Since it validates as CLIENT, it causes
remain layers to be validated as CLIENT, resulting performance dropping.

Signed-off-by: Roman Stratiienko <roman.stratiienko@globallogic.com>
4 years agodrm_hwcomposer: Fix mixed layer composition
Roman Stratiienko [Wed, 20 Nov 2019 23:58:35 +0000 (01:58 +0200)]
drm_hwcomposer: Fix mixed layer composition

Fix cases when mixed layer composition require non-device layer in the middle:

'''
Layer z_order - SF type    - validated type before - validated type fixed
            0 - DEVICE     - CLIENT                - CLIENT
            1 - DEVICE     - DEVICE                - CLIENT
            2 - DEVICE     - DEVICE                - CLIENT
            3 - SOLIDCOLOR - CLIENT                - CLIENT
            4 - DEVICE     - DEVICE                - DEVICE
'''

In such composition SF will merge layers 0 and 3 and hwcomposer will
merge <SF>,1,2,4 that results incorrect merging order.

Issue was observed on the rcar3 (imagination importer), db845c and allwinner H3
(Generic importer) platforms.
Reproduces with compositions that requires 'cursor' or 'dim' layers.
How to reproduce:
 1. Connect USB mouse when on home screen, you should see mouse cursor
    under icons (Tested with Launcher3QuickStep desktop)
 2. Go to Settings -> WIFI -> Connect to the AP, then you should see
    password dialog under AP list.

Solution:
1. Mark intermediate layers as CLIENT to ensure CLIENT section is in range
from bottom layer to most top CLIENT layer.

2. Use this layer composition to validate if DRM can handle it.

Signed-off-by: Roman Stratiienko <roman.stratiienko@globallogic.com>
4 years agodrm_hwcomposer: Add Imagination platform support
Roman Stratiienko [Thu, 17 Oct 2019 14:42:36 +0000 (17:42 +0300)]
drm_hwcomposer: Add Imagination platform support

External Android.bp file should be created in order to build this module:
```
cc_library_shared {
    name: "hwcomposer.drm_imagination",
    defaults: ["hwcomposer.drm_defaults"],
    srcs: [":drm_hwcomposer_platformimagination"],
    whole_static_libs: ["drm_hwcomposer"],
    shared_libs: ["libion"],
    include_dirs: [
        "path/to/imgtec/include/files",
    ],
}
```
libion is needed to make ion.h header visible `linux/ion.h`.

Signed-off-by: Roman Stratiienko <roman.stratiienko@globallogic.com>
4 years agodrm_hwcomposer: avoid using signed errno on uint32 type
Roman Stratiienko [Wed, 6 Nov 2019 13:03:12 +0000 (15:03 +0200)]
drm_hwcomposer: avoid using signed errno on uint32 type

DrmGenericImporter::ConvertHalFormatToDrm() should not return negative values.

 - Use DRM_FORMAT_INVALID instead of -EINVAL
 - Check DrmGenericImporter::ConvertHalFormatToDrm() result value in
   DrmGenericImporter::ImportBuffer()

Signed-off-by: Roman Stratiienko <roman.stratiienko@globallogic.com>
4 years agodrm_hwcomposer: HWC2: Handle bad layer_handle
Vincent Donnefort [Wed, 9 Oct 2019 14:43:43 +0000 (15:43 +0100)]
drm_hwcomposer: HWC2: Handle bad layer_handle

HWC2 can issue a command with an incorrect layer handle. Making sure a such
error is caught with the expected HWC2 error code BadLayer

This can be verified with the VTS test:

  * GraphicsComposerHidlTest.DestroyLayerBadLayerError

Signed-off-by: Vincent Donnefort <vincent.donnefort@arm.com>
4 years agodrm_hwcomposer: HWC2: Handle bad display_handle
Vincent Donnefort [Wed, 9 Oct 2019 13:23:42 +0000 (14:23 +0100)]
drm_hwcomposer: HWC2: Handle bad display_handle

HWC2 can issue a command with an incorrect display handle. Making sure a such
error is caught with the right HWC2 error code BadDisplay.

This can be verified with the VTS tests:

  * GraphicsComposerHidlTest.DestroyLayerBadDisplay
  * GraphicsComposerHidlTest.CreateLayerBadDisplay
  * GraphicsComposerHidlTest.GetActiveConfigBadDisplay

Signed-off-by: Vincent Donnefort <vincent.donnefort@arm.com>
4 years agodrm_hwcomposer: HWC2: Align SetColorMode Error with Android VTS
Vincent Donnefort [Wed, 9 Oct 2019 14:53:56 +0000 (15:53 +0100)]
drm_hwcomposer: HWC2: Align SetColorMode Error with Android VTS

Android VTS tests expect to get BadParameter error for an unknown color
mode.

Signed-off-by: Vincent Donnefort <vincent.donnefort@arm.com>
4 years agodrm_hwcomposer: HWC2: Align SetPowerMode Errors with Android VTS
Vincent Donnefort [Wed, 9 Oct 2019 10:39:28 +0000 (11:39 +0100)]
drm_hwcomposer: HWC2: Align SetPowerMode Errors with Android VTS

Android VTS tests expect to get Unsupported error for Doze and DozeSuspend
modes and BadParameter for the rest.

Signed-off-by: Vincent Donnefort <vincent.donnefort@arm.com>
4 years agodrm_hwcomposer: platformmeson: fix AFBC 32x8 feature support
Neil Armstrong [Thu, 10 Oct 2019 09:35:57 +0000 (09:35 +0000)]
drm_hwcomposer: platformmeson: fix AFBC 32x8 feature support

Since MALI_GRALLOC_INTFMT_AFBC_BASIC is mandatory even
to enable 32x8 block size, do not OR 32x8 and 16x16
overwise the final modifier will be invalid.

Change-Id: Ifa20a29e9c012b8ce0ec598d76e26514a61b52c8
Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
4 years agodrm_hwcomposer: add LCD panel support
Mykhailo Sopiha [Thu, 11 Jul 2019 11:31:09 +0000 (14:31 +0300)]
drm_hwcomposer: add LCD panel support

This commit adds support for LCD panel as internal
connector.

Change-Id: Iccb96526ee11bc4a9b53fc8dcd9ba0ea218d41b6
Signed-off-by: Mykhailo Sopiha <mykhailo.sopiha@linaro.org>
4 years agodrm_hwcomposer: add non hwfb import filter
Mykhailo Sopiha [Mon, 8 Jul 2019 15:28:56 +0000 (18:28 +0300)]
drm_hwcomposer: add non hwfb import filter

This patch adds non hwfb filter to generic drm importer
with additional property "hwc.drm.exclude_non_hwfb_imports".
By default this is set to false, and no logic changes are
happening. On setting this option to 1 the filter is being
activated on Init() function.

Change-Id: I7a718a66cb6214c051335a4589d60b5833e5c545
Signed-off-by: Mykhailo Sopiha <mykhailo.sopiha@linaro.org>
5 years agodrm_hwcomposer: pre-filter modes provided to HWC2
Neil Armstrong [Thu, 20 Jun 2019 09:00:21 +0000 (09:00 +0000)]
drm_hwcomposer: pre-filter modes provided to HWC2

Currently LocalDisplayAdapter in AOSP filters out similar modes based
on their currently limited supported attributes: width/height/refresh.

This leads to a situation where important modes are discarded, like the
preferred mode and/or the active mode, leading SurfaceFlinger to select
an unwanted and potentially invalid  mode in the list provided by
drm-hwcomposer to HWC2.

Let's pre-filter the modes provided to HWC2 by :
- systematically adding the preferred mode
- systematically adding the current active mode, if different
  from preferred mode
- keeping the interlaced modes filtering-out if no other non-interlace
  modes with same widthXheight exists (for HD-Ready 1080i TVs or CVBS)
- discarding modes if a similar mode with same widthXheight@refresh was
  already selected for HWC2

This mimics the behavior of LocalDisplayAdapter filtering algorithm,
but keeps the important modes from the DRM Point Of View and drops the
duplicate modes while keeping the mode ordering from DRM in account.

This local filtering should ultimately go out when HWC2 can actually
handle mode Attributes to describe Preferred mode, Interlaced, 3D...
and LocalDisplayAdapter uses these Attributes for filtering duplicate
modes.

Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
Tested-by: John Stultz <john.stultz@linaro.org>
5 years agodrm_hwcomposer: Organize files into subdirs
Sean Paul [Tue, 2 Apr 2019 20:57:20 +0000 (16:57 -0400)]
drm_hwcomposer: Organize files into subdirs

This is way overdue

Signed-off-by: Sean Paul <seanpaul@chromium.org>
Change-Id: I1bcbd8fdb0bb03feafd76bc41f6f11c03cdf9c25

5 years agodrm_hwcomposer: Add platformmeson for Amlogic SoC support
Neil Armstrong [Thu, 25 Apr 2019 15:17:22 +0000 (15:17 +0000)]
drm_hwcomposer: Add platformmeson for Amlogic SoC support

This specific platform handler is dedicated for the Amlogic SoC,
and more precisely for the Amlogic G12A family.

OpenGL/Mali allocation is done via a slightly modified ARM Gralloc
module, thus needing a custom platform handler to handle the custom
private_handle_t structure.

This platformmeson is based on platformhisi without the AFBC YUV
management (not handled by the Amlogic SoCs).

Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
Change-Id: I1a1d20b0a84b0e17aa3417c8e9633712f258523d

5 years agodrm_hwcomposer: Drop modes with DRM_MODE_FLAG_INTERLACE to HWC2
Neil Armstrong [Tue, 4 Jun 2019 14:48:02 +0000 (14:48 +0000)]
drm_hwcomposer: Drop modes with DRM_MODE_FLAG_INTERLACE to HWC2

HWC2 has currently no support for interlaced modes, and will conflict
with non-interlaced modes for now.

Drop them in DrmHwcTwo::HwcDisplay::GetDisplayConfigs(), correctly
handling the two phase calls to GetDisplayConfigs() giving a valid
num_configs without the interlaced modes.

Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
5 years agodrm_hwcomposer: clean Importer inherited classes
Mykhailo Sopiha [Thu, 6 Jun 2019 11:45:27 +0000 (14:45 +0300)]
drm_hwcomposer: clean Importer inherited classes

Move some common logic from Importer class implementations
into DrmGenericImporter class:
 - reused generic constructors and destructors for derived
   classes
 - formed common Init() logic for all derived classes
 - removed unused gralloc_ and drm_ variables from derived
   classes
 - made drm_ protected for base class to be reused in derived

Signed-off-by: Mykhailo Sopiha <mykhailo.sopiha@linaro.org>
5 years agodrm_hwcomposer: recalculate vrefresh from clock + resolution
Neil Armstrong [Tue, 4 Jun 2019 14:37:51 +0000 (14:37 +0000)]
drm_hwcomposer: recalculate vrefresh from clock + resolution

For DMT modes and HDMI modes with 1000/1001 variations, the kernel
reports the vrefresh in integer, rounded up, thus 59.94Hz or 23.97Hz
are reported as 60Hz and 24Hz to userspace.

To solve this, recalculate the vrefresh from clock + resolution.

Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
5 years agodrm_hwcomposer: platformhisi: extend conditional of AFBC support
Victor Chong [Thu, 11 Apr 2019 05:23:28 +0000 (06:23 +0100)]
drm_hwcomposer: platformhisi: extend conditional of AFBC support

The AFBC modifiers in [1] are defined in aosp bionic's drm headers only
if it has been updated to v4.19 kernel headers [2]. If the version used
is older, drm_hwcomposer build will fail, so we extend the conditional
of the AFBC logic to include one of these modifiers.

[1] cc5fca4f ("drm_hwcomposer: Add support for Arm Framebuffer Compression (AFBC) modifiers.")
[2] https://android.googlesource.com/platform/bionic/+/9ce28844db7cf80ee8cf7c88dab23b666eaab739

Signed-off-by: Victor Chong <victor.chong@linaro.org>
5 years agodrm_hwcomposer: Move hwcomposer.drm_hikey and hwcomposer.drm_hikey960
Colin Cross [Fri, 29 Mar 2019 17:27:23 +0000 (10:27 -0700)]
drm_hwcomposer: Move hwcomposer.drm_hikey and hwcomposer.drm_hikey960

Prevent external/drm_hwcomposer from referencing device/linaro/hikey,
which may not exist in all trees, by compiling most of drm_hwcomposer
as a static library and then compiling just the source files that
are affected by device-specific #defines and #includes in
device/linary/hikey/gralloc*.

Fixes: 129543119
Test: m hwcomposer.drm_hikey hwcomposer.drm_hikey960 MODULES-IN-external-drm_hwcomposer
Change-Id: I800b147a40c4e368ce1a74273728f5941f6b63c4
Signed-off-by: Colin Cross <ccross@android.com>
Signed-off-by: John Stultz <john.stultz@linaro.org>
5 years agodrm_hwcomposer: Convert external/drm_hwcomposer to Android.bp
Colin Cross [Fri, 22 Mar 2019 20:13:12 +0000 (13:13 -0700)]
drm_hwcomposer: Convert external/drm_hwcomposer to Android.bp

See build/soong/README.md for more information.

This replaces the product and BoardConfig.mk variable conditionals
with different versions of the HAL for each product, which will
also allow checkbuild to verify that they build even on products
that don't use them.

Fixes: 122332597
Test: mma
Change-Id: I8d2c8ac1bb58dcbc81ae75c2bb2c97d4485909b4
Signed-off-by: Colin Cross <ccross@android.com>
Signed-off-by: John Stultz <john.stultz@linaro.org>
5 years agodrm_hwcomposer: Remove unnecessary parentheses in the conditional
John Stultz [Thu, 28 Mar 2019 22:18:53 +0000 (15:18 -0700)]
drm_hwcomposer: Remove unnecessary parentheses in the conditional

As requested by Sean, remove unnecessary parens around the
!preferred_mode_found check.

Change-Id: Ibca46c104ab54be894b860373fc42ec047afd337
Signed-off-by: John Stultz <john.stultz@linaro.org>
5 years agodrm_hwcomposer: Tweak mode selection to pick the first DRM_MODE_TYPE_PREFERRED mode
John Stultz [Wed, 27 Mar 2019 04:11:31 +0000 (21:11 -0700)]
drm_hwcomposer: Tweak mode selection to pick the first DRM_MODE_TYPE_PREFERRED mode

With commit 1b1e35eb ("drm_hwcomposer: Chose preferred mode with
type DRM_MODE_TYPE_PREFERRED"), we now pick a preferred mode
rather then just the first mode to use.

However, on some systems there may erroniously be multiple modes
marked as DRM_MODE_TYPE_PREFERRED. In this case, the logic added
in that commit ends up selecting the *last* preferred mode.

This seems less likely to be the desired choice, compared to
what we had before (which picked first mode provided).

So this patch alters the selection logic to only use the first
DRM_MODE_TYPE_PREFERRED mode found, rather than the last.

Change-Id: Ieb3e5d946b96099f14c1c5a287ca8113360a39d1
Signed-off-by: John Stultz <john.stultz@linaro.org>
5 years agoRevert "drm_hwcomposer: platformgeneric: Fix build"
Sean Paul [Tue, 19 Mar 2019 16:47:35 +0000 (12:47 -0400)]
Revert "drm_hwcomposer: platformgeneric: Fix build"

This reverts commit 112903781ca34a39320d99bc68bd9f971182aa27.

Per discussion in !47 [1], this is not needed.

Signed-off-by: Sean Paul <seanpaul@chromium.org>
[1]- https://gitlab.freedesktop.org/drm-hwcomposer/drm-hwcomposer/merge_requests/47

5 years agodrm_hwcomposer: Set zpos relative to the minimum possible value
Alexandru Gheorghe [Tue, 8 Jan 2019 17:21:08 +0000 (19:21 +0200)]
drm_hwcomposer: Set zpos relative to the minimum possible value

Current implementation doesn't handle properly the cases where zpos
range starts from 1.
See https://gitlab.freedesktop.org/drm-hwcomposer/drm-hwcomposer/issues/19#note_100622

Fixes: ea1c5e5a ("drm_hwcomposer: Add z order support")

Signed-off-by: Alexandru Gheorghe <alexc.g1.ro@gmail.com>
[seanpaul converted to std::tuple return type]
Signed-off-by: Sean Paul <seanpaul@chromium.org>
Change-Id: I35dc2c1cfd0e38ca3a47cf4e668eeb5f3c470ddb

5 years agodrm_hwcomposer: Rename DrmProperty::immutable()
Sean Paul [Wed, 13 Mar 2019 18:36:52 +0000 (14:36 -0400)]
drm_hwcomposer: Rename DrmProperty::immutable()

To be a little more precise, add an 'is_' prefix

Change-Id: Idd8fe45a4dfba1cd778b4ed6b761ec489697c31a
Signed-off-by: Sean Paul <seanpaul@chromium.org>
5 years agodrm_hwcomposer: Change return type of DrmProperty::value() to tuple
Sean Paul [Wed, 6 Mar 2019 14:48:42 +0000 (09:48 -0500)]
drm_hwcomposer: Change return type of DrmProperty::value() to tuple

To keep consistent with other functions

Change-Id: I11ba07eabcee08f3db09b3a5422bc480482a62c1
Signed-off-by: Sean Paul <seanpaul@chromium.org>
5 years agodrm_hwcomposer: Use proper commit for author/committer check
Sean Paul [Fri, 15 Mar 2019 19:18:46 +0000 (15:18 -0400)]
drm_hwcomposer: Use proper commit for author/committer check

The script uses the author/committer of HEAD instead of the commit it is
inspecting. This fails when a patch set has different authors/committers
(such as https://gitlab.freedesktop.org/drm-hwcomposer/drm-hwcomposer/merge_requests/46)

Change-Id: I0fcd724cf372fad435c7614777f13e015c204c3d
Signed-off-by: Sean Paul <seanpaul@chromium.org>
5 years agodrm_hwcomposer: platformgeneric: Fix build
Andrii Chepurnyi [Wed, 6 Mar 2019 13:01:59 +0000 (15:01 +0200)]
drm_hwcomposer: platformgeneric: Fix build

Propagate correct include path for gralloc_handle.h

Signed-off-by: Andrii Chepurnyi <andrii_chepurnyi@epam.com>
5 years agodrm_hwcomposer: Chose preferred mode with type DRM_MODE_TYPE_PREFERRED
Andrii Chepurnyi [Tue, 19 Feb 2019 19:38:13 +0000 (21:38 +0200)]
drm_hwcomposer: Chose preferred mode with type DRM_MODE_TYPE_PREFERRED

According to the Linux Kernel: "DRM_MODE_TYPE_PREFERRED: Preferred mode,
usually the native resolution of an LCD panel. There should only be
one preferred mode per connector at any given time."
Will use it during preferred mode choice.

Tested-by: John Stultz <john.stultz@linaro.org>
Signed-off-by: Andrii Chepurnyi <andrii_chepurnyi@epam.com>
5 years agodrm_hwcomposer: Added hotplug support of the external display
Andrii Chepurnyi [Wed, 1 Aug 2018 14:42:56 +0000 (17:42 +0300)]
drm_hwcomposer: Added hotplug support of the external display

Unplug of the main display will not work because of
Activity Manager code(ActivityStackSupervisor.java:handleDisplayRemoved).
Only one display can be connected as an external
display (see SurfaceFlinger::determineDisplayType).

Tested-by: John Stultz <john.stultz@linaro.org>
Signed-off-by: Andrii Chepurnyi <andrii_chepurnyi@epam.com>
5 years agodrm_hwcomposer: Fix VSYNC control
Andrii Chepurnyi [Fri, 27 Jul 2018 12:14:37 +0000 (15:14 +0300)]
drm_hwcomposer: Fix VSYNC control

Use HWC2_VSYNC_ENABLE for correct state recognition.

Tested-by: John Stultz <john.stultz@linaro.org>
Signed-off-by: Andrii Chepurnyi <andrii_chepurnyi@epam.com>
5 years agodrm_hwcomposer: Initialize buffer_ pointer to NULL
John Stultz [Thu, 28 Feb 2019 05:35:03 +0000 (21:35 -0800)]
drm_hwcomposer: Initialize buffer_ pointer to NULL

In some cases, we've seen drm_hwcomposer start to try to
compose frames before anything has called SetClientTarget().

This seems to be some sort of a race, which for some reason
we only see with certain dummy HDMI dongles (which provide
fake EDID data) which allow our lab machines to run headless.
I'm still trying to understand more about why this happens
only in this case.

The net of the issue is we see CreateComposition() being called,
which adds the client_layer_ to the zmap. Then it creates the
DrmHwcLayers copying the non-initialized buffer_ value as the
sf_handle.

This then later causes a crash in ImportBuffer() when we
traverse the non-null (but invalid) hnd value.

Thus, this patch simply initilizes the buffer_ pointer to NULL
so that we error out properly in the case of the race.

Reported-by: YongQin Liu <yongqin.liu@linaro.org>
Signed-off-by: John Stultz <john.stultz@linaro.org>
Change-Id: I5fde3fccde86519edb04e61cbc2842eda395ade4