summaryrefslogtreecommitdiffstats
path: root/libvo/gl_common.c
diff options
context:
space:
mode:
Diffstat (limited to 'libvo/gl_common.c')
-rw-r--r--libvo/gl_common.c204
1 files changed, 145 insertions, 59 deletions
diff --git a/libvo/gl_common.c b/libvo/gl_common.c
index a4ef197035..a14c745cfb 100644
--- a/libvo/gl_common.c
+++ b/libvo/gl_common.c
@@ -35,6 +35,47 @@
#include "gl_common.h"
#include "libavutil/common.h"
+void (APIENTRY *Begin)(GLenum) = glBegin;
+void (APIENTRY *End)(void) = glEnd;
+void (APIENTRY *Viewport)(GLint, GLint, GLsizei, GLsizei) = glViewport;
+void (APIENTRY *MatrixMode)(GLenum) = glMatrixMode;
+void (APIENTRY *LoadIdentity)(void) = glLoadIdentity;
+void (APIENTRY *Scaled)(double, double, double) = glScaled;
+void (APIENTRY *Ortho)(double, double, double, double, double, double) = glOrtho;
+void (APIENTRY *PushMatrix)(void) = glPushMatrix;
+void (APIENTRY *PopMatrix)(void) = glPopMatrix;
+void (APIENTRY *Clear)(GLbitfield) = glClear;
+GLuint (APIENTRY *GenLists)(GLsizei) = glGenLists;
+void (APIENTRY *DeleteLists)(GLuint, GLsizei) = glDeleteLists;
+void (APIENTRY *NewList)(GLuint, GLenum) = glNewList;
+void (APIENTRY *EndList)(void) = glEndList;
+void (APIENTRY *CallList)(GLuint) = glCallList;
+void (APIENTRY *CallLists)(GLsizei, GLenum, const GLvoid *) = glCallLists;
+void (APIENTRY *GenTextures)(GLsizei, GLuint *) = glGenTextures;
+void (APIENTRY *DeleteTextures)(GLsizei, const GLuint *) = glDeleteTextures;
+void (APIENTRY *TexEnvi)(GLenum, GLenum, GLint) = glTexEnvi;
+void (APIENTRY *Color4ub)(GLubyte, GLubyte, GLubyte, GLubyte) = glColor4ub;
+void (APIENTRY *Color3f)(GLfloat, GLfloat, GLfloat) = glColor3f;
+void (APIENTRY *ClearColor)(GLclampf, GLclampf, GLclampf, GLclampf) = glClearColor;
+void (APIENTRY *Enable)(GLenum) = glEnable;
+void (APIENTRY *Disable)(GLenum) = glDisable;
+const GLubyte *(APIENTRY *GetString)(GLenum) = glGetString;
+void (APIENTRY *DrawBuffer)(GLenum) = glDrawBuffer;
+void (APIENTRY *DepthMask)(GLboolean) = glDepthMask;
+void (APIENTRY *BlendFunc)(GLenum, GLenum) = glBlendFunc;
+void (APIENTRY *Flush)(void) = glFlush;
+void (APIENTRY *Finish)(void) = glFinish;
+void (APIENTRY *PixelStorei)(GLenum, GLint) = glPixelStorei;
+void (APIENTRY *TexImage1D)(GLenum, GLint, GLint, GLsizei, GLint, GLenum, GLenum, const GLvoid *) = glTexImage1D;
+void (APIENTRY *TexImage2D)(GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *) = glTexImage2D;
+void (APIENTRY *TexSubImage2D)(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid *) = glTexSubImage2D;
+void (APIENTRY *TexParameteri)(GLenum, GLenum, GLint) = glTexParameteri;
+void (APIENTRY *TexParameterf)(GLenum, GLenum, GLfloat) = glTexParameterf;
+void (APIENTRY *TexParameterfv)(GLenum, GLenum, const GLfloat *) = glTexParameterfv;
+void (APIENTRY *TexCoord2f)(GLfloat, GLfloat) = glTexCoord2f;
+void (APIENTRY *Vertex2f)(GLfloat, GLfloat) = glVertex2f;
+void (APIENTRY *GetIntegerv)(GLenum, GLint *) = glGetIntegerv;
+
/**
* \defgroup glextfunctions OpenGL extension functions
*
@@ -106,7 +147,7 @@ void glAdjustAlignment(int stride) {
gl_alignment=2;
else
gl_alignment=1;
- glPixelStorei (GL_UNPACK_ALIGNMENT, gl_alignment);
+ PixelStorei(GL_UNPACK_ALIGNMENT, gl_alignment);
}
struct gl_name_map_struct {
@@ -290,7 +331,52 @@ typedef struct {
const char *funcnames[7];
} extfunc_desc_t;
+#define DEF_FUNC_DESC(name) {&name, NULL, {"gl"#name, NULL}}
static const extfunc_desc_t extfuncs[] = {
+ // these aren't extension functions but we query them anyway to allow
+ // different "backends" with one binary
+ DEF_FUNC_DESC(Begin),
+ DEF_FUNC_DESC(End),
+ DEF_FUNC_DESC(Viewport),
+ DEF_FUNC_DESC(MatrixMode),
+ DEF_FUNC_DESC(LoadIdentity),
+ DEF_FUNC_DESC(Scaled),
+ DEF_FUNC_DESC(Ortho),
+ DEF_FUNC_DESC(PushMatrix),
+ DEF_FUNC_DESC(PopMatrix),
+ DEF_FUNC_DESC(Clear),
+ DEF_FUNC_DESC(GenLists),
+ DEF_FUNC_DESC(DeleteLists),
+ DEF_FUNC_DESC(NewList),
+ DEF_FUNC_DESC(EndList),
+ DEF_FUNC_DESC(CallList),
+ DEF_FUNC_DESC(CallLists),
+ DEF_FUNC_DESC(GenTextures),
+ DEF_FUNC_DESC(DeleteTextures),
+ DEF_FUNC_DESC(TexEnvi),
+ DEF_FUNC_DESC(Color4ub),
+ DEF_FUNC_DESC(Color3f),
+ DEF_FUNC_DESC(ClearColor),
+ DEF_FUNC_DESC(Enable),
+ DEF_FUNC_DESC(Disable),
+ DEF_FUNC_DESC(GetString),
+ DEF_FUNC_DESC(DrawBuffer),
+ DEF_FUNC_DESC(DepthMask),
+ DEF_FUNC_DESC(BlendFunc),
+ DEF_FUNC_DESC(Flush),
+ DEF_FUNC_DESC(Finish),
+ DEF_FUNC_DESC(PixelStorei),
+ DEF_FUNC_DESC(TexImage1D),
+ DEF_FUNC_DESC(TexImage2D),
+ DEF_FUNC_DESC(TexSubImage2D),
+ DEF_FUNC_DESC(TexParameteri),
+ DEF_FUNC_DESC(TexParameterf),
+ DEF_FUNC_DESC(TexParameterfv),
+ DEF_FUNC_DESC(TexCoord2f),
+ DEF_FUNC_DESC(Vertex2f),
+ DEF_FUNC_DESC(GetIntegerv),
+
+ // here start the real extensions
{&GenBuffers, NULL, {"glGenBuffers", "glGenBuffersARB", NULL}},
{&DeleteBuffers, NULL, {"glDeleteBuffers", "glDeleteBuffersARB", NULL}},
{&BindBuffer, NULL, {"glBindBuffer", "glBindBufferARB", NULL}},
@@ -331,7 +417,7 @@ static const extfunc_desc_t extfuncs[] = {
static void getFunctions(void *(*getProcAddress)(const GLubyte *),
const char *ext2) {
const extfunc_desc_t *dsc;
- const char *extensions = (const char *)glGetString(GL_EXTENSIONS);
+ const char *extensions = (const char *)GetString(GL_EXTENSIONS);
char *allexts;
if (!extensions) extensions = "";
if (!ext2) ext2 = "";
@@ -382,16 +468,16 @@ void glCreateClearTex(GLenum target, GLenum fmt, GLenum format, GLenum type, GLi
init = malloc(stride * h);
memset(init, val, stride * h);
glAdjustAlignment(stride);
- glPixelStorei(GL_UNPACK_ROW_LENGTH, w);
- glTexImage2D(target, 0, fmt, w, h, 0, format, type, init);
- glTexParameterf(target, GL_TEXTURE_PRIORITY, 1.0);
- glTexParameteri(target, GL_TEXTURE_MIN_FILTER, filter);
- glTexParameteri(target, GL_TEXTURE_MAG_FILTER, filter);
- glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ PixelStorei(GL_UNPACK_ROW_LENGTH, w);
+ TexImage2D(target, 0, fmt, w, h, 0, format, type, init);
+ TexParameterf(target, GL_TEXTURE_PRIORITY, 1.0);
+ TexParameteri(target, GL_TEXTURE_MIN_FILTER, filter);
+ TexParameteri(target, GL_TEXTURE_MAG_FILTER, filter);
+ TexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ TexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// Border texels should not be used with CLAMP_TO_EDGE
// We set a sane default anyway.
- glTexParameterfv(target, GL_TEXTURE_BORDER_COLOR, border);
+ TexParameterfv(target, GL_TEXTURE_BORDER_COLOR, border);
free(init);
}
@@ -539,13 +625,13 @@ void glUploadTex(GLenum target, GLenum format, GLenum type,
}
// this is not always correct, but should work for MPlayer
glAdjustAlignment(stride);
- glPixelStorei(GL_UNPACK_ROW_LENGTH, stride / glFmt2bpp(format, type));
+ PixelStorei(GL_UNPACK_ROW_LENGTH, stride / glFmt2bpp(format, type));
for (; y + slice <= y_max; y += slice) {
- glTexSubImage2D(target, 0, x, y, w, slice, format, type, data);
+ TexSubImage2D(target, 0, x, y, w, slice, format, type, data);
data += stride * slice;
}
if (y < y_max)
- glTexSubImage2D(target, 0, x, y, w, y_max - y, format, type, data);
+ TexSubImage2D(target, 0, x, y, w, y_max - y, format, type, data);
}
static void fillUVcoeff(GLfloat *ucoef, GLfloat *vcoef,
@@ -584,11 +670,11 @@ static void glSetupYUVCombiners(float uvcos, float uvsin) {
mp_msg(MSGT_VO, MSGL_FATAL, "[gl] Combiner functions missing!\n");
return;
}
- glGetIntegerv(GL_MAX_GENERAL_COMBINERS_NV, &i);
+ GetIntegerv(GL_MAX_GENERAL_COMBINERS_NV, &i);
if (i < 2)
mp_msg(MSGT_VO, MSGL_ERR,
"[gl] 2 general combiners needed for YUV combiner support (found %i)\n", i);
- glGetIntegerv(GL_MAX_TEXTURE_UNITS, &i);
+ GetIntegerv(GL_MAX_TEXTURE_UNITS, &i);
if (i < 3)
mp_msg(MSGT_VO, MSGL_ERR,
"[gl] 3 texture units needed for YUV combiner support (found %i)\n", i);
@@ -644,11 +730,11 @@ static void glSetupYUVCombinersATI(float uvcos, float uvsin) {
mp_msg(MSGT_VO, MSGL_FATAL, "[gl] Combiner (ATI) functions missing!\n");
return;
}
- glGetIntegerv(GL_NUM_FRAGMENT_REGISTERS_ATI, &i);
+ GetIntegerv(GL_NUM_FRAGMENT_REGISTERS_ATI, &i);
if (i < 3)
mp_msg(MSGT_VO, MSGL_ERR,
"[gl] 3 registers needed for YUV combiner (ATI) support (found %i)\n", i);
- glGetIntegerv (GL_MAX_TEXTURE_UNITS, &i);
+ GetIntegerv (GL_MAX_TEXTURE_UNITS, &i);
if (i < 3)
mp_msg(MSGT_VO, MSGL_ERR,
"[gl] 3 texture units needed for YUV combiner (ATI) support (found %i)\n", i);
@@ -710,11 +796,11 @@ static void gen_spline_lookup_tex(GLenum unit) {
store_weights(0, tex);
store_weights(1, &tex[4 * (LOOKUP_BSPLINE_RES - 1)]);
ActiveTexture(unit);
- glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA16, LOOKUP_BSPLINE_RES, 0, GL_RGBA, GL_FLOAT, tex);
- glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_PRIORITY, 1.0);
- glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ TexImage1D(GL_TEXTURE_1D, 0, GL_RGBA16, LOOKUP_BSPLINE_RES, 0, GL_RGBA, GL_FLOAT, tex);
+ TexParameterf(GL_TEXTURE_1D, GL_TEXTURE_PRIORITY, 1.0);
+ TexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ TexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ TexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
ActiveTexture(GL_TEXTURE0);
free(tex);
}
@@ -1023,15 +1109,15 @@ static void create_conv_textures(gl_conversion_params_t *params, int *texu, char
lookup_data = malloc(3 * sz * sz * sz);
gen_yuv2rgb_map(params, lookup_data, LOOKUP_3DRES);
glAdjustAlignment(sz);
- glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+ PixelStorei(GL_UNPACK_ROW_LENGTH, 0);
TexImage3D(GL_TEXTURE_3D, 0, 3, sz, sz, sz, 1,
GL_RGB, GL_UNSIGNED_BYTE, lookup_data);
- glTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_PRIORITY, 1.0);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP);
+ TexParameterf(GL_TEXTURE_3D, GL_TEXTURE_PRIORITY, 1.0);
+ TexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ TexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ TexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+ TexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+ TexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP);
ActiveTexture(GL_TEXTURE0);
texs[0] += '0';
}
@@ -1157,13 +1243,13 @@ int loadGPUProgram(GLenum target, char *prog) {
return 0;
}
ProgramString(target, GL_PROGRAM_FORMAT_ASCII, strlen(prog), prog);
- glGetIntegerv(GL_PROGRAM_ERROR_POSITION, &err);
+ GetIntegerv(GL_PROGRAM_ERROR_POSITION, &err);
if (err != -1) {
mp_msg(MSGT_VO, MSGL_ERR,
"[gl] Error compiling fragment program, make sure your card supports\n"
"[gl] GL_ARB_fragment_program (use glxinfo to check).\n"
"[gl] Error message:\n %s at %.10s\n",
- glGetString(GL_PROGRAM_ERROR_STRING), &prog[err]);
+ GetString(GL_PROGRAM_ERROR_STRING), &prog[err]);
return 0;
}
if (!GetProgramiv || !mp_msg_test(MSGT_VO, MSGL_DBG2))
@@ -1211,7 +1297,7 @@ static void glSetupYUVFragprog(gl_conversion_params_t *params) {
memcpy(chrom_scale_texs, lum_scale_texs, sizeof(chrom_scale_texs));
else
create_scaler_textures(YUV_CHROM_SCALER(type), &cur_texu, chrom_scale_texs);
- glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &i);
+ GetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &i);
if (i < cur_texu)
mp_msg(MSGT_VO, MSGL_ERR,
"[gl] %i texture units needed for this type of YUV fragment support (found %i)\n",
@@ -1328,25 +1414,25 @@ void glEnableYUVConversion(GLenum target, int type) {
switch (YUV_CONVERSION(type)) {
case YUV_CONVERSION_COMBINERS:
ActiveTexture(GL_TEXTURE1);
- glEnable(target);
+ Enable(target);
ActiveTexture(GL_TEXTURE2);
- glEnable(target);
+ Enable(target);
ActiveTexture(GL_TEXTURE0);
- glEnable(GL_REGISTER_COMBINERS_NV);
+ Enable(GL_REGISTER_COMBINERS_NV);
break;
case YUV_CONVERSION_COMBINERS_ATI:
ActiveTexture(GL_TEXTURE1);
- glEnable(target);
+ Enable(target);
ActiveTexture(GL_TEXTURE2);
- glEnable(target);
+ Enable(target);
ActiveTexture(GL_TEXTURE0);
- glEnable(GL_FRAGMENT_SHADER_ATI);
+ Enable(GL_FRAGMENT_SHADER_ATI);
break;
case YUV_CONVERSION_FRAGMENT_LOOKUP3D:
case YUV_CONVERSION_FRAGMENT_LOOKUP:
case YUV_CONVERSION_FRAGMENT_POW:
case YUV_CONVERSION_FRAGMENT:
- glEnable(GL_FRAGMENT_PROGRAM);
+ Enable(GL_FRAGMENT_PROGRAM);
break;
}
}
@@ -1362,25 +1448,25 @@ void glDisableYUVConversion(GLenum target, int type) {
switch (YUV_CONVERSION(type)) {
case YUV_CONVERSION_COMBINERS:
ActiveTexture(GL_TEXTURE1);
- glDisable(target);
+ Disable(target);
ActiveTexture(GL_TEXTURE2);
- glDisable(target);
+ Disable(target);
ActiveTexture(GL_TEXTURE0);
- glDisable(GL_REGISTER_COMBINERS_NV);
+ Disable(GL_REGISTER_COMBINERS_NV);
break;
case YUV_CONVERSION_COMBINERS_ATI:
ActiveTexture(GL_TEXTURE1);
- glDisable(target);
+ Disable(target);
ActiveTexture(GL_TEXTURE2);
- glDisable(target);
+ Disable(target);
ActiveTexture(GL_TEXTURE0);
- glDisable(GL_FRAGMENT_SHADER_ATI);
+ Disable(GL_FRAGMENT_SHADER_ATI);
break;
case YUV_CONVERSION_FRAGMENT_LOOKUP3D:
case YUV_CONVERSION_FRAGMENT_LOOKUP:
case YUV_CONVERSION_FRAGMENT_POW:
case YUV_CONVERSION_FRAGMENT:
- glDisable(GL_FRAGMENT_PROGRAM);
+ Disable(GL_FRAGMENT_PROGRAM);
break;
}
}
@@ -1414,32 +1500,32 @@ void glDrawTex(GLfloat x, GLfloat y, GLfloat w, GLfloat h,
y += h;
h = -h;
}
- glBegin(GL_QUADS);
- glTexCoord2f(tx, ty);
+ Begin(GL_QUADS);
+ TexCoord2f(tx, ty);
if (is_yv12) {
MultiTexCoord2f(GL_TEXTURE1, tx2, ty2);
MultiTexCoord2f(GL_TEXTURE2, tx2, ty2);
}
- glVertex2f(x, y);
- glTexCoord2f(tx, ty + th);
+ Vertex2f(x, y);
+ TexCoord2f(tx, ty + th);
if (is_yv12) {
MultiTexCoord2f(GL_TEXTURE1, tx2, ty2 + th2);
MultiTexCoord2f(GL_TEXTURE2, tx2, ty2 + th2);
}
- glVertex2f(x, y + h);
- glTexCoord2f(tx + tw, ty + th);
+ Vertex2f(x, y + h);
+ TexCoord2f(tx + tw, ty + th);
if (is_yv12) {
MultiTexCoord2f(GL_TEXTURE1, tx2 + tw2, ty2 + th2);
MultiTexCoord2f(GL_TEXTURE2, tx2 + tw2, ty2 + th2);
}
- glVertex2f(x + w, y + h);
- glTexCoord2f(tx + tw, ty);
+ Vertex2f(x + w, y + h);
+ TexCoord2f(tx + tw, ty);
if (is_yv12) {
MultiTexCoord2f(GL_TEXTURE1, tx2 + tw2, ty2);
MultiTexCoord2f(GL_TEXTURE2, tx2 + tw2, ty2);
}
- glVertex2f(x + w, y);
- glEnd();
+ Vertex2f(x + w, y);
+ End();
}
#ifdef GL_WIN32
@@ -1472,7 +1558,7 @@ static int setGlWindow_w32(MPGLContext *ctx)
// should only be needed when keeping context, but not doing glFinish
// can cause flickering even when we do not keep it.
if (*context)
- glFinish();
+ Finish();
new_vinfo = GetPixelFormat(windc);
if (*context && *vinfo && new_vinfo && *vinfo == new_vinfo) {
// we can keep the wglContext
@@ -1613,7 +1699,7 @@ static int setGlWindow_x11(MPGLContext *ctx)
// should only be needed when keeping context, but not doing glFinish
// can cause flickering even when we do not keep it.
if (*context)
- glFinish();
+ Finish();
new_vinfo = getWindowVisualInfo(win);
if (*context && *vinfo && new_vinfo &&
(*vinfo)->visualid == new_vinfo->visualid) {
@@ -1691,7 +1777,7 @@ static void releaseGlContext_x11(MPGLContext *ctx) {
*vinfo = NULL;
if (*context)
{
- glFinish();
+ Finish();
glXMakeCurrent(mDisplay, None, NULL);
glXDestroyContext(mDisplay, *context);
}