[vlc-commits] vout/opengl: expose shaders commands in an internal header
Thomas Guillem
git at videolan.org
Mon Dec 19 12:06:41 CET 2016
vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Mon Dec 12 10:56:33 2016 +0100| [a1abe86d0bc360c7717bf99036d7a7635908d6a0] | committer: Thomas Guillem
vout/opengl: expose shaders commands in an internal header
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=a1abe86d0bc360c7717bf99036d7a7635908d6a0
---
modules/video_output/Makefile.am | 2 +-
modules/video_output/opengl/internal.h | 120 ++++++++++
modules/video_output/opengl/vout_helper.c | 356 ++++++++++++------------------
modules/video_output/opengl/vout_helper.h | 4 -
4 files changed, 261 insertions(+), 221 deletions(-)
diff --git a/modules/video_output/Makefile.am b/modules/video_output/Makefile.am
index 8ca405e..ab4a455 100644
--- a/modules/video_output/Makefile.am
+++ b/modules/video_output/Makefile.am
@@ -3,7 +3,7 @@ vout_LTLIBRARIES =
EXTRA_DIST += video_output/README
OPENGL_DISPLAY_SRCS = video_output/opengl/vout_helper.c \
- video_output/opengl/vout_helper.h
+ video_output/opengl/vout_helper.h video_output/opengl/internal.h
if HAVE_DECKLINK
libdecklinkoutput_plugin_la_SOURCES = video_output/decklink.cpp
diff --git a/modules/video_output/opengl/internal.h b/modules/video_output/opengl/internal.h
new file mode 100644
index 0000000..b215c43
--- /dev/null
+++ b/modules/video_output/opengl/internal.h
@@ -0,0 +1,120 @@
+/*****************************************************************************
+ * opengl_internal.h: OpenGL internal header
+ *****************************************************************************
+ * Copyright (C) 2016 VLC authors and VideoLAN
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifndef VLC_OPENGL_INTERNAL_H
+#define VLC_OPENGL_INTERNAL_H
+
+#include "vout_helper.h"
+
+#if defined(USE_OPENGL_ES2)
+# define GLSL_VERSION "100"
+# define VLCGL_TEXTURE_COUNT 1
+# define PRECISION "precision highp float;"
+# define VLCGL_PICTURE_MAX 128
+# define glClientActiveTexture(x)
+#else
+# define GLSL_VERSION "120"
+# define VLCGL_TEXTURE_COUNT 1
+# define VLCGL_PICTURE_MAX 128
+# define PRECISION ""
+#endif
+
+#if defined(USE_OPENGL_ES2) || defined(__APPLE__)
+# define PFNGLGETPROGRAMIVPROC typeof(glGetProgramiv)*
+# define PFNGLGETPROGRAMINFOLOGPROC typeof(glGetProgramInfoLog)*
+# define PFNGLGETSHADERIVPROC typeof(glGetShaderiv)*
+# define PFNGLGETSHADERINFOLOGPROC typeof(glGetShaderInfoLog)*
+# define PFNGLGETUNIFORMLOCATIONPROC typeof(glGetUniformLocation)*
+# define PFNGLGETATTRIBLOCATIONPROC typeof(glGetAttribLocation)*
+# define PFNGLVERTEXATTRIBPOINTERPROC typeof(glVertexAttribPointer)*
+# define PFNGLENABLEVERTEXATTRIBARRAYPROC typeof(glEnableVertexAttribArray)*
+# define PFNGLUNIFORMMATRIX4FVPROC typeof(glUniformMatrix4fv)*
+# define PFNGLUNIFORM4FVPROC typeof(glUniform4fv)*
+# define PFNGLUNIFORM4FPROC typeof(glUniform4f)*
+# define PFNGLUNIFORM1IPROC typeof(glUniform1i)*
+# define PFNGLCREATESHADERPROC typeof(glCreateShader)*
+# define PFNGLSHADERSOURCEPROC typeof(glShaderSource)*
+# define PFNGLCOMPILESHADERPROC typeof(glCompileShader)*
+# define PFNGLDELETESHADERPROC typeof(glDeleteShader)*
+# define PFNGLCREATEPROGRAMPROC typeof(glCreateProgram)*
+# define PFNGLLINKPROGRAMPROC typeof(glLinkProgram)*
+# define PFNGLUSEPROGRAMPROC typeof(glUseProgram)*
+# define PFNGLDELETEPROGRAMPROC typeof(glDeleteProgram)*
+# define PFNGLATTACHSHADERPROC typeof(glAttachShader)*
+# define PFNGLGENBUFFERSPROC typeof(glGenBuffers)*
+# define PFNGLBINDBUFFERPROC typeof(glBindBuffer)*
+# define PFNGLBUFFERDATAPROC typeof(glBufferData)*
+# define PFNGLDELETEBUFFERSPROC typeof(glDeleteBuffers)*
+#if defined(__APPLE__)
+# import <CoreFoundation/CoreFoundation.h>
+#endif
+#endif
+
+/**
+ * Structure containing function pointers to shaders commands
+ */
+typedef struct {
+ /* Shader variables commands*/
+ PFNGLGETUNIFORMLOCATIONPROC GetUniformLocation;
+ PFNGLGETATTRIBLOCATIONPROC GetAttribLocation;
+ PFNGLVERTEXATTRIBPOINTERPROC VertexAttribPointer;
+ PFNGLENABLEVERTEXATTRIBARRAYPROC EnableVertexAttribArray;
+
+ PFNGLUNIFORMMATRIX4FVPROC UniformMatrix4fv;
+ PFNGLUNIFORM4FVPROC Uniform4fv;
+ PFNGLUNIFORM4FPROC Uniform4f;
+ PFNGLUNIFORM1IPROC Uniform1i;
+
+ /* Shader command */
+ PFNGLCREATESHADERPROC CreateShader;
+ PFNGLSHADERSOURCEPROC ShaderSource;
+ PFNGLCOMPILESHADERPROC CompileShader;
+ PFNGLDELETESHADERPROC DeleteShader;
+
+ PFNGLCREATEPROGRAMPROC CreateProgram;
+ PFNGLLINKPROGRAMPROC LinkProgram;
+ PFNGLUSEPROGRAMPROC UseProgram;
+ PFNGLDELETEPROGRAMPROC DeleteProgram;
+
+ PFNGLATTACHSHADERPROC AttachShader;
+
+ /* Shader log commands */
+ PFNGLGETPROGRAMIVPROC GetProgramiv;
+ PFNGLGETPROGRAMINFOLOGPROC GetProgramInfoLog;
+ PFNGLGETSHADERIVPROC GetShaderiv;
+ PFNGLGETSHADERINFOLOGPROC GetShaderInfoLog;
+
+ PFNGLGENBUFFERSPROC GenBuffers;
+ PFNGLBINDBUFFERPROC BindBuffer;
+ PFNGLBUFFERDATAPROC BufferData;
+ PFNGLDELETEBUFFERSPROC DeleteBuffers;
+
+#if defined(_WIN32)
+ PFNGLACTIVETEXTUREPROC ActiveTexture;
+ PFNGLCLIENTACTIVETEXTUREPROC ClientActiveTexture;
+# undef glClientActiveTexture
+# undef glActiveTexture
+# define glActiveTexture tc->api->ActiveTexture
+# define glClientActiveTexture tc->api->ClientActiveTexture
+#endif
+
+} opengl_shaders_api_t;
+
+#endif /* include-guard */
diff --git a/modules/video_output/opengl/vout_helper.c b/modules/video_output/opengl/vout_helper.c
index af01f36..9f6064f 100644
--- a/modules/video_output/opengl/vout_helper.c
+++ b/modules/video_output/opengl/vout_helper.c
@@ -40,55 +40,12 @@
#include <vlc_vout.h>
#include "vout_helper.h"
+#include "internal.h"
#ifndef GL_CLAMP_TO_EDGE
# define GL_CLAMP_TO_EDGE 0x812F
#endif
-#if defined(USE_OPENGL_ES2) || defined(__APPLE__)
-# define PFNGLGETPROGRAMIVPROC typeof(glGetProgramiv)*
-# define PFNGLGETPROGRAMINFOLOGPROC typeof(glGetProgramInfoLog)*
-# define PFNGLGETSHADERIVPROC typeof(glGetShaderiv)*
-# define PFNGLGETSHADERINFOLOGPROC typeof(glGetShaderInfoLog)*
-# define PFNGLGETUNIFORMLOCATIONPROC typeof(glGetUniformLocation)*
-# define PFNGLGETATTRIBLOCATIONPROC typeof(glGetAttribLocation)*
-# define PFNGLVERTEXATTRIBPOINTERPROC typeof(glVertexAttribPointer)*
-# define PFNGLENABLEVERTEXATTRIBARRAYPROC typeof(glEnableVertexAttribArray)*
-# define PFNGLUNIFORMMATRIX4FVPROC typeof(glUniformMatrix4fv)*
-# define PFNGLUNIFORM4FVPROC typeof(glUniform4fv)*
-# define PFNGLUNIFORM4FPROC typeof(glUniform4f)*
-# define PFNGLUNIFORM1IPROC typeof(glUniform1i)*
-# define PFNGLCREATESHADERPROC typeof(glCreateShader)*
-# define PFNGLSHADERSOURCEPROC typeof(glShaderSource)*
-# define PFNGLCOMPILESHADERPROC typeof(glCompileShader)*
-# define PFNGLDELETESHADERPROC typeof(glDeleteShader)*
-# define PFNGLCREATEPROGRAMPROC typeof(glCreateProgram)*
-# define PFNGLLINKPROGRAMPROC typeof(glLinkProgram)*
-# define PFNGLUSEPROGRAMPROC typeof(glUseProgram)*
-# define PFNGLDELETEPROGRAMPROC typeof(glDeleteProgram)*
-# define PFNGLATTACHSHADERPROC typeof(glAttachShader)*
-# define PFNGLGENBUFFERSPROC typeof(glGenBuffers)*
-# define PFNGLBINDBUFFERPROC typeof(glBindBuffer)*
-# define PFNGLBUFFERDATAPROC typeof(glBufferData)*
-# define PFNGLDELETEBUFFERSPROC typeof(glDeleteBuffers)*
-#if defined(__APPLE__)
-# import <CoreFoundation/CoreFoundation.h>
-#endif
-#endif
-
-#if defined(USE_OPENGL_ES2)
-# define GLSL_VERSION "100"
-# define VLCGL_TEXTURE_COUNT 1
-# define PRECISION "precision highp float;"
-# define VLCGL_PICTURE_MAX 128
-# define glClientActiveTexture(x)
-#else
-# define GLSL_VERSION "120"
-# define VLCGL_TEXTURE_COUNT 1
-# define VLCGL_PICTURE_MAX 128
-# define PRECISION ""
-#endif
-
#ifndef GL_RED
#define GL_RED 0
#endif
@@ -119,6 +76,7 @@ typedef struct {
struct vout_display_opengl_t {
vlc_gl_t *gl;
+ opengl_shaders_api_t api;
video_format_t fmt;
const vlc_chroma_description_t *chroma;
@@ -159,46 +117,6 @@ struct vout_display_opengl_t {
GLuint *subpicture_buffer_object;
int subpicture_buffer_object_count;
- /* Shader variables commands*/
- PFNGLGETUNIFORMLOCATIONPROC GetUniformLocation;
- PFNGLGETATTRIBLOCATIONPROC GetAttribLocation;
- PFNGLVERTEXATTRIBPOINTERPROC VertexAttribPointer;
- PFNGLENABLEVERTEXATTRIBARRAYPROC EnableVertexAttribArray;
-
- PFNGLUNIFORMMATRIX4FVPROC UniformMatrix4fv;
- PFNGLUNIFORM4FVPROC Uniform4fv;
- PFNGLUNIFORM4FPROC Uniform4f;
- PFNGLUNIFORM1IPROC Uniform1i;
-
- /* Shader command */
- PFNGLCREATESHADERPROC CreateShader;
- PFNGLSHADERSOURCEPROC ShaderSource;
- PFNGLCOMPILESHADERPROC CompileShader;
- PFNGLDELETESHADERPROC DeleteShader;
-
- PFNGLCREATEPROGRAMPROC CreateProgram;
- PFNGLLINKPROGRAMPROC LinkProgram;
- PFNGLUSEPROGRAMPROC UseProgram;
- PFNGLDELETEPROGRAMPROC DeleteProgram;
-
- PFNGLATTACHSHADERPROC AttachShader;
-
- /* Shader log commands */
- PFNGLGETPROGRAMIVPROC GetProgramiv;
- PFNGLGETPROGRAMINFOLOGPROC GetProgramInfoLog;
- PFNGLGETSHADERIVPROC GetShaderiv;
- PFNGLGETSHADERINFOLOGPROC GetShaderInfoLog;
-
- PFNGLGENBUFFERSPROC GenBuffers;
- PFNGLBINDBUFFERPROC BindBuffer;
- PFNGLBUFFERDATAPROC BufferData;
- PFNGLDELETEBUFFERSPROC DeleteBuffers;
-
-#if defined(_WIN32)
- PFNGLACTIVETEXTUREPROC ActiveTexture;
- PFNGLCLIENTACTIVETEXTUREPROC ClientActiveTexture;
-#endif
-
/* Non-power-of-2 texture size support */
bool supports_npot;
@@ -275,9 +193,9 @@ static void BuildVertexShader(vout_display_opengl_t *vgl,
" gl_Position = ProjectionMatrix * OrientationMatrix * ZoomMatrix * ZRotMatrix * XRotMatrix * YRotMatrix * vec4(VertexPosition, 1.0);"
"}";
- *shader = vgl->CreateShader(GL_VERTEX_SHADER);
- vgl->ShaderSource(*shader, 1, &vertexShader, NULL);
- vgl->CompileShader(*shader);
+ *shader = vgl->api.CreateShader(GL_VERTEX_SHADER);
+ vgl->api.ShaderSource(*shader, 1, &vertexShader, NULL);
+ vgl->api.CompileShader(*shader);
}
static void BuildYUVFragmentShader(vout_display_opengl_t *vgl,
@@ -357,9 +275,9 @@ static void BuildYUVFragmentShader(vout_display_opengl_t *vgl,
local_value[i*4+j] = j < 3 ? correction * matrix[j*4+i] : 0.f;
}
- *shader = vgl->CreateShader(GL_FRAGMENT_SHADER);
- vgl->ShaderSource(*shader, 1, (const char **)&code, NULL);
- vgl->CompileShader(*shader);
+ *shader = vgl->api.CreateShader(GL_FRAGMENT_SHADER);
+ vgl->api.ShaderSource(*shader, 1, (const char **)&code, NULL);
+ vgl->api.CompileShader(*shader);
free(code);
}
@@ -378,9 +296,9 @@ static void BuildRGBFragmentShader(vout_display_opengl_t *vgl,
"{ "
" gl_FragColor = texture2D(Texture[0], TexCoord0.st);"
"}";
- *shader = vgl->CreateShader(GL_FRAGMENT_SHADER);
- vgl->ShaderSource(*shader, 1, &code, NULL);
- vgl->CompileShader(*shader);
+ *shader = vgl->api.CreateShader(GL_FRAGMENT_SHADER);
+ vgl->api.ShaderSource(*shader, 1, &code, NULL);
+ vgl->api.CompileShader(*shader);
}
#endif
@@ -398,9 +316,9 @@ static void BuildRGBAFragmentShader(vout_display_opengl_t *vgl,
"{ "
" gl_FragColor = texture2D(Texture, TexCoord0.st) * FillColor;"
"}";
- *shader = vgl->CreateShader(GL_FRAGMENT_SHADER);
- vgl->ShaderSource(*shader, 1, &code, NULL);
- vgl->CompileShader(*shader);
+ *shader = vgl->api.CreateShader(GL_FRAGMENT_SHADER);
+ vgl->api.ShaderSource(*shader, 1, &code, NULL);
+ vgl->api.CompileShader(*shader);
}
static void BuildXYZFragmentShader(vout_display_opengl_t *vgl,
@@ -437,9 +355,9 @@ static void BuildXYZFragmentShader(vout_display_opengl_t *vgl,
" v_out = clamp(v_out, 0.0, 1.0) ;"
" gl_FragColor = v_out;"
"}";
- *shader = vgl->CreateShader(GL_FRAGMENT_SHADER);
- vgl->ShaderSource(*shader, 1, &code, NULL);
- vgl->CompileShader(*shader);
+ *shader = vgl->api.CreateShader(GL_FRAGMENT_SHADER);
+ vgl->api.ShaderSource(*shader, 1, &code, NULL);
+ vgl->api.CompileShader(*shader);
}
vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
@@ -471,44 +389,46 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
const int yuv_plane_texformat = GL_LUMINANCE;
#endif
+ opengl_shaders_api_t *api = &vgl->api;
+
#if defined(USE_OPENGL_ES2)
#define GET_PROC_ADDR(name) name
#else
#define GET_PROC_ADDR(name) vlc_gl_GetProcAddress(gl, #name)
#endif
- vgl->CreateShader = GET_PROC_ADDR(glCreateShader);
- vgl->ShaderSource = GET_PROC_ADDR(glShaderSource);
- vgl->CompileShader = GET_PROC_ADDR(glCompileShader);
- vgl->AttachShader = GET_PROC_ADDR(glAttachShader);
-
- vgl->GetProgramiv = GET_PROC_ADDR(glGetProgramiv);
- vgl->GetShaderiv = GET_PROC_ADDR(glGetShaderiv);
- vgl->GetProgramInfoLog = GET_PROC_ADDR(glGetProgramInfoLog);
- vgl->GetShaderInfoLog = GET_PROC_ADDR(glGetShaderInfoLog);
-
- vgl->DeleteShader = GET_PROC_ADDR(glDeleteShader);
-
- vgl->GetUniformLocation = GET_PROC_ADDR(glGetUniformLocation);
- vgl->GetAttribLocation = GET_PROC_ADDR(glGetAttribLocation);
- vgl->VertexAttribPointer = GET_PROC_ADDR(glVertexAttribPointer);
- vgl->EnableVertexAttribArray = GET_PROC_ADDR(glEnableVertexAttribArray);
- vgl->UniformMatrix4fv = GET_PROC_ADDR(glUniformMatrix4fv);
- vgl->Uniform4fv = GET_PROC_ADDR(glUniform4fv);
- vgl->Uniform4f = GET_PROC_ADDR(glUniform4f);
- vgl->Uniform1i = GET_PROC_ADDR(glUniform1i);
-
- vgl->CreateProgram = GET_PROC_ADDR(glCreateProgram);
- vgl->LinkProgram = GET_PROC_ADDR(glLinkProgram);
- vgl->UseProgram = GET_PROC_ADDR(glUseProgram);
- vgl->DeleteProgram = GET_PROC_ADDR(glDeleteProgram);
-
- vgl->GenBuffers = GET_PROC_ADDR(glGenBuffers);
- vgl->BindBuffer = GET_PROC_ADDR(glBindBuffer);
- vgl->BufferData = GET_PROC_ADDR(glBufferData);
- vgl->DeleteBuffers = GET_PROC_ADDR(glDeleteBuffers);
+ api->CreateShader = GET_PROC_ADDR(glCreateShader);
+ api->ShaderSource = GET_PROC_ADDR(glShaderSource);
+ api->CompileShader = GET_PROC_ADDR(glCompileShader);
+ api->AttachShader = GET_PROC_ADDR(glAttachShader);
+
+ api->GetProgramiv = GET_PROC_ADDR(glGetProgramiv);
+ api->GetShaderiv = GET_PROC_ADDR(glGetShaderiv);
+ api->GetProgramInfoLog = GET_PROC_ADDR(glGetProgramInfoLog);
+ api->GetShaderInfoLog = GET_PROC_ADDR(glGetShaderInfoLog);
+
+ api->DeleteShader = GET_PROC_ADDR(glDeleteShader);
+
+ api->GetUniformLocation = GET_PROC_ADDR(glGetUniformLocation);
+ api->GetAttribLocation = GET_PROC_ADDR(glGetAttribLocation);
+ api->VertexAttribPointer = GET_PROC_ADDR(glVertexAttribPointer);
+ api->EnableVertexAttribArray = GET_PROC_ADDR(glEnableVertexAttribArray);
+ api->UniformMatrix4fv = GET_PROC_ADDR(glUniformMatrix4fv);
+ api->Uniform4fv = GET_PROC_ADDR(glUniform4fv);
+ api->Uniform4f = GET_PROC_ADDR(glUniform4f);
+ api->Uniform1i = GET_PROC_ADDR(glUniform1i);
+
+ api->CreateProgram = GET_PROC_ADDR(glCreateProgram);
+ api->LinkProgram = GET_PROC_ADDR(glLinkProgram);
+ api->UseProgram = GET_PROC_ADDR(glUseProgram);
+ api->DeleteProgram = GET_PROC_ADDR(glDeleteProgram);
+
+ api->GenBuffers = GET_PROC_ADDR(glGenBuffers);
+ api->BindBuffer = GET_PROC_ADDR(glBindBuffer);
+ api->BufferData = GET_PROC_ADDR(glBufferData);
+ api->DeleteBuffers = GET_PROC_ADDR(glDeleteBuffers);
#undef GET_PROC_ADDR
- if (!vgl->CreateShader || !vgl->ShaderSource || !vgl->CreateProgram)
+ if (!vgl->api.CreateShader || !vgl->api.ShaderSource || !vgl->api.CreateProgram)
supports_shaders = false;
if (!supports_shaders)
{
@@ -518,10 +438,12 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
}
#if defined(_WIN32)
- vgl->ActiveTexture = (PFNGLACTIVETEXTUREPROC)vlc_gl_GetProcAddress(gl, "glActiveTexture");
- vgl->ClientActiveTexture = (PFNGLCLIENTACTIVETEXTUREPROC)vlc_gl_GetProcAddress(gl, "glClientActiveTexture");
-# define glActiveTexture vgl->ActiveTexture
-# define glClientActiveTexture vgl->ClientActiveTexture
+ api->ActiveTexture = vlc_gl_GetProcAddress(gl, "glActiveTexture");
+ api->ClientActiveTexture = vlc_gl_GetProcAddress(gl, "glClientActiveTexture");
+# undef glActiveTexture
+# undef glClientActiveTexture
+# define glActiveTexture vgl->api.ActiveTexture
+# define glClientActiveTexture vgl->api.ClientActiveTexture
#endif
vgl->supports_npot = HasExtension(extensions, "GL_ARB_texture_non_power_of_two") ||
@@ -625,7 +547,7 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
/* Check shaders messages */
for (unsigned j = 0; j < nb_shaders; j++) {
int infoLength;
- vgl->GetShaderiv(vgl->shader[j], GL_INFO_LOG_LENGTH, &infoLength);
+ vgl->api.GetShaderiv(vgl->shader[j], GL_INFO_LOG_LENGTH, &infoLength);
if (infoLength <= 1)
continue;
@@ -633,8 +555,8 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
if (infolog != NULL)
{
int charsWritten;
- vgl->GetShaderInfoLog(vgl->shader[j], infoLength, &charsWritten,
- infolog);
+ vgl->api.GetShaderInfoLog(vgl->shader[j], infoLength, &charsWritten,
+ infolog);
msg_Err(gl, "shader %d: %s", j, infolog);
free(infolog);
}
@@ -650,18 +572,18 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
{
program_idx = nb_programs++;
- program = vgl->program[program_idx] = vgl->CreateProgram();
- vgl->AttachShader(program, vgl->shader[fragment_shader_idx]);
- vgl->AttachShader(program, vgl->shader[vertex_shader_idx]);
- vgl->LinkProgram(program);
+ program = vgl->program[program_idx] = vgl->api.CreateProgram();
+ vgl->api.AttachShader(program, vgl->shader[fragment_shader_idx]);
+ vgl->api.AttachShader(program, vgl->shader[vertex_shader_idx]);
+ vgl->api.LinkProgram(program);
}
/* RGB & Vertex shaders */
rgba_program_idx = nb_programs++;
- program = vgl->program[rgba_program_idx] = vgl->CreateProgram();
- vgl->AttachShader(program, vgl->shader[rgba_fragment_shader_idx]);
- vgl->AttachShader(program, vgl->shader[vertex_shader_idx]);
- vgl->LinkProgram(program);
+ program = vgl->program[rgba_program_idx] = vgl->api.CreateProgram();
+ vgl->api.AttachShader(program, vgl->shader[rgba_fragment_shader_idx]);
+ vgl->api.AttachShader(program, vgl->shader[vertex_shader_idx]);
+ vgl->api.LinkProgram(program);
vgl->program_idx = program_idx != -1 ? program_idx : rgba_program_idx;
vgl->program_sub_idx = rgba_program_idx;
@@ -669,22 +591,22 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
/* Check program messages */
for (GLuint i = 0; i < nb_programs; i++) {
int infoLength = 0;
- vgl->GetProgramiv(vgl->program[i], GL_INFO_LOG_LENGTH, &infoLength);
+ vgl->api.GetProgramiv(vgl->program[i], GL_INFO_LOG_LENGTH, &infoLength);
if (infoLength <= 1)
continue;
char *infolog = malloc(infoLength);
if (infolog != NULL)
{
int charsWritten;
- vgl->GetProgramInfoLog(vgl->program[i], infoLength, &charsWritten,
- infolog);
+ vgl->api.GetProgramInfoLog(vgl->program[i], infoLength, &charsWritten,
+ infolog);
msg_Err(gl, "shader program %d: %s", i, infolog);
free(infolog);
}
/* If there is some message, better to check linking is ok */
GLint link_status = GL_TRUE;
- vgl->GetProgramiv(vgl->program[i], GL_LINK_STATUS, &link_status);
+ vgl->api.GetProgramiv(vgl->program[i], GL_LINK_STATUS, &link_status);
if (link_status == GL_FALSE) {
msg_Err(gl, "Unable to use program %d\n", i);
vout_display_opengl_Delete(vgl);
@@ -719,9 +641,9 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
- vgl->GenBuffers(1, &vgl->vertex_buffer_object);
- vgl->GenBuffers(1, &vgl->index_buffer_object);
- vgl->GenBuffers(vgl->chroma->plane_count, vgl->texture_buffer_object);
+ vgl->api.GenBuffers(1, &vgl->vertex_buffer_object);
+ vgl->api.GenBuffers(1, &vgl->index_buffer_object);
+ vgl->api.GenBuffers(vgl->chroma->plane_count, vgl->texture_buffer_object);
/* Initial number of allocated buffer objects for subpictures, will grow dynamically. */
int subpicture_buffer_object_count = 8;
@@ -731,7 +653,7 @@ vout_display_opengl_t *vout_display_opengl_New(video_format_t *fmt,
return NULL;
}
vgl->subpicture_buffer_object_count = subpicture_buffer_object_count;
- vgl->GenBuffers(vgl->subpicture_buffer_object_count, vgl->subpicture_buffer_object);
+ vgl->api.GenBuffers(vgl->subpicture_buffer_object_count, vgl->subpicture_buffer_object);
/* */
for (int i = 0; i < VLCGL_TEXTURE_COUNT; i++) {
@@ -771,14 +693,14 @@ void vout_display_opengl_Delete(vout_display_opengl_t *vgl)
free(vgl->region);
for (int i = 0; i < 2 && vgl->program[i] != 0; i++)
- vgl->DeleteProgram(vgl->program[i]);
+ vgl->api.DeleteProgram(vgl->program[i]);
for (int i = 0; i < 3 && vgl->shader[i] != 0; i++)
- vgl->DeleteShader(vgl->shader[i]);
- vgl->DeleteBuffers(1, &vgl->vertex_buffer_object);
- vgl->DeleteBuffers(1, &vgl->index_buffer_object);
- vgl->DeleteBuffers(vgl->chroma->plane_count, vgl->texture_buffer_object);
+ vgl->api.DeleteShader(vgl->shader[i]);
+ vgl->api.DeleteBuffers(1, &vgl->vertex_buffer_object);
+ vgl->api.DeleteBuffers(1, &vgl->index_buffer_object);
+ vgl->api.DeleteBuffers(vgl->chroma->plane_count, vgl->texture_buffer_object);
if (vgl->subpicture_buffer_object_count > 0)
- vgl->DeleteBuffers(vgl->subpicture_buffer_object_count, vgl->subpicture_buffer_object);
+ vgl->api.DeleteBuffers(vgl->subpicture_buffer_object_count, vgl->subpicture_buffer_object);
free(vgl->subpicture_buffer_object);
free(vgl->texture_temp_buf);
@@ -1511,22 +1433,22 @@ static void DrawWithShaders(vout_display_opengl_t *vgl,
unsigned int program_idx)
{
GLuint program = vgl->program[program_idx];
- vgl->UseProgram(program);
+ vgl->api.UseProgram(program);
if (vlc_fourcc_IsYUV(vgl->fmt.i_chroma)
|| vgl->fmt.i_chroma == VLC_CODEC_XYZ12) { /* FIXME: ugly */
if (vgl->chroma->plane_count == 3) {
- vgl->Uniform4fv(vgl->GetUniformLocation(program,
+ vgl->api.Uniform4fv(vgl->api.GetUniformLocation(program,
"Coefficient"), 4, vgl->local_value);
- vgl->Uniform1i(vgl->GetUniformLocation(program, "Texture0"), 0);
- vgl->Uniform1i(vgl->GetUniformLocation(program, "Texture1"), 1);
- vgl->Uniform1i(vgl->GetUniformLocation(program, "Texture2"), 2);
+ vgl->api.Uniform1i(vgl->api.GetUniformLocation(program, "Texture0"), 0);
+ vgl->api.Uniform1i(vgl->api.GetUniformLocation(program, "Texture1"), 1);
+ vgl->api.Uniform1i(vgl->api.GetUniformLocation(program, "Texture2"), 2);
}
else if (vgl->chroma->plane_count == 1) {
- vgl->Uniform1i(vgl->GetUniformLocation(program, "Texture0"), 0);
+ vgl->api.Uniform1i(vgl->api.GetUniformLocation(program, "Texture0"), 0);
}
} else {
- vgl->Uniform1i(vgl->GetUniformLocation(program, "Texture0"), 0);
- vgl->Uniform4f(vgl->GetUniformLocation(program, "FillColor"),
+ vgl->api.Uniform1i(vgl->api.GetUniformLocation(program, "Texture0"), 0);
+ vgl->api.Uniform4f(vgl->api.GetUniformLocation(program, "FillColor"),
1.0f, 1.0f, 1.0f, 1.0f);
}
@@ -1595,45 +1517,45 @@ static void DrawWithShaders(vout_display_opengl_t *vgl,
glClientActiveTexture(GL_TEXTURE0+j);
glBindTexture(vgl->tex_target, vgl->texture[0][j]);
- vgl->BindBuffer(GL_ARRAY_BUFFER, vgl->texture_buffer_object[j]);
- vgl->BufferData(GL_ARRAY_BUFFER, nbVertices * 2 * sizeof(GLfloat),
+ vgl->api.BindBuffer(GL_ARRAY_BUFFER, vgl->texture_buffer_object[j]);
+ vgl->api.BufferData(GL_ARRAY_BUFFER, nbVertices * 2 * sizeof(GLfloat),
textureCoord + j * nbVertices * 2, GL_STATIC_DRAW);
char attribute[20];
snprintf(attribute, sizeof(attribute), "MultiTexCoord%1d", j);
- vgl->EnableVertexAttribArray(vgl->GetAttribLocation(program, attribute));
- vgl->VertexAttribPointer(vgl->GetAttribLocation(program, attribute), 2,
+ vgl->api.EnableVertexAttribArray(vgl->api.GetAttribLocation(program, attribute));
+ vgl->api.VertexAttribPointer(vgl->api.GetAttribLocation(program, attribute), 2,
GL_FLOAT, 0, 0, 0);
}
free(textureCoord);
glActiveTexture(GL_TEXTURE0 + 0);
glClientActiveTexture(GL_TEXTURE0 + 0);
- vgl->BindBuffer(GL_ARRAY_BUFFER, vgl->vertex_buffer_object);
- vgl->BufferData(GL_ARRAY_BUFFER, nbVertices * 3 * sizeof(GLfloat), vertexCoord, GL_STATIC_DRAW);
+ vgl->api.BindBuffer(GL_ARRAY_BUFFER, vgl->vertex_buffer_object);
+ vgl->api.BufferData(GL_ARRAY_BUFFER, nbVertices * 3 * sizeof(GLfloat), vertexCoord, GL_STATIC_DRAW);
free(vertexCoord);
- vgl->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, vgl->index_buffer_object);
- vgl->BufferData(GL_ELEMENT_ARRAY_BUFFER, nbIndices * sizeof(GLushort), indices, GL_STATIC_DRAW);
+ vgl->api.BindBuffer(GL_ELEMENT_ARRAY_BUFFER, vgl->index_buffer_object);
+ vgl->api.BufferData(GL_ELEMENT_ARRAY_BUFFER, nbIndices * sizeof(GLushort), indices, GL_STATIC_DRAW);
free(indices);
- vgl->EnableVertexAttribArray(vgl->GetAttribLocation(program,
+ vgl->api.EnableVertexAttribArray(vgl->api.GetAttribLocation(program,
"VertexPosition"));
- vgl->VertexAttribPointer(vgl->GetAttribLocation(program, "VertexPosition"),
+ vgl->api.VertexAttribPointer(vgl->api.GetAttribLocation(program, "VertexPosition"),
3, GL_FLOAT, 0, 0, 0);
- vgl->UniformMatrix4fv(vgl->GetUniformLocation(program, "OrientationMatrix"),
+ vgl->api.UniformMatrix4fv(vgl->api.GetUniformLocation(program, "OrientationMatrix"),
1, GL_FALSE, orientationMatrix);
- vgl->UniformMatrix4fv(vgl->GetUniformLocation(program, "ProjectionMatrix"),
+ vgl->api.UniformMatrix4fv(vgl->api.GetUniformLocation(program, "ProjectionMatrix"),
1, GL_FALSE, projectionMatrix);
- vgl->UniformMatrix4fv(vgl->GetUniformLocation(program, "ZRotMatrix"),
+ vgl->api.UniformMatrix4fv(vgl->api.GetUniformLocation(program, "ZRotMatrix"),
1, GL_FALSE, zRotMatrix);
- vgl->UniformMatrix4fv(vgl->GetUniformLocation(program, "YRotMatrix"),
+ vgl->api.UniformMatrix4fv(vgl->api.GetUniformLocation(program, "YRotMatrix"),
1, GL_FALSE, yRotMatrix);
- vgl->UniformMatrix4fv(vgl->GetUniformLocation(program, "XRotMatrix"),
+ vgl->api.UniformMatrix4fv(vgl->api.GetUniformLocation(program, "XRotMatrix"),
1, GL_FALSE, xRotMatrix);
- vgl->UniformMatrix4fv(vgl->GetUniformLocation(program, "ZoomMatrix"),
+ vgl->api.UniformMatrix4fv(vgl->api.GetUniformLocation(program, "ZoomMatrix"),
1, GL_FALSE, zoomMatrix);
- vgl->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, vgl->index_buffer_object);
+ vgl->api.BindBuffer(GL_ELEMENT_ARRAY_BUFFER, vgl->index_buffer_object);
glDrawElements(GL_TRIANGLES, nbIndices, GL_UNSIGNED_SHORT, 0);
}
@@ -1679,8 +1601,8 @@ int vout_display_opengl_Display(vout_display_opengl_t *vgl,
/* Draw the subpictures */
// Change the program for overlays
GLuint sub_program = vgl->program[vgl->program_sub_idx];
- vgl->UseProgram(sub_program);
- vgl->Uniform1i(vgl->GetUniformLocation(sub_program, "Texture"), 0);
+ vgl->api.UseProgram(sub_program);
+ vgl->api.Uniform1i(vgl->api.GetUniformLocation(sub_program, "Texture"), 0);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
@@ -1688,7 +1610,8 @@ int vout_display_opengl_Display(vout_display_opengl_t *vgl,
/* We need two buffer objects for each region: for vertex and texture coordinates. */
if (2 * vgl->region_count > vgl->subpicture_buffer_object_count) {
if (vgl->subpicture_buffer_object_count > 0)
- vgl->DeleteBuffers(vgl->subpicture_buffer_object_count, vgl->subpicture_buffer_object);
+ vgl->api.DeleteBuffers(vgl->subpicture_buffer_object_count,
+ vgl->subpicture_buffer_object);
vgl->subpicture_buffer_object_count = 0;
int new_count = 2 * vgl->region_count;
@@ -1697,7 +1620,8 @@ int vout_display_opengl_Display(vout_display_opengl_t *vgl,
return VLC_ENOMEM;
vgl->subpicture_buffer_object_count = new_count;
- vgl->GenBuffers(vgl->subpicture_buffer_object_count, vgl->subpicture_buffer_object);
+ vgl->api.GenBuffers(vgl->subpicture_buffer_object_count,
+ vgl->subpicture_buffer_object);
}
glActiveTexture(GL_TEXTURE0 + 0);
@@ -1718,36 +1642,36 @@ int vout_display_opengl_Display(vout_display_opengl_t *vgl,
};
glBindTexture(GL_TEXTURE_2D, glr->texture);
- vgl->Uniform4f(vgl->GetUniformLocation(sub_program, "FillColor"),
- 1.0f, 1.0f, 1.0f, glr->alpha);
-
- vgl->BindBuffer(GL_ARRAY_BUFFER, vgl->subpicture_buffer_object[2 * i]);
- vgl->BufferData(GL_ARRAY_BUFFER, sizeof(textureCoord), textureCoord, GL_STATIC_DRAW);
- vgl->EnableVertexAttribArray(vgl->GetAttribLocation(sub_program,
- "MultiTexCoord0"));
- vgl->VertexAttribPointer(vgl->GetAttribLocation(sub_program,
- "MultiTexCoord0"), 2, GL_FLOAT, 0, 0, 0);
-
- vgl->BindBuffer(GL_ARRAY_BUFFER, vgl->subpicture_buffer_object[2 * i + 1]);
- vgl->BufferData(GL_ARRAY_BUFFER, sizeof(vertexCoord), vertexCoord, GL_STATIC_DRAW);
- vgl->EnableVertexAttribArray(vgl->GetAttribLocation(sub_program,
- "VertexPosition"));
- vgl->VertexAttribPointer(vgl->GetAttribLocation(sub_program,
- "VertexPosition"), 2, GL_FLOAT, 0, 0, 0);
+ vgl->api.Uniform4f(vgl->api.GetUniformLocation(sub_program, "FillColor"),
+ 1.0f, 1.0f, 1.0f, glr->alpha);
+
+ vgl->api.BindBuffer(GL_ARRAY_BUFFER, vgl->subpicture_buffer_object[2 * i]);
+ vgl->api.BufferData(GL_ARRAY_BUFFER, sizeof(textureCoord), textureCoord, GL_STATIC_DRAW);
+ vgl->api.EnableVertexAttribArray(vgl->api.GetAttribLocation(sub_program,
+ "MultiTexCoord0"));
+ vgl->api.VertexAttribPointer(vgl->api.GetAttribLocation(sub_program,
+ "MultiTexCoord0"), 2, GL_FLOAT, 0, 0, 0);
+
+ vgl->api.BindBuffer(GL_ARRAY_BUFFER, vgl->subpicture_buffer_object[2 * i + 1]);
+ vgl->api.BufferData(GL_ARRAY_BUFFER, sizeof(vertexCoord), vertexCoord, GL_STATIC_DRAW);
+ vgl->api.EnableVertexAttribArray(vgl->api.GetAttribLocation(sub_program,
+ "VertexPosition"));
+ vgl->api.VertexAttribPointer(vgl->api.GetAttribLocation(sub_program,
+ "VertexPosition"), 2, GL_FLOAT, 0, 0, 0);
// Subpictures have the correct orientation:
- vgl->UniformMatrix4fv(vgl->GetUniformLocation(sub_program,
- "OrientationMatrix"), 1, GL_FALSE, identity);
- vgl->UniformMatrix4fv(vgl->GetUniformLocation(sub_program,
- "ProjectionMatrix"), 1, GL_FALSE, identity);
- vgl->UniformMatrix4fv(vgl->GetUniformLocation(sub_program,
- "ZRotMatrix"), 1, GL_FALSE, identity);
- vgl->UniformMatrix4fv(vgl->GetUniformLocation(sub_program,
- "YRotMatrix"), 1, GL_FALSE, identity);
- vgl->UniformMatrix4fv(vgl->GetUniformLocation(sub_program,
- "XRotMatrix"), 1, GL_FALSE, identity);
- vgl->UniformMatrix4fv(vgl->GetUniformLocation(sub_program,
- "ZoomMatrix"), 1, GL_FALSE, identity);
+ vgl->api.UniformMatrix4fv(vgl->api.GetUniformLocation(sub_program,
+ "OrientationMatrix"), 1, GL_FALSE, identity);
+ vgl->api.UniformMatrix4fv(vgl->api.GetUniformLocation(sub_program,
+ "ProjectionMatrix"), 1, GL_FALSE, identity);
+ vgl->api.UniformMatrix4fv(vgl->api.GetUniformLocation(sub_program,
+ "ZRotMatrix"), 1, GL_FALSE, identity);
+ vgl->api.UniformMatrix4fv(vgl->api.GetUniformLocation(sub_program,
+ "YRotMatrix"), 1, GL_FALSE, identity);
+ vgl->api.UniformMatrix4fv(vgl->api.GetUniformLocation(sub_program,
+ "XRotMatrix"), 1, GL_FALSE, identity);
+ vgl->api.UniformMatrix4fv(vgl->api.GetUniformLocation(sub_program,
+ "ZoomMatrix"), 1, GL_FALSE, identity);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}
diff --git a/modules/video_output/opengl/vout_helper.h b/modules/video_output/opengl/vout_helper.h
index d334ed8..5e5fbbe 100644
--- a/modules/video_output/opengl/vout_helper.h
+++ b/modules/video_output/opengl/vout_helper.h
@@ -53,10 +53,6 @@
# else
# ifdef _WIN32
# include <GL/glew.h>
-# undef glClientActiveTexture
-# undef glActiveTexture
- PFNGLACTIVETEXTUREPROC glActiveTexture;
- PFNGLCLIENTACTIVETEXTUREPROC glClientActiveTexture;
# endif
# include <GL/gl.h>
# endif
More information about the vlc-commits
mailing list