diff options
author | Roman Stratiienko <roman.o.stratiienko@globallogic.com> | 2022-02-21 13:03:29 +0200 |
---|---|---|
committer | Roman Stratiienko <roman.o.stratiienko@globallogic.com> | 2022-05-17 10:35:29 +0300 |
commit | e9fbd8d626a22b58efd6d600662a9341e664400e (patch) | |
tree | bcdd69d97a71b478c4b75da83c3ea266869fa1fe | |
parent | 1cbaaf9eeba7ba5421674ff5fb41174862b73866 (diff) |
drm_hwcomposer: Set return type to std::optional for BufferInfoGetters
This is a bit of code modernization. Further changes will require indication
that buffer_info is valid, and using std::optional is the most correct
approach to do that.
Signed-off-by: Roman Stratiienko <roman.o.stratiienko@globallogic.com>
-rw-r--r-- | bufferinfo/BufferInfoGetter.cpp | 10 | ||||
-rw-r--r-- | bufferinfo/BufferInfoGetter.h | 5 | ||||
-rw-r--r-- | bufferinfo/BufferInfoMapperMetadata.cpp | 42 | ||||
-rw-r--r-- | bufferinfo/BufferInfoMapperMetadata.h | 2 | ||||
-rw-r--r-- | bufferinfo/legacy/BufferInfoImagination.cpp | 26 | ||||
-rw-r--r-- | bufferinfo/legacy/BufferInfoImagination.h | 2 | ||||
-rw-r--r-- | bufferinfo/legacy/BufferInfoLibdrm.cpp | 33 | ||||
-rw-r--r-- | bufferinfo/legacy/BufferInfoLibdrm.h | 2 | ||||
-rw-r--r-- | bufferinfo/legacy/BufferInfoMaliHisi.cpp | 41 | ||||
-rw-r--r-- | bufferinfo/legacy/BufferInfoMaliHisi.h | 2 | ||||
-rw-r--r-- | bufferinfo/legacy/BufferInfoMaliMediatek.cpp | 24 | ||||
-rw-r--r-- | bufferinfo/legacy/BufferInfoMaliMediatek.h | 2 | ||||
-rw-r--r-- | bufferinfo/legacy/BufferInfoMaliMeson.cpp | 27 | ||||
-rw-r--r-- | bufferinfo/legacy/BufferInfoMaliMeson.h | 2 | ||||
-rw-r--r-- | bufferinfo/legacy/BufferInfoMinigbm.cpp | 31 | ||||
-rw-r--r-- | bufferinfo/legacy/BufferInfoMinigbm.h | 2 | ||||
-rw-r--r-- | drm/DrmPlane.cpp | 2 | ||||
-rw-r--r-- | hwc2_device/HwcDisplay.cpp | 11 | ||||
-rw-r--r-- | include/drmhwcomposer.h | 3 | ||||
-rw-r--r-- | utils/hwcutils.cpp | 13 |
20 files changed, 153 insertions, 129 deletions
diff --git a/bufferinfo/BufferInfoGetter.cpp b/bufferinfo/BufferInfoGetter.cpp index 57dc7f1..b42838d 100644 --- a/bufferinfo/BufferInfoGetter.cpp +++ b/bufferinfo/BufferInfoGetter.cpp @@ -49,15 +49,9 @@ BufferInfoGetter *BufferInfoGetter::GetInstance() { } bool BufferInfoGetter::IsHandleUsable(buffer_handle_t handle) { - BufferInfo bo{}; + auto bo = GetBoInfo(handle); - if (ConvertBoInfo(handle, &bo) != 0) { - return false; - } - if (bo.prime_fds[0] == 0) { - return false; - } - return true; + return bo && bo->prime_fds[0] != 0; } int LegacyBufferInfoGetter::Init() { diff --git a/bufferinfo/BufferInfoGetter.h b/bufferinfo/BufferInfoGetter.h index d86a5b4..4d35faa 100644 --- a/bufferinfo/BufferInfoGetter.h +++ b/bufferinfo/BufferInfoGetter.h @@ -20,6 +20,8 @@ #include <drm/drm_fourcc.h> #include <hardware/gralloc.h> +#include <optional> + #include "BufferInfo.h" #include "drm/DrmDevice.h" @@ -33,7 +35,8 @@ class BufferInfoGetter { public: virtual ~BufferInfoGetter() = default; - virtual int ConvertBoInfo(buffer_handle_t handle, BufferInfo *bo) = 0; + virtual auto GetBoInfo(buffer_handle_t handle) + -> std::optional<BufferInfo> = 0; bool IsHandleUsable(buffer_handle_t handle); diff --git a/bufferinfo/BufferInfoMapperMetadata.cpp b/bufferinfo/BufferInfoMapperMetadata.cpp index 70bd2da..bdacb74 100644 --- a/bufferinfo/BufferInfoMapperMetadata.cpp +++ b/bufferinfo/BufferInfoMapperMetadata.cpp @@ -86,55 +86,63 @@ BufferInfoMapperMetadata::GetFds(buffer_handle_t handle, BufferInfo *bo) { return 0; } -int BufferInfoMapperMetadata::ConvertBoInfo(buffer_handle_t handle, - BufferInfo *bo) { +auto BufferInfoMapperMetadata::GetBoInfo(buffer_handle_t handle) + -> std::optional<BufferInfo> { GraphicBufferMapper &mapper = GraphicBufferMapper::getInstance(); if (handle == nullptr) - return -EINVAL; + return {}; - int err = mapper.getPixelFormatFourCC(handle, &bo->format); + BufferInfo bi{}; + + int err = mapper.getPixelFormatFourCC(handle, &bi.format); if (err != 0) { ALOGE("Failed to get FourCC format err=%d", err); - return err; + return {}; } - err = mapper.getPixelFormatModifier(handle, &bo->modifiers[0]); + err = mapper.getPixelFormatModifier(handle, &bi.modifiers[0]); if (err != 0) { ALOGE("Failed to get DRM Modifier err=%d", err); - return err; + return {}; } uint64_t width = 0; err = mapper.getWidth(handle, &width); if (err != 0) { ALOGE("Failed to get Width err=%d", err); - return err; + return {}; } - bo->width = static_cast<uint32_t>(width); + bi.width = static_cast<uint32_t>(width); uint64_t height = 0; err = mapper.getHeight(handle, &height); if (err != 0) { ALOGE("Failed to get Height err=%d", err); - return err; + return {}; } - bo->height = static_cast<uint32_t>(height); + bi.height = static_cast<uint32_t>(height); std::vector<ui::PlaneLayout> layouts; err = mapper.getPlaneLayouts(handle, &layouts); if (err != 0) { ALOGE("Failed to get Plane Layouts err=%d", err); - return err; + return {}; } 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; - bo->sizes[i] = layouts[i].totalSizeInBytes; + bi.modifiers[i] = bi.modifiers[0]; + bi.pitches[i] = layouts[i].strideInBytes; + bi.offsets[i] = layouts[i].offsetInBytes; + bi.sizes[i] = layouts[i].totalSizeInBytes; + } + + err = GetFds(handle, &bi); + if (err != 0) { + ALOGE("Failed to get fds (err=%d)", err); + return {}; } - return GetFds(handle, bo); + return bi; } } // namespace android diff --git a/bufferinfo/BufferInfoMapperMetadata.h b/bufferinfo/BufferInfoMapperMetadata.h index 6ab29d3..ab269dc 100644 --- a/bufferinfo/BufferInfoMapperMetadata.h +++ b/bufferinfo/BufferInfoMapperMetadata.h @@ -25,7 +25,7 @@ class BufferInfoMapperMetadata : public BufferInfoGetter { public: using BufferInfoGetter::BufferInfoGetter; - int ConvertBoInfo(buffer_handle_t handle, BufferInfo *bo) override; + auto GetBoInfo(buffer_handle_t handle) -> std::optional<BufferInfo> override; int GetFds(buffer_handle_t handle, BufferInfo *bo); diff --git a/bufferinfo/legacy/BufferInfoImagination.cpp b/bufferinfo/legacy/BufferInfoImagination.cpp index 6823a74..1858ddb 100644 --- a/bufferinfo/legacy/BufferInfoImagination.cpp +++ b/bufferinfo/legacy/BufferInfoImagination.cpp @@ -29,22 +29,24 @@ namespace android { LEGACY_BUFFER_INFO_GETTER(BufferInfoImagination); -int BufferInfoImagination::ConvertBoInfo(buffer_handle_t handle, - BufferInfo *bo) { +auto BufferInfoImagination::GetBoInfo(buffer_handle_t handle) + -> std::optional<BufferInfo> { auto *hnd = (IMG_native_handle_t *)handle; if (!hnd) - return -EINVAL; + return {}; /* Extra bits are responsible for buffer compression and memory layout */ if (hnd->iFormat & ~0x10f) { ALOGV("Special buffer formats are not supported"); - return -EINVAL; + return {}; } - bo->width = hnd->iWidth; - bo->height = hnd->iHeight; - bo->prime_fds[0] = hnd->fd[0]; - bo->pitches[0] = ALIGN(hnd->iWidth, HW_ALIGN) * hnd->uiBpp >> 3; + BufferInfo bi{}; + + bi.width = hnd->iWidth; + bi.height = hnd->iHeight; + bi.prime_fds[0] = hnd->fd[0]; + bi.pitches[0] = ALIGN(hnd->iWidth, HW_ALIGN) * hnd->uiBpp >> 3; switch (hnd->iFormat) { #ifdef HAL_PIXEL_FORMAT_BGRX_8888 @@ -53,14 +55,14 @@ int BufferInfoImagination::ConvertBoInfo(buffer_handle_t handle, break; #endif default: - bo->format = ConvertHalFormatToDrm(hnd->iFormat & 0xf); - if (bo->format == DRM_FORMAT_INVALID) { + bi.format = ConvertHalFormatToDrm(hnd->iFormat & 0xf); + if (bi.format == DRM_FORMAT_INVALID) { ALOGV("Cannot convert hal format to drm format %u", hnd->iFormat); - return -EINVAL; + return {}; } } - return 0; + return bi; } } // namespace android diff --git a/bufferinfo/legacy/BufferInfoImagination.h b/bufferinfo/legacy/BufferInfoImagination.h index 4066d11..635e3b5 100644 --- a/bufferinfo/legacy/BufferInfoImagination.h +++ b/bufferinfo/legacy/BufferInfoImagination.h @@ -27,7 +27,7 @@ class BufferInfoImagination : public LegacyBufferInfoGetter { public: using LegacyBufferInfoGetter::LegacyBufferInfoGetter; - int ConvertBoInfo(buffer_handle_t handle, BufferInfo *bo) override; + auto GetBoInfo(buffer_handle_t handle) -> std::optional<BufferInfo> override; }; } // namespace android diff --git a/bufferinfo/legacy/BufferInfoLibdrm.cpp b/bufferinfo/legacy/BufferInfoLibdrm.cpp index 3bea3f2..ac71ec0 100644 --- a/bufferinfo/legacy/BufferInfoLibdrm.cpp +++ b/bufferinfo/legacy/BufferInfoLibdrm.cpp @@ -162,13 +162,16 @@ bool BufferInfoLibdrm::GetYuvPlaneInfo(uint32_t hal_format, int num_fds, return true; } -int BufferInfoLibdrm::ConvertBoInfo(buffer_handle_t handle, BufferInfo *bo) { +auto BufferInfoLibdrm::GetBoInfo(buffer_handle_t handle) + -> std::optional<BufferInfo> { gralloc_handle_t *gr_handle = gralloc_handle(handle); if (!gr_handle) - return -EINVAL; + return {}; + + BufferInfo bi{}; - bo->width = gr_handle->width; - bo->height = gr_handle->height; + bi.width = gr_handle->width; + bi.height = gr_handle->height; #if GRALLOC_HANDLE_VERSION < 4 static std::once_flag once; @@ -178,34 +181,34 @@ int BufferInfoLibdrm::ConvertBoInfo(buffer_handle_t handle, BufferInfo *bo) { }); #endif #if GRALLOC_HANDLE_VERSION == 4 - bo->modifiers[0] = gr_handle->modifier; + bi.modifiers[0] = gr_handle->modifier; #endif - bo->prime_fds[0] = gr_handle->prime_fd; + bi.prime_fds[0] = gr_handle->prime_fd; if (is_yuv(gr_handle->format)) { - if (!GetYuvPlaneInfo(gr_handle->format, handle->numFds, handle, bo)) - return -EINVAL; + if (!GetYuvPlaneInfo(gr_handle->format, handle->numFds, handle, &bi)) + return {}; } else { - bo->pitches[0] = gr_handle->stride; - bo->offsets[0] = 0; + bi.pitches[0] = gr_handle->stride; + bi.offsets[0] = 0; /* 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. */ switch (gr_handle->format) { case HAL_PIXEL_FORMAT_RGB_565: - bo->format = DRM_FORMAT_RGB565; + bi.format = DRM_FORMAT_RGB565; break; default: - bo->format = ConvertHalFormatToDrm(gr_handle->format); + bi.format = ConvertHalFormatToDrm(gr_handle->format); } - if (bo->format == DRM_FORMAT_INVALID) - return -EINVAL; + if (bi.format == DRM_FORMAT_INVALID) + return {}; } - return 0; + return bi; } constexpr char gbm_gralloc_module_name[] = "GBM Memory Allocator"; diff --git a/bufferinfo/legacy/BufferInfoLibdrm.h b/bufferinfo/legacy/BufferInfoLibdrm.h index 17ee5fb..7f5b08c 100644 --- a/bufferinfo/legacy/BufferInfoLibdrm.h +++ b/bufferinfo/legacy/BufferInfoLibdrm.h @@ -26,7 +26,7 @@ namespace android { class BufferInfoLibdrm : public LegacyBufferInfoGetter { public: using LegacyBufferInfoGetter::LegacyBufferInfoGetter; - int ConvertBoInfo(buffer_handle_t handle, BufferInfo *bo) override; + auto GetBoInfo(buffer_handle_t handle) -> std::optional<BufferInfo> override; int ValidateGralloc() override; private: diff --git a/bufferinfo/legacy/BufferInfoMaliHisi.cpp b/bufferinfo/legacy/BufferInfoMaliHisi.cpp index 7a75075..1c7f4d0 100644 --- a/bufferinfo/legacy/BufferInfoMaliHisi.cpp +++ b/bufferinfo/legacy/BufferInfoMaliHisi.cpp @@ -66,30 +66,33 @@ uint64_t BufferInfoMaliHisi::ConvertGrallocFormatToDrmModifiers( } #endif -int BufferInfoMaliHisi::ConvertBoInfo(buffer_handle_t handle, BufferInfo *bo) { +auto BufferInfoMaliHisi::GetBoInfo(buffer_handle_t handle) + -> std::optional<BufferInfo> { bool is_rgb = false; const auto *hnd = (private_handle_t const *)handle; if (!hnd) - return -EINVAL; + return {}; if (!(hnd->usage & GRALLOC_USAGE_HW_FB)) - return -EINVAL; + return {}; uint32_t fmt = ConvertHalFormatToDrm(hnd->req_format); if (fmt == DRM_FORMAT_INVALID) - return -EINVAL; + return {}; + + BufferInfo bi{}; is_rgb = IsDrmFormatRgb(fmt); - bo->modifiers[0] = ConvertGrallocFormatToDrmModifiers(hnd->internal_format, - is_rgb); + bi.modifiers[0] = ConvertGrallocFormatToDrmModifiers(hnd->internal_format, + is_rgb); - bo->width = hnd->width; - bo->height = hnd->height; - bo->format = fmt; - bo->pitches[0] = hnd->byte_stride; - bo->prime_fds[0] = hnd->share_fd; - bo->offsets[0] = 0; + bi.width = hnd->width; + bi.height = hnd->height; + bi.format = fmt; + bi.pitches[0] = hnd->byte_stride; + bi.prime_fds[0] = hnd->share_fd; + bi.offsets[0] = 0; switch (fmt) { case DRM_FORMAT_YVU420: { @@ -103,20 +106,20 @@ int BufferInfoMaliHisi::ConvertBoInfo(buffer_handle_t handle, BufferInfo *bo) { int v_size = vu_stride * (adjusted_height / 2); /* V plane*/ - bo->prime_fds[1] = hnd->share_fd; - bo->pitches[1] = vu_stride; - bo->offsets[1] = y_size; + bi.prime_fds[1] = hnd->share_fd; + bi.pitches[1] = vu_stride; + bi.offsets[1] = y_size; /* U plane */ - bo->prime_fds[2] = hnd->share_fd; - bo->pitches[2] = vu_stride; - bo->offsets[2] = y_size + v_size; + bi.prime_fds[2] = hnd->share_fd; + bi.pitches[2] = vu_stride; + bi.offsets[2] = y_size + v_size; break; } default: break; } - return 0; + return bi; } } // namespace android diff --git a/bufferinfo/legacy/BufferInfoMaliHisi.h b/bufferinfo/legacy/BufferInfoMaliHisi.h index e809d06..cc37491 100644 --- a/bufferinfo/legacy/BufferInfoMaliHisi.h +++ b/bufferinfo/legacy/BufferInfoMaliHisi.h @@ -27,7 +27,7 @@ class BufferInfoMaliHisi : public LegacyBufferInfoGetter { public: using LegacyBufferInfoGetter::LegacyBufferInfoGetter; - int ConvertBoInfo(buffer_handle_t handle, BufferInfo *bo) override; + auto GetBoInfo(buffer_handle_t handle) -> std::optional<BufferInfo> override; private: uint64_t ConvertGrallocFormatToDrmModifiers(uint64_t flags, bool is_rgb); diff --git a/bufferinfo/legacy/BufferInfoMaliMediatek.cpp b/bufferinfo/legacy/BufferInfoMaliMediatek.cpp index 569148b..2e10460 100644 --- a/bufferinfo/legacy/BufferInfoMaliMediatek.cpp +++ b/bufferinfo/legacy/BufferInfoMaliMediatek.cpp @@ -32,24 +32,26 @@ namespace android { LEGACY_BUFFER_INFO_GETTER(BufferInfoMaliMediatek); -int BufferInfoMaliMediatek::ConvertBoInfo(buffer_handle_t handle, - BufferInfo *bo) { +auto BufferInfoMaliMediatek::GetBoInfo(buffer_handle_t handle) + -> std::optional<BufferInfo> { const auto *hnd = (private_handle_t const *)handle; if (!hnd) - return -EINVAL; + return {}; uint32_t fmt = ConvertHalFormatToDrm(hnd->req_format); if (fmt == DRM_FORMAT_INVALID) - return -EINVAL; + return {}; - bo->width = hnd->width; - bo->height = hnd->height; - bo->format = fmt; - bo->prime_fds[0] = hnd->share_fd; - bo->pitches[0] = hnd->byte_stride; - bo->offsets[0] = 0; + BufferInfo bi{}; - return 0; + bi.width = hnd->width; + bi.height = hnd->height; + bi.format = fmt; + bi.prime_fds[0] = hnd->share_fd; + bi.pitches[0] = hnd->byte_stride; + bi.offsets[0] = 0; + + return bi; } } // namespace android diff --git a/bufferinfo/legacy/BufferInfoMaliMediatek.h b/bufferinfo/legacy/BufferInfoMaliMediatek.h index 5b48019..43d987a 100644 --- a/bufferinfo/legacy/BufferInfoMaliMediatek.h +++ b/bufferinfo/legacy/BufferInfoMaliMediatek.h @@ -27,7 +27,7 @@ class BufferInfoMaliMediatek : public LegacyBufferInfoGetter { public: using LegacyBufferInfoGetter::LegacyBufferInfoGetter; - int ConvertBoInfo(buffer_handle_t handle, BufferInfo *bo) override; + auto GetBoInfo(buffer_handle_t handle) -> std::optional<BufferInfo> override; }; } // namespace android diff --git a/bufferinfo/legacy/BufferInfoMaliMeson.cpp b/bufferinfo/legacy/BufferInfoMaliMeson.cpp index 08f7717..cadc2bc 100644 --- a/bufferinfo/legacy/BufferInfoMaliMeson.cpp +++ b/bufferinfo/legacy/BufferInfoMaliMeson.cpp @@ -61,29 +61,32 @@ uint64_t BufferInfoMaliMeson::ConvertGrallocFormatToDrmModifiers( } #endif -int BufferInfoMaliMeson::ConvertBoInfo(buffer_handle_t handle, BufferInfo *bo) { +auto BufferInfoMaliMeson::GetBoInfo(buffer_handle_t handle) + -> std::optional<BufferInfo> { const auto *hnd = (private_handle_t const *)handle; if (!hnd) - return -EINVAL; + return {}; if (!(hnd->usage & GRALLOC_USAGE_HW_FB)) - return -EINVAL; + return {}; uint32_t fmt = ConvertHalFormatToDrm(hnd->req_format); if (fmt == DRM_FORMAT_INVALID) - return -EINVAL; + return {}; - bo->modifiers[0] = BufferInfoMaliMeson::ConvertGrallocFormatToDrmModifiers( + BufferInfo bi{}; + + bi.modifiers[0] = BufferInfoMaliMeson::ConvertGrallocFormatToDrmModifiers( hnd->internal_format); - bo->width = hnd->width; - bo->height = hnd->height; - bo->format = fmt; - bo->prime_fds[0] = hnd->share_fd; - bo->pitches[0] = hnd->byte_stride; - bo->offsets[0] = 0; + bi.width = hnd->width; + bi.height = hnd->height; + bi.format = fmt; + bi.prime_fds[0] = hnd->share_fd; + bi.pitches[0] = hnd->byte_stride; + bi.offsets[0] = 0; - return 0; + return {}; } } // namespace android diff --git a/bufferinfo/legacy/BufferInfoMaliMeson.h b/bufferinfo/legacy/BufferInfoMaliMeson.h index 3bd126d..3b6fab0 100644 --- a/bufferinfo/legacy/BufferInfoMaliMeson.h +++ b/bufferinfo/legacy/BufferInfoMaliMeson.h @@ -26,7 +26,7 @@ namespace android { class BufferInfoMaliMeson : public LegacyBufferInfoGetter { public: using LegacyBufferInfoGetter::LegacyBufferInfoGetter; - int ConvertBoInfo(buffer_handle_t handle, BufferInfo *bo) override; + auto GetBoInfo(buffer_handle_t handle) -> std::optional<BufferInfo> override; private: uint64_t ConvertGrallocFormatToDrmModifiers(uint64_t flags); diff --git a/bufferinfo/legacy/BufferInfoMinigbm.cpp b/bufferinfo/legacy/BufferInfoMinigbm.cpp index 60795b1..c5a9e98 100644 --- a/bufferinfo/legacy/BufferInfoMinigbm.cpp +++ b/bufferinfo/legacy/BufferInfoMinigbm.cpp @@ -43,11 +43,14 @@ struct cros_gralloc0_buffer_info { int stride[4]; }; -int BufferInfoMinigbm::ConvertBoInfo(buffer_handle_t handle, BufferInfo *bo) { +auto BufferInfoMinigbm::GetBoInfo(buffer_handle_t handle) + -> std::optional<BufferInfo> { if (handle == nullptr) { - return -EINVAL; + return {}; } + BufferInfo bi{}; + uint32_t width{}; uint32_t height{}; if (gralloc_->perform(gralloc_, CROS_GRALLOC_DRM_GET_DIMENSIONS, handle, @@ -55,7 +58,7 @@ int BufferInfoMinigbm::ConvertBoInfo(buffer_handle_t handle, BufferInfo *bo) { ALOGE( "CROS_GRALLOC_DRM_GET_DIMENSIONS operation has failed. " "Please ensure you are using the latest minigbm."); - return -EINVAL; + return {}; } int32_t droid_format{}; @@ -64,7 +67,7 @@ int BufferInfoMinigbm::ConvertBoInfo(buffer_handle_t handle, BufferInfo *bo) { ALOGE( "CROS_GRALLOC_DRM_GET_FORMAT operation has failed. " "Please ensure you are using the latest minigbm."); - return -EINVAL; + return {}; } uint32_t usage{}; @@ -73,7 +76,7 @@ int BufferInfoMinigbm::ConvertBoInfo(buffer_handle_t handle, BufferInfo *bo) { ALOGE( "CROS_GRALLOC_DRM_GET_USAGE operation has failed. " "Please ensure you are using the latest minigbm."); - return -EINVAL; + return {}; } struct cros_gralloc0_buffer_info info {}; @@ -82,22 +85,22 @@ int BufferInfoMinigbm::ConvertBoInfo(buffer_handle_t handle, BufferInfo *bo) { ALOGE( "CROS_GRALLOC_DRM_GET_BUFFER_INFO operation has failed. " "Please ensure you are using the latest minigbm."); - return -EINVAL; + return {}; } - bo->width = width; - bo->height = height; + bi.width = width; + bi.height = height; - bo->format = info.drm_fourcc; + bi.format = info.drm_fourcc; for (int i = 0; i < info.num_fds; i++) { - bo->modifiers[i] = info.modifier; - bo->prime_fds[i] = info.fds[i]; - bo->pitches[i] = info.stride[i]; - bo->offsets[i] = info.offset[i]; + bi.modifiers[i] = info.modifier; + bi.prime_fds[i] = info.fds[i]; + bi.pitches[i] = info.stride[i]; + bi.offsets[i] = info.offset[i]; } - return 0; + return bi; } constexpr char cros_gralloc_module_name[] = "CrOS Gralloc"; diff --git a/bufferinfo/legacy/BufferInfoMinigbm.h b/bufferinfo/legacy/BufferInfoMinigbm.h index 16cbf2c..40d9926 100644 --- a/bufferinfo/legacy/BufferInfoMinigbm.h +++ b/bufferinfo/legacy/BufferInfoMinigbm.h @@ -26,7 +26,7 @@ namespace android { class BufferInfoMinigbm : public LegacyBufferInfoGetter { public: using LegacyBufferInfoGetter::LegacyBufferInfoGetter; - int ConvertBoInfo(buffer_handle_t handle, BufferInfo *bo) override; + auto GetBoInfo(buffer_handle_t handle) -> std::optional<BufferInfo> override; int ValidateGralloc() override; }; diff --git a/drm/DrmPlane.cpp b/drm/DrmPlane.cpp index 28f48f3..12ac44f 100644 --- a/drm/DrmPlane.cpp +++ b/drm/DrmPlane.cpp @@ -176,7 +176,7 @@ bool DrmPlane::IsValidForLayer(DrmHwcLayer *layer) { return false; } - uint32_t format = layer->buffer_info.format; + uint32_t format = layer->buffer_info->format; if (!IsFormatSupported(format)) { ALOGV("Plane %d does not supports %c%c%c%c format", GetId(), format, format >> 8, format >> 16, format >> 24); diff --git a/hwc2_device/HwcDisplay.cpp b/hwc2_device/HwcDisplay.cpp index 2aec440..7279c02 100644 --- a/hwc2_device/HwcDisplay.cpp +++ b/hwc2_device/HwcDisplay.cpp @@ -598,13 +598,16 @@ HWC2::Error HwcDisplay::SetClientTarget(buffer_handle_t target, /* TODO: Do not update source_crop every call. * It makes sense to do it once after every hotplug event. */ - BufferInfo bo{}; - BufferInfoGetter::GetInstance()->ConvertBoInfo(target, &bo); + auto bi = BufferInfoGetter::GetInstance()->GetBoInfo(target); + + if (!bi) { + return HWC2::Error::BadParameter; + } hwc_frect_t source_crop = {.left = 0.0F, .top = 0.0F, - .right = static_cast<float>(bo.width), - .bottom = static_cast<float>(bo.height)}; + .right = static_cast<float>(bi->width), + .bottom = static_cast<float>(bi->height)}; client_layer_.SetLayerSourceCrop(source_crop); return HWC2::Error::None; diff --git a/include/drmhwcomposer.h b/include/drmhwcomposer.h index 211ffd2..5ddb220 100644 --- a/include/drmhwcomposer.h +++ b/include/drmhwcomposer.h @@ -22,6 +22,7 @@ #include <cstdbool> #include <cstdint> +#include <optional> #include <vector> #include "bufferinfo/BufferInfo.h" @@ -62,7 +63,7 @@ enum class DrmHwcBlending : int32_t { struct DrmHwcLayer { buffer_handle_t sf_handle = nullptr; - BufferInfo buffer_info{}; + std::optional<BufferInfo> buffer_info; std::shared_ptr<DrmFbIdHandle> fb_id_handle; DrmHwcTransform transform{}; diff --git a/utils/hwcutils.cpp b/utils/hwcutils.cpp index aec9bba..5aa9a3f 100644 --- a/utils/hwcutils.cpp +++ b/utils/hwcutils.cpp @@ -28,16 +28,15 @@ namespace android { int DrmHwcLayer::ImportBuffer(DrmDevice *drm_device) { - buffer_info = BufferInfo{}; + buffer_info = BufferInfoGetter::GetInstance()->GetBoInfo(sf_handle); - int ret = BufferInfoGetter::GetInstance()->ConvertBoInfo(sf_handle, - &buffer_info); - if (ret != 0) { - ALOGE("Failed to convert buffer info %d", ret); - return ret; + if (!buffer_info) { + ALOGE("Failed to convert buffer info"); + return -EINVAL; } - fb_id_handle = drm_device->GetDrmFbImporter().GetOrCreateFbId(&buffer_info); + fb_id_handle = drm_device->GetDrmFbImporter().GetOrCreateFbId( + &(*buffer_info)); if (!fb_id_handle) { ALOGE("Failed to import buffer"); return -EINVAL; |