diff options
author | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2012-10-18 10:20:26 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2012-10-18 14:35:20 +0200 |
commit | 147edd1fc299b1d6bac19ceeb69f0a1612151568 (patch) | |
tree | 5085b0f6efa57baa936756566e67c68eabac7020 | |
parent | a025c80b4ca68925ca7d55ab04a997b15db9a270 (diff) | |
download | gstreamer-plugins-bad-147edd1fc299b1d6bac19ceeb69f0a1612151568.tar.gz |
eglglessink: Only draw black borders if the default swap behaviour of the surface is to destroy the buffer
-rw-r--r-- | ext/eglgles/gsteglglessink.c | 196 | ||||
-rw-r--r-- | ext/eglgles/gsteglglessink.h | 1 |
2 files changed, 107 insertions, 90 deletions
diff --git a/ext/eglgles/gsteglglessink.c b/ext/eglgles/gsteglglessink.c index 9207681f2..3f9889bfd 100644 --- a/ext/eglgles/gsteglglessink.c +++ b/ext/eglgles/gsteglglessink.c @@ -1117,6 +1117,7 @@ gst_eglglessink_init_egl_surface (GstEglGlesSink * eglglessink) EGLint display_par; const gchar *texnames[3] = { NULL, }; gchar *tmp_prog = NULL; + EGLint swap_behavior; GST_DEBUG_OBJECT (eglglessink, "Enter EGL surface setup"); @@ -1131,6 +1132,16 @@ gst_eglglessink_init_egl_surface (GstEglGlesSink * eglglessink) goto HANDLE_EGL_ERROR_LOCKED; } + eglglessink->eglglesctx.buffer_preserved = FALSE; + if (eglQuerySurface (eglglessink->eglglesctx.display, + eglglessink->eglglesctx.surface, EGL_SWAP_BEHAVIOR, &swap_behavior)) { + GST_DEBUG_OBJECT (eglglessink, "Buffer swap behavior %x", swap_behavior); + eglglessink->eglglesctx.buffer_preserved = + swap_behavior == EGL_BUFFER_PRESERVED; + } else { + GST_DEBUG_OBJECT (eglglessink, "Can't query buffer swap behavior"); + } + if (!gst_eglglessink_context_make_current (eglglessink, TRUE)) goto HANDLE_EGL_ERROR_LOCKED; @@ -1368,89 +1379,92 @@ gst_eglglessink_init_egl_surface (GstEglGlesSink * eglglessink) if (got_gl_error ("glEnableVertexAttribArray")) goto HANDLE_ERROR; - /* Build shader program for black borders */ - eglglessink->eglglesctx.vertshader[1] = glCreateShader (GL_VERTEX_SHADER); - GST_DEBUG_OBJECT (eglglessink, "Sending %s to handle %d", vert_COPY_prog, - eglglessink->eglglesctx.vertshader[1]); - glShaderSource (eglglessink->eglglesctx.vertshader[1], 1, - &vert_COPY_prog_no_tex, NULL); - if (got_gl_error ("glShaderSource vertex")) - goto HANDLE_ERROR; + if (!eglglessink->eglglesctx.buffer_preserved) { + /* Build shader program for black borders */ + eglglessink->eglglesctx.vertshader[1] = glCreateShader (GL_VERTEX_SHADER); + GST_DEBUG_OBJECT (eglglessink, "Sending %s to handle %d", vert_COPY_prog, + eglglessink->eglglesctx.vertshader[1]); + glShaderSource (eglglessink->eglglesctx.vertshader[1], 1, + &vert_COPY_prog_no_tex, NULL); + if (got_gl_error ("glShaderSource vertex")) + goto HANDLE_ERROR; - glCompileShader (eglglessink->eglglesctx.vertshader[1]); - if (got_gl_error ("glCompileShader vertex")) - goto HANDLE_ERROR; + glCompileShader (eglglessink->eglglesctx.vertshader[1]); + if (got_gl_error ("glCompileShader vertex")) + goto HANDLE_ERROR; - glGetShaderiv (eglglessink->eglglesctx.vertshader[1], GL_COMPILE_STATUS, - &test); - if (test != GL_FALSE) - GST_DEBUG_OBJECT (eglglessink, "Successfully compiled vertex shader"); - else { - GST_ERROR_OBJECT (eglglessink, "Couldn't compile vertex shader"); - glGetShaderiv (eglglessink->eglglesctx.vertshader[1], GL_INFO_LOG_LENGTH, + glGetShaderiv (eglglessink->eglglesctx.vertshader[1], GL_COMPILE_STATUS, &test); - info_log = g_new0 (GLchar, test); - glGetShaderInfoLog (eglglessink->eglglesctx.vertshader[1], test, NULL, - info_log); - GST_INFO_OBJECT (eglglessink, "Compilation info log:\n%s", info_log); - g_free (info_log); - goto HANDLE_ERROR; - } + if (test != GL_FALSE) + GST_DEBUG_OBJECT (eglglessink, "Successfully compiled vertex shader"); + else { + GST_ERROR_OBJECT (eglglessink, "Couldn't compile vertex shader"); + glGetShaderiv (eglglessink->eglglesctx.vertshader[1], GL_INFO_LOG_LENGTH, + &test); + info_log = g_new0 (GLchar, test); + glGetShaderInfoLog (eglglessink->eglglesctx.vertshader[1], test, NULL, + info_log); + GST_INFO_OBJECT (eglglessink, "Compilation info log:\n%s", info_log); + g_free (info_log); + goto HANDLE_ERROR; + } - eglglessink->eglglesctx.fragshader[1] = glCreateShader (GL_FRAGMENT_SHADER); - glShaderSource (eglglessink->eglglesctx.fragshader[1], 1, &frag_BLACK_prog, - NULL); + eglglessink->eglglesctx.fragshader[1] = glCreateShader (GL_FRAGMENT_SHADER); + glShaderSource (eglglessink->eglglesctx.fragshader[1], 1, &frag_BLACK_prog, + NULL); - if (got_gl_error ("glShaderSource fragment")) - goto HANDLE_ERROR; + if (got_gl_error ("glShaderSource fragment")) + goto HANDLE_ERROR; - glCompileShader (eglglessink->eglglesctx.fragshader[1]); - if (got_gl_error ("glCompileShader fragment")) - goto HANDLE_ERROR; + glCompileShader (eglglessink->eglglesctx.fragshader[1]); + if (got_gl_error ("glCompileShader fragment")) + goto HANDLE_ERROR; - glGetShaderiv (eglglessink->eglglesctx.fragshader[1], GL_COMPILE_STATUS, - &test); - if (test != GL_FALSE) - GST_DEBUG_OBJECT (eglglessink, "Successfully compiled fragment shader"); - else { - GST_ERROR_OBJECT (eglglessink, "Couldn't compile fragment shader"); - glGetShaderiv (eglglessink->eglglesctx.fragshader[1], GL_INFO_LOG_LENGTH, + glGetShaderiv (eglglessink->eglglesctx.fragshader[1], GL_COMPILE_STATUS, &test); - info_log = g_new0 (GLchar, test); - glGetShaderInfoLog (eglglessink->eglglesctx.fragshader[1], test, NULL, - info_log); - GST_INFO_OBJECT (eglglessink, "Compilation info log:\n%s", info_log); - g_free (info_log); - goto HANDLE_ERROR; - } + if (test != GL_FALSE) + GST_DEBUG_OBJECT (eglglessink, "Successfully compiled fragment shader"); + else { + GST_ERROR_OBJECT (eglglessink, "Couldn't compile fragment shader"); + glGetShaderiv (eglglessink->eglglesctx.fragshader[1], GL_INFO_LOG_LENGTH, + &test); + info_log = g_new0 (GLchar, test); + glGetShaderInfoLog (eglglessink->eglglesctx.fragshader[1], test, NULL, + info_log); + GST_INFO_OBJECT (eglglessink, "Compilation info log:\n%s", info_log); + g_free (info_log); + goto HANDLE_ERROR; + } - eglglessink->eglglesctx.glslprogram[1] = glCreateProgram (); - if (got_gl_error ("glCreateProgram")) - goto HANDLE_ERROR; - glAttachShader (eglglessink->eglglesctx.glslprogram[1], - eglglessink->eglglesctx.vertshader[1]); - if (got_gl_error ("glAttachShader vertices")) - goto HANDLE_ERROR; - glAttachShader (eglglessink->eglglesctx.glslprogram[1], - eglglessink->eglglesctx.fragshader[1]); - if (got_gl_error ("glAttachShader fragments")) - goto HANDLE_ERROR; - glLinkProgram (eglglessink->eglglesctx.glslprogram[1]); - glGetProgramiv (eglglessink->eglglesctx.glslprogram[1], GL_LINK_STATUS, - &test); - if (test != GL_FALSE) - GST_DEBUG_OBJECT (eglglessink, "GLES: Successfully linked program"); - else { - GST_ERROR_OBJECT (eglglessink, "Couldn't link program"); - goto HANDLE_ERROR; - } + eglglessink->eglglesctx.glslprogram[1] = glCreateProgram (); + if (got_gl_error ("glCreateProgram")) + goto HANDLE_ERROR; + glAttachShader (eglglessink->eglglesctx.glslprogram[1], + eglglessink->eglglesctx.vertshader[1]); + if (got_gl_error ("glAttachShader vertices")) + goto HANDLE_ERROR; + glAttachShader (eglglessink->eglglesctx.glslprogram[1], + eglglessink->eglglesctx.fragshader[1]); + if (got_gl_error ("glAttachShader fragments")) + goto HANDLE_ERROR; + glLinkProgram (eglglessink->eglglesctx.glslprogram[1]); + glGetProgramiv (eglglessink->eglglesctx.glslprogram[1], GL_LINK_STATUS, + &test); + if (test != GL_FALSE) + GST_DEBUG_OBJECT (eglglessink, "GLES: Successfully linked program"); + else { + GST_ERROR_OBJECT (eglglessink, "Couldn't link program"); + goto HANDLE_ERROR; + } - eglglessink->eglglesctx.position_loc[1] = - glGetAttribLocation (eglglessink->eglglesctx.glslprogram[1], "position"); + eglglessink->eglglesctx.position_loc[1] = + glGetAttribLocation (eglglessink->eglglesctx.glslprogram[1], + "position"); - glEnableVertexAttribArray (eglglessink->eglglesctx.position_loc[1]); - if (got_gl_error ("glEnableVertexAttribArray")) - goto HANDLE_ERROR; + glEnableVertexAttribArray (eglglessink->eglglesctx.position_loc[1]); + if (got_gl_error ("glEnableVertexAttribArray")) + goto HANDLE_ERROR; + } glUseProgram (eglglessink->eglglesctx.glslprogram[0]); @@ -1891,29 +1905,31 @@ gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink, } } - /* Draw black borders */ - GST_DEBUG_OBJECT (eglglessink, "Drawing black border 1"); - glUseProgram (eglglessink->eglglesctx.glslprogram[1]); + if (!eglglessink->eglglesctx.buffer_preserved) { + /* Draw black borders */ + GST_DEBUG_OBJECT (eglglessink, "Drawing black border 1"); + glUseProgram (eglglessink->eglglesctx.glslprogram[1]); - glVertexAttribPointer (eglglessink->eglglesctx.position_loc[1], 3, - GL_FLOAT, GL_FALSE, sizeof (coord5), (gpointer) (4 * sizeof (coord5))); - if (got_gl_error ("glVertexAttribPointer")) - goto HANDLE_ERROR; + glVertexAttribPointer (eglglessink->eglglesctx.position_loc[1], 3, + GL_FLOAT, GL_FALSE, sizeof (coord5), (gpointer) (4 * sizeof (coord5))); + if (got_gl_error ("glVertexAttribPointer")) + goto HANDLE_ERROR; - glDrawElements (GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 0); - if (got_gl_error ("glDrawElements")) - goto HANDLE_ERROR; + glDrawElements (GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 0); + if (got_gl_error ("glDrawElements")) + goto HANDLE_ERROR; - GST_DEBUG_OBJECT (eglglessink, "Drawing black border 2"); + GST_DEBUG_OBJECT (eglglessink, "Drawing black border 2"); - glVertexAttribPointer (eglglessink->eglglesctx.position_loc[1], 3, - GL_FLOAT, GL_FALSE, sizeof (coord5), (gpointer) (8 * sizeof (coord5))); - if (got_gl_error ("glVertexAttribPointer")) - goto HANDLE_ERROR; + glVertexAttribPointer (eglglessink->eglglesctx.position_loc[1], 3, + GL_FLOAT, GL_FALSE, sizeof (coord5), (gpointer) (8 * sizeof (coord5))); + if (got_gl_error ("glVertexAttribPointer")) + goto HANDLE_ERROR; - glDrawElements (GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 0); - if (got_gl_error ("glDrawElements")) - goto HANDLE_ERROR; + glDrawElements (GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, 0); + if (got_gl_error ("glDrawElements")) + goto HANDLE_ERROR; + } /* Draw video frame */ GST_DEBUG_OBJECT (eglglessink, "Drawing video frame"); diff --git a/ext/eglgles/gsteglglessink.h b/ext/eglgles/gsteglglessink.h index 8275130d1..d57a8e116 100644 --- a/ext/eglgles/gsteglglessink.h +++ b/ext/eglgles/gsteglglessink.h @@ -122,6 +122,7 @@ struct _GstEglGlesRenderContext EGLDisplay display; EGLNativeWindowType window, used_window; EGLSurface surface; + gboolean buffer_preserved; GLuint fragshader[2], vertshader[2], glslprogram[2]; GLuint texture[3]; EGLint surface_width; |