[Mesa-dev] [PATCH v1 0/7] Implement commont gralloc_handle_t in libdrm

Tomasz Figa tfiga at chromium.org
Fri Feb 2 08:01:17 UTC 2018


Hi Rob,

On Tue, Jan 30, 2018 at 9:36 PM, Robert Foss <robert.foss at collabora.com> wrote:
>>>>>>       uint32_t (*get_fd)(buffer_handle_t handle, uint32_t plane);
>>>>>>       uint64_t (*get_modifier)(buffer_handle_t handle, uint32_t
>>>>>> plane);
>>>>>>       uint32_t (*get_offsets)(buffer_handle_t handle, uint32_t plane);
>>>>>>       uint32_t (*get_stride)(buffer_handle_t handle, uint32_t plane);
>>>>>>       ...
>>>>>> } gralloc_funcs_t;
>>
>>
>> These ones? >
>> Yeah, if we could retrieve such function pointer struct using perform
>> or any equivalent (like the implementation-specific methods in
>> gralloc1, but not sure if that's going to be used in practice
>> anywhere), it could work for us.
>
>
> So this is where you and Rob Herring lose me, I don't think I understand
> quite how the gralloc1 call would be used, and how it would tie into this
> handle struct. I think I could do with some guidance on this.

This would be very similar to gralloc0 perform call. gralloc1
implementations need to provide getFunction() callback [1], which
returns a pointer to given function. The list of standard functions is
defined in the gralloc1.h header [2], but we could take some random
big number and use it for our function that fills in provided
gralloc_funcs_t struct with necessary pointers.

[1] https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware/gralloc1.h#300
[2] https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware/gralloc1.h#134

With this, the buffer consumers (e.g. Mesa) would look like this:

consume_buffer(priv, handle)
{
    gralloc_funcs_t funcs;

    if (priv->gralloc1) {
        DRM_GRALLOC1_PFN_GET_GRALLOC_FUNCS get_gralloc_funcs;

        get_gralloc_func = priv->gralloc1->getFunction(priv->gralloc1,
DRM_GRALLOC1_FUNCTION_GET_GRALLOC_FUNCS);
        get_gralloc_func(priv->gralloc1, handle, &funcs); // Not sure
if the handle is even necessary
    } else /* gralloc0 */ {
        priv->gralloc0->perform(priv->gralloc0,
DRM_GRALLOC_PERFORM_GET_GRALLOC_FUNCS, &funcs);
    }

    // funcs has everything that the consumer needs to deal with the buffer
}

Best regards,
Tomasz


More information about the mesa-dev mailing list