<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    If you're running on linux, there is a native display handle behind
    the EGLDIsplay.  That native display handle would be an X11 Display,
    or a wayland wl_display (or maybe a mir display).  OpenGL resources
    cannot be shared unless this 'native' display type is the same
    between all OpenGL uses.  Passing an EGLDisplay is not sufficient
    and will not work.<br>
    <br>
    You need to pass the state->xdisplay using the appropriate
    platform-specific gst_gl_display_x11_new_with_display().  You cannot
    use the EGLDisplay version here.<br>
    <br>
    Cheers<br>
    -Matt<br>
    <br>
    <div class="moz-cite-prefix">On 17/8/21 12:40 am, Lusine Hayrapetyan
      wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:CAO4TkMi10s569jFpyvVBsvX+ayU+xAcDXCDPSBuSM-AcTwtamw@mail.gmail.com">
      <meta http-equiv="content-type" content="text/html; charset=UTF-8">
      <div dir="ltr">Hi Mat,
        <div><br>
        </div>
        <div>My display is <b>EGLDisplay </b>type:<br>
          <div>  /* get an EGL display connection */<br>
          </div>
          <div>
            <div>  EGLNativeDisplayType nativeDisplay =
              state->xdisplay;<br>
            </div>
            <div>  <b>state->display</b> = eglGetDisplay
              (nativeDisplay);<br>
            </div>
              assert (state->display != EGL_NO_DISPLAY);</div>
          <div><br>
          </div>
          <div>/* The I create an EGL rendering context with EGLDisplay
            */<br>
              state->context =<br>
                  eglCreateContext (state->display, config,
            EGL_NO_CONTEXT, context_attributes);<br>
          </div>
          <div><br>
          </div>
        </div>
        <div>/* Then I create  GstGLDisplayEGL from EGLDisplay */</div>
        <div>state->gst_display =
          gst_gl_display_egl_new_with_egl_display (state->display);<br>
        </div>
        <div><br>
        </div>
        <div>/* And create my wrapped context with GstGLDisplayEGL */</div>
        <div>  state->gl_context =<br>
                gst_gl_context_new_wrapped (GST_GL_DISPLAY
          (state->gst_display),<br>
                (guintptr) state->context, GST_GL_PLATFORM_EGL,
          GST_GL_API_GLES2);<br>
        </div>
        <div><br>
        </div>
        <div>/* Now I want to create a shared context from my wrapped
          context and again I pass GstGLDisplayEGL to it */</div>
        <div>gst_gl_display_create_context(GST_GL_DISPLAY(state->gst_display),
          state->gl_context, &state->newContext, &error) )<br>
        </div>
        <div><br>
        </div>
        <div>And this function complains that it expects an x11 display
          instead of egl display. But I don't understand how I can pass
          x11 display because my context is created with egl display.</div>
        <div>I'm not experienced in opengl es & egl, do I miss
          something?</div>
        <div><br>
        </div>
        <div>Regards,</div>
        <div>Lusine</div>
      </div>
      <br>
      <div class="gmail_quote">
        <div dir="ltr" class="gmail_attr">On Fri, Aug 13, 2021 at 1:48
          PM Matthew Waters <<a href="mailto:ystreet00@gmail.com"
            target="_blank" moz-do-not-send="true">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">
          <div> <br>
            <br>
            <div>On 13/8/21 5:59 pm, Lusine Hayrapetyan wrote:<br>
            </div>
            <blockquote type="cite">
              <div dir="ltr">In gstglconfig.h I see the following:
                <div><i>#define GST_GL_HAVE_WINDOW_X11 1<br>
                  </i></div>
                <div><br>
                </div>
                <div>I've built the latest master on Ubuntu 20 and still
                  see the same message about x11 window and there is a
                  new FIXME message:<br>
                  0:00:03.382786440 252231 0x55e6075596a0 INFO          
                       glwindow gstglwindow.c:295:gst_gl_window_new:
                  creating a window, user choice:x11<br>
                  0:00:03.382847275 252231 0x55e6075596a0 INFO          
                       glwindow
                  gstglwindow_x11.c:136:gst_gl_window_x11_new: Wrong
                  display type 32 for this window type 1<br>
                </div>
              </div>
            </blockquote>
            <br>
            This is the problematic line.  The display type (EGL) as
            returned by gst_gl_display_get_type() does not match the
            window impl's expectations (X11).  If you are running under
            X11 and your application is using X11 to connect to the
            display server, you need to pass an X11 GstGLDisplay. 
            Passing an EGLDisplay is not sufficient and will not work. 
            An appropriate EGLDIsplay will be created internally.<br>
            <br>
            Cheers<br>
            -Matt<br>
            <br>
            <blockquote type="cite">
              <div dir="ltr">
                <div>0:00:03.382877455 252231 0x55e6075596a0 WARN      
                          <font color="#ff0000"> glwindow
                    gstglwindow.c:340:gst_gl_window_new: Could not
                    create window. user specified x11, creating dummy
                    window</font><br>
                  0:00:03.382998854 252231 0x55e6075596a0 DEBUG        
                       gldisplay
                  gstgldisplay.c:694:gst_gl_display_create_window:<gldisplayegl0>
                  Adding window <gldummywindow0> (0x55e607797c50)
                  to internal list<br>
                  0:00:03.383024753 252231 0x55e6075596a0 DEBUG        
                       glcontext
                  gstglcontext.c:963:gst_gl_context_set_window:<glcontextegl0>
                  window:<gldummywindow0><br>
                  0:00:03.383269595 252231 0x55e6077b5640 DEBUG        
                       glcontext
                  gstglcontext.c:1223:gst_gl_context_create_thread:<glcontextegl0>
                  Creating thread<br>
                  0:00:03.383377039 252231 0x55e6077b5640 <font
                    color="#ff0000">FIXME              glcontext
