<div dir="ltr"><div>Hi Matt,<br><br>Thanks for a great answer, appreciate it. We got it working by retrieving the gl context for a specific thread per your proposals. <br>Right now it works because we already use glupload prior in the pipeline, but will need to handle the context more properly i.e. create one if it doesn't exist.<br><br>Yeah I am aware of those classes, which absolutely would have been very helpful to use instead. <br>Also new to the gstreamer community but definitely would like to contribute at some point. <br><br>Thanks again,<br>Daniel </div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, 25 Nov 2022 at 04:20, Matthew Waters <<a href="mailto:ystreet00@gmail.com">ystreet00@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi,<br>
<br>
In order to properly integrate with any other GStreamer OpenGL element, <br>
you need to retrieve the OpenGL display and context objects from <br>
elsewhere in the pipeline through the GstContext mechanism.<br>
<br>
In C, this is: <br>
<a href="https://gstreamer.freedesktop.org/documentation/gl/gstglutils.html?gi-language=c#gst_gl_ensure_element_data" rel="noreferrer" target="_blank">https://gstreamer.freedesktop.org/documentation/gl/gstglutils.html?gi-language=c#gst_gl_ensure_element_data</a> <br>
for ensuring you have the display and the application provided context. <br>
<a href="https://gstreamer.freedesktop.org/documentation/gl/gstglutils.html?gi-language=c#gst_gl_handle_set_context" rel="noreferrer" target="_blank">https://gstreamer.freedesktop.org/documentation/gl/gstglutils.html?gi-language=c#gst_gl_handle_set_context</a> <br>
for handling GstElementClass::set_context. <br>
<a href="https://gstreamer.freedesktop.org/documentation/gl/gstglutils.html?gi-language=c#gst_gl_handle_context_query" rel="noreferrer" target="_blank">https://gstreamer.freedesktop.org/documentation/gl/gstglutils.html?gi-language=c#gst_gl_handle_context_query</a> <br>
for responding to queries of type GST_QUERY_CONTEXT for providing the <br>
display, other_context and context in use to the surrounding peers. <br>
<a href="https://gstreamer.freedesktop.org/documentation/gl/gstglquery.html?gi-language=c#gst_gl_query_local_gl_context" rel="noreferrer" target="_blank">https://gstreamer.freedesktop.org/documentation/gl/gstglquery.html?gi-language=c#gst_gl_query_local_gl_context</a> <br>
for asking the surrounding elements for the GL context they are using.<br>
<br>
If all that fails, then there is <br>
<a href="https://gstreamer.freedesktop.org/documentation/gl/gstgldisplay.html?gi-language=c#gst_gl_display_get_gl_context_for_thread" rel="noreferrer" target="_blank">https://gstreamer.freedesktop.org/documentation/gl/gstgldisplay.html?gi-language=c#gst_gl_display_get_gl_context_for_thread</a> <br>
for retrieving the GL context for a specific thread (NULL can be <br>
provided to get any GL context).<br>
<br>
Ultimately however, you are reimplementing what has been implemented by <br>
these two classes: <br>
<a href="https://gitlab.freedesktop.org/gstreamer/gstreamer/-/blob/main/subprojects/gst-plugins-base/ext/gl/gstglbasemixer.c" rel="noreferrer" target="_blank">https://gitlab.freedesktop.org/gstreamer/gstreamer/-/blob/main/subprojects/gst-plugins-base/ext/gl/gstglbasemixer.c</a> <br>
and <br>
<a href="https://gitlab.freedesktop.org/gstreamer/gstreamer/-/blob/main/subprojects/gst-plugins-base/ext/gl/gstglmixer.c" rel="noreferrer" target="_blank">https://gitlab.freedesktop.org/gstreamer/gstreamer/-/blob/main/subprojects/gst-plugins-base/ext/gl/gstglmixer.c</a> <br>
and time would be better spent making those classes public API and then <br>
generating the appropriate Rust bindings.<br>
<br>
Cheers<br>
-Matt<br>
<br>
On 24/11/22 21:24, Daniel Pendse via gstreamer-devel wrote:<br>
> Hi!<br>
><br>
> Working on a project to perform GL rendering based on multiple inputs <br>
> in GLMemory using the gstreamer rust bindings.<br>
> From previous suggestions we decided to use the GstAggregator as a <br>
> base class for our element. (Rust impl exists)<br>
> (See prev thread for more context: <br>
> <a href="https://lists.freedesktop.org/archives/gstreamer-devel/2022-November/080619.html" rel="noreferrer" target="_blank">https://lists.freedesktop.org/archives/gstreamer-devel/2022-November/080619.html</a>)<br>
><br>
> I have stumbled upon some issues with handling the GLContext when <br>
> creating custom shaders. When I try to create a GLSL Stage I fail with:<br>
><br>
> * (gst-launch-1.0:93053): GStreamer-GL-CRITICAL **: 10:10:35.633: <br>
> gst_gl_context_thread_add: assertion 'GST_IS_GL_CONTEXT (context)’ failed<br>
><br>
> It might seem that I fail to crate the context somehow or I don’t set <br>
> it properly. How should the GLContext be handled using the aggregator <br>
> as a base class?<br>
> I simply create the GLContext in the start method for my element and <br>
> intent to pass the context trough to the methods where I intend to use <br>
> GL calls.<br>
><br>
> // fn start<br>
> let gl_display = GLDisplay::new();<br>
> let gl_context = GLContext::new(&gl_display);<br>
> gl_context.activate(true).unwrap();<br>
><br>
> let shader_program = GLShader::new(gl_context);<br>
> let vertex_shader = GLSLStage::new_default_vertex(gl_context); // Crash<br>
><br>
> And also can I expect to input GLMemory and output GLMemory using this <br>
> baseclass  by using glupload/gldownload?<br>
> I am guessing that there might be a performance hit if I don’t <br>
> input/output GLMemory, and instead handle that in the element..<br>
> I have previous successfully managed to get gl textures passing <br>
> through the element like so feels like I am not handling the context <br>
> correct.<br>
> (gst-launch-1.0 videotestsrc ! ... ! glupload ! <ELEMENT>  ! <br>
> gldownload ! ... ! autovideosink<br>
><br>
> Any tips and help is greatly appreciated!<br>
><br>
> Daniel Pendse<br>
<br>
</blockquote></div></div>