Problem importing buffer allocated by etnaviv to imx-drm

Robert Foss robert.foss at collabora.com
Fri Jul 13 07:38:15 UTC 2018


Hey Martin,

On 2018-07-12 16:28, Martin Fuzzey wrote:
> Hi Robert,
> 
> Latest update: it works!

Excellent!

> 
> Thank you for your help!
> 
> 
> On 12/07/18 14:45, Robert Foss wrote:
>> Hey Martin (& Chris),
>>
>> This has been a re-occuring pain point on devices with multiple DRM nodes to 
>> chose from, but recently I added node probing support to mesa which lets you 
>> avoid hardcoded paths.
>>
>> https://cgit.freedesktop.org/mesa/mesa/commit/?id=c7bb82136b48b99427465ba4fa3ce477cf09e097 
>>
>>
> 
> Yes indeed thank you, I just saw that. It should let me get rid of the hack below
> 
>>>
>>> I also tried leaving the gbm_gralloc allocation parameter alone and modifying 
>>> imx_drm_screen_create() to use /dev/dri/card1 for .kms_fd with the same result.
>>>
>>> --- a/src/gallium/winsys/imx/drm/imx_drm_winsys.c
>>> +++ b/src/gallium/winsys/imx/drm/imx_drm_winsys.c
>>>   struct pipe_screen *imx_drm_screen_create(int fd)
>>>   {
>>>      struct renderonly ro = {
>>>         .create_for_resource = renderonly_create_kms_dumb_buffer_for_resource,
>>> -      .kms_fd = fd,
>>> +      //.kms_fd = fd,
>>> +      .kms_fd = open("/dev/dri/card1", O_RDWR | O_CLOEXEC), // MF Hack
>>>         .gpu_fd = open("/dev/dri/renderD128", O_RDWR | O_CLOEXEC)
>>>      };
>>>
>>>
>> Rob Herrings has mentioned that pushing a dev branch for the gbm_gralloc 
>> handle support is on his Todo list.
>> But for now there is another branch, which reportedly has been working better.
>>
>> https://github.com/robherring/gbm_gralloc/commits/handle-rework-v2
>>
> 
> Yes, just found that this morning too.
> 
> That is the key to getting it to work due to this patch which is on that branch:
> 
> commit 137cc39aaa57f8c64db3397cd6ec7600a191a88d
> Author: Mauro Rossi <issor.oruam at gmail.com>
> Date:   Fri Jun 29 13:45:10 2018 +0200
> 
>      Update usage flag handling for hwc
> 
>      Add support for GRALLOC_USAGE_HW_COMPOSER usage flag
>      mapping it to GBM flags, inspired by minigbm implementation.
> 
>      Fixes the artifacts issues with vulkan hal radv with the following apps
>      with benefit to all apps using HWC layers:
>      V1 - GPU Benchmark Pro (Vulkan API)
>      PPSSPP - PSP emulator
>      Sascha Willems Vulkan Examples (e.g. Vulkan Gears, Vulkan Texture)
> 
>      Signed-off-by: Mauro Rossi <issor.oruam at gmail.com>
>      Signed-off-by: Rob Herring <robh at kernel.org>
> 
> diff --git a/gralloc_gbm.cpp b/gralloc_gbm.cpp
> index 247fba7..cd37f4d 100644
> --- a/gralloc_gbm.cpp
> +++ b/gralloc_gbm.cpp
> @@ -147,6 +147,8 @@ static unsigned int get_pipe_bind(int usage)
>                  bind |= GBM_BO_USE_RENDERING;
>          if (usage & GRALLOC_USAGE_HW_FB)
>                  bind |= GBM_BO_USE_SCANOUT;
> +       if (usage & GRALLOC_USAGE_HW_COMPOSER)
> +               bind |= GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING;
> 
>          return bind;
>   }
> 
> 
> Since android tags buffers that will be sent to HWC with 
> GRALLOC_USAGE_HW_COMPOSER they will now be allocated from imx-drm rather than 
> etnaviv which solves the import problem.

Excellent, I'm glad Mauros work is coming in handy.

> 
> That branch also fixes the structure mismatch problem I mentionned but requires 
> cherry picking this commit from mesa master so that egl will compile
> 
> commit 3f7bca44d9a9f07eaafc5de850ec65bdd00707b9
> Author: Rob Herring <robh at kernel.org>
> Date:   Thu Apr 26 16:02:01 2018 +0200
> 
>      egl/android: #ifdef out flink name support
> 

flink name support should only be needed for drm_gralloc, which isn't shouldn't 
be used at this point (due to not supporting HWC2).

> 
> So, I now have it all working, at least to the bootanimation (my boot doesn't go 
> further for the moment, for reasons unrelated to the graphics stack).
> 
> 
> The only nasty thing remaining is the DRM permissions hack in the kernel.
> 
> This is required because the renderonly code uses the imx-drm node to allocate 
> scanout and hw composer buffers and also to do drmPrimeHandleToFD() from the 
> graphics allocator process.
> 
> But the same device node is opened by the  HWC process and it is HWC that is DRM 
> master.
> 
> So, without the kernel hack, drmPrimeHandleToFD() for the scanout / hw composer 
> buffers fails.
> 
> 
> Ways I can think of to fix this:
> 
> 1) Use AUTHMAGIC ? (But I think that's more or less deprecated today) and it 
> would require communicating the token between HWC and gralloc
> 2) Share the fd between gralloc and hwc? Seems to be creating unwanted coupling.
> 3) Modify the imx-drm kernel driver to provide a render node and use that in the 
> renderonly code
> 
> #3 looks the best to me at the moment.

#3 is the easy way to go about it I think too.

But it would be nice to have a proper solution to this that would work with all 
hardware platforms without changes.

Maybe having a conversation about this with Rob Herring, John Stultz and Mauro 
Rossi would be a good idea.

> 
> Regards,
> 
> Martin
> 
> 


More information about the etnaviv mailing list