Handling GLContext in GstAggregator Element (Rust)

Matthew Waters ystreet00 at gmail.com
Fri Nov 25 03:20:27 UTC 2022


Hi,

In order to properly integrate with any other GStreamer OpenGL element, 
you need to retrieve the OpenGL display and context objects from 
elsewhere in the pipeline through the GstContext mechanism.

In C, this is: 
https://gstreamer.freedesktop.org/documentation/gl/gstglutils.html?gi-language=c#gst_gl_ensure_element_data 
for ensuring you have the display and the application provided context. 
https://gstreamer.freedesktop.org/documentation/gl/gstglutils.html?gi-language=c#gst_gl_handle_set_context 
for handling GstElementClass::set_context. 
https://gstreamer.freedesktop.org/documentation/gl/gstglutils.html?gi-language=c#gst_gl_handle_context_query 
for responding to queries of type GST_QUERY_CONTEXT for providing the 
display, other_context and context in use to the surrounding peers. 
https://gstreamer.freedesktop.org/documentation/gl/gstglquery.html?gi-language=c#gst_gl_query_local_gl_context 
for asking the surrounding elements for the GL context they are using.

If all that fails, then there is 
https://gstreamer.freedesktop.org/documentation/gl/gstgldisplay.html?gi-language=c#gst_gl_display_get_gl_context_for_thread 
for retrieving the GL context for a specific thread (NULL can be 
provided to get any GL context).

Ultimately however, you are reimplementing what has been implemented by 
these two classes: 
https://gitlab.freedesktop.org/gstreamer/gstreamer/-/blob/main/subprojects/gst-plugins-base/ext/gl/gstglbasemixer.c 
and 
https://gitlab.freedesktop.org/gstreamer/gstreamer/-/blob/main/subprojects/gst-plugins-base/ext/gl/gstglmixer.c 
and time would be better spent making those classes public API and then 
generating the appropriate Rust bindings.

Cheers
-Matt

On 24/11/22 21:24, Daniel Pendse via gstreamer-devel wrote:
> Hi!
>
> Working on a project to perform GL rendering based on multiple inputs 
> in GLMemory using the gstreamer rust bindings.
> From previous suggestions we decided to use the GstAggregator as a 
> base class for our element. (Rust impl exists)
> (See prev thread for more context: 
> https://lists.freedesktop.org/archives/gstreamer-devel/2022-November/080619.html)
>
> I have stumbled upon some issues with handling the GLContext when 
> creating custom shaders. When I try to create a GLSL Stage I fail with:
>
> * (gst-launch-1.0:93053): GStreamer-GL-CRITICAL **: 10:10:35.633: 
> gst_gl_context_thread_add: assertion 'GST_IS_GL_CONTEXT (context)’ failed
>
> It might seem that I fail to crate the context somehow or I don’t set 
> it properly. How should the GLContext be handled using the aggregator 
> as a base class?
> I simply create the GLContext in the start method for my element and 
> intent to pass the context trough to the methods where I intend to use 
> GL calls.
>
> // fn start
> let gl_display = GLDisplay::new();
> let gl_context = GLContext::new(&gl_display);
> gl_context.activate(true).unwrap();
>
> let shader_program = GLShader::new(gl_context);
> let vertex_shader = GLSLStage::new_default_vertex(gl_context); // Crash
>
> And also can I expect to input GLMemory and output GLMemory using this 
> baseclass  by using glupload/gldownload?
> I am guessing that there might be a performance hit if I don’t 
> input/output GLMemory, and instead handle that in the element..
> I have previous successfully managed to get gl textures passing 
> through the element like so feels like I am not handling the context 
> correct.
> (gst-launch-1.0 videotestsrc ! ... ! glupload ! <ELEMENT>  ! 
> gldownload ! ... ! autovideosink
>
> Any tips and help is greatly appreciated!
>
> Daniel Pendse

-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature
Type: application/pgp-signature
Size: 495 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20221125/e5245fdf/attachment.sig>


More information about the gstreamer-devel mailing list