Problem with context sharing (glupload) with an OVR thread (Oculus Mobile SDK)

jeremi.wojcicki jeremi.wojcicki at gmail.com
Mon Feb 19 22:52:00 UTC 2018


I have used GAPID tool for OpenGL debugging (which actually is quite an
awesome tool) and I have confirmed that indeed gstreamer creates a new GL
context with eglCreateContext but with share_context as NULL. This means
that for some reasons the context I provide, using methods shown in sdlshare
and sdlshare2 examples, is ignored.

<http://gstreamer-devel.966125.n4.nabble.com/file/t377800/gapid.png> 

This slightly narrows down the problem, but I still don't get what is the
reason. Looking into the gstglcontext_egl.c I don't see a clear point in
which the "other_context" could be stripped:

static gboolean
gst_gl_context_egl_create_context (GstGLContext * context,
    GstGLAPI gl_api, GstGLContext * other_context, GError ** error)
{
  GstGLContextEGL *egl;
  GstGLWindow *window = NULL;
  EGLNativeWindowType window_handle = (EGLNativeWindowType) 0;
  EGLint majorVersion;
  EGLint minorVersion;
  gboolean need_surface = TRUE;
  guintptr external_gl_context = 0;
  GstGLDisplay *display;

  egl = GST_GL_CONTEXT_EGL (context);
  window = gst_gl_context_get_window (context);

  GST_DEBUG_OBJECT (context, "Creating EGL context");

  if (other_context) { 
// ======= I don’t know if other_context is != NULL at this point, but it is
quite possible
    
    if (gst_gl_context_get_gl_platform (other_context) !=
GST_GL_PLATFORM_EGL) {
      g_set_error (error, GST_GL_CONTEXT_ERROR,
          GST_GL_CONTEXT_ERROR_WRONG_CONFIG,
          "Cannot share context with non-EGL context");
// ======== I don’t reach this point
      goto failure;
    }
    external_gl_context = gst_gl_context_get_gl_context (other_context);
  }

  if ((gl_api & (GST_GL_API_OPENGL | GST_GL_API_OPENGL3 | GST_GL_API_GLES2))
==
      GST_GL_API_NONE) {

...
// =========== OPENGL case – not relevant
...


  } else if (gl_api & GST_GL_API_GLES2) {
    gint i;

  try_gles2:
    if (!eglBindAPI (EGL_OPENGL_ES_API)) {
      g_set_error (error, GST_GL_CONTEXT_ERROR, GST_GL_CONTEXT_ERROR_FAILED,
          "Failed to bind OpenGL|ES API: %s",
          gst_gl_context_egl_get_error_string (eglGetError ()));
      goto failure;
    }

// ============ I get this message

    GST_INFO ("Bound OpenGL|ES"); 


    for (i = 0; i < G_N_ELEMENTS (gles2_versions); i++) {
      gint profileMask = 0;
      gint contextFlags = 0;

      if (!gst_gl_context_egl_choose_config (egl, GST_GL_API_GLES2,
              gles2_versions[i].major, error)) {
        continue;
      }
#if defined(EGL_KHR_create_context)
      /* try a debug context */
      contextFlags |= EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR;

      egl->egl_context =
          _create_context_with_flags (egl, (EGLContext) external_gl_context,
          GST_GL_API_GLES2, gles2_versions[i].major,
          gles2_versions[i].minor, contextFlags, profileMask);

      if (egl->egl_context)
        break;

      /* try without a debug context */
      contextFlags &= ~EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR;
#endif

      egl->egl_context =
          _create_context_with_flags (egl, (EGLContext) external_gl_context,
          GST_GL_API_GLES2, gles2_versions[i].major,
          gles2_versions[i].minor, contextFlags, profileMask);

      if (egl->egl_context)
        break;
    }
    egl->gl_api = GST_GL_API_GLES2;
  }

  if (egl->egl_context != EGL_NO_CONTEXT) {
// ====== I get this message
    GST_INFO ("gl context created: %" G_GUINTPTR_FORMAT,
        (guintptr) egl->egl_context); 
  } else {
    g_set_error (error, GST_GL_CONTEXT_ERROR,
        GST_GL_CONTEXT_ERROR_CREATE_CONTEXT,
        "Failed to create a OpenGL context: %s",
        gst_gl_context_egl_get_error_string (eglGetError ()));
    goto failure;
  }

Just for reference, I share the current version of context setting (in the
bus need-context callback):

        case GST_MESSAGE_NEED_CONTEXT:
        {

            // we got gl_display and gl_context and starting of the main
loop

            GstElement *element = GST_ELEMENT (message->src);
            const gchar *name = gst_element_get_name(element);

            LOG_INFO("Element %s asks for context. We give => 0x%08x
0x%08x", name, data->egl_context, data->egl_display);

            const gchar *context_type;

            gst_message_parse_context_type (message, &context_type);
            g_print ("got need context %s\n", context_type);

            if (g_strcmp0 (context_type, GST_GL_DISPLAY_CONTEXT_TYPE) == 0)
{
                GstContext *display_context =
                        gst_context_new (GST_GL_DISPLAY_CONTEXT_TYPE, TRUE);
                gst_context_set_gl_display (display_context,
data->gst_display);
                gst_element_set_context (GST_ELEMENT (message->src),
display_context);
                return TRUE;
            } else if (g_strcmp0 (context_type, "gst.gl.app_context") == 0)
{
                GstContext *app_context = gst_context_new
("gst.gl.app_context", TRUE);
                GstStructure *s = gst_context_writable_structure
(app_context);
                gst_structure_set (s, "context", GST_GL_TYPE_CONTEXT,
data->gst_context, NULL);
                gst_element_set_context (GST_ELEMENT (message->src),
app_context);
                return TRUE;
            }
            break;

        }

Any remarks would be much appreciated.

Best,
Jeremi



--
Sent from: http://gstreamer-devel.966125.n4.nabble.com/


More information about the gstreamer-devel mailing list