[RFC][PATCH 2/4 v2] drm_hwcomposer: Add platformhisi buffer importer for hikey and hikey960
Sean Paul
seanpaul at chromium.org
Mon Jan 29 20:02:30 UTC 2018
On Thu, Jan 25, 2018 at 09:23:45PM -0800, John Stultz wrote:
> On Wed, Jan 24, 2018 at 7:46 AM, Sean Paul <seanpaul at chromium.org> wrote:
> > On Tue, Jan 23, 2018 at 03:16:37PM -0800, John Stultz wrote:
> >> +#ifdef HIKEY
> >> +uint32_t HisiImporter::ConvertHalFormatToDrm(uint32_t hal_format) {
> >> + switch (hal_format) {
> >> + case HAL_PIXEL_FORMAT_RGB_888:
> >> + return DRM_FORMAT_BGR888;
> >> + case HAL_PIXEL_FORMAT_BGRA_8888:
> >> + return DRM_FORMAT_ARGB8888;
> >> + case HAL_PIXEL_FORMAT_RGBX_8888:
> >> + return DRM_FORMAT_XBGR8888;
> >> + case HAL_PIXEL_FORMAT_RGBA_8888:
> >> + return DRM_FORMAT_ABGR8888;
> >> + case HAL_PIXEL_FORMAT_RGB_565:
> >> + return DRM_FORMAT_BGR565;
> >> + case HAL_PIXEL_FORMAT_YV12:
> >> + return DRM_FORMAT_YVU420;
> >> + default:
> >> + ALOGE("Cannot convert hal format to drm format %u", hal_format);
> >> + return -EINVAL;
> >> + }
> >
> > This is the same as the generic case, and below is a little confusing to me.
>
> Yes. HiKey is the same as the generic case.
>
> >> +}
> >> +#else /* HIKEY960 case*/
> >> +uint32_t HisiImporter::ConvertHalFormatToDrm(uint32_t hal_format) {
> >> + switch (hal_format) {
> >> + case HAL_PIXEL_FORMAT_RGB_888:
> >> + return DRM_FORMAT_BGR888;
> >> + case HAL_PIXEL_FORMAT_BGRA_8888:
> >> + return DRM_FORMAT_XBGR8888;
> >> + case HAL_PIXEL_FORMAT_RGBX_8888:
> >> + return DRM_FORMAT_XBGR8888;
> >> + case HAL_PIXEL_FORMAT_RGBA_8888:
> >> + return DRM_FORMAT_XBGR8888;
> >> + case HAL_PIXEL_FORMAT_RGB_565:
> >> + return DRM_FORMAT_BGR565;
> >> + case HAL_PIXEL_FORMAT_YV12:
> >> + return DRM_FORMAT_YVU420;
> >> + default:
> >> + ALOGE("Cannot convert hal format to drm format %u", hal_format);
> >> + return -EINVAL;
> >> + }
> >
> > So it seems like we're smashing a whole bunch of formats into XBGR8888 here, and
> > I'm not sure how it'll work. If you look above, the primary difference between
> > the HAL and drm formats is that the subpixels are reversed (ie: RGBA becomes
> > ABGR). In this snippet, you've got BGRA->XBGR, does this actually work?
>
> Honestly the above is some sort of dyslexia nightmare for me, so I may
> have gotten it slightly wrong. :)
>
I can certainly sympathize with this. It took me longer than I'd like to admit
to write the above. This seems like a good reason to change things up!
> So my understanding is that for the HiKey960/bifrost the As need to be
> Xs (and I've verified that we don't get anything if we try to leave
> the X's), and we have to switch the R/Bs to get the colors right. It
> may be the R/B switching is due to other quirks in gralloc and the drm
> driver, I'm not sure.
It'd be nice to figure out. I suspect there's a bug somewhere that's re-
reversing things.
>
> > Furthermore, when I look at the kirin driver (I think that's what you use on
> > hikey?), I see full support for all the above formats. So 2 questions:
>
> So, on HiKey960 we have the out-of-tree kirin960 drm driver, which is
> one of those vendor code drops that is similar but different enough
> that its a pain to whittle down if extending the kirin driver can be
> done to support it, I've not been involved in the upstreaming effort
> for that driver, so I'm not sure what the plan is yet.
>
> > 1- Does this work as expected
>
> So yes, the code here does work. But we're only exercising the
> BGRA_8888 path, so the rest could very well be wrong.
>
>
> > 2- Is there an opportunity to share code between platforms instead of
> > copy-pasting this function over and over again? Perhaps each platform provides
> > the formats they support and we have the base class do a mapping based on what
> > is present?
>
> My C++ is ~20 years stale, but I'll take a look to see what I can do there.
>
> >> +#ifdef HIKEY
> >> + bo->pitches[0] = hnd->width * 4;
> >
> > Does this work for formats that are not 32-bit?
>
> Probably not. I'll try to sort that out in a better way too.
>
>
> >> +int HisiImporter::ReleaseBuffer(hwc_drm_bo_t *bo) {
> >> + if (bo->fb_id)
> >> + if (drmModeRmFB(drm_->fd(), bo->fb_id))
> >> + ALOGE("Failed to rm fb");
> >> +
> >> + struct drm_gem_close gem_close;
> >> + memset(&gem_close, 0, sizeof(gem_close));
> >> + int num_gem_handles = sizeof(bo->gem_handles) / sizeof(bo->gem_handles[0]);
> >> + for (int i = 0; i < num_gem_handles; i++) {
> >> + if (!bo->gem_handles[i])
> >> + continue;
> >> +
> >> + gem_close.handle = bo->gem_handles[i];
> >> + int ret = drmIoctl(drm_->fd(), DRM_IOCTL_GEM_CLOSE, &gem_close);
> >> + if (ret)
> >> + ALOGE("Failed to close gem handle %d %d", i, ret);
> >> + else
> >> + bo->gem_handles[i] = 0;
> >> + }
> >> + return 0;
> >> +}
> >
> > This function is a straight copy-paste from generic, right? Let's try to do
> > better than that. Perhaps you should be subclassing the drm generic platform
> > instead?
>
> Apologies, my sense of taste here is terrible. Do you recommend I try
> to subclass the drmgenericplatform or create a common base that both
> use (along with the format bits)?
I think it makes sense to subclass DrmGenericPlatform, since there are minimal
differences. Ideally we wouldn't need any subclass, but tbh I haven't dug into
the differences enough to have a strong opinion on that.
For the format conversion function, given that the only difference is s/A/X/,
we can probably keep everything in drmgeneric (assuming you fix the format issue
mentioned above).
I'm thinking you add a member to DrmGenericPlatform called _has_alpha. If the
platform has alpha, this is set to true when the object is initialized. If
_has_alpha is true in CovertFormat you use the 'A' variants. If not, use 'X'.
I haven't put the Import functions side-by-side, but perhaps you can share some
code between them similar to above?
Sean
>
> thanks
> -john
--
Sean Paul, Software Engineer, Google / Chromium OS
More information about the dri-devel
mailing list