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 /bufferinfo | |
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>
Diffstat (limited to 'bufferinfo')
-rw-r--r-- | bufferinfo/BufferInfoMapperMetadata.cpp | 103 | ||||
-rw-r--r-- | bufferinfo/BufferInfoMapperMetadata.h | 2 |
2 files changed, 102 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 |