gboolean gst_gl_context_supports_glsl_profile_version (GstGLContext * context, GstGLSLVersion version, GstGLSLProfile profile) { g_return_val_if_fail (GST_IS_GL_CONTEXT (context), FALSE); if (!_is_valid_version_profile (version, profile)) return FALSE; if (profile != GST_GLSL_PROFILE_NONE) { if (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 2, 0)) { if ((profile & GST_GLSL_PROFILE_ES) == 0) return FALSE; } else if ((gst_gl_context_get_gl_api (context) & GST_GL_API_OPENGL) != 0) { if ((profile & GST_GLSL_PROFILE_COMPATIBILITY) == 0) return FALSE; } else if ((gst_gl_context_get_gl_api (context) & GST_GL_API_OPENGL3) != 0) { /* GL_ARB_es2_compatibility is requried for GL3 contexts */ if ((profile & (GST_GLSL_PROFILE_CORE | GST_GLSL_PROFILE_ES)) == 0) return FALSE; } else { g_assert_not_reached (); } } if (version != GST_GLSL_VERSION_NONE) { GstGLAPI gl_api; gint maj, min, glsl_version; if (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 3, 1)) { if (version > GST_GLSL_VERSION_310) return FALSE; } else if (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 3, 0)) { if (version > GST_GLSL_VERSION_300) return FALSE; } else if (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 2, 0)) { if (version > GST_GLSL_VERSION_100) return FALSE; } gl_api = gst_gl_context_get_gl_api (context); gst_gl_context_get_gl_version (context, &maj, &min); glsl_version = gst_gl_version_to_glsl_version (gl_api, maj, min); if (glsl_version > version) return FALSE; if (gst_gl_context_check_gl_version (context, GST_GL_API_OPENGL3, 1, 0)) /* GL_ARB_es2_compatibility is requried for GL3 contexts */ if (version < GST_GLSL_VERSION_150 && version != GST_GLSL_VERSION_100) return FALSE; if (gst_gl_context_check_gl_version (context, GST_GL_API_OPENGL, 1, 0) && version < GST_GLSL_VERSION_110) return FALSE; } return TRUE; }
static void _mangle_version_profile_from_gl_api (GstGLContext * context, GstGLTextureTarget from, GstGLTextureTarget to, GstGLSLVersion * version, GstGLSLProfile * profile) { GstGLAPI gl_api; gint gl_major, gl_minor; gl_api = gst_gl_context_get_gl_api (context); gst_gl_context_get_gl_version (context, &gl_major, &gl_minor); *version = GST_GLSL_VERSION_NONE; *profile = GST_GLSL_PROFILE_NONE; if (gl_api & GST_GL_API_OPENGL3) { if (gl_major > 3 || gl_minor >= 3) { *version = GST_GLSL_VERSION_330; *profile = GST_GLSL_PROFILE_CORE; } else { *version = GST_GLSL_VERSION_150; *profile = GST_GLSL_PROFILE_NONE; } } else if (gl_api & GST_GL_API_GLES2) { /* We don't know which texture function to use if we have GLES3 and * don't have the essl3 extension */ if (gl_major >= 3 && (to != GST_GL_TEXTURE_TARGET_EXTERNAL_OES || gst_gl_context_check_feature (context, "GL_OES_EGL_image_external_essl3"))) { *version = GST_GLSL_VERSION_300; *profile = GST_GLSL_PROFILE_ES; } else if (gl_major >= 2) { *version = GST_GLSL_VERSION_100; *profile = GST_GLSL_PROFILE_ES; } } else if (gl_api & GST_GL_API_OPENGL) { *version = GST_GLSL_VERSION_110; *profile = GST_GLSL_PROFILE_COMPATIBILITY; } }