<div dir="ltr">I'll be honest, thus far I've simply copied over <a href="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/blob/74557132e17e24677b4f60fcffe32adec4de60c7/examples/src/glupload.rs"><font face="monospace">examples/src/glupload.rs</font></a> and have been hacking away at it, in an attempt to understand the logic and understand the gstreamer_gl/glutin workflow, so I have nothing that would really make sense even as a draft MR. But there's a couple main points of glupload that are throwing me off.<div><br><div>So, as a brief summary, I'm trying to replicate <a href="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/blob/main/examples/src/glupload.rs"><font face="monospace">examples/src/glwindow.rs</font></a>, which simply creates a <font face="monospace">glupload::App(None)</font> (<a href="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/blob/74557132e17e24677b4f60fcffe32adec4de60c7/examples/src/bin/glwindow.rs#L11">L11</a>) and runs <font face="monospace">glupload::main_loop</font> in that <font face="monospace">App</font><font face="arial, sans-serif"> (<a href="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/blob/74557132e17e24677b4f60fcffe32adec4de60c7/examples/src/bin/glwindow.rs#L12">L12</a>). So my troubles come from trying to make </font><a href="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/blob/74557132e17e24677b4f60fcffe32adec4de60c7/examples/src/glupload.rs"><font face="monospace">examples/src/glupload.rs</font></a><font face="arial, sans-serif"> support Windows (WGL).</font></div></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">With that said, my troubles start in </font><a href="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/blob/74557132e17e24677b4f60fcffe32adec4de60c7/examples/src/glupload.rs#L330" style="font-family:monospace">glupload::App::new</a><font face="arial, sans-serif">, specifically at <a href="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/blob/74557132e17e24677b4f60fcffe32adec4de60c7/examples/src/glupload.rs#L350">L350</a>. Here glupload fails by design if the platform is not linux. This is easy to fix, but within this if statement, glupload matches the raw gl context handle, provided by glutin, checking only for EGL and GLX, then creates a </font><a href="https://gstreamer.pages.freedesktop.org/gstreamer-rs/stable/latest/docs/gstreamer_gl/struct.GLDisplay.html" style="font-family:monospace">GLDisplay</a><font face="arial, sans-serif"> using </font><font face="monospace"><a href="https://gstreamer.pages.freedesktop.org/gstreamer-rs/stable/latest/docs/gstreamer_gl_egl/struct.GLDisplayEGL.html#method.from_gl_display"><span class="gmail-nn">gstreamer_gl_egl</span><span class="gmail-p">::</span><span class="gmail-nn">GLDisplayEGL</span><span class="gmail-p">::</span></a></font><span class="gmail-nf"><font face="monospace"><a href="https://gstreamer.pages.freedesktop.org/gstreamer-rs/stable/latest/docs/gstreamer_gl_egl/struct.GLDisplayEGL.html#method.from_gl_display">with_egl_display</a></font>, </span><font face="monospace"><a href="https://gstreamer.pages.freedesktop.org/gstreamer-rs/stable/latest/docs/gstreamer_gl_wayland/struct.GLDisplayWayland.html#method.with_display"><span class="gmail-nn">gstreamer_gl_wayland</span><span class="gmail-p">::</span><span class="gmail-nn">GLDisplayWayland</span><span class="gmail-p">::</span></a></font><span class="gmail-nf"><font face="monospace"><a href="https://gstreamer.pages.freedesktop.org/gstreamer-rs/stable/latest/docs/gstreamer_gl_wayland/struct.GLDisplayWayland.html#method.with_display">with_display</a></font>, or </span><font face="monospace"><a href="https://gstreamer.pages.freedesktop.org/gstreamer-rs/stable/latest/docs/gstreamer_gl_x11/struct.GLDisplayX11.html#method.with_display"><span class="gmail-nn">gstreamer_gl_x11</span><span class="gmail-p">::</span><span class="gmail-nn">GLDisplayX11</span><span class="gmail-p">::</span></a></font><span class="gmail-nf"><font face="monospace"><a href="https://gstreamer.pages.freedesktop.org/gstreamer-rs/stable/latest/docs/gstreamer_gl_x11/struct.GLDisplayX11.html#method.with_display">with_display</a></font>, depending on context. Lastly, it creates a wrapped <font face="monospace">GLContext</font><font face="arial, sans-serif"> (<a href="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/blob/74557132e17e24677b4f60fcffe32adec4de60c7/examples/src/glupload.rs#L408">L408</a>)</font>, using the <font face="monospace">GLDisplay</font><font face="arial, sans-serif"> created in the previous step.</font> As far as I can tell, this process handles linking the gl context provided by glutin to a <font face="monospace">GLContext</font> and linking that with the <font face="monospace">GLDisplay</font><font face="arial, sans-serif"> created in the egl/wayland/x11 functions. It's this linking that I can't seem to replicate on Windows. Since there's no equivalent functions for WGL, I'm somewhat left in the dark here.</font></span></div><div><span class="gmail-nf"><font face="arial, sans-serif"><br></font></span></div><div><span class="gmail-nf"><font face="arial, sans-serif">The most progress I've managed to make here is simply creating a <a href="https://gstreamer.pages.freedesktop.org/gstreamer-rs/stable/latest/docs/gstreamer_gl/struct.GLDisplay.html#method.new">new </a></font><a href="https://gstreamer.pages.freedesktop.org/gstreamer-rs/stable/latest/docs/gstreamer_gl/struct.GLDisplay.html#method.new" style="font-family:monospace">GLDisplay</a> in place <font face="arial, sans-serif">of the </font><font face="monospace">GLDisplayXXX::with_display</font><font face="arial, sans-serif"> functions, creating the wrapped </font><font face="monospace">GLContext</font><font face="arial, sans-serif"> in the same way as </font></span><a href="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/blob/74557132e17e24677b4f60fcffe32adec4de60c7/examples/src/glupload.rs#L408" style="font-family:arial,sans-serif">L408</a>:</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><font face="monospace">// <a href="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/blob/74557132e17e24677b4f60fcffe32adec4de60c7/examples/src/glupload.rs#L356">L356</a></font></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><font face="monospace">let api = App::map_gl_api(windowed_context.get_api());<br></font></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"> </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"> <font face="monospace">// replace <a href="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/blob/74557132e17e24677b4f60fcffe32adec4de60c7/examples/src/glupload.rs#L358-406">L358-406</a> with the following</font></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><font face="monospace"></font><font face="monospace">let gl_context = if let RawHandle::Wgl(ctx) = unsafe { windowed_context.raw_handle() } {<br></font><font face="monospace">    ctx as usize<br></font><font face="monospace">} else {<br></font><font face="monospace">    panic!("Expected WGL!");<br></font><font face="monospace">};<br></font></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><font face="monospace">// leak to ensure the display doesn't get dropped</font></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><font face="monospace"></font><font face="monospace">let gl_display: &'static gstreamer_gl::GLDisplay</font><span style="font-family:monospace"> = Box::leak(Box::new(gstreamer_gl::GLDisplay::new()));</span></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><font face="monospace">let platform = gstreamer_gl::GLPlatform::WGL;</font></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"> </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"> <font face="monospace">// <a href="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/blob/74557132e17e24677b4f60fcffe32adec4de60c7/examples/src/glupload.rs#L408">L408</a></font></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><font face="monospace">shared_context = </font><font face="monospace">unsafe { gst_gl::GLContext::new_wrapped(gl_display, gl_context, platform, api) } </font><font face="monospace">.unwrap();</font></blockquote><div><br></div><div>which compiles and makes it past <font face="monospace">App::new</font>, but then fails in <font face="monospace">main_loop</font><font face="arial, sans-serif"> with the following error:</font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="monospace">failed to share contexts through wglShareLists 0xaa', <a href="https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/blob/74557132e17e24677b4f60fcffe32adec4de60c7/examples/src/glupload.rs#L697">src\glupload.rs:697:44</a></font><font face="arial, sans-serif"><br></font></div><div><br></div><div><font face="arial, sans-serif">My intuition tells me that the </font><font face="monospace">GLDisplay</font><font face="arial, sans-serif"> and gl context aren't getting properly linked, but I might be wrong. Anyway, hopefully this is helpful, and thanks for all your help so far!</font></div></div>