[cairo] Fwd: cairo_paint() with GPU Buffer

Abimathi Natarajan abimathi08 at gmail.com
Mon Feb 11 07:11:30 UTC 2019


---------- Forwarded message ---------
From: Abimathi Natarajan <abimathi08 at gmail.com>
Date: Thu, Feb 7, 2019, 6:27 PM
Subject: Re: [cairo] cairo_paint() with GPU Buffer
To: Uli Schlachter <psychon at znc.in>


Hi,


My sample code contains two parts,


PART 1

------------

   - Decoding an input file using ffmpeg and get raw buffers (GPU allocated
   within FFMPEG ) in rgb32 format. My code does exactly what the below
   ffmpeg command does.

               ffmpeg -hwaccel vaapi -hwaccel_device
/dev/dri/renderD128 -hwaccel_output_format vaapi -i input.mp4
               -vf
'scale_vaapi,hwmap=mode=read+write+direct,format=rgb32' output.rgb

         The above command will decode the input file (input.mp4) with
hardware accelerations(vaapi) and hwmap will directly map the hardware
         frames to system memory.

PART 2
----------


   - I will directly feed this memory to

                cairo_image_surface_create_for_data ((unsigned char
*)buffer, CAIRO_FORMAT_ARGB32,width, height, stride) to create a
cairo_surface for the given frame.

   -  cairo_paint() in
https://github.com/wayland-project/weston/blob/master/clients/image.c#L160
will paint the cairo_surface over weston compositor.
   - When we measured the time taken by this API to paint the GPU
buffer, we observed it took approximately 400 ms to paint a single 4k
frame.
   - The github link is not my actual sample code, However my
application uses similar flow only. (I'm using cairo with weston
compositor).




On Wed, Feb 6, 2019, 12:40 AM Uli Schlachter <psychon at znc.in> wrote:

> Hi,
>
> On 05.02.19 07:16, Abimathi Natarajan wrote:
> > I'm implementing a sample program with Weston to render video (decoded
> > using ffmpeg VAAPI)  frames using Cairo graphics.
> > Each frame is of 4k size
>
> How complicated is your example program? Do you have a link to it or can
> you send it by mail?
>
> > I'm passing GPU buffer directly to cairo_image_surface_create_for_data()
> to
> > create a cairo_surface for each frame.
> > When I render the buffer using cairo_paint() , the API is taking
> > approximately 400 ms for each buffer.
>
> Uhm, can you tell us more about the cairo_paint() call? I assume you are
> copying from the image surface that you created. Where are you copying
> to? Is it just the call to cairo_paint() that takes so long or did you
> measure more than just that?
>
> Also, what exactly does "I'm passing GPU buffer directly" mean? Is the
> GPU memory directly accessible to the CPU? If so, I would expect this to
> be uncached and slow, which is why I am asking.
>
> Cheers,
> Uli
> --
> Homophobia - The fear that another man will treat you the way you treat
> women.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.cairographics.org/archives/cairo/attachments/20190211/36bfe4a2/attachment.html>


More information about the cairo mailing list