gstglcontext.c:2039:gst_gl_wrapped_context_get_config:<glwrappedcontext0>
                    wrapped context could not retrieve config. The
                    application may be missing a call to
                    gst_gl_context_fill_info() or the specific platform
                    implemention is not implemented for retrieving the
                    config from a wrapped OpenGL context.</font><br>
                  0:00:03.383437907 252231 0x55e6077b5640 INFO          
                      glcontext
                  gstglcontext.c:1315:gst_gl_context_create_thread:<glcontextegl0>
                  Attempting to create opengl context. user chosen
                  api(s) (gles2), compiled api support (opengl opengl3
                  gles2) display api (gles2)<br>
                  0:00:03.383463315 252231 0x55e6077b5640 DEBUG        
                       glcontext
gstglcontext_egl.c:863:gst_gl_context_egl_create_context:<glcontextegl0>
                  Creating EGL context<br>
                </div>
                <div><br>
                </div>
                <div>Regards,</div>
                <div>Lusine</div>
              </div>
              <br>
              <div class="gmail_quote">
                <div dir="ltr" class="gmail_attr">On Thu, Aug 12, 2021
                  at 11:18 AM Matthew Waters <<a
                    href="mailto:ystreet00@gmail.com" target="_blank"
                    moz-do-not-send="true">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">
                  <div> Yes, that is a critical error for X11.  X11
                    would require access to an X11 Display which must be
                    provided by your application in order share OpenGL
                    resources.  You may also not have X11 support built
                    and you would have to check your build configuration
                    for that.  gstglconfig.h would contain information
                    on what libgstgl-1.0 was built with.<br>
                    <br>
                    It looks like it's picking a raw EGLDisplay
                    instead.  This was potentially an issue in previous
                    versions of GStreamer that has been fixed in master
                    by <a
href="https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/1154"
                      target="_blank" moz-do-not-send="true">https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/1154</a>
                    and <a
