diff options
author | Dennis Tsiang <dennis.tsiang@arm.com> | 2020-10-30 08:43:33 +0000 |
---|---|---|
committer | Dennis Tsiang <dennis.tsiang@arm.com> | 2020-11-02 08:25:13 +0000 |
commit | 3a5fb50648f390534a45de00b901d53722d0df6d (patch) | |
tree | bed6e000cd078a20d9fa45c2ccca1362f9fffaa8 | |
parent | add24cb745a35c4c80d1c49e8a6da5475136b051 (diff) | |
download | drm_hwcomposer-3a5fb50648f390534a45de00b901d53722d0df6d.tar.gz |
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>
-rw-r--r-- | bufferinfo/BufferInfoMapperMetadata.cpp | 103 | ||||
-rw-r--r-- | bufferinfo/BufferInfoMapperMetadata.h | 2 | ||||
-rw-r--r-- | drm/DrmGenericImporter.cpp | 13 | ||||
-rw-r--r-- | drm/DrmGenericImporter.h | 1 |
4 files changed, 116 insertions, 3 deletions
diff --git a/bufferinfo/BufferInfoMapperMetadata.cpp b/bufferinfo/BufferInfoMapperMetadata.cpp index 2725802..3aabeb5 100644 --- a/bufferinfo/BufferInfoMapperMetadata.cpp +++ b/bufferinfo/BufferInfoMapperMetadata.cpp @@ -39,9 +39,106 @@ BufferInfoGetter *BufferInfoMapperMetadata::CreateInstance() { return new BufferInfoMapperMetadata(); } -int BufferInfoMapperMetadata::ConvertBoInfo(buffer_handle_t /*handle*/, - hwc_drm_bo_t * /*bo*/) { - return -EINVAL; +/* The implementation below makes assumptions on the order and number of file + * descriptors that Gralloc places in the native_handle_t and as such it very + * likely needs to be adapted to match the particular Gralloc implementation + * used in the system. For this reason it is been declared as a weak symbol, + * so that it can be overridden. + */ +int __attribute__((weak)) +BufferInfoMapperMetadata::GetFds(buffer_handle_t handle, hwc_drm_bo_t *bo) { + int num_fds = handle->numFds; + + if (num_fds >= 1 && num_fds <= 2) { + if (IsDrmFormatRgb(bo->format)) { + bo->prime_fds[0] = handle->data[0]; + } else { + bo->prime_fds[0] = bo->prime_fds[1] = bo->prime_fds[2] = handle->data[0]; + } + if (bo->prime_fds[0] <= 0) { + ALOGE("Encountered invalid fd %d", bo->prime_fds[0]); + return android::BAD_VALUE; + } + + } else if (num_fds >= 3) { + bo->prime_fds[0] = handle->data[0]; + bo->prime_fds[1] = handle->data[1]; + bo->prime_fds[2] = handle->data[2]; + for (int i = 0; i < 3; i++) { + if (bo->prime_fds[i] <= 0) { + ALOGE("Encountered invalid fd %d", bo->prime_fds[i]); + return android::BAD_VALUE; + } + } + } + return 0; +} + +int BufferInfoMapperMetadata::ConvertBoInfo(buffer_handle_t handle, + hwc_drm_bo_t *bo) { + GraphicBufferMapper &mapper = GraphicBufferMapper::getInstance(); + if (!handle) + return -EINVAL; + + uint64_t usage = 0; + int err = mapper.getUsage(handle, &usage); + if (err) { + ALOGE("Failed to get usage err=%d", err); + return err; + } + bo->usage = static_cast<uint32_t>(usage); + + ui::PixelFormat hal_format; + err = mapper.getPixelFormatRequested(handle, &hal_format); + if (err) { + ALOGE("Failed to get HAL Pixel Format err=%d", err); + return err; + } + bo->hal_format = static_cast<uint32_t>(hal_format); + + err = mapper.getPixelFormatFourCC(handle, &bo->format); + if (err) { + ALOGE("Failed to get FourCC format err=%d", err); + return err; + } + + err = mapper.getPixelFormatModifier(handle, &bo->modifiers[0]); + if (err) { + ALOGE("Failed to get DRM Modifier err=%d", err); + return err; + } + bo->with_modifiers = true; + + uint64_t width = 0; + err = mapper.getWidth(handle, &width); + if (err) { + ALOGE("Failed to get Width err=%d", err); + return err; + } + bo->width = static_cast<uint32_t>(width); + + uint64_t height = 0; + err = mapper.getHeight(handle, &height); + if (err) { + ALOGE("Failed to get Height err=%d", err); + return err; + } + bo->height = static_cast<uint32_t>(height); + + std::vector<ui::PlaneLayout> layouts; + err = mapper.getPlaneLayouts(handle, &layouts); + if (err) { + ALOGE("Failed to get Plane Layouts err=%d", err); + return err; + } + + for (uint32_t i = 0; i < layouts.size(); i++) { + bo->modifiers[i] = bo->modifiers[0]; + bo->pitches[i] = layouts[i].strideInBytes; + bo->offsets[i] = layouts[i].offsetInBytes; + } + + return GetFds(handle, bo); } } // namespace android diff --git a/bufferinfo/BufferInfoMapperMetadata.h b/bufferinfo/BufferInfoMapperMetadata.h index 49c788a..d335705 100644 --- a/bufferinfo/BufferInfoMapperMetadata.h +++ b/bufferinfo/BufferInfoMapperMetadata.h @@ -27,6 +27,8 @@ class BufferInfoMapperMetadata : public BufferInfoGetter { int ConvertBoInfo(buffer_handle_t handle, hwc_drm_bo_t *bo) override; + int GetFds(buffer_handle_t handle, hwc_drm_bo_t *bo); + static BufferInfoGetter *CreateInstance(); }; } // namespace android diff --git a/drm/DrmGenericImporter.cpp b/drm/DrmGenericImporter.cpp index b4dc063..8ab4fe5 100644 --- a/drm/DrmGenericImporter.cpp +++ b/drm/DrmGenericImporter.cpp @@ -21,6 +21,7 @@ #include <cutils/properties.h> #include <gralloc_handle.h> #include <hardware/gralloc.h> +#include <inttypes.h> #include <log/log.h> #include <xf86drm.h> #include <xf86drmMode.h> @@ -28,6 +29,12 @@ namespace android { DrmGenericImporter::DrmGenericImporter(DrmDevice *drm) : drm_(drm) { + uint64_t cap_value = 0; + if (drmGetCap(drm_->fd(), DRM_CAP_ADDFB2_MODIFIERS, &cap_value)) { + ALOGE("drmGetCap failed. Fallback to no modifier support."); + cap_value = 0; + } + has_modifier_support_ = cap_value; } DrmGenericImporter::~DrmGenericImporter() { @@ -52,6 +59,12 @@ int DrmGenericImporter::ImportBuffer(hwc_drm_bo_t *bo) { } } + if (!has_modifier_support_ && bo->modifiers[0]) { + ALOGE("No ADDFB2 with modifier support. Can't import modifier %" PRIu64, + bo->modifiers[0]); + return -EINVAL; + } + if (!bo->with_modifiers) ret = drmModeAddFB2(drm_->fd(), bo->width, bo->height, bo->format, bo->gem_handles, bo->pitches, bo->offsets, &bo->fb_id, diff --git a/drm/DrmGenericImporter.h b/drm/DrmGenericImporter.h index efda6be..ca53762 100644 --- a/drm/DrmGenericImporter.h +++ b/drm/DrmGenericImporter.h @@ -65,6 +65,7 @@ class DrmGenericImporter : public Importer { private: int CloseHandle(uint32_t gem_handle); std::map<uint32_t, int> gem_refcount_; + bool has_modifier_support_; }; } // namespace android |