>
> So I had a look into implementing this, and using function pointers is
> problematic due to this struct being passed between processes which would
> prevent mesa calling a function assigned in gbm_gralloc for example.


Which function?  In theory, anything with a dependency on libdrm and a
gralloc handle should be able use the FPs.

It could be used to provide runtime support for multiple gralloc
> implementations, but that seems to about the only advantage to adding FPs.


Yes, that's the main benefit.  The other two options are:

(a) standardize the handle.  I'm still not sure how we're going to
reconcile the implementation specific differences that I pointed out in my
last message.
(b) subclass the handles.  If I'm reading everyone's comments correctly, no
one is in favor of this b/c of alignment/padding issues.
(c) Standard struct in libdrm + a perform call in gralloc.  However, the
issue with that is (*perform) is removed in gralloc1 and HIDL gralloc
(/hardware/interfaces/graphics/mapper/2.0/IMapper.hal
and hardware/interfaces/graphics/allocator/2.0/IAllocator.hal in AOSP).

On Thu, Jan 11, 2018 at 12:26 PM, Robert Foss <robert.f...@collabora.com>
wrote:

> Heya,
>
>
> On 12/22/17 1:09 PM, Tomasz Figa wrote:
>
>> On Fri, Dec 22, 2017 at 10:09 AM, Gurchetan Singh
>> <gurchetansi...@chromium.org> wrote:
>>
>>> So the plan is for alloc_handle_t to not be sub-classed by the
>>> implementations, but have all necessary information that an
>>> implementation
>>> would need?
>>>
>>> If so, how do we reconcile the implementation specific information that
>>> is
>>> often in the handle:
>>>
>>> https://github.com/intel/minigbm/blob/master/cros_gralloc/cr
>>> os_gralloc_handle.h
>>> [consumer_usage, producer_usage, yuv_color_range, is_updated etc.]
>>>
>>> https://chromium.googlesource.com/chromiumos/platform/minigb
>>> m/+/master/cros_gralloc/cros_gralloc_handle.h
>>> [use_flags, pixel_stride]
>>>
>>> In our case, removing our minigbm specific use flags from the handle
>>> would
>>> add complexity to our (*registerBuffer) path.
>>>
>>> On Thu, Dec 21, 2017 at 10:14 AM, Rob Herring <r...@kernel.org> wrote:
>>>
>>>>
>>>> On Wed, Dec 13, 2017 at 5:02 PM, Gurchetan Singh
>>>> <gurchetansi...@chromium.org> wrote:
>>>>
>>>>> Hi Robert,
>>>>>
>>>>> Thanks for looking into this!  We need to decide if we want:
>>>>>
>>>>> (1) A common struct that implementations can subclass, i.e:
>>>>>
>>>>> struct blah_gralloc_handle {
>>>>>      alloc_handle_t alloc_handle;
>>>>>      int x, y, z;
>>>>>      ....
>>>>> }
>>>>>
>>>>> (2) An accessor library that vendors can implement, i.e:
>>>>>
>>>>> struct drmAndroidHandleInfo {
>>>>>     uint32_t (*get_fourcc)(buffer_handle_t handle);
>>>>>     uint32_t (*get_stride)(buffer_handle_t handle, uint32_t plane);
>>>>>     uint32_t (*get_offsets)(buffer_handle_t handle, uint32_t plane);
>>>>>     uint64_t (*get_modifier)(buffer_handle_t handle);
>>>>> };
>>>>>
>>>>>  From my perspective as someone who has to maintain the minigbm gralloc
>>>>> implementation, (2) is preferable since:
>>>>>
>>>>
>>>> Yeah, I'd prefer not to encourage 1 as the default.
>>>>
>>>>
> So I had a look into implementing this, and using function pointers is
> problematic due to this struct being passed between processes which would
> prevent mesa calling a function assigned in gbm_gralloc for example.
>
> It could be used to provide runtime support for multiple gralloc
> implementations, but that seems to about the only advantage to adding FPs.
>
> Am I missing a good usecase for FPs? If not I think the added
> complexity/cruft is more problematic than good.
>
> Any thoughts?
>
>
> Rob.
>
>
> a) We really don't have a need for fields like data_owner, void *data,
>>>>> etc.
>>>>>
>>>>
>>>> We should be able to get rid of this. It's just for tracking imports.
>>>>
>>>> Also, minigbm puts per plane fds, strides, offsets into the handle.
>>>>> Separating the information for the first plane (for the alloc_handle_t)
>>>>> and
>>>>> then rest of the planes would be annoying.
>>>>>
>>>>
>>>> The plan is to add those to alloc_handle_t.
>>>>
>>>> b) we can avoid the struct within a struct that happens when we
>>>>> subclass,
>>>>> since alignment/padding issues often pop up during
>>>>> serialization/de-serialization.  Using __attribute__((aligned(xx))) is
>>>>> less
>>>>> portable than maintaining a POD struct.
>>>>>
>>>>
>>>> Yes. Even just between 32 and 64 bit it's problematic.
>>>>
>>>>
>>>> c) IMO creating the handle should be left to the gralloc implementation.
>>>>> Having accessor functions clearly defines what we need from libdrm --
>>>>> to
>>>>> make up for shortcomings of the gralloc API for DRM/KMS use cases.
>>>>>
>>>>>
>> I think there might be also d). Define a standard struct in libdrm
>> headers and add a custom call to gralloc that would fill in such
>> struct for given buffer. This would keep the libdrm handle independent
>> of gralloc's internal handle.
>>
>> P.S. Top-posting is bad.
>>
>> Best regards,
>> Tomasz
>>
>>
>>>>> On Wed, Dec 13, 2017 at 9:30 AM, Robert Foss <
>>>>> robert.f...@collabora.com>
>>>>> wrote:
>>>>>
>>>>>>
>>>>>> This series moves {gbm,drm,cros}_gralloc_handle_t struct to libdrm,
>>>>>> since at least 4 implementations exist, and share a lot of contents.
>>>>>> The idea is to keep the common stuff defined in one place, and libdrm
>>>>>> is the common codebase to all of these platforms.
>>>>>>
>>>>>> Additionally, having this struct defined in libdrm will make it
>>>>>> easier for mesa and grallocs to communicate.
>>>>>>
>>>>>> Curretly missing is:
>>>>>>   - Planar formats
>>>>>>   - Get/Set functions
>>>>>>
>>>>>>
>>>>>> Planar formats
>>>>>> --------------
>>>>>> Support for planar formats is needed, but has not been added
>>>>>> yet, mostly since this was not already implemented in
>>>>>> {gbm,drm}_gralloc
>>>>>> and the fact the having at least initial backwards compatability would
>>>>>> be nice. Anonymous unions can of course be used later on to provide
>>>>>> backwards compatability if so desired.
>>>>>>
>>>>>>
>>>>>> Get/Set functions
>>>>>> -----------------
>>>>>> During the previous discussion[1] one suggestion was to add accessor
>>>>>> functions. In this RFC I've only provided a alloc_handle_create()
>>>>>> function.
>>>>>>
>>>>>> The Get/Set functions have not been added yet, I was hoping for some
>>>>>> conclusive arguments for them being adeded.
>>>>>>
>>>>>> Lastly it was suggested by Rob Herring that having a fourcc<->android
>>>>>> pixel format conversion function would be useful.
>>>>>>
>>>>>>
>>>>>> [1]
>>>>>>
>>>>>> https://lists.freedesktop.org/archives/mesa-dev/2017-Novembe
>>>>>> r/178199.html
>>>>>>
>>>>>> Robert Foss (5):
>>>>>>    android: Move gralloc handle struct to libdrm
>>>>>>    android: Add version variable to alloc_handle_t
>>>>>>    android: Mark alloc_handle_t magic variable as const
>>>>>>    android: Remove member name from alloc_handle_t
>>>>>>    android: Change alloc_handle_t format from Android format to fourcc
>>>>>>
>>>>>>   Android.mk                   |  8 +++-
>>>>>>   Makefile.sources             |  3 ++
>>>>>>   android/alloc_handle.h       | 87
>>>>>> ++++++++++++++++++++++++++++++++++++++++++++
>>>>>>   android/gralloc_drm_handle.h |  1 +
>>>>>>   4 files changed, 97 insertions(+), 2 deletions(-)
>>>>>>   create mode 100644 android/alloc_handle.h
>>>>>>   create mode 120000 android/gralloc_drm_handle.h
>>>>>>
>>>>>> --
>>>>>> 2.14.1
>>>>>>
>>>>>> _______________________________________________
>>>>>> mesa-dev mailing list
>>>>>> mesa-dev@lists.freedesktop.org
>>>>>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>>>>>>
>>>>>
>>>>>
>>>>>
>>>
>>>
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to