cairosink and gpu buffer sharing (gstreamer conference 2013)

28
Cairosink, GPU Buer Sharing ...and other random ramblings Guillaume Emont - Igalia [email protected]

Upload: igalia

Post on 12-Jul-2015

371 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Cairosink and GPU Buffer Sharing (GStreamer Conference 2013)

Cairosink, GPU Buffer Sharing...and other random ramblings

Guillaume Emont - [email protected]

Page 2: Cairosink and GPU Buffer Sharing (GStreamer Conference 2013)

ongoing experiment, I may not have the best answers yet

Page 3: Cairosink and GPU Buffer Sharing (GStreamer Conference 2013)

Work sponsored by Samsung Research Americahttp://www.sisa.samsung.com/

Page 4: Cairosink and GPU Buffer Sharing (GStreamer Conference 2013)

I. Technologies, past and present

Page 5: Cairosink and GPU Buffer Sharing (GStreamer Conference 2013)

Cairo: 2D graphicsCairogles: 2D graphics in OpenGL(ES)

Page 6: Cairosink and GPU Buffer Sharing (GStreamer Conference 2013)

support for EGL/GLX/WGL

Page 7: Cairosink and GPU Buffer Sharing (GStreamer Conference 2013)

Sharing video buffers: before

- Add a specific cap (e.g. video/x-raw-gl) - subclass GstBuffer

Page 8: Cairosink and GPU Buffer Sharing (GStreamer Conference 2013)

Sharing video buffers: nowadays

- GstContext - GstVideoGLTextureUploadMeta - GstAllocator and GstMemory

Page 9: Cairosink and GPU Buffer Sharing (GStreamer Conference 2013)

- GstContext, system to share a GL context and more between elements - GstVideoGLTextureUploadMeta: a way to tell how to upload a buffer to GPU - GstAllocator and GstMemory: cleaner way to handle non-CPU memory

Page 10: Cairosink and GPU Buffer Sharing (GStreamer Conference 2013)

Sharing video buffers: nowadays

"modern" gl(es) sink implementationsknown to the author: - eglglessink (and libgstegl) - glimagesink

Page 11: Cairosink and GPU Buffer Sharing (GStreamer Conference 2013)

II. Integrating cairogles and GStreamer

Page 12: Cairosink and GPU Buffer Sharing (GStreamer Conference 2013)

Many possibilities: - xvimagesink + GstVideoOverlay - eglglessink - glimagesink - make our own sink

Page 13: Cairosink and GPU Buffer Sharing (GStreamer Conference 2013)

xvimagesink with overlay: not so fast, I suspect it triggers a download to CPU to get the image from xvimagesink's Drawable to a cairo-gl surface. eglglessink: promising, but obviously doesn't support openGL or GLX glimagesink started work on proper integration, likely will require addition of a few features there

Page 14: Cairosink and GPU Buffer Sharing (GStreamer Conference 2013)

First attempt:a cairosink that does everything

Page 15: Cairosink and GPU Buffer Sharing (GStreamer Conference 2013)

Cairosink: status

- GstAllocator and GstMemory subclasses - Use either OpenGL or OpenGLES - Possibility to use PixelBuffer Objects (PBOs) (inefficiently)

Page 16: Cairosink and GPU Buffer Sharing (GStreamer Conference 2013)

allocator and memory not that useful as it's the only element using it. Main advantage: _could_ allow to start uploading the frame as soon as possible. PBOs in a nutshell: a way to asynchronously upload a frame to a texture. The upload is then done through the magic of DMA, without the CPU being involved. More on why cairosink is currently inefficient at using it later. FIXME: graph explaining PBO?

Page 17: Cairosink and GPU Buffer Sharing (GStreamer Conference 2013)

Cairosink: simplistic benchmark

Page 18: Cairosink and GPU Buffer Sharing (GStreamer Conference 2013)
Page 19: Cairosink and GPU Buffer Sharing (GStreamer Conference 2013)

Synchronous / PBO / XV XV: limited by refresh rate? Looks like its genuine limit (often below 60) frames 720x400, RGB or YUV

Page 20: Cairosink and GPU Buffer Sharing (GStreamer Conference 2013)

Cairosink: difficulties (or rants)

- cairogles can be compiled with either gl or glesv2 (not both) - driver bugs and regressions - cairo only supports RGB - desktop vs mobile GPUs

Page 21: Cairosink and GPU Buffer Sharing (GStreamer Conference 2013)

driver regression: GL+EGL used to work on my machine...

Page 22: Cairosink and GPU Buffer Sharing (GStreamer Conference 2013)

Desktop vs mobile GPU

- EGLMakeCurrent() is costly on many mobile GPUs/drivers - bandwidth differences

Page 23: Cairosink and GPU Buffer Sharing (GStreamer Conference 2013)

context acquisition (makeCurrent) slowness is likely to counter the effects of asynchronous direct upload

Page 24: Cairosink and GPU Buffer Sharing (GStreamer Conference 2013)

Cairosink: what's to do - more flexibility on code path - compatibility with other elements (not our own memory/allocator)

Page 25: Cairosink and GPU Buffer Sharing (GStreamer Conference 2013)

we want to be able to tailor to various GPUs various "options": is it faster to do a synchronous or asynchronous upload?

Page 26: Cairosink and GPU Buffer Sharing (GStreamer Conference 2013)

Cairosink: other ideas to explore - libgstgl backend (ongoing experiment) - wrapper around glimagesink

Page 27: Cairosink and GPU Buffer Sharing (GStreamer Conference 2013)

libgstgl issues: mechanism to MakeCurrent() or save/restore states share GMainContext? (all in one thread)

Page 28: Cairosink and GPU Buffer Sharing (GStreamer Conference 2013)

Thank youQuestions?