diff options
-rw-r--r-- | include/drmhwcgralloc.h | 3 | ||||
-rw-r--r-- | include/platform.h | 3 | ||||
-rw-r--r-- | platform/platformdrmgeneric.cpp | 69 | ||||
-rw-r--r-- | platform/platformdrmgeneric.h | 2 | ||||
-rw-r--r-- | platform/platformhisi.cpp | 48 | ||||
-rw-r--r-- | platform/platformhisi.h | 3 | ||||
-rw-r--r-- | platform/platformimagination.cpp | 27 | ||||
-rw-r--r-- | platform/platformimagination.h | 2 | ||||
-rw-r--r-- | platform/platformmeson.cpp | 40 | ||||
-rw-r--r-- | platform/platformmeson.h | 3 | ||||
-rw-r--r-- | platform/platformminigbm.cpp | 24 | ||||
-rw-r--r-- | platform/platformminigbm.h | 2 |
12 files changed, 88 insertions, 138 deletions
diff --git a/include/drmhwcgralloc.h b/include/drmhwcgralloc.h index 65a4007..b959714 100644 --- a/include/drmhwcgralloc.h +++ b/include/drmhwcgralloc.h @@ -29,8 +29,11 @@ typedef struct hwc_drm_bo { uint32_t pixel_stride; uint32_t pitches[HWC_DRM_BO_MAX_PLANES]; uint32_t offsets[HWC_DRM_BO_MAX_PLANES]; + uint32_t prime_fds[HWC_DRM_BO_MAX_PLANES]; uint32_t gem_handles[HWC_DRM_BO_MAX_PLANES]; + uint64_t modifiers[HWC_DRM_BO_MAX_PLANES]; uint32_t fb_id; + bool with_modifiers; int acquire_fence_fd; void *priv; } hwc_drm_bo_t; diff --git a/include/platform.h b/include/platform.h index 6fdece2..6775e29 100644 --- a/include/platform.h +++ b/include/platform.h @@ -52,6 +52,9 @@ class Importer { // Checks if importer can import the buffer. virtual bool CanImportBuffer(buffer_handle_t handle) = 0; + + // Convert platform-dependent buffer format to drm_hwc internal format. + virtual int ConvertBoInfo(buffer_handle_t handle, hwc_drm_bo_t *bo) = 0; }; class Planner { diff --git a/platform/platformdrmgeneric.cpp b/platform/platformdrmgeneric.cpp index 668742c..1aa8160 100644 --- a/platform/platformdrmgeneric.cpp +++ b/platform/platformdrmgeneric.cpp @@ -110,19 +110,12 @@ uint32_t DrmGenericImporter::DrmFormatToBitsPerPixel(uint32_t drm_format) { } } -int DrmGenericImporter::ImportBuffer(buffer_handle_t handle, hwc_drm_bo_t *bo) { +int DrmGenericImporter::ConvertBoInfo(buffer_handle_t handle, + hwc_drm_bo_t *bo) { gralloc_handle_t *gr_handle = gralloc_handle(handle); if (!gr_handle) return -EINVAL; - uint32_t gem_handle; - int ret = drmPrimeFDToHandle(drm_->fd(), gr_handle->prime_fd, &gem_handle); - if (ret) { - ALOGE("failed to import prime fd %d ret=%d", gr_handle->prime_fd, ret); - return ret; - } - - memset(bo, 0, sizeof(hwc_drm_bo_t)); bo->width = gr_handle->width; bo->height = gr_handle->height; bo->hal_format = gr_handle->format; @@ -132,18 +125,54 @@ int DrmGenericImporter::ImportBuffer(buffer_handle_t handle, hwc_drm_bo_t *bo) { bo->usage = gr_handle->usage; bo->pixel_stride = (gr_handle->stride * 8) / DrmFormatToBitsPerPixel(bo->format); + bo->prime_fds[0] = gr_handle->prime_fd; bo->pitches[0] = gr_handle->stride; - bo->gem_handles[0] = gem_handle; bo->offsets[0] = 0; - ret = drmModeAddFB2(drm_->fd(), bo->width, bo->height, bo->format, - bo->gem_handles, bo->pitches, bo->offsets, &bo->fb_id, 0); + return 0; +} + +int DrmGenericImporter::ImportBuffer(buffer_handle_t handle, hwc_drm_bo_t *bo) { + memset(bo, 0, sizeof(hwc_drm_bo_t)); + + int ret = ConvertBoInfo(handle, bo); + if (ret) + return ret; + + ret = drmPrimeFDToHandle(drm_->fd(), bo->prime_fds[0], &bo->gem_handles[0]); + if (ret) { + ALOGE("failed to import prime fd %d ret=%d", bo->prime_fds[0], ret); + return ret; + } + + for (int i = 1; i < HWC_DRM_BO_MAX_PLANES; i++) { + int fd = bo->prime_fds[i]; + if (fd != 0) { + if (fd != bo->prime_fds[0]) { + ALOGE("Multiplanar FBs are not supported by this version of composer"); + return -ENOTSUP; + } + bo->gem_handles[i] = bo->gem_handles[0]; + } + } + + if (!bo->with_modifiers) + ret = drmModeAddFB2(drm_->fd(), bo->width, bo->height, bo->format, + bo->gem_handles, bo->pitches, bo->offsets, &bo->fb_id, + 0); + else + ret = drmModeAddFB2WithModifiers(drm_->fd(), bo->width, bo->height, + bo->format, bo->gem_handles, bo->pitches, + bo->offsets, bo->modifiers, &bo->fb_id, + bo->modifiers[0] ? DRM_MODE_FB_MODIFIERS + : 0); + if (ret) { ALOGE("could not create drm fb %d", ret); return ret; } - ImportHandle(gem_handle); + ImportHandle(bo->gem_handles[0]); return ret; } @@ -170,13 +199,17 @@ int DrmGenericImporter::ReleaseBuffer(hwc_drm_bo_t *bo) { } bool DrmGenericImporter::CanImportBuffer(buffer_handle_t handle) { - if (handle == NULL) + hwc_drm_bo_t bo; + + int ret = ConvertBoInfo(handle, &bo); + if (ret) return false; - if (exclude_non_hwfb_) { - gralloc_handle_t *hnd = gralloc_handle(handle); - return hnd->usage & GRALLOC_USAGE_HW_FB; - } + if (bo.prime_fds[0] == 0) + return false; + + if (exclude_non_hwfb_ && !(bo.usage & GRALLOC_USAGE_HW_FB)) + return false; return true; } diff --git a/platform/platformdrmgeneric.h b/platform/platformdrmgeneric.h index a7cf941..f9d923f 100644 --- a/platform/platformdrmgeneric.h +++ b/platform/platformdrmgeneric.h @@ -44,6 +44,8 @@ class DrmGenericImporter : public Importer { int ImportHandle(uint32_t gem_handle); int ReleaseHandle(uint32_t gem_handle); + int ConvertBoInfo(buffer_handle_t handle, hwc_drm_bo_t *bo) override; + uint32_t ConvertHalFormatToDrm(uint32_t hal_format); uint32_t DrmFormatToBitsPerPixel(uint32_t drm_format); diff --git a/platform/platformhisi.cpp b/platform/platformhisi.cpp index 81d8039..1f1478f 100644 --- a/platform/platformhisi.cpp +++ b/platform/platformhisi.cpp @@ -92,41 +92,29 @@ bool HisiImporter::IsDrmFormatRgb(uint32_t drm_format) { case DRM_FORMAT_YVU420: return false; default: - ALOGE("Unsupported format %u assuming rgb?", drm_format); + ALOGV("Unsupported format %u assuming rgb?", drm_format); return true; } } -int HisiImporter::ImportBuffer(buffer_handle_t handle, hwc_drm_bo_t *bo) { +int HisiImporter::ConvertBoInfo(buffer_handle_t handle, hwc_drm_bo_t *bo) { bool is_rgb; - uint64_t modifiers[4] = {0}; - - memset(bo, 0, sizeof(hwc_drm_bo_t)); private_handle_t const *hnd = reinterpret_cast<private_handle_t const *>( handle); if (!hnd) return -EINVAL; - // We can't import these types of buffers. - // These buffers should have been filtered out with CanImportBuffer() if (!(hnd->usage & GRALLOC_USAGE_HW_FB)) return -EINVAL; - uint32_t gem_handle; - int ret = drmPrimeFDToHandle(drm_->fd(), hnd->share_fd, &gem_handle); - if (ret) { - ALOGE("failed to import prime fd %d ret=%d", hnd->share_fd, ret); - return ret; - } - uint32_t fmt = ConvertHalFormatToDrm(hnd->req_format); if (fmt == DRM_FORMAT_INVALID) return -EINVAL; - is_rgb = IsDrmFormatRgb(fmt); - modifiers[0] = ConvertGrallocFormatToDrmModifiers(hnd->internal_format, - is_rgb); + is_rgb = HisiImporter::IsDrmFormatRgb(fmt); + bo->modifiers[0] = HisiImporter:: + ConvertGrallocFormatToDrmModifiers(hnd->internal_format, is_rgb); bo->width = hnd->width; bo->height = hnd->height; @@ -135,7 +123,7 @@ int HisiImporter::ImportBuffer(buffer_handle_t handle, hwc_drm_bo_t *bo) { bo->usage = hnd->usage; bo->pixel_stride = hnd->stride; bo->pitches[0] = hnd->byte_stride; - bo->gem_handles[0] = gem_handle; + bo->prime_fds[0] = hnd->share_fd; bo->offsets[0] = 0; switch (fmt) { @@ -150,11 +138,11 @@ int HisiImporter::ImportBuffer(buffer_handle_t handle, hwc_drm_bo_t *bo) { int v_size = vu_stride * (adjusted_height / 2); /* V plane*/ - bo->gem_handles[1] = gem_handle; + bo->prime_fds[1] = hnd->share_fd; bo->pitches[1] = vu_stride; bo->offsets[1] = y_size; /* U plane */ - bo->gem_handles[2] = gem_handle; + bo->prime_fds[2] = hnd->share_fd; bo->pitches[2] = vu_stride; bo->offsets[2] = y_size + v_size; break; @@ -163,25 +151,9 @@ int HisiImporter::ImportBuffer(buffer_handle_t handle, hwc_drm_bo_t *bo) { break; } - ret = drmModeAddFB2WithModifiers(drm_->fd(), bo->width, bo->height, - bo->format, bo->gem_handles, bo->pitches, - bo->offsets, modifiers, &bo->fb_id, - modifiers[0] ? DRM_MODE_FB_MODIFIERS : 0); - - if (ret) { - ALOGE("could not create drm fb %d", ret); - return ret; - } + bo->with_modifiers = true; - ImportHandle(gem_handle); - - return ret; -} - -bool HisiImporter::CanImportBuffer(buffer_handle_t handle) { - private_handle_t const *hnd = reinterpret_cast<private_handle_t const *>( - handle); - return hnd && (hnd->usage & GRALLOC_USAGE_HW_FB); + return 0; } class PlanStageHiSi : public Planner::PlanStage { diff --git a/platform/platformhisi.h b/platform/platformhisi.h index 9dfea89..f127bdb 100644 --- a/platform/platformhisi.h +++ b/platform/platformhisi.h @@ -31,8 +31,7 @@ class HisiImporter : public DrmGenericImporter { public: using DrmGenericImporter::DrmGenericImporter; - int ImportBuffer(buffer_handle_t handle, hwc_drm_bo_t *bo) override; - bool CanImportBuffer(buffer_handle_t handle) override; + int ConvertBoInfo(buffer_handle_t handle, hwc_drm_bo_t *bo) override; private: uint64_t ConvertGrallocFormatToDrmModifiers(uint64_t flags, bool is_rgb); diff --git a/platform/platformimagination.cpp b/platform/platformimagination.cpp index 5e0335c..ea34ecc 100644 --- a/platform/platformimagination.cpp +++ b/platform/platformimagination.cpp @@ -22,30 +22,22 @@ Importer *Importer::CreateInstance(DrmDevice *drm) { return importer; } -int ImaginationImporter::ImportBuffer(buffer_handle_t handle, - hwc_drm_bo_t *bo) { +int ImaginationImporter::ConvertBoInfo(buffer_handle_t handle, + hwc_drm_bo_t *bo) { IMG_native_handle_t *hnd = (IMG_native_handle_t *)handle; if (!hnd) return -EINVAL; - uint32_t gem_handle; - int ret = drmPrimeFDToHandle(drm_->fd(), hnd->fd[0], &gem_handle); - if (ret) { - ALOGE("failed to import prime fd %d ret=%d", hnd->fd[0], ret); - return ret; - } - /* Extra bits are responsible for buffer compression and memory layout */ if (hnd->iFormat & ~0x10f) { - ALOGE("Special buffer formats are not supported"); + ALOGV("Special buffer formats are not supported"); return -EINVAL; } - memset(bo, 0, sizeof(hwc_drm_bo_t)); bo->width = hnd->iWidth; bo->height = hnd->iHeight; bo->usage = hnd->usage; - bo->gem_handles[0] = gem_handle; + bo->prime_fds[0] = hnd->fd[0]; bo->pitches[0] = ALIGN(hnd->iWidth, HW_ALIGN) * hnd->uiBpp >> 3; switch (hnd->iFormat) { @@ -57,20 +49,11 @@ int ImaginationImporter::ImportBuffer(buffer_handle_t handle, default: bo->format = ConvertHalFormatToDrm(hnd->iFormat & 0xf); if (bo->format == DRM_FORMAT_INVALID) { - ALOGE("Cannot convert hal format to drm format %u", hnd->iFormat); + ALOGV("Cannot convert hal format to drm format %u", hnd->iFormat); return -EINVAL; } } - ret = drmModeAddFB2(drm_->fd(), bo->width, bo->height, bo->format, - bo->gem_handles, bo->pitches, bo->offsets, &bo->fb_id, 0); - if (ret) { - ALOGE("could not create drm fb ret: %d", ret); - return ret; - } - - ImportHandle(gem_handle); - return 0; } diff --git a/platform/platformimagination.h b/platform/platformimagination.h index 85dfc45..f2a7cb7 100644 --- a/platform/platformimagination.h +++ b/platform/platformimagination.h @@ -15,7 +15,7 @@ class ImaginationImporter : public DrmGenericImporter { public: using DrmGenericImporter::DrmGenericImporter; - int ImportBuffer(buffer_handle_t handle, hwc_drm_bo_t *bo) override; + int ConvertBoInfo(buffer_handle_t handle, hwc_drm_bo_t *bo) override; }; } // namespace android diff --git a/platform/platformmeson.cpp b/platform/platformmeson.cpp index 7b7a1f1..ad3aff1 100644 --- a/platform/platformmeson.cpp +++ b/platform/platformmeson.cpp @@ -75,33 +75,21 @@ uint64_t MesonImporter::ConvertGrallocFormatToDrmModifiers( } #endif -int MesonImporter::ImportBuffer(buffer_handle_t handle, hwc_drm_bo_t *bo) { - uint64_t modifiers[4] = {0}; - - memset(bo, 0, sizeof(hwc_drm_bo_t)); - +int MesonImporter::ConvertBoInfo(buffer_handle_t handle, hwc_drm_bo_t *bo) { private_handle_t const *hnd = reinterpret_cast<private_handle_t const *>( handle); if (!hnd) return -EINVAL; - // We can't import these types of buffers. - // These buffers should have been filtered out with CanImportBuffer() if (!(hnd->usage & GRALLOC_USAGE_HW_FB)) return -EINVAL; - uint32_t gem_handle; - int ret = drmPrimeFDToHandle(drm_->fd(), hnd->share_fd, &gem_handle); - if (ret) { - ALOGE("failed to import prime fd %d ret=%d", hnd->share_fd, ret); - return ret; - } - uint32_t fmt = ConvertHalFormatToDrm(hnd->req_format); if (fmt == DRM_FORMAT_INVALID) return -EINVAL; - modifiers[0] = ConvertGrallocFormatToDrmModifiers(hnd->internal_format); + bo->modifiers[0] = MesonImporter::ConvertGrallocFormatToDrmModifiers( + hnd->internal_format); bo->width = hnd->width; bo->height = hnd->height; @@ -109,29 +97,13 @@ int MesonImporter::ImportBuffer(buffer_handle_t handle, hwc_drm_bo_t *bo) { bo->format = fmt; bo->usage = hnd->usage; bo->pixel_stride = hnd->stride; + bo->prime_fds[0] = hnd->share_fd; bo->pitches[0] = hnd->byte_stride; - bo->gem_handles[0] = gem_handle; bo->offsets[0] = 0; - ret = drmModeAddFB2WithModifiers(drm_->fd(), bo->width, bo->height, - bo->format, bo->gem_handles, bo->pitches, - bo->offsets, modifiers, &bo->fb_id, - modifiers[0] ? DRM_MODE_FB_MODIFIERS : 0); - - if (ret) { - ALOGE("could not create drm fb %d", ret); - return ret; - } - - ImportHandle(gem_handle); - - return ret; -} + bo->with_modifiers = true; -bool MesonImporter::CanImportBuffer(buffer_handle_t handle) { - private_handle_t const *hnd = reinterpret_cast<private_handle_t const *>( - handle); - return hnd && (hnd->usage & GRALLOC_USAGE_HW_FB); + return 0; } std::unique_ptr<Planner> Planner::CreateInstance(DrmDevice *) { diff --git a/platform/platformmeson.h b/platform/platformmeson.h index 7be7702..f29b796 100644 --- a/platform/platformmeson.h +++ b/platform/platformmeson.h @@ -31,8 +31,7 @@ class MesonImporter : public DrmGenericImporter { public: using DrmGenericImporter::DrmGenericImporter; - int ImportBuffer(buffer_handle_t handle, hwc_drm_bo_t *bo) override; - bool CanImportBuffer(buffer_handle_t handle) override; + int ConvertBoInfo(buffer_handle_t handle, hwc_drm_bo_t *bo) override; private: uint64_t ConvertGrallocFormatToDrmModifiers(uint64_t flags); diff --git a/platform/platformminigbm.cpp b/platform/platformminigbm.cpp index cb1e110..df195d3 100644 --- a/platform/platformminigbm.cpp +++ b/platform/platformminigbm.cpp @@ -44,39 +44,23 @@ Importer *Importer::CreateInstance(DrmDevice *drm) { return importer; } -int DrmMinigbmImporter::ImportBuffer(buffer_handle_t handle, hwc_drm_bo_t *bo) { +int DrmMinigbmImporter::ConvertBoInfo(buffer_handle_t handle, + hwc_drm_bo_t *bo) { cros_gralloc_handle *gr_handle = (cros_gralloc_handle *)handle; if (!gr_handle) return -EINVAL; - uint32_t gem_handle; - int ret = drmPrimeFDToHandle(drm_->fd(), gr_handle->fds[0], &gem_handle); - if (ret) { - ALOGE("failed to import prime fd %d ret=%d", gr_handle->fds[0], ret); - return ret; - } - - memset(bo, 0, sizeof(hwc_drm_bo_t)); bo->width = gr_handle->width; bo->height = gr_handle->height; bo->hal_format = gr_handle->droid_format; bo->format = gr_handle->format; bo->usage = gr_handle->usage; bo->pixel_stride = gr_handle->pixel_stride; + bo->prime_fds[0] = gr_handle->fds[0]; bo->pitches[0] = gr_handle->strides[0]; bo->offsets[0] = gr_handle->offsets[0]; - bo->gem_handles[0] = gem_handle; - - ret = drmModeAddFB2(drm_->fd(), bo->width, bo->height, bo->format, - bo->gem_handles, bo->pitches, bo->offsets, &bo->fb_id, 0); - if (ret) { - ALOGE("could not create drm fb %d", ret); - return ret; - } - - ImportHandle(gem_handle); - return ret; + return 0; } std::unique_ptr<Planner> Planner::CreateInstance(DrmDevice *) { diff --git a/platform/platformminigbm.h b/platform/platformminigbm.h index ff69f14..053b2aa 100644 --- a/platform/platformminigbm.h +++ b/platform/platformminigbm.h @@ -28,7 +28,7 @@ namespace android { class DrmMinigbmImporter : public DrmGenericImporter { public: using DrmGenericImporter::DrmGenericImporter; - int ImportBuffer(buffer_handle_t handle, hwc_drm_bo_t *bo) override; + int ConvertBoInfo(buffer_handle_t handle, hwc_drm_bo_t *bo) override; }; } // namespace android |