[vlc-devel] [PATCH] vout: opengl: GL_LUMINANCE* is deprecated starting opengl* 3
Thomas Guillem
thomas at gllm.fr
Thu Dec 1 13:40:19 CET 2016
On Thu, Dec 1, 2016, at 12:53, Thomas Guillem wrote:
> Use GL_RED/GL_R16 instead of GL_LUMINANCE/GL_LUMINANCE16.
> ---
> modules/video_output/opengl.c | 54
> ++++++++++++++++++++++++++++++++-----------
> 1 file changed, 40 insertions(+), 14 deletions(-)
>
> diff --git a/modules/video_output/opengl.c
> b/modules/video_output/opengl.c
> index 4968edf..f92eb12 100644
> --- a/modules/video_output/opengl.c
> +++ b/modules/video_output/opengl.c
> @@ -225,20 +225,31 @@ static inline int GetAlignedSize(unsigned size)
> }
Miss the following on top of the file, in order to build against gl2
headers.
#ifndef GL_RED
#define GL_RED 0
#endif
#ifndef GL_R16
#define GL_R16 0
#endif
>
> #if !USE_OPENGL_ES
> -static bool IsLuminance16Supported(int target)
> +static int GetTexFormatSize(int target, int tex_format, int
> tex_internal,
> + int tex_type)
> {
> + GLint tex_param_size;
> + switch (tex_format)
> + {
> + case GL_RED:
> + tex_param_size = GL_TEXTURE_RED_SIZE;
> + break;
> + case GL_LUMINANCE:
> + tex_param_size = GL_TEXTURE_LUMINANCE_SIZE;
> + break;
> + default:
> + return false;
> + }
> GLuint texture;
>
> glGenTextures(1, &texture);
> glBindTexture(target, texture);
> - glTexImage2D(target, 0, GL_LUMINANCE16,
> - 64, 64, 0, GL_LUMINANCE, GL_UNSIGNED_SHORT, NULL);
> + glTexImage2D(target, 0, tex_internal, 64, 64, 0, tex_format,
> tex_type, NULL);
> GLint size = 0;
> - glGetTexLevelParameteriv(target, 0, GL_TEXTURE_LUMINANCE_SIZE,
> &size);
> + glGetTexLevelParameteriv(target, 0, tex_param_size, &size);
>
> glDeleteTextures(1, &texture);
> -
> - return size == 16;
> + return size;
> }
> #endif
>
> @@ -315,9 +326,17 @@ static void
> BuildYUVFragmentShader(vout_display_opengl_t *vgl,
>
> "void main(void) {"
> " vec4 x,y,z,result;"
> - " x = texture2D(Texture0, TexCoord0.st);"
> - " %c = texture2D(Texture1, TexCoord1.st);"
> - " %c = texture2D(Texture2, TexCoord2.st);"
> +
> + /* The texture format can be GL_RED: vec4(R,0,0,1) or
> GL_LUMINANCE:
> + * vec4(L,L,L,1). The following transform a vec4(x, y, z, w)
> into a
> + * vec4(x, x, x, 1) (we may want to use texture swizzling
> starting
> + * OpenGL 3.3). */
> + " float val0 = texture2D(Texture0, TexCoord0.st).x;"
> + " float val1 = texture2D(Texture1, TexCoord1.st).x;"
> + " float val2 = texture2D(Texture2, TexCoord2.st).x;"
> + " x = vec4(val0, val0, val0, 1);"
> + " %c = vec4(val1, val1, val1, 1);"
> + " %c = vec4(val2, val2, val2, 1);"
>
> " result = x * Coefficient[0] + Coefficient[3];"
> " result = (y * Coefficient[1]) + result;"
> @@ -456,8 +475,12 @@ vout_display_opengl_t
> *vout_display_opengl_New(video_format_t *fmt,
> #if !USE_OPENGL_ES
> const unsigned char *ogl_version = glGetString(GL_VERSION);
> bool supports_shaders = strverscmp((const char *)ogl_version, "2.0")
> >= 0;
> + const bool oglv3 = strverscmp((const char *)ogl_version, "3.0") >=
> 0;
> + const int yuv_plane_texformat = oglv3 ? GL_RED : GL_LUMINANCE;
> + const int yuv_plane_texformat_16 = oglv3 ? GL_R16 : GL_LUMINANCE16;
> #else
> bool supports_shaders = false;
> + const int yuv_plane_texformat = GL_LUMINANCE;
> #endif
>
> #if USE_OPENGL_ES == 2
> @@ -585,19 +608,22 @@ vout_display_opengl_t
> *vout_display_opengl_New(video_format_t *fmt,
> need_fs_yuv = true;
> vgl->fmt = *fmt;
> vgl->fmt.i_chroma = *list;
> - vgl->tex_format = GL_LUMINANCE;
> - vgl->tex_internal = GL_LUMINANCE;
> + vgl->tex_format = yuv_plane_texformat;
> + vgl->tex_internal = yuv_plane_texformat;
> vgl->tex_type = GL_UNSIGNED_BYTE;
> yuv_range_correction = 1.0;
> break;
> #if !USE_OPENGL_ES
> } else if (dsc && dsc->plane_count == 3 && dsc->pixel_size
> == 2 &&
> - IsLuminance16Supported(vgl->tex_target)) {
> + GetTexFormatSize(vgl->tex_target,
> + yuv_plane_texformat,
> + yuv_plane_texformat_16,
> + GL_UNSIGNED_SHORT) == 16) {
> need_fs_yuv = true;
> vgl->fmt = *fmt;
> vgl->fmt.i_chroma = *list;
> - vgl->tex_format = GL_LUMINANCE;
> - vgl->tex_internal = GL_LUMINANCE16;
> + vgl->tex_format = yuv_plane_texformat;
> + vgl->tex_internal = yuv_plane_texformat_16;
> vgl->tex_type = GL_UNSIGNED_SHORT;
> yuv_range_correction = (float)((1 << 16) - 1) / ((1 <<
> dsc->pixel_bits) - 1);
> break;
> --
> 2.10.2
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
More information about the vlc-devel
mailing list