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