href="https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/1169"
                      target="_blank" moz-do-not-send="true">https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/1169</a>.<br>
                    <br>
                    Cheers<br>
                    -Matt<br>
                    <br>
                    <div>On 12/8/21 1:50 am, Lusine Hayrapetyan wrote:<br>
                    </div>
                    <blockquote type="cite">
                      <div dir="ltr">For limiting to a particular OpenGL
                        variant I'm using the following environment
                        variables, is it the same?
                        <div><i> export GST_GL_WINDOW=x11<br>
                             export GST_GL_PLATFORM=egl<br>
                             export GST_GL_API=gles2</i><br>
                        </div>
                        <div><i><br>
                          </i></div>
                        <div>I've attached GST_DEBUG=gl*:7 output
                          (gl_output.txt).</div>
                        <div>I see the following messages in the output:<br>
                          <i>0:00:03.857084617 24438 0x55d59121d400 INFO
                                           glwindow
                            gstglwindow.c:278:gst_gl_window_new:
                            creating a window, user choice:x11<br>
                            0:00:03.857117499 24438 0x55d59121d400 INFO
                                           glwindow
                            gstglwindow_x11.c:137:gst_gl_window_x11_new:
                            Wrong display type 32 for this window type 1<br>
                            0:00:03.857144332 24438 0x55d59121d400 WARN
                                           glwindow
                            gstglwindow.c:324:gst_gl_window_new: Could
                            not create window. user specified x11,
                            creating dummy window<br>
                            0:00:03.857277761 24438 0x55d59121d400 DEBUG
                                         gldisplay
                            gstgldisplay.c:579:gst_gl_display_create_window:<gldisplayegl0>
                            Adding window <gldummywindow0>
                            (0x55d5913809d0) to internal list<br>
                            0:00:03.857311159 24438 0x55d59121d400 DEBUG
                                         glcontext
                            gstglcontext.c:948:gst_gl_context_set_window:<glcontextegl0>
                            window:<gldummywindow0></i><br>
                        </div>
                        <div><i><br>
                          </i></div>
                        <div>Is this a critical issue? Can this cause a
                          texture reading issue?</div>
                      </div>
                      <br>
                      <div class="gmail_quote">
                        <div dir="ltr" class="gmail_attr">On Tue, Aug
                          10, 2021 at 10:21 AM Matthew Waters <<a
                            href="mailto:ystreet00@gmail.com"
                            target="_blank" moz-do-not-send="true">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">
                          <div> Ah, if you want to limit to a particular
                            OpenGL variant,  you need to also call
                            gst_gl_display_filter_gl_api() with that
                            variant.<br>
                            <br>
                            GST_DEBUG=gl*:7 will output a whole bunch of
                            information about what is generated and
                            tried in all of this respect.<br>
                            <br>
                            Cheers<br>
                            -Matt<br>
                            <br>
                            <div>On 9/8/21 12:58 am, Lusine Hayrapetyan
                              wrote:<br>
                            </div>
                            <blockquote type="cite">
                              <div dir="ltr">
                                <div dir="ltr">Hi Matthew,<br>
                                  Seems the second approach fits to my
                                  use case- I need to push textures
                                  which are created in opengles &
                                  egl( it means not in gstreamer
                                  context) to gstreamer.
                                  <div>I've changed my code to use  <code>gst_gl_display_create_context
                                      & </code> <code><span>gst_gl_display_add_context
                                        <font face="arial, sans-serif">but
                                          still can't read textures in
                                          gstreamer, gstreamer prudeces
                                          the following errors after I
                                          push buffer to appsrc:</font></span></code></div>
                                  <div><code>(testegl1:24602):
                                      GStreamer-CRITICAL **:
                                      13:02:55.568:
                                      gst_debug_log_valist: assertion
                                      'category != NULL' failed<br>
                                      0:00:14.039444188 24602
                                      0x5611bc356d90 WARN          
                                      glbasetexture
                                      gstglmemory.c:401:gst_gl_memory_read_pixels:
                                      Could not create framebuffer to
                                      read pixels for memory
                                      0x7f8cf0017ac0<br>
                                      0:00:14.039480909 24602
                                      0x5611bc356d90 WARN          
                                       glbasememory
                                      gstglbasememory.c:585:gst_gl_base_memory_memcpy:
                                      could not read map source memory
                                      0x7f8cf0017ac0<br>
                                      0:00:14.039505741 24602
                                      0x5611bc356d90 WARN              
                                       glmemory
                                      gstglmemorypbo.c:592:_gl_mem_copy:
                                      Could not copy GL Memory<br>
                                      0:00:14.039779268 24602
                                      0x5611bc4f14f0 ERROR            
                                       videometa
                                      gstvideometa.c:247:default_map:
                                      cannot map memory range 0-1<br>
                                      0:00:14.039846056 24602
                                      0x5611bc4f14f0 ERROR              
                                       default
                                      video-frame.c:168:gst_video_frame_map_id:
                                      failed to map video frame plane 0<br>
                                      0:00:14.039891314 24602
                                      0x5611bc4f14f0 WARN            
                                      videofilter
                                      gstvideofilter.c:297:gst_video_filter_transform:<videoconvert0>
                                      warning: invalid video buffer
                                      received<span><font face="arial,
                                          sans-serif"><br>
                                        </font></span></code></div>
                                  <div><code><span><font face="arial,
                                          sans-serif"><br>
                                        </font></span></code></div>
                                  <div><code><span><font face="arial,
                                          sans-serif"><br>
                                        </font></span></code></div>
                                  <div><code><span><font face="arial,
                                          sans-serif">This is how I
                                          implemented it, did I
                                          misunderstand something? </font></span></code></div>
                                  <div><code><span><font face="arial,
                                          sans-serif"><br>
                                        </font></span></code></div>
                                  <div>I have rendering thread where I
                                    initialize opengles context and
                                    create wrapped and the new contexts.</div>
                                  <div>//</div>
                                  <div>//  Description: Sets the
                                    display, OpenGL|ES context and
                                    screen stuff</div>
                                  <div>// Created GstGLContext s -
                                    wrapped (gst_gl_context_new_wrapped)
                                    and new
                                    context(gst_gl_display_create_context)</div>
                                  <div>//</div>
                                  <div>static void<br>
                                    init_ogl (APP_STATE_T * state)<br>
                                  </div>
                                  <div>{</div>
                                  <div>...</div>
                                   /* get an EGL display connection */<br>
                                    state->display = eglGetDisplay
                                  (EGL_DEFAULT_DISPLAY);<br>
                                    assert (state->display !=
                                  EGL_NO_DISPLAY);<br>
                                    /* initialize the EGL display
                                  connection */<br>
                                    result = eglInitialize
                                  (state->display, NULL, NULL);<br>
                                  <div>  assert (EGL_FALSE != result); </div>
                                  <div><br>
                                  </div>
                                  <div>/* create an EGL rendering
                                    context */<br>
                                     state->context =<br>
                                          eglCreateContext
                                    (state->display, config,
                                    EGL_NO_CONTEXT, context_attributes);<br>
                                      assert (state->context !=
                                    EGL_NO_CONTEXT);<br>
                                  </div>
                                  <div>//</div>
                                  <div>// Initialize GStreamer related
                                    resources.</div>
                                  <div>//</div>
                                  <div>state->gst_display =
                                    gst_gl_display_egl_new_with_egl_display
                                    (state->display);<br>
                                    state->gl_context =<br>
                                          gst_gl_context_new_wrapped
                                    (GST_GL_DISPLAY
                                    (state->gst_display),<br>
                                          (guintptr) state->context,
                                    GST_GL_PLATFORM_EGL,
                                    GST_GL_API_GLES2);<br>
                                    <br>
                                    GError *error = NULL;<br>
                                    if (
                                    !gst_gl_display_create_context(GST_GL_DISPLAY(state->gst_display),
                                    state->gl_context,
                                    &state->newContext,
                                    &error) )<br>
                                         g_print("Failed to create new
                                    context\n");</div>
                                  <div><br>
                                    if (
                                    !gst_gl_display_add_context(GST_GL_DISPLAY(state->gst_display),
                                    state->newContext))<br>
                                        g_print("Failed to add new
                                    context to display\n");</div>
                                  <div><br>
                                  </div>
                                  <div>} // init_ogl end.</div>
                                  <div><br>
                                  </div>
                                  <div><br>
                                  </div>
                                  <div>static void<br>
                                    sync_bus_call (GstBus * bus,
                                    GstMessage * msg, gpointer * data)<br>
                                    {<br>
                                    <br>
                                       APP_STATE_T *state = (APP_STATE_T
                                    *)data;<br>
                                        switch (GST_MESSAGE_TYPE (msg))<br>
                                        {<br>
                                            case
                                    GST_MESSAGE_NEED_CONTEXT:<br>
                                            {<br>
                                                const gchar
                                    *context_type;<br>
                                               
                                    gst_message_parse_context_type (msg,
                                    &context_type);<br>
                                    <br>
                                                GstContext *context =
                                    NULL;<br>
                                                if (g_strcmp0
                                    (context_type,
                                    GST_GL_DISPLAY_CONTEXT_TYPE) == 0)<br>
                                                {<br>
                                                   GstGLDisplay *
                                    gl_display =
                                    GST_GL_DISPLAY(state->gst_display);<br>
                                                   context =
                                    gst_context_new
                                    (GST_GL_DISPLAY_CONTEXT_TYPE, TRUE);<br>
                                                 
                                     gst_context_set_gl_display(context,
                                    gl_display);<br>
                                                 
                                     gst_element_set_context
                                    (GST_ELEMENT(msg->src), context);<br>
                                                }<br>
                                                else if (g_strcmp0
                                    (context_type, "gst.gl.app_context")
                                    == 0)<br>
                                                {<br>
                                                    GstContext *context
                                    =
                                    gst_context_new("gst.gl.app_context",
                                    TRUE);<br>
                                                    GstStructure *s =
                                    gst_context_writable_structure
                                    (context);<br>
                                                    gst_structure_set
                                    (s, "context", GST_TYPE_GL_CONTEXT,
                                    state->gl_context, NULL);<br>
                                                   
                                    gst_element_set_context(GST_ELEMENT(msg->src),
                                    context);  <br>
                                                }<br>
                                                break;<br>
                                            }<br>
                                            default:<br>
                                              break;<br>
                                      }<br>
                                    } // sync_bus_call end<br>
                                  </div>
                                  <div><br>
                                  </div>
                                  <div><br>
                                  </div>
                                  <div>
                                    <div>I use need-data callback to
                                      create a buffer from texture_id
                                      and and push it in the appsrc:</div>
                                    <div><i>g_signal_connect
                                        (state->appsrc, "need-data",
                                        G_CALLBACK (</i> pushFrame <i>),
                                        state);</i></div>
                                  </div>
                                  <div><i><br>
                                    </i></div>
                                  <div>static bool pushFrame(...,
                                    APP_STATE_T * state)<br>
                                    {<br>
                                         // Wrap the texture into
                                    GstGLMemory<br>
                                        GstVideoInfo vinfo;<br>
                                       
                                    gst_video_info_set_format(&vinfo,
                                    GST_VIDEO_FORMAT_RGBA,
                                    state->screen_width,
                                    state->screen_height);<br>
                                        // Use  state->newContext for
                                    allocator.<br>
                                        GstAllocator* allocator =
GST_ALLOCATOR(gst_gl_memory_allocator_get_default(state->newContext));<br>
                                        GstGLVideoAllocationParams*
                                    params =
                                    gst_gl_video_allocation_params_new_wrapped_texture(<br>
                                           state->newContext, NULL,
                                    &vinfo, 0, NULL,
                                    GST_GL_TEXTURE_TARGET_2D,
                                    GST_GL_RGBA, state->tex,<br>
                                          NULL, 0);<br>
                                    <br>
                                        GstGLMemory* glMemory =
                                    GST_GL_MEMORY_CAST(gst_gl_base_memory_alloc(<br>
                                         
                                    GST_GL_BASE_MEMORY_ALLOCATOR_CAST(allocator),
                                    (GstGLAllocationParams*) params));<br>
                                    <br>
                                       
                                    gst_gl_allocation_params_free((GstGLAllocationParams
                                    *)params);<br>
                                        gst_object_unref(allocator);<br>
                                    <br>
                                        // Attach GstGLMemory object
                                    into buffer, timestamp the buffer
                                    and push it downstream<br>
                                        GstBuffer* buffer =
                                    gst_buffer_new();<br>
                                        gst_buffer_append_memory(buffer,
                                    GST_MEMORY_CAST(glMemory));<br>
                                    <br>
                                        GstVideoMeta * vmeta =
                                    gst_buffer_add_video_meta(buffer,
                                    GST_VIDEO_FRAME_FLAG_NONE,
                                    GST_VIDEO_FORMAT_RGBA,
                                    state->screen_width,
                                    state->screen_height);<br>
                                    <br>
                                        // Put timestamps into buffer<br>
                                        GST_BUFFER_PTS (buffer) =
                                    timestamp;<br>
                                        GST_BUFFER_DURATION (buffer) =
                                    gst_util_uint64_scale_int (1,
                                    GST_SECOND, 2);<br>
                                        timestamp += GST_BUFFER_DURATION
                                    (buffer);<br>
                                    <br>
                                        GstFlowReturn ret;<br>
                                       
                                    g_signal_emit_by_name(state->appsrc,
                                    "push-buffer", buffer, &ret);<br>
                                    <br>
                                        if (ret != GST_FLOW_OK)<br>
                                        {<br>
                                            // Something wrong, stop
                                    pushing.<br>
                                            g_printerr("Something went
                                    wrong: Pushing buffer into appsrc is
                                    stopped.\n");<br>
                                            return false;<br>
                                        }<br>
                                    <br>
                                        return true;<br>
                                    } // pushFrame end<br>
                                    <br>
                                  </div>
                                  <div>Regards,</div>
                                  <div>Lusine</div>
                                </div>
                                <br>
                                <div class="gmail_quote">
                                  <div dir="ltr" class="gmail_attr">On
                                    Fri, Aug 6, 2021 at 8:59 AM Matthew
                                    Waters <<a
                                      href="mailto:ystreet00@gmail.com"
                                      target="_blank"
                                      moz-do-not-send="true">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">
                                    <div> Hi,<br>
                                      <br>
                                      <div>On 6/8/21 1:12 am, Lusine
                                        Hayrapetyan wrote:<br>
                                      </div>
                                      <blockquote type="cite">
                                        <div dir="ltr">Dear Matt,<br>
                                          Thank you very much for your
                                          response. It helped me to
                                          understand that using 
                                          'wrapped' OpenGL context is a
                                          wrong direction to go :) 
                                          <div><br>
                                            <i>WRT Suggestion 1:</i>
                                            <div>Do I understand
                                              correctly that I need to
                                              get local context from
                                              gstreamer and pass it to
                                              opengl rendering thread?
                                              (I have a rendering thread
                                              where I set OpenGL|ES
                                              context and screen stuff).</div>
                                            <div>GstGLContext* mContext
                                              = nullptr;<br>
                                            </div>
                                            <div>g_object_get(state->gldownload,
                                              "context", &mContext,
                                              NULL);<br>
                                            </div>
                                            <div>guintptr handle;<br>
                                              handle =
                                              gst_gl_context_get_gl_context(mContext);
                                              // is this correct?<br>
                                              state->context =
                                              (EGLContext)handle; //
                                              state->context
                                              is EGLContext type;<br>
                                            </div>
                                            <div>And then use
                                              state->context in
                                              OpenGL|ES?</div>
                                          </div>
                                          <div>Do I need to get and pass
                                            window and display
                                            from gstreamer to my
                                            rendering thread as well?</div>
                                          <div>Although my use scenario
                                            is different from this one -
                                            I need to pass context from
                                            OpenGL to Gstreamer.</div>
                                        </div>
                                      </blockquote>
                                      <br>
                                      You only need to retrieve or
                                      create a non-wrapped GstGLContext
                                      and use that for creating your
                                      textures that you are pushing into
                                      GStreamer.  You don't need to use
                                      GStreamer's provided OpenGL
                                      context for anything else. 
                                      Everything else in your sample
                                      remains the same.  You may need to
                                      add a GstGLSyncMeta on your
                                      buffers you are pushing into
                                      GStreamer to provide the necessary
                                      synchronisation guarantees between
                                      the shared OpenGL contexts
                                      (application and GStreamer).  On
                                      some platforms the window handle
                                      type and format may be important
                                      however in general on linux
                                      (X11/wayland) it doesn't really
                                      matter.<br>
                                      <br>
                                      You must not attempt to use
                                      GStreamer's OpenGL context as-is
                                      (using e.g. eglMakeCurrent() or
                                      anything of the like) from outside
                                      the GStreamer OpenGL context
                                      thread (as provided by the
                                      gst_gl_context_thread_add() API).<br>
                                      <br>
                                      <blockquote type="cite">
                                        <div dir="ltr">
                                          <div><i>WRT Suggestion 2:</i><br>
                                          </div>
                                          <div>gst_gl_display_create_context
                                            accepts <i>other_context </i>argument,
                                            should the <i>other_context </i>be
                                            the 'wrapped' context?</div>
                                        </div>
                                      </blockquote>
                                      <br>
                                      Yes.  other_context is the
                                      GstGLContext that will be shared
                                      with the newly created
                                      GstGLContext.<br>
                                      <br>
                                      Side note, GStreamer cannot use
                                      any application-provided OpenGL
                                      context as-is due to the overhead
                                      of dealing with all the OpenGL
                                      state that may be changed behind
                                      GStreamer's back.  This is why the
                                      OpenGL context sharing dance is
                                      required.<br>
                                      <br>
                                      Cheers<br>
                                      -Matt<br>
                                      <br>
                                      <blockquote type="cite">
                                        <div dir="ltr">
                                          <div>Best Regards,</div>
                                          <div>Lusine</div>
                                        </div>
                                        <br>
                                        <div class="gmail_quote">
                                          <div dir="ltr"
                                            class="gmail_attr">On Thu,
                                            Aug 5, 2021 at 12:39 PM
                                            Matthew Waters <<a
                                              href="mailto:ystreet00@gmail.com"
                                              target="_blank"
                                              moz-do-not-send="true">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">
                                            <div> So, I think you almost
                                              have the correct sequence.<br>
                                              <br>
                                              Response inline.<br>
                                              <br>
                                              <div>On 5/8/21 1:04 am,
                                                Lusine Hayrapetyan via
                                                gstreamer-devel wrote:<br>
                                              </div>
                                              <blockquote type="cite">
                                                <div dir="ltr">Hi Folks,
                                                  <div>I'm struggling
                                                    with the following
                                                    issue and can't
                                                    understand what I'm
                                                    doing wrong.</div>
                                                  <div>I need to pass
                                                    opengl texture to
                                                    the gstreamer
                                                    pipeline.</div>
                                                  <div>I have a
                                                    rendering thread
                                                    where I create
                                                    opengl texture, the
                                                    following objects
                                                    created in this
                                                    thread:</div>
                                                  <div><i>EGLDisplay
                                                      display;</i></div>
                                                  <div><i>EGLContext
                                                      context;</i><br>
                                                  </div>
                                                  <div><i><br>
                                                    </i></div>
                                                  <div>I create
                                                    gstreamer pipeline
                                                    in the main thread
                                                    and as described in
                                                    the following
                                                    article sharing an
                                                    X11 display and
                                                    GstGLContext with
                                                    the bus callback.</div>
                                                  <div><a
href="http://ystreet00.blogspot.com/2015/09/gstreamer-16-and-opengl-contexts.html"
                                                      target="_blank"
                                                      moz-do-not-send="true">http://ystreet00.blogspot.com/2015/09/gstreamer-16-and-opengl-contexts.html</a><br>
                                                  </div>
                                                  <div><br>
                                                  </div>
                                                  <div>GstGLDisplayEGL
                                                    and GstGLContext are
                                                    created in this way:</div>
                                                  <div><i>GstGLDisplayEGL*
                                                      gst_display =
gst_gl_display_egl_new_with_egl_display (display);<br>
                                                    </i></div>
                                                  <div><i>GstGLContext
                                                      *gl_context =<br>
                                                           
                                                      gst_gl_context_new_wrapped
                                                      (GST_GL_DISPLAY
                                                      (gst_display),<br>
                                                            (guintptr)
                                                      context,
                                                      GST_GL_PLATFORM_EGL,
                                                      GST_GL_API_GLES2);</i><br>
                                                  </div>
                                                  <div><br>
                                                  </div>
                                                  <div>The first element
                                                    of my pipeline is
                                                    appsrc:</div>
                                                  <div><i>appsrc
                                                      stream-type=0
                                                      emit-signals=1
                                                      format=3 
                                                      caps=video/x-raw(memory:GLMemory),  width=300,
                                                      height=300,
                                                      framerate=(fraction)20/1,
format=(string)RGBA ! gldownload ! ...</i><br>
                                                  </div>
                                                  <div><br>
                                                  </div>
                                                  <div>I use need-data
                                                    callback to create a
                                                    buffer from
                                                    texture_id and and
                                                    push it in the
                                                    appsrc:</div>
                                                  <div><i>g_signal_connect
                                                      (state->appsrc,
                                                      "need-data",
                                                      G_CALLBACK (</i>
                                                    pushFrame <i>),
                                                      state);</i></div>
                                                  <div><i><br>
                                                    </i></div>
                                                  <div><i>bool
                                                      pushFrame()</i><br>
                                                  </div>
                                                  <div><i>{<br>
                                                           // Wrap the
                                                      texture into
                                                      GstGLMemory<br>
                                                          GstVideoInfo
                                                      vinfo;<br>
                                                         
                                                      gst_video_info_set_format(&vinfo,
GST_VIDEO_FORMAT_RGBA, 300, 300);<br>
                                                      <br>
                                                          GstAllocator*
                                                      allocator =
                                                      GST_ALLOCATOR(gst_gl_memory_allocator_get_default(gl_context));<br>
                                                      <br>
                                                         
                                                      GstGLVideoAllocationParams*
                                                      params =
                                                      gst_gl_video_allocation_params_new_wrapped_texture(<br>
                                                           
                                                       state->gl_context,
                                                      NULL, &vinfo,
                                                      0, NULL,
                                                      GST_GL_TEXTURE_TARGET_2D,
                                                      GST_GL_RGBA, </i>
                                                    texture_id  <i>,<br>
                                                            NULL, 0);<br>
                                                    </i></div>
                                                </div>
                                              </blockquote>
                                              <br>
                                              The use of
                                              state->gl_context is
                                              probably your OpenGL
                                              context that has been
                                              wrapped from the
                                              application.  This
                                              'wrapped' OpenGL context
                                              has some limitations, one
                                              being that GStreamer
                                              cannot actually do a
                                              complete
                                              gst_gl_context_thread_add
                                              where the request is
                                              marshalled to an
                                              OpenGL-specific thread. 
                                              This is what that critical
                                              is complaining about
                                              effectively.<br>
                                              <br>
                                              To do this properly, you
                                              would need to do one of
                                              two things:<br>
                                              1. Retrieve the OpenGL
                                              context from the
                                              downstream gldownload
                                              element using either the
                                              'context' property or
                                              using an appropriate
                                              GST_CONTEXT QUERY or the
                                              helper
                                              gst_gl_query_local_gl_context().<br>
                                              2. Create your own
                                              GStreamer OpenGL context
                                              and add it to the
                                              GstGLDisplay using
                                              something like: <a
href="https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/blob/master/gst-libs/gst/gl/gstglbasefilter.c#L550-565"
                                                target="_blank"
                                                moz-do-not-send="true">https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/blob/master/gst-libs/gst/gl/gstglbasefilter.c#L550-565</a>.<br>
                                              <br>
                                              Cheers<br>
                                              -Matt<br>
                                              <br>
                                              <blockquote type="cite">
                                                <div dir="ltr">
                                                  <div><i><br>
                                                          // The
                                                      following line
                                                      produces an
                                                      error!!!<br>
                                                          GstGLMemory*
                                                      glMemory =
                                                      GST_GL_MEMORY_CAST(gst_gl_base_memory_alloc(<br>
                                                           
                                                      GST_GL_BASE_MEMORY_ALLOCATOR_CAST(allocator),
(GstGLAllocationParams*) params));<br>
                                                      <br>
                                                         
                                                      gst_gl_allocation_params_free((GstGLAllocationParams
                                                      *)params);<br>
                                                         
                                                      gst_object_unref(allocator);<br>
                                                      <br>
                                                          // Attach
                                                      GstGLMemory object
                                                      into buffer,
                                                      timestamp the
                                                      buffer and push it
                                                      downstream<br>
                                                          GstBuffer*
                                                      buffer =
                                                      gst_buffer_new();<br>
                                                         
                                                      gst_buffer_append_memory(buffer,
GST_MEMORY_CAST(glMemory));<br>
                                                      <br>
                                                          // Put
                                                      timestamps into
                                                      buffer<br>
                                                          GST_BUFFER_PTS
                                                      (buffer) =
                                                      timestamp;<br>
                                                         
                                                      GST_BUFFER_DURATION
                                                      (buffer) =
                                                      gst_util_uint64_scale_int
                                                      (1, GST_SECOND,
                                                      2);<br>
                                                      <br>
                                                          timestamp +=
                                                      GST_BUFFER_DURATION
                                                      (buffer);<br>
                                                          GstFlowReturn
                                                      ret;<br>
                                                         
                                                      g_signal_emit_by_name(state->appsrc,
                                                      "push-buffer",
                                                      buffer, &ret);<br>
                                                      <br>
                                                          if (ret !=
                                                      GST_FLOW_OK)<br>
                                                          {<br>
                                                              //
                                                      Something wrong,
                                                      stop pushing.<br>
                                                             
                                                      g_printerr("Something
                                                      went wrong:
                                                      Pushing buffer
                                                      into appsrc is
                                                      stopped.\n");<br>
                                                              return
                                                      false;<br>
                                                          }<br>
                                                      <br>
                                                          return true;<br>
                                                      }<br>
                                                    </i></div>
                                                  <div><br>
                                                  </div>
                                                  <div>pushFrame
                                                    produces the
                                                    following error:</div>
                                                  <div><font
                                                      color="#ff0000">gst_gl_context_thread_add:
                                                      assertion
                                                      'context->priv->active_thread
                                                      == g_thread_self
                                                      ()' failIed<br>
                                                    </font></div>
                                                  <div><font
                                                      color="#ff0000"><br>
                                                    </font></div>
                                                  <div><font
                                                      color="#000000">What
                                                      am I doing wrong
                                                      or how can push
                                                      gpu texture to
                                                      gstreamer?</font></div>
                                                  <div><font
                                                      color="#000000"><br>
                                                    </font></div>
                                                  <div><font
                                                      color="#000000">Thanks,</font></div>
                                                  <div><font
                                                      color="#000000">Lusine</font></div>
                                                  <div><font
                                                      color="#000000"><br>
                                                    </font></div>
                                                </div>
                                              </blockquote>
                                              <br>
                                            </div>
                                          </blockquote>
                                        </div>
                                      </blockquote>
                                      <br>
                                    </div>
                                  </blockquote>
                                </div>
                              </div>
                            </blockquote>
                            <br>
                          </div>
                        </blockquote>
                      </div>
                    </blockquote>
                    <br>
                  </div>
                </blockquote>
              </div>
            </blockquote>
            <br>
          </div>
        </blockquote>
      </div>
    </blockquote>
    <br>
  </body>
</html>