annotate libvo/gl_common.c @ 22210:4a958bd08920

Select the first charmap in the font, if FreeType did not autoselect any. This happens, for example, with fonts only having an Apple Roman charmap.
author eugeni
date Thu, 15 Feb 2007 22:03:09 +0000
parents 2d3fdf94a50c
children fcfcb09762df
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1 /**
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
2 * \file gl_common.c
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
3 * \brief OpenGL helper functions used by vo_gl.c and vo_gl2.c
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
4 *
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
5 * Common OpenGL routines.
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
6 * Copyleft (C) Reimar Döffinger <Reimar.Doeffinger@stud.uni-karlsruhe.de>, 2005
20962
a95ed9a69caf Put files fully owned by my under GPL v2 "or later"
reimar
parents: 19221
diff changeset
7 * Licensend under the GNU GPL v2 or later.
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
8 * Special thanks go to the xine team and Matthias Hopf, whose video_out_opengl.c
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
9 * gave me lots of good ideas.
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
10 */
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
11 #include <stdlib.h>
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
12 #include <stdio.h>
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
13 #include <string.h>
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
14 #include <ctype.h>
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
15 #include <math.h>
13653
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
16 #include "gl_common.h"
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
17
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
18 /**
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
19 * \defgroup glextfunctions OpenGL extension functions
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
20 *
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
21 * the pointers to these functions are acquired when the OpenGL
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
22 * context is created
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
23 * \{
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
24 */
16233
f00a2826ee11 use GenBuffers to get a buffer number instead of hardcoding 1.
reimar
parents: 16223
diff changeset
25 void (APIENTRY *GenBuffers)(GLsizei, GLuint *);
f00a2826ee11 use GenBuffers to get a buffer number instead of hardcoding 1.
reimar
parents: 16223
diff changeset
26 void (APIENTRY *DeleteBuffers)(GLsizei, const GLuint *);
16099
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
27 void (APIENTRY *BindBuffer)(GLenum, GLuint);
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
28 GLvoid* (APIENTRY *MapBuffer)(GLenum, GLenum);
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
29 GLboolean (APIENTRY *UnmapBuffer)(GLenum);
16109
519a307e3ccf OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents: 16099
diff changeset
30 void (APIENTRY *BufferData)(GLenum, intptr_t, const GLvoid *, GLenum);
16099
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
31 void (APIENTRY *CombinerParameterfv)(GLenum, const GLfloat *);
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
32 void (APIENTRY *CombinerParameteri)(GLenum, GLint);
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
33 void (APIENTRY *CombinerInput)(GLenum, GLenum, GLenum, GLenum, GLenum,
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
34 GLenum);
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
35 void (APIENTRY *CombinerOutput)(GLenum, GLenum, GLenum, GLenum, GLenum,
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
36 GLenum, GLenum, GLboolean, GLboolean,
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
37 GLboolean);
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
38 void (APIENTRY *BeginFragmentShader)(void);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
39 void (APIENTRY *EndFragmentShader)(void);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
40 void (APIENTRY *SampleMap)(GLuint, GLuint, GLenum);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
41 void (APIENTRY *ColorFragmentOp2)(GLenum, GLuint, GLuint, GLuint, GLuint,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
42 GLuint, GLuint, GLuint, GLuint, GLuint);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
43 void (APIENTRY *ColorFragmentOp3)(GLenum, GLuint, GLuint, GLuint, GLuint,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
44 GLuint, GLuint, GLuint, GLuint, GLuint,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
45 GLuint, GLuint, GLuint);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
46 void (APIENTRY *SetFragmentShaderConstant)(GLuint, const GLfloat *);
16099
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
47 void (APIENTRY *ActiveTexture)(GLenum);
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
48 void (APIENTRY *BindTexture)(GLenum, GLuint);
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
49 void (APIENTRY *MultiTexCoord2f)(GLenum, GLfloat, GLfloat);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
50 void (APIENTRY *GenPrograms)(GLsizei, GLuint *);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
51 void (APIENTRY *DeletePrograms)(GLsizei, const GLuint *);
16099
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
52 void (APIENTRY *BindProgram)(GLenum, GLuint);
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
53 void (APIENTRY *ProgramString)(GLenum, GLenum, GLsizei, const GLvoid *);
18653
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
54 void (APIENTRY *GetProgramiv)(GLenum, GLenum, GLint *);
16099
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
55 void (APIENTRY *ProgramEnvParameter4f)(GLenum, GLuint, GLfloat, GLfloat,
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
56 GLfloat, GLfloat);
16270
d5374d07492a Fix crash in windows
reimar
parents: 16268
diff changeset
57 int (APIENTRY *SwapInterval)(int);
18578
eef0850d4a4b add (currently unused) lookup for glTexImage3D
reimar
parents: 18577
diff changeset
58 void (APIENTRY *TexImage3D)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei,
eef0850d4a4b add (currently unused) lookup for glTexImage3D
reimar
parents: 18577
diff changeset
59 GLint, GLenum, GLenum, const GLvoid *);
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
60 /** \} */ // end of glextfunctions group
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
61
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
62 //! \defgroup glgeneral OpenGL general helper functions
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
63
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
64 //! \defgroup glcontext OpenGL context management helper functions
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
65
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
66 //! \defgroup gltexture OpenGL texture handling helper functions
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
67
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
68 //! \defgroup glconversion OpenGL conversion helper functions
16099
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
69
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
70 static GLint hqtexfmt;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
71
13653
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
72 /**
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
73 * \brief adjusts the GL_UNPACK_ALIGNMENT to fit the stride.
13653
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
74 * \param stride number of bytes per line for which alignment should fit.
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
75 * \ingroup glgeneral
13653
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
76 */
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
77 void glAdjustAlignment(int stride) {
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
78 GLint gl_alignment;
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
79 if (stride % 8 == 0)
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
80 gl_alignment=8;
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
81 else if (stride % 4 == 0)
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
82 gl_alignment=4;
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
83 else if (stride % 2 == 0)
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
84 gl_alignment=2;
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
85 else
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
86 gl_alignment=1;
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
87 glPixelStorei (GL_UNPACK_ALIGNMENT, gl_alignment);
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
88 }
799f81d3cb19 added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff changeset
89
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
90 struct gl_name_map_struct {
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
91 GLint value;
19194
5949a654e2d4 marks some read-only char* inside structs as const, patch by Stefan Huehner, stefan At huehner-org
reynaldo
parents: 19167
diff changeset
92 const char *name;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
93 };
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
94
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
95 #undef MAP
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
96 #define MAP(a) {a, #a}
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
97 //! mapping table for the glValName function
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
98 static const struct gl_name_map_struct gl_name_map[] = {
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
99 // internal format
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
100 MAP(GL_R3_G3_B2), MAP(GL_RGB4), MAP(GL_RGB5), MAP(GL_RGB8),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
101 MAP(GL_RGB10), MAP(GL_RGB12), MAP(GL_RGB16), MAP(GL_RGBA2),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
102 MAP(GL_RGBA4), MAP(GL_RGB5_A1), MAP(GL_RGBA8), MAP(GL_RGB10_A2),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
103 MAP(GL_RGBA12), MAP(GL_RGBA16), MAP(GL_LUMINANCE8),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
104
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
105 // format
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
106 MAP(GL_RGB), MAP(GL_RGBA), MAP(GL_RED), MAP(GL_GREEN), MAP(GL_BLUE),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
107 MAP(GL_ALPHA), MAP(GL_LUMINANCE), MAP(GL_LUMINANCE_ALPHA),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
108 MAP(GL_COLOR_INDEX),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
109 // rest 1.2 only
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
110 MAP(GL_BGR), MAP(GL_BGRA),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
111
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
112 //type
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
113 MAP(GL_BYTE), MAP(GL_UNSIGNED_BYTE), MAP(GL_SHORT), MAP(GL_UNSIGNED_SHORT),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
114 MAP(GL_INT), MAP(GL_UNSIGNED_INT), MAP(GL_FLOAT), MAP(GL_DOUBLE),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
115 MAP(GL_2_BYTES), MAP(GL_3_BYTES), MAP(GL_4_BYTES),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
116 // rest 1.2 only
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
117 MAP(GL_UNSIGNED_BYTE_3_3_2), MAP(GL_UNSIGNED_BYTE_2_3_3_REV),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
118 MAP(GL_UNSIGNED_SHORT_5_6_5), MAP(GL_UNSIGNED_SHORT_5_6_5_REV),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
119 MAP(GL_UNSIGNED_SHORT_4_4_4_4), MAP(GL_UNSIGNED_SHORT_4_4_4_4_REV),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
120 MAP(GL_UNSIGNED_SHORT_5_5_5_1), MAP(GL_UNSIGNED_SHORT_1_5_5_5_REV),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
121 MAP(GL_UNSIGNED_INT_8_8_8_8), MAP(GL_UNSIGNED_INT_8_8_8_8_REV),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
122 MAP(GL_UNSIGNED_INT_10_10_10_2), MAP(GL_UNSIGNED_INT_2_10_10_10_REV),
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
123 {0, 0}
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
124 };
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
125 #undef MAP
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
126
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
127 /**
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
128 * \brief return the name of an OpenGL constant
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
129 * \param value the constant
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
130 * \return name of the constant or "Unknown format!"
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
131 * \ingroup glgeneral
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
132 */
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
133 const char *glValName(GLint value)
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
134 {
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
135 int i = 0;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
136
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
137 while (gl_name_map[i].name) {
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
138 if (gl_name_map[i].value == value)
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
139 return gl_name_map[i].name;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
140 i++;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
141 }
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
142 return "Unknown format!";
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
143 }
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
144
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
145 //! always return this format as internal texture format in glFindFormat
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
146 #define TEXTUREFORMAT_ALWAYS GL_RGB8
16474
01d27e023ae4 Improved glFindFormat
reimar
parents: 16461
diff changeset
147 #undef TEXTUREFORMAT_ALWAYS
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
148
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
149 /**
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
150 * \brief find the OpenGL settings coresponding to format.
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
151 *
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
152 * All parameters may be NULL.
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
153 * \param fmt MPlayer format to analyze.
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
154 * \param bpp [OUT] bits per pixel of that format.
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
155 * \param gl_texfmt [OUT] internal texture format that fits the
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
156 * image format, not necessarily the best for performance.
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
157 * \param gl_format [OUT] OpenGL format for this image format.
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
158 * \param gl_type [OUT] OpenGL type for this image format.
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
159 * \return 1 if format is supported by OpenGL, 0 if not.
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
160 * \ingroup gltexture
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
161 */
16879
6ea220b10e8e More consistent and sane types. Also avoids some gcc 4 warnings.
reimar
parents: 16648
diff changeset
162 int glFindFormat(uint32_t fmt, int *bpp, GLint *gl_texfmt,
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
163 GLenum *gl_format, GLenum *gl_type)
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
164 {
16474
01d27e023ae4 Improved glFindFormat
reimar
parents: 16461
diff changeset
165 int supported = 1;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
166 int dummy1;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
167 GLenum dummy2;
16303
a87c6cf3fe52 Fix texture format variable types. Internal format is GLint, others are GLenum
reimar
parents: 16270
diff changeset
168 GLint dummy3;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
169 if (bpp == NULL) bpp = &dummy1;
16303
a87c6cf3fe52 Fix texture format variable types. Internal format is GLint, others are GLenum
reimar
parents: 16270
diff changeset
170 if (gl_texfmt == NULL) gl_texfmt = &dummy3;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
171 if (gl_format == NULL) gl_format = &dummy2;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
172 if (gl_type == NULL) gl_type = &dummy2;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
173
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
174 *bpp = IMGFMT_IS_BGR(fmt)?IMGFMT_BGR_DEPTH(fmt):IMGFMT_RGB_DEPTH(fmt);
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
175 *gl_texfmt = 3;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
176 switch (fmt) {
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
177 case IMGFMT_RGB24:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
178 *gl_format = GL_RGB;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
179 *gl_type = GL_UNSIGNED_BYTE;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
180 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
181 case IMGFMT_RGBA:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
182 *gl_texfmt = 4;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
183 *gl_format = GL_RGBA;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
184 *gl_type = GL_UNSIGNED_BYTE;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
185 break;
16474
01d27e023ae4 Improved glFindFormat
reimar
parents: 16461
diff changeset
186 case IMGFMT_YV12:
01d27e023ae4 Improved glFindFormat
reimar
parents: 16461
diff changeset
187 supported = 0; // no native YV12 support
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
188 case IMGFMT_Y800:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
189 case IMGFMT_Y8:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
190 *gl_texfmt = 1;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
191 *bpp = 8;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
192 *gl_format = GL_LUMINANCE;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
193 *gl_type = GL_UNSIGNED_BYTE;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
194 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
195 #if 0
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
196 // we do not support palettized formats, although the format the
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
197 // swscale produces works
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
198 case IMGFMT_RGB8:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
199 gl_format = GL_RGB;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
200 gl_type = GL_UNSIGNED_BYTE_2_3_3_REV;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
201 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
202 #endif
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
203 case IMGFMT_RGB15:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
204 *gl_format = GL_RGBA;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
205 *gl_type = GL_UNSIGNED_SHORT_1_5_5_5_REV;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
206 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
207 case IMGFMT_RGB16:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
208 *gl_format = GL_RGB;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
209 *gl_type = GL_UNSIGNED_SHORT_5_6_5_REV;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
210 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
211 #if 0
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
212 case IMGFMT_BGR8:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
213 // special case as red and blue have a differen number of bits.
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
214 // GL_BGR and GL_UNSIGNED_BYTE_3_3_2 isn't supported at least
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
215 // by nVidia drivers, and in addition would give more bits to
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
216 // blue than to red, which isn't wanted
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
217 gl_format = GL_RGB;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
218 gl_type = GL_UNSIGNED_BYTE_3_3_2;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
219 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
220 #endif
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
221 case IMGFMT_BGR15:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
222 *gl_format = GL_BGRA;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
223 *gl_type = GL_UNSIGNED_SHORT_1_5_5_5_REV;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
224 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
225 case IMGFMT_BGR16:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
226 *gl_format = GL_RGB;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
227 *gl_type = GL_UNSIGNED_SHORT_5_6_5;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
228 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
229 case IMGFMT_BGR24:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
230 *gl_format = GL_BGR;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
231 *gl_type = GL_UNSIGNED_BYTE;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
232 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
233 case IMGFMT_BGRA:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
234 *gl_texfmt = 4;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
235 *gl_format = GL_BGRA;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
236 *gl_type = GL_UNSIGNED_BYTE;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
237 break;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
238 default:
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
239 *gl_texfmt = 4;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
240 *gl_format = GL_RGBA;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
241 *gl_type = GL_UNSIGNED_BYTE;
16474
01d27e023ae4 Improved glFindFormat
reimar
parents: 16461
diff changeset
242 supported = 0;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
243 }
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
244 #ifdef TEXTUREFORMAT_ALWAYS
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
245 *gl_texfmt = TEXTUREFORMAT_ALWAYS;
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
246 #endif
16474
01d27e023ae4 Improved glFindFormat
reimar
parents: 16461
diff changeset
247 return supported;
14078
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
248 }
c4033dcb986f More similar code from gl and gl2 moved to gl_common
reimar
parents: 13843
diff changeset
249
16099
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
250 static void *setNull(const GLubyte *s) {
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
251 return NULL;
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
252 }
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
253
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
254 typedef struct {
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
255 void **funcptr;
19194
5949a654e2d4 marks some read-only char* inside structs as const, patch by Stefan Huehner, stefan At huehner-org
reynaldo
parents: 19167
diff changeset
256 const char *extstr;
5949a654e2d4 marks some read-only char* inside structs as const, patch by Stefan Huehner, stefan At huehner-org
reynaldo
parents: 19167
diff changeset
257 const char *funcnames[7];
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
258 } extfunc_desc_t;
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
259
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
260 static const extfunc_desc_t extfuncs[] = {
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
261 {(void **)&GenBuffers, NULL, {"glGenBuffers", "glGenBuffersARB", NULL}},
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
262 {(void **)&DeleteBuffers, NULL, {"glDeleteBuffers", "glDeleteBuffersARB", NULL}},
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
263 {(void **)&BindBuffer, NULL, {"glBindBuffer", "glBindBufferARB", NULL}},
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
264 {(void **)&MapBuffer, NULL, {"glMapBuffer", "glMapBufferARB", NULL}},
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
265 {(void **)&UnmapBuffer, NULL, {"glUnmapBuffer", "glUnmapBufferARB", NULL}},
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
266 {(void **)&BufferData, NULL, {"glBufferData", "glBufferDataARB", NULL}},
18577
ebf4f7aa000f more GL extension checks to avoid crashes with Mesa
reimar
parents: 18495
diff changeset
267 {(void **)&CombinerParameterfv, "NV_register_combiners", {"glCombinerParameterfv", "glCombinerParameterfvNV", NULL}},
ebf4f7aa000f more GL extension checks to avoid crashes with Mesa
reimar
parents: 18495
diff changeset
268 {(void **)&CombinerParameteri, "NV_register_combiners", {"glCombinerParameteri", "glCombinerParameteriNV", NULL}},
ebf4f7aa000f more GL extension checks to avoid crashes with Mesa
reimar
parents: 18495
diff changeset
269 {(void **)&CombinerInput, "NV_register_combiners", {"glCombinerInput", "glCombinerInputNV", NULL}},
ebf4f7aa000f more GL extension checks to avoid crashes with Mesa
reimar
parents: 18495
diff changeset
270 {(void **)&CombinerOutput, "NV_register_combiners", {"glCombinerOutput", "glCombinerOutputNV", NULL}},
ebf4f7aa000f more GL extension checks to avoid crashes with Mesa
reimar
parents: 18495
diff changeset
271 {(void **)&BeginFragmentShader, "ATI_fragment_shader", {"glBeginFragmentShaderATI", NULL}},
ebf4f7aa000f more GL extension checks to avoid crashes with Mesa
reimar
parents: 18495
diff changeset
272 {(void **)&EndFragmentShader, "ATI_fragment_shader", {"glEndFragmentShaderATI", NULL}},
ebf4f7aa000f more GL extension checks to avoid crashes with Mesa
reimar
parents: 18495
diff changeset
273 {(void **)&SampleMap, "ATI_fragment_shader", {"glSampleMapATI", NULL}},
ebf4f7aa000f more GL extension checks to avoid crashes with Mesa
reimar
parents: 18495
diff changeset
274 {(void **)&ColorFragmentOp2, "ATI_fragment_shader", {"glColorFragmentOp2ATI", NULL}},
ebf4f7aa000f more GL extension checks to avoid crashes with Mesa
reimar
parents: 18495
diff changeset
275 {(void **)&ColorFragmentOp3, "ATI_fragment_shader", {"glColorFragmentOp3ATI", NULL}},
ebf4f7aa000f more GL extension checks to avoid crashes with Mesa
reimar
parents: 18495
diff changeset
276 {(void **)&SetFragmentShaderConstant, "ATI_fragment_shader", {"glSetFragmentShaderConstantATI", NULL}},
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
277 {(void **)&ActiveTexture, NULL, {"glActiveTexture", "glActiveTextureARB", NULL}},
18494
7a1ad9f0d718 glBindTexture might be called glBindTextureEXT as well
reimar
parents: 18175
diff changeset
278 {(void **)&BindTexture, NULL, {"glBindTexture", "glBindTextureARB", "glBindTextureEXT", NULL}},
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
279 {(void **)&MultiTexCoord2f, NULL, {"glMultiTexCoord2f", "glMultiTexCoord2fARB", NULL}},
18577
ebf4f7aa000f more GL extension checks to avoid crashes with Mesa
reimar
parents: 18495
diff changeset
280 {(void **)&GenPrograms, "_program", {"glGenPrograms", "glGenProgramsARB", "glGenProgramsNV", NULL}},
ebf4f7aa000f more GL extension checks to avoid crashes with Mesa
reimar
parents: 18495
diff changeset
281 {(void **)&DeletePrograms, "_program", {"glDeletePrograms", "glDeleteProgramsARB", "glDeleteProgramsNV", NULL}},
ebf4f7aa000f more GL extension checks to avoid crashes with Mesa
reimar
parents: 18495
diff changeset
282 {(void **)&BindProgram, "_program", {"glBindProgram", "glBindProgramARB", "glBindProgramNV", NULL}},
ebf4f7aa000f more GL extension checks to avoid crashes with Mesa
reimar
parents: 18495
diff changeset
283 {(void **)&ProgramString, "_program", {"glProgramString", "glProgramStringARB", "glProgramStringNV", NULL}},
18653
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
284 {(void **)&GetProgramiv, "_program", {"glGetProgramiv", "glGetProgramivARB", "glGetProgramivNV", NULL}},
18577
ebf4f7aa000f more GL extension checks to avoid crashes with Mesa
reimar
parents: 18495
diff changeset
285 {(void **)&ProgramEnvParameter4f, "_program", {"glProgramEnvParameter4f", "glProgramEnvParameter4fARB", "glProgramEnvParameter4fNV", NULL}},
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
286 {(void **)&SwapInterval, "_swap_control", {"glXSwapInterval", "glXSwapIntervalEXT", "glXSwapIntervalSGI", "wglSwapInterval", "wglSwapIntervalEXT", "wglSwapIntervalSGI", NULL}},
18578
eef0850d4a4b add (currently unused) lookup for glTexImage3D
reimar
parents: 18577
diff changeset
287 {(void **)&TexImage3D, NULL, {"glTexImage3D", NULL}},
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
288 {NULL}
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
289 };
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
290
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
291 /**
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
292 * \brief find the function pointers of some useful OpenGL extensions
16588
c3dc7f3c716c get rid of global getProcAddress variable
reimar
parents: 16586
diff changeset
293 * \param getProcAddress function to resolve function names, may be NULL
17019
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
294 * \param ext2 an extra extension string
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
295 */
17019
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
296 static void getFunctions(void *(*getProcAddress)(const GLubyte *),
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
297 const char *ext2) {
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
298 const extfunc_desc_t *dsc;
17336
98b064148349 avoid some gcc 4 compiler warnings
reimar
parents: 17335
diff changeset
299 const char *extensions = (const char *)glGetString(GL_EXTENSIONS);
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
300 char *allexts;
17019
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
301 if (!extensions) extensions = "";
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
302 if (!ext2) ext2 = "";
18878
3bf0d70b4c7f rm unnecesary casts from void* - part 2
reynaldo
parents: 18787
diff changeset
303 allexts = malloc(strlen(extensions) + strlen(ext2) + 2);
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
304 strcpy(allexts, extensions);
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
305 strcat(allexts, " ");
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
306 strcat(allexts, ext2);
18495
56e78892c895 show OpenGL extension string with -v, very helpful for debugging
reimar
parents: 18494
diff changeset
307 mp_msg(MSGT_VO, MSGL_V, "OpenGL extensions string:\n%s\n", allexts);
16099
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
308 if (!getProcAddress)
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
309 getProcAddress = setNull;
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
310 for (dsc = extfuncs; dsc->funcptr; dsc++) {
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
311 void *ptr = NULL;
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
312 int i;
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
313 if (!dsc->extstr || strstr(allexts, dsc->extstr)) {
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
314 for (i = 0; !ptr && dsc->funcnames[i]; i++)
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
315 ptr = getProcAddress((const GLubyte *)dsc->funcnames[i]);
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
316 }
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
317 *(dsc->funcptr) = ptr;
16984
94b70ab52695 disable *SwapInterval function when extensions are missing, since it
reimar
parents: 16944
diff changeset
318 }
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
319 if (strstr(allexts, "_texture_float"))
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
320 hqtexfmt = GL_RGB32F;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
321 else if (strstr(allexts, "NV_float_buffer"))
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
322 hqtexfmt = GL_FLOAT_RGB32_NV;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
323 else
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
324 hqtexfmt = GL_RGB16;
17335
3e49b98ad314 Less ugly and easier to extend getFunctions
reimar
parents: 17220
diff changeset
325 free(allexts);
16099
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
326 }
629c54dc7e0d support for rectangular and streaming textures.
reimar
parents: 14269
diff changeset
327
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
328 /**
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
329 * \brief create a texture and set some defaults
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
330 * \param target texture taget, usually GL_TEXTURE_2D
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
331 * \param fmt internal texture format
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
332 * \param filter filter used for scaling, e.g. GL_LINEAR
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
333 * \param w texture width
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
334 * \param h texture height
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
335 * \param val luminance value to fill texture with
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
336 * \ingroup gltexture
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
337 */
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
338 void glCreateClearTex(GLenum target, GLenum fmt, GLint filter,
16460
ec7036dedee4 Fix border color (forgot to divide by 255.0).
reimar
parents: 16437
diff changeset
339 int w, int h, unsigned char val) {
ec7036dedee4 Fix border color (forgot to divide by 255.0).
reimar
parents: 16437
diff changeset
340 GLfloat fval = (GLfloat)val / 255.0;
ec7036dedee4 Fix border color (forgot to divide by 255.0).
reimar
parents: 16437
diff changeset
341 GLfloat border[4] = {fval, fval, fval, fval};
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
342 GLenum clrfmt = (fmt == GL_ALPHA) ? GL_ALPHA : GL_LUMINANCE;
18878
3bf0d70b4c7f rm unnecesary casts from void* - part 2
reynaldo
parents: 18787
diff changeset
343 char *init = malloc(w * h);
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
344 memset(init, val, w * h);
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
345 glAdjustAlignment(w);
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
346 glPixelStorei(GL_UNPACK_ROW_LENGTH, w);
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
347 glTexImage2D(target, 0, fmt, w, h, 0, clrfmt, GL_UNSIGNED_BYTE, init);
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
348 glTexParameterf(target, GL_TEXTURE_PRIORITY, 1.0);
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
349 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, filter);
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
350 glTexParameteri(target, GL_TEXTURE_MAG_FILTER, filter);
16461
f93eaa5ad64d Use GL_CLAMP_TO_EDGE instead of GL_CLAMP to avoid border texels being sampled.
reimar
parents: 16460
diff changeset
351 glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
f93eaa5ad64d Use GL_CLAMP_TO_EDGE instead of GL_CLAMP to avoid border texels being sampled.
reimar
parents: 16460
diff changeset
352 glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
f93eaa5ad64d Use GL_CLAMP_TO_EDGE instead of GL_CLAMP to avoid border texels being sampled.
reimar
parents: 16460
diff changeset
353 // Border texels should not be used with CLAMP_TO_EDGE
f93eaa5ad64d Use GL_CLAMP_TO_EDGE instead of GL_CLAMP to avoid border texels being sampled.
reimar
parents: 16460
diff changeset
354 // We set a sane default anyway.
16437
9dda08ef3e7c Set texture border color to avoid weird border colors in some rare cases.
reimar
parents: 16435
diff changeset
355 glTexParameterfv(target, GL_TEXTURE_BORDER_COLOR, border);
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
356 free(init);
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
357 }
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
358
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
359 /**
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
360 * \brief skips whitespace and comments
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
361 * \param f file to read from
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
362 */
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
363 static void ppm_skip(FILE *f) {
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
364 int c, comment = 0;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
365 do {
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
366 c = fgetc(f);
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
367 if (c == '#')
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
368 comment = 1;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
369 if (c == '\n')
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
370 comment = 0;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
371 } while (c != EOF && (isspace(c) || comment));
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
372 if (c != EOF)
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
373 ungetc(c, f);
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
374 }
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
375
18175
01ca8a5fb8a6 minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents: 17566
diff changeset
376 #define MAXDIM (16 * 1024)
01ca8a5fb8a6 minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents: 17566
diff changeset
377
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
378 /**
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
379 * \brief creates a texture from a PPM file
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
380 * \param target texture taget, usually GL_TEXTURE_2D
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
381 * \param fmt internal texture format, 0 for default
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
382 * \param filter filter used for scaling, e.g. GL_LINEAR
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
383 * \param f file to read PPM from
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
384 * \param width [out] width of texture
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
385 * \param height [out] height of texture
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
386 * \param maxval [out] maxval value from PPM file
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
387 * \return 0 on error, 1 otherwise
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
388 * \ingroup gltexture
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
389 */
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
390 int glCreatePPMTex(GLenum target, GLenum fmt, GLint filter,
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
391 FILE *f, int *width, int *height, int *maxval) {
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
392 unsigned w, h, m, val, bpp;
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
393 char *data;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
394 ppm_skip(f);
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
395 if (fgetc(f) != 'P' || fgetc(f) != '6')
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
396 return 0;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
397 ppm_skip(f);
18175
01ca8a5fb8a6 minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents: 17566
diff changeset
398 if (fscanf(f, "%u", &w) != 1)
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
399 return 0;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
400 ppm_skip(f);
18175
01ca8a5fb8a6 minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents: 17566
diff changeset
401 if (fscanf(f, "%u", &h) != 1)
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
402 return 0;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
403 ppm_skip(f);
18175
01ca8a5fb8a6 minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents: 17566
diff changeset
404 if (fscanf(f, "%u", &m) != 1)
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
405 return 0;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
406 val = fgetc(f);
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
407 if (!isspace(val))
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
408 return 0;
18175
01ca8a5fb8a6 minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents: 17566
diff changeset
409 if (w > MAXDIM || h > MAXDIM)
01ca8a5fb8a6 minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents: 17566
diff changeset
410 return 0;
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
411 bpp = (m > 255) ? 6 : 3;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
412 data = malloc(w * h * bpp);
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
413 if (fread(data, w * bpp, h, f) != h)
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
414 return 0;
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
415 if (!fmt) {
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
416 fmt = (m > 255) ? hqtexfmt : 3;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
417 if (fmt == GL_FLOAT_RGB32_NV && target != GL_TEXTURE_RECTANGLE)
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
418 fmt = GL_RGB16;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
419 }
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
420 glCreateClearTex(target, fmt, filter, w, h, 0);
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
421 glUploadTex(target, GL_RGB, (m > 255) ? GL_UNSIGNED_SHORT : GL_UNSIGNED_BYTE,
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
422 data, w * bpp, 0, 0, w, h, 0);
16592
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
423 free(data);
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
424 if (width) *width = w;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
425 if (height) *height = h;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
426 if (maxval) *maxval = m;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
427 return 1;
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
428 }
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
429
1bb2b2696451 support loading a texture from a PPM file
reimar
parents: 16589
diff changeset
430 /**
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
431 * \brief return the number of bytes per pixel for the given format
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
432 * \param format OpenGL format
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
433 * \param type OpenGL type
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
434 * \return bytes per pixel
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
435 * \ingroup glgeneral
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
436 *
16435
b5ca0e5760d0 Fix a typo in a comment
reimar
parents: 16303
diff changeset
437 * Does not handle all possible variants, just those used by MPlayer
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
438 */
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
439 int glFmt2bpp(GLenum format, GLenum type) {
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
440 int component_size = 0;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
441 switch (type) {
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
442 case GL_UNSIGNED_BYTE_3_3_2:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
443 case GL_UNSIGNED_BYTE_2_3_3_REV:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
444 return 1;
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
445 case GL_UNSIGNED_SHORT_5_5_5_1:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
446 case GL_UNSIGNED_SHORT_1_5_5_5_REV:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
447 case GL_UNSIGNED_SHORT_5_6_5:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
448 case GL_UNSIGNED_SHORT_5_6_5_REV:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
449 return 2;
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
450 case GL_UNSIGNED_BYTE:
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
451 component_size = 1;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
452 break;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
453 case GL_UNSIGNED_SHORT:
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
454 component_size = 2;
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
455 break;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
456 }
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
457 switch (format) {
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
458 case GL_LUMINANCE:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
459 case GL_ALPHA:
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
460 return component_size;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
461 case GL_RGB:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
462 case GL_BGR:
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
463 return 3 * component_size;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
464 case GL_RGBA:
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
465 case GL_BGRA:
18961
9f1bbc70c773 Support for 16 bit ppms
reimar
parents: 18878
diff changeset
466 return 4 * component_size;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
467 }
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
468 return 0; // unknown
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
469 }
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
470
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
471 /**
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
472 * \brief upload a texture, handling things like stride and slices
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
473 * \param target texture target, usually GL_TEXTURE_2D
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
474 * \param format OpenGL format of data
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
475 * \param type OpenGL type of data
21201
2c1b7fe05973 Avoid void * arithmetic
reimar
parents: 20962
diff changeset
476 * \param dataptr data to upload
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
477 * \param stride data stride
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
478 * \param x x offset in texture
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
479 * \param y y offset in texture
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
480 * \param w width of the texture part to upload
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
481 * \param h height of the texture part to upload
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
482 * \param slice height of an upload slice, 0 for all at once
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
483 * \ingroup gltexture
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
484 */
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
485 void glUploadTex(GLenum target, GLenum format, GLenum type,
21201
2c1b7fe05973 Avoid void * arithmetic
reimar
parents: 20962
diff changeset
486 const void *dataptr, int stride,
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
487 int x, int y, int w, int h, int slice) {
21201
2c1b7fe05973 Avoid void * arithmetic
reimar
parents: 20962
diff changeset
488 const uint8_t *data = dataptr;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
489 int y_max = y + h;
16223
f540609340ac extra check for glUploadTex to avoid a possible hang.
reimar
parents: 16221
diff changeset
490 if (w <= 0 || h <= 0) return;
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
491 if (slice <= 0)
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
492 slice = h;
17220
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
493 if (stride < 0) {
18988
a61ef37d3c71 Fix off-by-one error for negative strides (flipped image)
reimar
parents: 18961
diff changeset
494 data += (h - 1) * stride;
17220
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
495 stride = -stride;
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
496 }
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
497 // this is not always correct, but should work for MPlayer
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
498 glAdjustAlignment(stride);
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
499 glPixelStorei(GL_UNPACK_ROW_LENGTH, stride / glFmt2bpp(format, type));
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
500 for (; y + slice <= y_max; y += slice) {
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
501 glTexSubImage2D(target, 0, x, y, w, slice, format, type, data);
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
502 data += stride * slice;
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
503 }
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
504 if (y < y_max)
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
505 glTexSubImage2D(target, 0, x, y, w, y_max - y, format, type, data);
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
506 }
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
507
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
508 static void fillUVcoeff(GLfloat *ucoef, GLfloat *vcoef,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
509 float uvcos, float uvsin) {
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
510 int i;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
511 ucoef[0] = 0 * uvcos + 1.403 * uvsin;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
512 vcoef[0] = 0 * uvsin + 1.403 * uvcos;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
513 ucoef[1] = -0.344 * uvcos + -0.714 * uvsin;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
514 vcoef[1] = -0.344 * uvsin + -0.714 * uvcos;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
515 ucoef[2] = 1.770 * uvcos + 0 * uvsin;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
516 vcoef[2] = 1.770 * uvsin + 0 * uvcos;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
517 ucoef[3] = 0;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
518 vcoef[3] = 0;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
519 // Coefficients (probably) must be in [0, 1] range, whereas they originally
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
520 // are in [-2, 2] range, so here comes the trick:
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
521 // First put them in the [-0.5, 0.5] range, then add 0.5.
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
522 // This can be undone with the HALF_BIAS and SCALE_BY_FOUR arguments
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
523 // for CombinerInput and CombinerOutput (or the respective ATI variants)
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
524 for (i = 0; i < 4; i++) {
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
525 ucoef[i] = ucoef[i] * 0.25 + 0.5;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
526 vcoef[i] = vcoef[i] * 0.25 + 0.5;
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
527 }
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
528 }
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
529
16214
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
530 /**
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
531 * \brief Setup register combiners for YUV to RGB conversion.
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
532 * \param uvcos used for saturation and hue adjustment
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
533 * \param uvsin used for saturation and hue adjustment
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
534 */
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
535 static void glSetupYUVCombiners(float uvcos, float uvsin) {
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
536 GLfloat ucoef[4];
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
537 GLfloat vcoef[4];
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
538 GLint i;
18579
fc3f25278021 Move/add checks to avoid crashes and make error messages less confusing
reimar
parents: 18578
diff changeset
539 if (!CombinerInput || !CombinerOutput ||
fc3f25278021 Move/add checks to avoid crashes and make error messages less confusing
reimar
parents: 18578
diff changeset
540 !CombinerParameterfv || !CombinerParameteri) {
fc3f25278021 Move/add checks to avoid crashes and make error messages less confusing
reimar
parents: 18578
diff changeset
541 mp_msg(MSGT_VO, MSGL_FATAL, "[gl] Combiner functions missing!\n");
fc3f25278021 Move/add checks to avoid crashes and make error messages less confusing
reimar
parents: 18578
diff changeset
542 return;
fc3f25278021 Move/add checks to avoid crashes and make error messages less confusing
reimar
parents: 18578
diff changeset
543 }
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
544 glGetIntegerv(GL_MAX_GENERAL_COMBINERS_NV, &i);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
545 if (i < 2)
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
546 mp_msg(MSGT_VO, MSGL_ERR,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
547 "[gl] 2 general combiners needed for YUV combiner support (found %i)\n", i);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
548 glGetIntegerv (GL_MAX_TEXTURE_UNITS, &i);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
549 if (i < 3)
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
550 mp_msg(MSGT_VO, MSGL_ERR,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
551 "[gl] 3 texture units needed for YUV combiner support (found %i)\n", i);
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
552 fillUVcoeff(ucoef, vcoef, uvcos, uvsin);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
553 CombinerParameterfv(GL_CONSTANT_COLOR0_NV, ucoef);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
554 CombinerParameterfv(GL_CONSTANT_COLOR1_NV, vcoef);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
555
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
556 // UV first, like this green component cannot overflow
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
557 CombinerInput(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_A_NV,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
558 GL_TEXTURE1, GL_HALF_BIAS_NORMAL_NV, GL_RGB);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
559 CombinerInput(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
560 GL_CONSTANT_COLOR0_NV, GL_HALF_BIAS_NORMAL_NV, GL_RGB);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
561 CombinerInput(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_C_NV,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
562 GL_TEXTURE2, GL_HALF_BIAS_NORMAL_NV, GL_RGB);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
563 CombinerInput(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_D_NV,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
564 GL_CONSTANT_COLOR1_NV, GL_HALF_BIAS_NORMAL_NV, GL_RGB);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
565 CombinerOutput(GL_COMBINER0_NV, GL_RGB, GL_DISCARD_NV, GL_DISCARD_NV,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
566 GL_SPARE0_NV, GL_SCALE_BY_FOUR_NV, GL_NONE, GL_FALSE,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
567 GL_FALSE, GL_FALSE);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
568
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
569 // stage 2
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
570 CombinerInput(GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_A_NV, GL_SPARE0_NV,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
571 GL_SIGNED_IDENTITY_NV, GL_RGB);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
572 CombinerInput(GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_B_NV, GL_ZERO,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
573 GL_UNSIGNED_INVERT_NV, GL_RGB);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
574 CombinerInput(GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_C_NV,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
575 GL_TEXTURE0, GL_SIGNED_IDENTITY_NV, GL_RGB);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
576 CombinerInput(GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_D_NV, GL_ZERO,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
577 GL_UNSIGNED_INVERT_NV, GL_RGB);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
578 CombinerOutput(GL_COMBINER1_NV, GL_RGB, GL_DISCARD_NV, GL_DISCARD_NV,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
579 GL_SPARE0_NV, GL_NONE, GL_NONE, GL_FALSE,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
580 GL_FALSE, GL_FALSE);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
581
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
582 // leave final combiner stage in default mode
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
583 CombinerParameteri(GL_NUM_GENERAL_COMBINERS_NV, 2);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
584 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
585
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
586 /**
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
587 * \brief Setup ATI version of register combiners for YUV to RGB conversion.
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
588 * \param uvcos used for saturation and hue adjustment
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
589 * \param uvsin used for saturation and hue adjustment
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
590 *
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
591 * ATI called this fragment shader, but the name is confusing in the
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
592 * light of a very different OpenGL 2.0 extension with the same name
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
593 */
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
594 static void glSetupYUVCombinersATI(float uvcos, float uvsin) {
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
595 GLfloat ucoef[4];
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
596 GLfloat vcoef[4];
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
597 GLint i;
18579
fc3f25278021 Move/add checks to avoid crashes and make error messages less confusing
reimar
parents: 18578
diff changeset
598 if (!BeginFragmentShader || !EndFragmentShader ||
fc3f25278021 Move/add checks to avoid crashes and make error messages less confusing
reimar
parents: 18578
diff changeset
599 !SetFragmentShaderConstant || !SampleMap ||
fc3f25278021 Move/add checks to avoid crashes and make error messages less confusing
reimar
parents: 18578
diff changeset
600 !ColorFragmentOp2 || !ColorFragmentOp3) {
fc3f25278021 Move/add checks to avoid crashes and make error messages less confusing
reimar
parents: 18578
diff changeset
601 mp_msg(MSGT_VO, MSGL_FATAL, "[gl] Combiner (ATI) functions missing!\n");
fc3f25278021 Move/add checks to avoid crashes and make error messages less confusing
reimar
parents: 18578
diff changeset
602 return;
fc3f25278021 Move/add checks to avoid crashes and make error messages less confusing
reimar
parents: 18578
diff changeset
603 }
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
604 glGetIntegerv(GL_NUM_FRAGMENT_REGISTERS_ATI, &i);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
605 if (i < 3)
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
606 mp_msg(MSGT_VO, MSGL_ERR,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
607 "[gl] 3 registers needed for YUV combiner (ATI) support (found %i)\n", i);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
608 glGetIntegerv (GL_MAX_TEXTURE_UNITS, &i);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
609 if (i < 3)
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
610 mp_msg(MSGT_VO, MSGL_ERR,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
611 "[gl] 3 texture units needed for YUV combiner (ATI) support (found %i)\n", i);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
612 fillUVcoeff(ucoef, vcoef, uvcos, uvsin);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
613 BeginFragmentShader();
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
614 SetFragmentShaderConstant(GL_CON_0_ATI, ucoef);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
615 SetFragmentShaderConstant(GL_CON_1_ATI, vcoef);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
616 SampleMap(GL_REG_0_ATI, GL_TEXTURE0, GL_SWIZZLE_STR_ATI);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
617 SampleMap(GL_REG_1_ATI, GL_TEXTURE1, GL_SWIZZLE_STR_ATI);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
618 SampleMap(GL_REG_2_ATI, GL_TEXTURE2, GL_SWIZZLE_STR_ATI);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
619 // UV first, like this green component cannot overflow
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
620 ColorFragmentOp2(GL_MUL_ATI, GL_REG_1_ATI, GL_NONE, GL_NONE,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
621 GL_REG_1_ATI, GL_NONE, GL_BIAS_BIT_ATI,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
622 GL_CON_0_ATI, GL_NONE, GL_BIAS_BIT_ATI);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
623 ColorFragmentOp3(GL_MAD_ATI, GL_REG_2_ATI, GL_NONE, GL_4X_BIT_ATI,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
624 GL_REG_2_ATI, GL_NONE, GL_BIAS_BIT_ATI,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
625 GL_CON_1_ATI, GL_NONE, GL_BIAS_BIT_ATI,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
626 GL_REG_1_ATI, GL_NONE, GL_NONE);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
627 ColorFragmentOp2(GL_ADD_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
628 GL_REG_0_ATI, GL_NONE, GL_NONE,
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
629 GL_REG_2_ATI, GL_NONE, GL_NONE);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
630 EndFragmentShader();
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
631 }
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
632
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
633 /**
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
634 * \brief helper function for gen_spline_lookup_tex
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
635 * \param x subpixel-position ((0,1) range) to calculate weights for
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
636 * \param dst where to store transformed weights, must provide space for 4 GLfloats
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
637 *
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
638 * calculates the weights and stores them after appropriate transformation
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
639 * for the scaler fragment program.
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
640 */
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
641 static void store_weights(float x, GLfloat *dst) {
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
642 float w0 = (((-1 * x + 3) * x - 3) * x + 1) / 6;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
643 float w1 = ((( 3 * x - 6) * x + 0) * x + 4) / 6;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
644 float w2 = (((-3 * x + 3) * x + 3) * x + 1) / 6;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
645 float w3 = ((( 1 * x + 0) * x + 0) * x + 0) / 6;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
646 *dst++ = 1 + x - w1 / (w0 + w1);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
647 *dst++ = 1 - x + w3 / (w2 + w3);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
648 *dst++ = w0 + w1;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
649 *dst++ = 0;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
650 }
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
651
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
652 //! to avoid artefacts this should be rather large
18693
a4a6b2cf5022 Do not use border for bicubic filter helper texture, since it will cause ATI
reimar
parents: 18686
diff changeset
653 #define LOOKUP_BSPLINE_RES (2 * 1024)
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
654 /**
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
655 * \brief creates the 1D lookup texture needed for fast higher-order filtering
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
656 * \param unit texture unit to attach texture to
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
657 */
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
658 static void gen_spline_lookup_tex(GLenum unit) {
18693
a4a6b2cf5022 Do not use border for bicubic filter helper texture, since it will cause ATI
reimar
parents: 18686
diff changeset
659 GLfloat tex[4 * LOOKUP_BSPLINE_RES];
a4a6b2cf5022 Do not use border for bicubic filter helper texture, since it will cause ATI
reimar
parents: 18686
diff changeset
660 GLfloat *tp = tex;
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
661 int i;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
662 for (i = 0; i < LOOKUP_BSPLINE_RES; i++) {
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
663 float x = (float)(i + 0.5) / LOOKUP_BSPLINE_RES;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
664 store_weights(x, tp);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
665 tp += 4;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
666 }
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
667 store_weights(0, tex);
18693
a4a6b2cf5022 Do not use border for bicubic filter helper texture, since it will cause ATI
reimar
parents: 18686
diff changeset
668 store_weights(1, &tex[4 * (LOOKUP_BSPLINE_RES - 1)]);
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
669 ActiveTexture(unit);
18693
a4a6b2cf5022 Do not use border for bicubic filter helper texture, since it will cause ATI
reimar
parents: 18686
diff changeset
670 glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA16, LOOKUP_BSPLINE_RES, 0, GL_RGBA, GL_FLOAT, tex);
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
671 glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_PRIORITY, 1.0);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
672 glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
673 glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
674 glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
675 ActiveTexture(GL_TEXTURE0);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
676 }
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
677
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
678 static const char *bilin_filt_template =
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
679 "TEX yuv.%c, fragment.texcoord[%c], texture[%c], %s;";
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
680
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
681 #define BICUB_FILT_MAIN(textype) \
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
682 /* first y-interpolation */ \
18686
05531597314e Optimize bicubic filtering
reimar
parents: 18676
diff changeset
683 "ADD coord, fragment.texcoord[%c].xyxy, cdelta.xyxw;" \
18787
5a2e45cd754f reduce number of texture indirections to support older cards
reimar
parents: 18693
diff changeset
684 "ADD coord2, fragment.texcoord[%c].xyxy, cdelta.zyzw;" \
18686
05531597314e Optimize bicubic filtering
reimar
parents: 18676
diff changeset
685 "TEX a.r, coord.xyxy, texture[%c], "textype";" \
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
686 "TEX a.g, coord.zwzw, texture[%c], "textype";" \
18787
5a2e45cd754f reduce number of texture indirections to support older cards
reimar
parents: 18693
diff changeset
687 /* second y-interpolation */ \
5a2e45cd754f reduce number of texture indirections to support older cards
reimar
parents: 18693
diff changeset
688 "TEX b.r, coord2.xyxy, texture[%c], "textype";" \
5a2e45cd754f reduce number of texture indirections to support older cards
reimar
parents: 18693
diff changeset
689 "TEX b.g, coord2.zwzw, texture[%c], "textype";" \
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
690 "LRP a.b, parmy.b, a.rrrr, a.gggg;" \
18787
5a2e45cd754f reduce number of texture indirections to support older cards
reimar
parents: 18693
diff changeset
691 "LRP a.a, parmy.b, b.rrrr, b.gggg;" \
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
692 /* x-interpolation */ \
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
693 "LRP yuv.%c, parmx.b, a.bbbb, a.aaaa;"
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
694
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
695 static const char *bicub_filt_template_2D =
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
696 "MAD coord.xy, fragment.texcoord[%c], {%f, %f}, {0.5, 0.5};"
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
697 "TEX parmx, coord.x, texture[%c], 1D;"
18686
05531597314e Optimize bicubic filtering
reimar
parents: 18676
diff changeset
698 "MUL cdelta.xz, parmx.rrgg, {-%f, 0, %f, 0};"
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
699 "TEX parmy, coord.y, texture[%c], 1D;"
18686
05531597314e Optimize bicubic filtering
reimar
parents: 18676
diff changeset
700 "MUL cdelta.yw, parmy.rrgg, {0, -%f, 0, %f};"
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
701 BICUB_FILT_MAIN("2D");
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
702
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
703 static const char *bicub_filt_template_RECT =
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
704 "ADD coord, fragment.texcoord[%c], {0.5, 0.5};"
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
705 "TEX parmx, coord.x, texture[%c], 1D;"
18686
05531597314e Optimize bicubic filtering
reimar
parents: 18676
diff changeset
706 "MUL cdelta.xz, parmx.rrgg, {-1, 0, 1, 0};"
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
707 "TEX parmy, coord.y, texture[%c], 1D;"
18686
05531597314e Optimize bicubic filtering
reimar
parents: 18676
diff changeset
708 "MUL cdelta.yw, parmy.rrgg, {0, -1, 0, 1};"
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
709 BICUB_FILT_MAIN("RECT");
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
710
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
711 static const char *yuv_prog_template =
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
712 "PARAM ycoef = {%.4f, %.4f, %.4f};"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
713 "PARAM ucoef = {%.4f, %.4f, %.4f};"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
714 "PARAM vcoef = {%.4f, %.4f, %.4f};"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
715 "PARAM offsets = {%.4f, %.4f, %.4f};"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
716 "TEMP res;"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
717 "MAD res.rgb, yuv.rrrr, ycoef, offsets;"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
718 "MAD res.rgb, yuv.gggg, ucoef, res;"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
719 "MAD result.color.rgb, yuv.bbbb, vcoef, res;"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
720 "END";
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
721
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
722 static const char *yuv_pow_prog_template =
16648
5e3e86e8c9b4 Make fragment program snprintf less confusing.
reimar
parents: 16625
diff changeset
723 "PARAM ycoef = {%.4f, %.4f, %.4f};"
5e3e86e8c9b4 Make fragment program snprintf less confusing.
reimar
parents: 16625
diff changeset
724 "PARAM ucoef = {%.4f, %.4f, %.4f};"
5e3e86e8c9b4 Make fragment program snprintf less confusing.
reimar
parents: 16625
diff changeset
725 "PARAM vcoef = {%.4f, %.4f, %.4f};"
5e3e86e8c9b4 Make fragment program snprintf less confusing.
reimar
parents: 16625
diff changeset
726 "PARAM offsets = {%.4f, %.4f, %.4f};"
5e3e86e8c9b4 Make fragment program snprintf less confusing.
reimar
parents: 16625
diff changeset
727 "PARAM gamma = {%.4f, %.4f, %.4f};"
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
728 "TEMP res;"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
729 "MAD res.rgb, yuv.rrrr, ycoef, offsets;"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
730 "MAD res.rgb, yuv.gggg, ucoef, res;"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
731 "MAD_SAT res.rgb, yuv.bbbb, vcoef, res;"
16648
5e3e86e8c9b4 Make fragment program snprintf less confusing.
reimar
parents: 16625
diff changeset
732 "POW result.color.r, res.r, gamma.r;"
5e3e86e8c9b4 Make fragment program snprintf less confusing.
reimar
parents: 16625
diff changeset
733 "POW result.color.g, res.g, gamma.g;"
5e3e86e8c9b4 Make fragment program snprintf less confusing.
reimar
parents: 16625
diff changeset
734 "POW result.color.b, res.b, gamma.b;"
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
735 "END";
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
736
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
737 static const char *yuv_lookup_prog_template =
16648
5e3e86e8c9b4 Make fragment program snprintf less confusing.
reimar
parents: 16625
diff changeset
738 "PARAM ycoef = {%.4f, %.4f, %.4f, 0};"
5e3e86e8c9b4 Make fragment program snprintf less confusing.
reimar
parents: 16625
diff changeset
739 "PARAM ucoef = {%.4f, %.4f, %.4f, 0};"
5e3e86e8c9b4 Make fragment program snprintf less confusing.
reimar
parents: 16625
diff changeset
740 "PARAM vcoef = {%.4f, %.4f, %.4f, 0};"
5e3e86e8c9b4 Make fragment program snprintf less confusing.
reimar
parents: 16625
diff changeset
741 "PARAM offsets = {%.4f, %.4f, %.4f, 0.125};"
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
742 "TEMP res;"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
743 "MAD res, yuv.rrrr, ycoef, offsets;"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
744 "MAD res.rgb, yuv.gggg, ucoef, res;"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
745 "MAD res.rgb, yuv.bbbb, vcoef, res;"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
746 "TEX result.color.r, res.raaa, texture[%c], 2D;"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
747 "ADD res.a, res.a, 0.25;"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
748 "TEX result.color.g, res.gaaa, texture[%c], 2D;"
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
749 "ADD res.a, res.a, 0.25;"
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
750 "TEX result.color.b, res.baaa, texture[%c], 2D;"
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
751 "END";
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
752
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
753 static const char *yuv_lookup3d_prog_template =
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
754 "TEX result.color, yuv, texture[%c], 3D;"
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
755 "END";
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
756
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
757 /**
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
758 * \brief creates and initializes helper textures needed for scaling texture read
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
759 * \param scaler scaler type to create texture for
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
760 * \param texu contains next free texture unit number
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
761 * \param texs texture unit ids for the scaler are stored in this array
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
762 */
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
763 static void create_scaler_textures(int scaler, int *texu, char *texs) {
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
764 switch (scaler) {
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
765 case YUV_SCALER_BILIN:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
766 break;
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
767 case YUV_SCALER_BICUB:
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
768 texs[0] = (*texu)++;
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
769 gen_spline_lookup_tex(GL_TEXTURE0 + texs[0]);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
770 texs[0] += '0';
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
771 break;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
772 default:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
773 mp_msg(MSGT_VO, MSGL_ERR, "[gl] unknown scaler type %i\n", scaler);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
774 }
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
775 }
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
776
19167
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
777 static void gen_gamma_map(unsigned char *map, int size, float gamma);
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
778
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
779 static void get_yuv2rgb_coeffs(float brightness, float contrast, float uvcos, float uvsin,
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
780 float *ry, float *ru, float *rv, float *rc,
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
781 float *gy, float *gu, float *gv, float *gc,
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
782 float *by, float *bu, float *bv, float *bc) {
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
783 *ry = 1.164 * contrast;
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
784 *gy = 1.164 * contrast;
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
785 *by = 1.164 * contrast;
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
786 *ru = 0 * uvcos + 1.596 * uvsin;
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
787 *rv = 0 * uvsin + 1.596 * uvcos;
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
788 *gu = -0.391 * uvcos + -0.813 * uvsin;
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
789 *gv = -0.391 * uvsin + -0.813 * uvcos;
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
790 *bu = 2.018 * uvcos + 0 * uvsin;
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
791 *bv = 2.018 * uvsin + 0 * uvcos;
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
792 *rc = (-16 * *ry + (-128) * *ru + (-128) * *rv) / 255.0 + brightness;
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
793 *gc = (-16 * *gy + (-128) * *gu + (-128) * *gv) / 255.0 + brightness;
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
794 *bc = (-16 * *by + (-128) * *bu + (-128) * *bv) / 255.0 + brightness;
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
795 // these "center" contrast control so that e.g. a contrast of 0
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
796 // leads to a grey image, not a black one
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
797 *rc += 0.5 - contrast / 2.0;
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
798 *gc += 0.5 - contrast / 2.0;
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
799 *bc += 0.5 - contrast / 2.0;
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
800 }
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
801
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
802 //! size of gamma map use to avoid slow exp function in gen_yuv2rgb_map
19167
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
803 #define GMAP_SIZE (1024)
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
804 /**
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
805 * \brief generate a 3D YUV -> RGB map
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
806 * \param map where to store map. Must provide space for (size + 2)^3 elements
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
807 * \param size size of the map, excluding border
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
808 * \param brightness desired brightness adjustment for conversion
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
809 * \param contrast desired contrast adjustment for conversion
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
810 * \param uvcos desired hue/saturation adjustment for conversion
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
811 * \param uvsin desired hue/saturation adjustment for conversion
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
812 * \param rgamma desired red gamma adjustment for conversion
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
813 * \param ggamma desired green gamma adjustment for conversion
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
814 * \param bgamma desired blue gamma adjustment for conversion
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
815 */
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
816 static void gen_yuv2rgb_map(unsigned char *map, int size, float brightness,
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
817 float contrast, float uvcos, float uvsin,
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
818 float rgamma, float ggamma, float bgamma) {
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
819 int i, j, k;
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
820 float step = 1.0 / size;
19167
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
821 float y, u, v;
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
822 float r, g, b;
19167
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
823 float ry, ru, rv, rc;
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
824 float gy, gu, gv, gc;
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
825 float by, bu, bv, bc;
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
826 unsigned char gmaps[3][GMAP_SIZE];
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
827 gen_gamma_map(gmaps[0], GMAP_SIZE, rgamma);
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
828 gen_gamma_map(gmaps[1], GMAP_SIZE, ggamma);
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
829 gen_gamma_map(gmaps[2], GMAP_SIZE, bgamma);
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
830 get_yuv2rgb_coeffs(brightness, contrast, uvcos, uvsin,
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
831 &ry, &ru, &rv, &rc, &gy, &gu, &gv, &gc, &by, &bu, &bv, &bc);
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
832 ry *= GMAP_SIZE - 1; ru *= GMAP_SIZE - 1; rv *= GMAP_SIZE - 1; rc *= GMAP_SIZE - 1;
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
833 gy *= GMAP_SIZE - 1; gu *= GMAP_SIZE - 1; gv *= GMAP_SIZE - 1; gc *= GMAP_SIZE - 1;
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
834 by *= GMAP_SIZE - 1; bu *= GMAP_SIZE - 1; bv *= GMAP_SIZE - 1; bc *= GMAP_SIZE - 1;
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
835 v = 0;
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
836 for (i = -1; i <= size; i++) {
19167
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
837 u = 0;
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
838 for (j = -1; j <= size; j++) {
19167
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
839 y = 0;
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
840 for (k = -1; k <= size; k++) {
19167
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
841 r = ry * y + ru * u + rv * v + rc;
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
842 g = gy * y + gu * u + gv * v + gc;
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
843 b = by * y + bu * u + bv * v + bc;
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
844 if (r > GMAP_SIZE - 1) r = GMAP_SIZE - 1;
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
845 if (r < 0) r = 0;
19167
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
846 if (g > GMAP_SIZE - 1) g = GMAP_SIZE - 1;
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
847 if (g < 0) g = 0;
19167
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
848 if (b > GMAP_SIZE - 1) b = GMAP_SIZE - 1;
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
849 if (b < 0) b = 0;
19167
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
850 *map++ = gmaps[0][(int)r];
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
851 *map++ = gmaps[1][(int)g];
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
852 *map++ = gmaps[2][(int)b];
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
853 y += (k == -1 || k == size - 1) ? step / 2 : step;
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
854 }
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
855 u += (j == -1 || j == size - 1) ? step / 2 : step;
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
856 }
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
857 v += (i == -1 || i == size - 1) ? step / 2 : step;
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
858 }
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
859 }
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
860
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
861 //! resolution of texture for gamma lookup table
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
862 #define LOOKUP_RES 512
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
863 //! resolution for 3D yuv->rgb conversion lookup table
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
864 #define LOOKUP_3DRES 32
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
865 /**
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
866 * \brief creates and initializes helper textures needed for yuv conversion
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
867 * \param texu contains next free texture unit number
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
868 * \param texs texture unit ids for the conversion are stored in this array
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
869 * \param brightness desired brightness adjustment for conversion
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
870 * \param contrast desired contrast adjustment for conversion
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
871 * \param uvcos desired hue/saturation adjustment for conversion
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
872 * \param uvsin desired hue/saturation adjustment for conversion
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
873 * \param rgamma desired red gamma adjustment for conversion
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
874 * \param ggamma desired green gamma adjustment for conversion
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
875 * \param bgamma desired blue gamma adjustment for conversion
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
876 */
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
877 static void create_conv_textures(int conv, int *texu, char *texs,
18676
e813d4014acd fix image adjustment (brightness etc.) for yuv=6
reimar
parents: 18655
diff changeset
878 float brightness, float contrast, float uvcos, float uvsin,
e813d4014acd fix image adjustment (brightness etc.) for yuv=6
reimar
parents: 18655
diff changeset
879 float rgamma, float ggamma, float bgamma) {
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
880 unsigned char *lookup_data = NULL;
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
881 switch (conv) {
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
882 case YUV_CONVERSION_FRAGMENT:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
883 case YUV_CONVERSION_FRAGMENT_POW:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
884 break;
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
885 case YUV_CONVERSION_FRAGMENT_LOOKUP:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
886 texs[0] = (*texu)++;
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
887 ActiveTexture(GL_TEXTURE0 + texs[0]);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
888 lookup_data = malloc(4 * LOOKUP_RES);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
889 gen_gamma_map(lookup_data, LOOKUP_RES, rgamma);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
890 gen_gamma_map(&lookup_data[LOOKUP_RES], LOOKUP_RES, ggamma);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
891 gen_gamma_map(&lookup_data[2 * LOOKUP_RES], LOOKUP_RES, bgamma);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
892 glCreateClearTex(GL_TEXTURE_2D, GL_LUMINANCE8, GL_LINEAR,
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
893 LOOKUP_RES, 4, 0);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
894 glUploadTex(GL_TEXTURE_2D, GL_LUMINANCE, GL_UNSIGNED_BYTE, lookup_data,
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
895 LOOKUP_RES, 0, 0, LOOKUP_RES, 4, 0);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
896 ActiveTexture(GL_TEXTURE0);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
897 texs[0] += '0';
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
898 break;
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
899 case YUV_CONVERSION_FRAGMENT_LOOKUP3D:
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
900 {
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
901 int sz = LOOKUP_3DRES + 2; // texture size including borders
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
902 if (!TexImage3D) {
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
903 mp_msg(MSGT_VO, MSGL_ERR, "[gl] Missing 3D texture function!\n");
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
904 break;
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
905 }
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
906 texs[0] = (*texu)++;
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
907 ActiveTexture(GL_TEXTURE0 + texs[0]);
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
908 lookup_data = malloc(3 * sz * sz * sz);
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
909 gen_yuv2rgb_map(lookup_data, LOOKUP_3DRES, brightness, contrast,
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
910 uvcos, uvsin, rgamma, ggamma, bgamma);
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
911 glAdjustAlignment(sz);
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
912 glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
913 TexImage3D(GL_TEXTURE_3D, 0, 3, sz, sz, sz, 1,
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
914 GL_RGB, GL_UNSIGNED_BYTE, lookup_data);
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
915 glTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_PRIORITY, 1.0);
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
916 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
917 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
918 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP);
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
919 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP);
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
920 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP);
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
921 ActiveTexture(GL_TEXTURE0);
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
922 texs[0] += '0';
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
923 }
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
924 break;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
925 default:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
926 mp_msg(MSGT_VO, MSGL_ERR, "[gl] unknown conversion type %i\n", conv);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
927 }
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
928 if (lookup_data)
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
929 free(lookup_data);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
930 }
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
931
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
932 /**
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
933 * \brief adds a scaling texture read at the current fragment program position
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
934 * \param scaler type of scaler to insert
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
935 * \param prog_pos current position in fragment program
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
936 * \param remain how many bytes remain in the buffer given by prog_pos
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
937 * \param texs array containing the texture unit identifiers for this scaler
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
938 * \param in_tex texture unit the scaler should read from
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
939 * \param out_comp component of the yuv variable the scaler stores the result in
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
940 * \param rect if rectangular (pixel) adressing should be used for in_tex
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
941 * \param texw width of the in_tex texture
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
942 * \param texh height of the in_tex texture
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
943 */
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
944 static void add_scaler(int scaler, char **prog_pos, int *remain, char *texs,
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
945 char in_tex, char out_comp, int rect, int texw, int texh) {
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
946 switch (scaler) {
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
947 case YUV_SCALER_BILIN:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
948 snprintf(*prog_pos, *remain, bilin_filt_template, out_comp, in_tex,
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
949 in_tex, rect ? "RECT" : "2D");
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
950 break;
18622
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
951 case YUV_SCALER_BICUB:
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
952 if (rect)
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
953 snprintf(*prog_pos, *remain, bicub_filt_template_RECT,
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
954 in_tex, texs[0], texs[0],
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
955 in_tex, in_tex, in_tex, in_tex, in_tex, in_tex, out_comp);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
956 else
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
957 snprintf(*prog_pos, *remain, bicub_filt_template_2D,
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
958 in_tex, (float)texw, (float)texh,
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
959 texs[0], (float)1.0 / texw, (float)1.0 / texw,
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
960 texs[0], (float)1.0 / texh, (float)1.0 / texh,
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
961 in_tex, in_tex, in_tex, in_tex, in_tex, in_tex, out_comp);
dd9a6e8005f3 Add bicubic texture scaling
reimar
parents: 18619
diff changeset
962 break;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
963 }
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
964 *remain -= strlen(*prog_pos);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
965 *prog_pos += strlen(*prog_pos);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
966 }
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
967
18653
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
968 static const struct {
19194
5949a654e2d4 marks some read-only char* inside structs as const, patch by Stefan Huehner, stefan At huehner-org
reynaldo
parents: 19167
diff changeset
969 const char *name;
18653
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
970 GLenum cur;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
971 GLenum max;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
972 } progstats[] = {
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
973 {"instructions", 0x88A0, 0x88A1},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
974 {"native instructions", 0x88A2, 0x88A3},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
975 {"temporaries", 0x88A4, 0x88A5},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
976 {"native temporaries", 0x88A6, 0x88A7},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
977 {"parameters", 0x88A8, 0x88A9},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
978 {"native parameters", 0x88AA, 0x88AB},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
979 {"attribs", 0x88AC, 0x88AD},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
980 {"native attribs", 0x88AE, 0x88AF},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
981 {"ALU instructions", 0x8805, 0x880B},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
982 {"TEX instructions", 0x8806, 0x880C},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
983 {"TEX indirections", 0x8807, 0x880D},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
984 {"native ALU instructions", 0x8808, 0x880E},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
985 {"native TEX instructions", 0x8809, 0x880F},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
986 {"native TEX indirections", 0x880A, 0x8810},
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
987 {NULL, 0, 0}
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
988 };
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
989
19221
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
990 /**
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
991 * \brief load the specified GPU Program
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
992 * \param target program target to load into, only GL_FRAGMENT_PROGRAM is tested
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
993 * \param prog program string
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
994 * \return 1 on success, 0 otherwise
62ff089c24f7 Some more documentation
reimar
parents: 19194
diff changeset
995 */
18653
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
996 int loadGPUProgram(GLenum target, char *prog) {
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
997 int i;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
998 GLint cur = 0, max = 0, err = 0;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
999 if (!ProgramString) {
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1000 mp_msg(MSGT_VO, MSGL_ERR, "[gl] Missing GPU program function\n");
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1001 return 0;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1002 }
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1003 ProgramString(target, GL_PROGRAM_FORMAT_ASCII, strlen(prog), prog);
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1004 glGetIntegerv(GL_PROGRAM_ERROR_POSITION, &err);
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1005 if (err != -1) {
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1006 mp_msg(MSGT_VO, MSGL_ERR,
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1007 "[gl] Error compiling fragment program, make sure your card supports\n"
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1008 "[gl] GL_ARB_fragment_program (use glxinfo to check).\n"
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1009 "[gl] Error message:\n %s at %.10s\n",
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1010 glGetString(GL_PROGRAM_ERROR_STRING), &prog[err]);
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1011 return 0;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1012 }
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1013 if (!GetProgramiv || !mp_msg_test(MSGT_VO, MSGL_V))
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1014 return 1;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1015 mp_msg(MSGT_VO, MSGL_V, "[gl] Program statistics:\n");
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1016 for (i = 0; progstats[i].name; i++) {
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1017 GetProgramiv(target, progstats[i].cur, &cur);
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1018 GetProgramiv(target, progstats[i].max, &max);
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1019 mp_msg(MSGT_VO, MSGL_V, "[gl] %s: %i/%i\n", progstats[i].name, cur, max);
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1020 }
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1021 return 1;
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1022 }
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1023
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1024 /**
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1025 * \brief setup a fragment program that will do YUV->RGB conversion
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1026 * \param brightness brightness adjustment offset
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1027 * \param contrast contrast adjustment factor
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1028 * \param uvcos used for saturation and hue adjustment
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1029 * \param uvsin used for saturation and hue adjustment
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1030 * \param lookup use fragment program that uses texture unit 4 to
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1031 * do additional conversion via lookup.
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1032 */
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1033 static void glSetupYUVFragprog(float brightness, float contrast,
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1034 float uvcos, float uvsin, float rgamma,
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1035 float ggamma, float bgamma, int type, int rect,
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1036 int texw, int texh) {
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1037 char yuv_prog[4000] =
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1038 "!!ARBfp1.0\n"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1039 "OPTION ARB_precision_hint_fastest;"
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1040 // all scaler variables must go here so they aren't defined
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1041 // multiple times when the same scaler is used more than once
18787
5a2e45cd754f reduce number of texture indirections to support older cards
reimar
parents: 18693
diff changeset
1042 "TEMP coord, coord2, cdelta, parmx, parmy, a, b, yuv;";
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1043 int prog_remain = sizeof(yuv_prog) - strlen(yuv_prog);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1044 char *prog_pos = &yuv_prog[strlen(yuv_prog)];
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1045 int cur_texu = 3;
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1046 char lum_scale_texs[1];
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1047 char chrom_scale_texs[1];
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1048 char conv_texs[1];
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1049 GLint i;
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1050 // this is the conversion matrix, with y, u, v factors
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1051 // for red, green, blue and the constant offsets
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1052 float ry, ru, rv, rc;
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1053 float gy, gu, gv, gc;
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1054 float by, bu, bv, bc;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1055 create_scaler_textures(YUV_LUM_SCALER(type), &cur_texu, lum_scale_texs);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1056 if (YUV_CHROM_SCALER(type) == YUV_LUM_SCALER(type))
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1057 memcpy(chrom_scale_texs, lum_scale_texs, sizeof(chrom_scale_texs));
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1058 else
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1059 create_scaler_textures(YUV_CHROM_SCALER(type), &cur_texu, chrom_scale_texs);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1060 create_conv_textures(YUV_CONVERSION(type), &cur_texu, conv_texs,
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1061 brightness, contrast, uvcos, uvsin, rgamma, ggamma, bgamma);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1062 glGetIntegerv(GL_MAX_TEXTURE_UNITS, &i);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1063 if (i < cur_texu)
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1064 mp_msg(MSGT_VO, MSGL_ERR,
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1065 "[gl] %i texture units needed for this type of YUV fragment support (found %i)\n",
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1066 cur_texu, i);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1067 if (!ProgramString) {
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1068 mp_msg(MSGT_VO, MSGL_FATAL, "[gl] ProgramString function missing!\n");
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1069 return;
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1070 }
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1071 add_scaler(YUV_LUM_SCALER(type), &prog_pos, &prog_remain, lum_scale_texs,
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1072 '0', 'r', rect, texw, texh);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1073 add_scaler(YUV_CHROM_SCALER(type), &prog_pos, &prog_remain, chrom_scale_texs,
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1074 '1', 'g', rect, texw / 2, texh / 2);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1075 add_scaler(YUV_CHROM_SCALER(type), &prog_pos, &prog_remain, chrom_scale_texs,
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1076 '2', 'b', rect, texw / 2, texh / 2);
19167
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
1077 get_yuv2rgb_coeffs(brightness, contrast, uvcos, uvsin,
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
1078 &ry, &ru, &rv, &rc, &gy, &gu, &gv, &gc, &by, &bu, &bv, &bc);
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1079 switch (YUV_CONVERSION(type)) {
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1080 case YUV_CONVERSION_FRAGMENT:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1081 snprintf(prog_pos, prog_remain, yuv_prog_template,
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1082 ry, gy, by, ru, gu, bu, rv, gv, bv, rc, gc, bc);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1083 break;
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1084 case YUV_CONVERSION_FRAGMENT_POW:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1085 snprintf(prog_pos, prog_remain, yuv_pow_prog_template,
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1086 ry, gy, by, ru, gu, bu, rv, gv, bv, rc, gc, bc,
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1087 (float)1.0 / rgamma, (float)1.0 / bgamma, (float)1.0 / bgamma);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1088 break;
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1089 case YUV_CONVERSION_FRAGMENT_LOOKUP:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1090 snprintf(prog_pos, prog_remain, yuv_lookup_prog_template,
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1091 ry, gy, by, ru, gu, bu, rv, gv, bv, rc, gc, bc,
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1092 conv_texs[0], conv_texs[0], conv_texs[0]);
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1093 break;
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1094 case YUV_CONVERSION_FRAGMENT_LOOKUP3D:
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1095 snprintf(prog_pos, prog_remain, yuv_lookup3d_prog_template, conv_texs[0]);
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1096 break;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1097 default:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1098 mp_msg(MSGT_VO, MSGL_ERR, "[gl] unknown conversion type %i\n", YUV_CONVERSION(type));
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1099 break;
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1100 }
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1101 mp_msg(MSGT_VO, MSGL_V, "[gl] generated fragment program:\n%s\n", yuv_prog);
18653
5af43a16abc3 loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents: 18622
diff changeset
1102 loadGPUProgram(GL_FRAGMENT_PROGRAM, yuv_prog);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1103 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1104
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1105 /**
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1106 * \brief little helper function to create a lookup table for gamma
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1107 * \param map buffer to create map into
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1108 * \param size size of buffer
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1109 * \param gamma gamma value
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1110 */
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1111 static void gen_gamma_map(unsigned char *map, int size, float gamma) {
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1112 int i;
19167
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
1113 if (gamma == 1.0) {
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
1114 for (i = 0; i < size; i++)
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
1115 map[i] = 255 * i / (size - 1);
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
1116 return;
4daef6e86041 Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents: 18988
diff changeset
1117 }
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1118 gamma = 1.0 / gamma;
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1119 for (i = 0; i < size; i++) {
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1120 float tmp = (float)i / (size - 1.0);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1121 tmp = pow(tmp, gamma);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1122 if (tmp > 1.0) tmp = 1.0;
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1123 if (tmp < 0.0) tmp = 0.0;
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1124 map[i] = 255 * tmp;
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1125 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1126 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1127
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1128 /**
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1129 * \brief setup YUV->RGB conversion
16586
26b156d7a68d Support rectangular texture in fragment programs
reimar
parents: 16582
diff changeset
1130 * \param target texture target for Y, U and V textures (e.g. GL_TEXTURE_2D)
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1131 * \param type YUV conversion type
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1132 * \param brightness brightness adjustment offset
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1133 * \param contrast contrast adjustment factor
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1134 * \param hue hue adjustment angle
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1135 * \param saturation saturation adjustment factor
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1136 * \param rgamma gamma value for red channel
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1137 * \param ggamma gamma value for green channel
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1138 * \param bgamma gamma value for blue channel
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1139 * \ingroup glconversion
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1140 */
16586
26b156d7a68d Support rectangular texture in fragment programs
reimar
parents: 16582
diff changeset
1141 void glSetupYUVConversion(GLenum target, int type,
26b156d7a68d Support rectangular texture in fragment programs
reimar
parents: 16582
diff changeset
1142 float brightness, float contrast,
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1143 float hue, float saturation,
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1144 float rgamma, float ggamma, float bgamma,
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1145 int texw, int texh) {
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1146 float uvcos = saturation * cos(hue);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1147 float uvsin = saturation * sin(hue);
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1148 switch (YUV_CONVERSION(type)) {
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1149 case YUV_CONVERSION_COMBINERS:
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1150 glSetupYUVCombiners(uvcos, uvsin);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1151 break;
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1152 case YUV_CONVERSION_COMBINERS_ATI:
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1153 glSetupYUVCombinersATI(uvcos, uvsin);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1154 break;
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1155 case YUV_CONVERSION_FRAGMENT_LOOKUP:
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1156 case YUV_CONVERSION_FRAGMENT_LOOKUP3D:
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1157 case YUV_CONVERSION_FRAGMENT:
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1158 case YUV_CONVERSION_FRAGMENT_POW:
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1159 glSetupYUVFragprog(brightness, contrast, uvcos, uvsin,
16586
26b156d7a68d Support rectangular texture in fragment programs
reimar
parents: 16582
diff changeset
1160 rgamma, ggamma, bgamma, type,
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1161 target == GL_TEXTURE_RECTANGLE,
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1162 texw, texh);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1163 break;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1164 default:
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1165 mp_msg(MSGT_VO, MSGL_ERR, "[gl] unknown conversion type %i\n", YUV_CONVERSION(type));
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1166 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1167 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1168
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1169 /**
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1170 * \brief enable the specified YUV conversion
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1171 * \param target texture target for Y, U and V textures (e.g. GL_TEXTURE_2D)
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1172 * \param type type of YUV conversion
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1173 * \ingroup glconversion
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1174 */
18175
01ca8a5fb8a6 minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents: 17566
diff changeset
1175 void glEnableYUVConversion(GLenum target, int type) {
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1176 if (type <= 0) return;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1177 switch (YUV_CONVERSION(type)) {
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1178 case YUV_CONVERSION_COMBINERS:
16582
cbd0ee58633b texture units do not need to be explicitly enabled when using a fragment
reimar
parents: 16488
diff changeset
1179 ActiveTexture(GL_TEXTURE1);
cbd0ee58633b texture units do not need to be explicitly enabled when using a fragment
reimar
parents: 16488
diff changeset
1180 glEnable(target);
cbd0ee58633b texture units do not need to be explicitly enabled when using a fragment
reimar
parents: 16488
diff changeset
1181 ActiveTexture(GL_TEXTURE2);
cbd0ee58633b texture units do not need to be explicitly enabled when using a fragment
reimar
parents: 16488
diff changeset
1182 glEnable(target);
cbd0ee58633b texture units do not need to be explicitly enabled when using a fragment
reimar
parents: 16488
diff changeset
1183 ActiveTexture(GL_TEXTURE0);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1184 glEnable(GL_REGISTER_COMBINERS_NV);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1185 break;
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1186 case YUV_CONVERSION_COMBINERS_ATI:
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1187 ActiveTexture(GL_TEXTURE1);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1188 glEnable(target);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1189 ActiveTexture(GL_TEXTURE2);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1190 glEnable(target);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1191 ActiveTexture(GL_TEXTURE0);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1192 glEnable(GL_FRAGMENT_SHADER_ATI);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1193 break;
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1194 case YUV_CONVERSION_FRAGMENT_LOOKUP3D:
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1195 case YUV_CONVERSION_FRAGMENT_LOOKUP:
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1196 case YUV_CONVERSION_FRAGMENT_POW:
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1197 case YUV_CONVERSION_FRAGMENT:
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1198 glEnable(GL_FRAGMENT_PROGRAM);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1199 break;
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1200 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1201 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1202
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1203 /**
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1204 * \brief disable the specified YUV conversion
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1205 * \param target texture target for Y, U and V textures (e.g. GL_TEXTURE_2D)
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1206 * \param type type of YUV conversion
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1207 * \ingroup glconversion
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1208 */
18175
01ca8a5fb8a6 minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents: 17566
diff changeset
1209 void glDisableYUVConversion(GLenum target, int type) {
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1210 if (type <= 0) return;
18619
106a0c366002 Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents: 18579
diff changeset
1211 switch (YUV_CONVERSION(type)) {
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1212 case YUV_CONVERSION_COMBINERS:
16582
cbd0ee58633b texture units do not need to be explicitly enabled when using a fragment
reimar
parents: 16488
diff changeset
1213 ActiveTexture(GL_TEXTURE1);
cbd0ee58633b texture units do not need to be explicitly enabled when using a fragment
reimar
parents: 16488
diff changeset
1214 glDisable(target);
cbd0ee58633b texture units do not need to be explicitly enabled when using a fragment
reimar
parents: 16488
diff changeset
1215 ActiveTexture(GL_TEXTURE2);
cbd0ee58633b texture units do not need to be explicitly enabled when using a fragment
reimar
parents: 16488
diff changeset
1216 glDisable(target);
cbd0ee58633b texture units do not need to be explicitly enabled when using a fragment
reimar
parents: 16488
diff changeset
1217 ActiveTexture(GL_TEXTURE0);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1218 glDisable(GL_REGISTER_COMBINERS_NV);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1219 break;
16625
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1220 case YUV_CONVERSION_COMBINERS_ATI:
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1221 ActiveTexture(GL_TEXTURE1);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1222 glDisable(target);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1223 ActiveTexture(GL_TEXTURE2);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1224 glDisable(target);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1225 ActiveTexture(GL_TEXTURE0);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1226 glDisable(GL_FRAGMENT_SHADER_ATI);
6b0dc40bf961 Support for ATI specific YUV->RGB conversion.
reimar
parents: 16595
diff changeset
1227 break;
18655
6aa0b26d584b Add yuv to rgb conversion using a 3D lookup texture
reimar
parents: 18653
diff changeset
1228 case YUV_CONVERSION_FRAGMENT_LOOKUP3D:
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1229 case YUV_CONVERSION_FRAGMENT_LOOKUP:
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1230 case YUV_CONVERSION_FRAGMENT_POW:
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1231 case YUV_CONVERSION_FRAGMENT:
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1232 glDisable(GL_FRAGMENT_PROGRAM);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1233 break;
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1234 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1235 }
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1236
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1237 /**
16214
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1238 * \brief draw a texture part at given 2D coordinates
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1239 * \param x screen top coordinate
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1240 * \param y screen left coordinate
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1241 * \param w screen width coordinate
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1242 * \param h screen height coordinate
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1243 * \param tx texture top coordinate in pixels
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1244 * \param ty texture left coordinate in pixels
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1245 * \param tw texture part width in pixels
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1246 * \param th texture part height in pixels
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1247 * \param sx width of texture in pixels
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1248 * \param sy height of texture in pixels
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1249 * \param rect_tex whether this texture uses texture_rectangle extension
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1250 * \param is_yv12 if set, also draw the textures from units 1 and 2
17220
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
1251 * \param flip flip the texture upside down
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1252 * \ingroup gltexture
16214
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1253 */
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1254 void glDrawTex(GLfloat x, GLfloat y, GLfloat w, GLfloat h,
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1255 GLfloat tx, GLfloat ty, GLfloat tw, GLfloat th,
17220
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
1256 int sx, int sy, int rect_tex, int is_yv12, int flip) {
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1257 GLfloat tx2 = tx / 2, ty2 = ty / 2, tw2 = tw / 2, th2 = th / 2;
16214
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1258 if (!rect_tex) {
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1259 tx /= sx; ty /= sy; tw /= sx; th /= sy;
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1260 tx2 = tx, ty2 = ty, tw2 = tw, th2 = th;
16214
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1261 }
17220
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
1262 if (flip) {
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
1263 y += h;
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
1264 h = -h;
a27e52b838e3 support negative stride (flipping) in vo_gl.
reimar
parents: 17116
diff changeset
1265 }
16214
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1266 glBegin(GL_QUADS);
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1267 glTexCoord2f(tx, ty);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1268 if (is_yv12) {
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1269 MultiTexCoord2f(GL_TEXTURE1, tx2, ty2);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1270 MultiTexCoord2f(GL_TEXTURE2, tx2, ty2);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1271 }
16214
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1272 glVertex2f(x, y);
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1273 glTexCoord2f(tx, ty + th);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1274 if (is_yv12) {
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1275 MultiTexCoord2f(GL_TEXTURE1, tx2, ty2 + th2);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1276 MultiTexCoord2f(GL_TEXTURE2, tx2, ty2 + th2);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1277 }
16214
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1278 glVertex2f(x, y + h);
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1279 glTexCoord2f(tx + tw, ty + th);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1280 if (is_yv12) {
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1281 MultiTexCoord2f(GL_TEXTURE1, tx2 + tw2, ty2 + th2);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1282 MultiTexCoord2f(GL_TEXTURE2, tx2 + tw2, ty2 + th2);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1283 }
16214
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1284 glVertex2f(x + w, y + h);
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1285 glTexCoord2f(tx + tw, ty);
16488
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1286 if (is_yv12) {
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1287 MultiTexCoord2f(GL_TEXTURE1, tx2 + tw2, ty2);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1288 MultiTexCoord2f(GL_TEXTURE2, tx2 + tw2, ty2);
3191dcb27a12 hardware color-space conversion for vo_gl and vo_gl2
reimar
parents: 16474
diff changeset
1289 }
16214
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1290 glVertex2f(x + w, y);
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1291 glEnd();
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1292 }
ede5b4afd262 Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents: 16117
diff changeset
1293
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1294 #ifdef GL_WIN32
17116
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
1295 #include "w32_common.h"
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1296 /**
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1297 * \brief little helper since wglGetProcAddress definition does not fit our
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1298 * getProcAddress
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1299 * \param procName name of function to look up
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1300 * \return function pointer returned by wglGetProcAddress
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1301 */
16109
519a307e3ccf OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents: 16099
diff changeset
1302 static void *w32gpa(const GLubyte *procName) {
519a307e3ccf OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents: 16099
diff changeset
1303 return wglGetProcAddress(procName);
519a307e3ccf OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents: 16099
diff changeset
1304 }
519a307e3ccf OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents: 16099
diff changeset
1305
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1306 int setGlWindow(int *vinfo, HGLRC *context, HWND win)
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1307 {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1308 int new_vinfo;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1309 HDC windc = GetDC(win);
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1310 HGLRC new_context = 0;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1311 int keep_context = 0;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1312
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1313 // should only be needed when keeping context, but not doing glFinish
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1314 // can cause flickering even when we do not keep it.
16944
179a7a2857a8 do not call glFinish when we do not have a context
reimar
parents: 16879
diff changeset
1315 if (*context)
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1316 glFinish();
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1317 new_vinfo = GetPixelFormat(windc);
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1318 if (*context && *vinfo && new_vinfo && *vinfo == new_vinfo) {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1319 // we can keep the wglContext
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1320 new_context = *context;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1321 keep_context = 1;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1322 } else {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1323 // create a context
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1324 new_context = wglCreateContext(windc);
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1325 if (!new_context) {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1326 mp_msg(MSGT_VO, MSGL_FATAL, "[gl] Could not create GL context!\n");
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1327 return SET_WINDOW_FAILED;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1328 }
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1329 }
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1330
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1331 // set context
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1332 if (!wglMakeCurrent(windc, new_context)) {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1333 mp_msg (MSGT_VO, MSGL_FATAL, "[gl] Could not set GL context!\n");
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1334 if (!keep_context) {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1335 wglDeleteContext(new_context);
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1336 }
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1337 return SET_WINDOW_FAILED;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1338 }
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1339
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1340 // set new values
21631
2d3fdf94a50c Fix compilation under MinGW with X11 enabled
reimar
parents: 21201
diff changeset
1341 vo_w32_window = win;
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1342 vo_hdc = windc;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1343 {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1344 RECT rect;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1345 GetClientRect(win, &rect);
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1346 vo_dwidth = rect.right;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1347 vo_dheight = rect.bottom;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1348 }
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1349 if (!keep_context) {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1350 if (*context)
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1351 wglDeleteContext(*context);
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1352 *context = new_context;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1353 *vinfo = new_vinfo;
17019
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
1354 getFunctions(w32gpa, NULL);
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1355
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1356 // and inform that reinit is neccessary
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1357 return SET_WINDOW_REINIT;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1358 }
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1359 return SET_WINDOW_OK;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1360 }
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1361
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1362 void releaseGlContext(int *vinfo, HGLRC *context) {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1363 *vinfo = 0;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1364 if (*context) {
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1365 wglMakeCurrent(0, 0);
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1366 wglDeleteContext(*context);
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1367 }
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1368 *context = 0;
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1369 }
17116
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
1370
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
1371 void swapGlBuffers() {
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
1372 SwapBuffers(vo_hdc);
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
1373 }
14142
f0c1ee83b216 Improving gl2 under windows, moving some functionality to gl_common
reimar
parents: 14089
diff changeset
1374 #else
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
1375 #ifdef HAVE_LIBDL
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
1376 #include <dlfcn.h>
16111
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1377 #endif
17116
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
1378 #include "x11_common.h"
16111
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1379 /**
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1380 * \brief find address of a linked function
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1381 * \param s name of function to find
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1382 * \return address of function or NULL if not found
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1383 *
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1384 * Copied from xine
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1385 */
17336
98b064148349 avoid some gcc 4 compiler warnings
reimar
parents: 17335
diff changeset
1386 static void *getdladdr(const char *s) {
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
1387 #ifdef HAVE_LIBDL
16111
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1388 #if defined(__sun) || defined(__sgi)
17419
433e35de3b10 avoid Solaris 10 compile error with gcc 3.4.5
reimar
parents: 17336
diff changeset
1389 static void *handle = NULL;
433e35de3b10 avoid Solaris 10 compile error with gcc 3.4.5
reimar
parents: 17336
diff changeset
1390 if (!handle)
433e35de3b10 avoid Solaris 10 compile error with gcc 3.4.5
reimar
parents: 17336
diff changeset
1391 handle = dlopen(NULL, RTLD_LAZY);
16111
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1392 return dlsym(handle, s);
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1393 #else
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1394 return dlsym(0, s);
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1395 #endif
16117
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
1396 #else
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
1397 return NULL;
d280ec2b9e63 More helper functions/defines and bugfixes
reimar
parents: 16111
diff changeset
1398 #endif
16111
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1399 }
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1400
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1401 /**
14269
718ec28220d6 Doxygen comments improved
reimar
parents: 14142
diff changeset
1402 * \brief Returns the XVisualInfo associated with Window win.
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1403 * \param win Window whose XVisualInfo is returne.
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1404 * \return XVisualInfo of the window. Caller must use XFree to free it.
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1405 */
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1406 static XVisualInfo *getWindowVisualInfo(Window win) {
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1407 XWindowAttributes xw_attr;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1408 XVisualInfo vinfo_template;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1409 int tmp;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1410 XGetWindowAttributes(mDisplay, win, &xw_attr);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1411 vinfo_template.visualid = XVisualIDFromVisual(xw_attr.visual);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1412 return XGetVisualInfo(mDisplay, VisualIDMask, &vinfo_template, &tmp);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1413 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1414
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1415 /**
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1416 * \brief Changes the window in which video is displayed.
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1417 * If possible only transfers the context to the new window, otherwise
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1418 * creates a new one, which must be initialized by the caller.
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1419 * \param vinfo Currently used visual.
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1420 * \param context Currently used context.
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1421 * \param win window that should be used for drawing.
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1422 * \return one of SET_WINDOW_FAILED, SET_WINDOW_OK or SET_WINDOW_REINIT.
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1423 * In case of SET_WINDOW_REINIT the context could not be transfered
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1424 * and the caller must initialize it correctly.
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1425 * \ingroup glcontext
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1426 */
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1427 int setGlWindow(XVisualInfo **vinfo, GLXContext *context, Window win)
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1428 {
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1429 XVisualInfo *new_vinfo;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1430 GLXContext new_context = NULL;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1431 int keep_context = 0;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1432
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1433 // should only be needed when keeping context, but not doing glFinish
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1434 // can cause flickering even when we do not keep it.
16944
179a7a2857a8 do not call glFinish when we do not have a context
reimar
parents: 16879
diff changeset
1435 if (*context)
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1436 glFinish();
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1437 new_vinfo = getWindowVisualInfo(win);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1438 if (*context && *vinfo && new_vinfo &&
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1439 (*vinfo)->visualid == new_vinfo->visualid) {
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1440 // we can keep the GLXContext
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1441 new_context = *context;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1442 XFree(new_vinfo);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1443 new_vinfo = *vinfo;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1444 keep_context = 1;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1445 } else {
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1446 // create a context
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1447 new_context = glXCreateContext(mDisplay, new_vinfo, NULL, True);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1448 if (!new_context) {
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1449 mp_msg(MSGT_VO, MSGL_FATAL, "[gl] Could not create GLX context!\n");
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1450 XFree(new_vinfo);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1451 return SET_WINDOW_FAILED;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1452 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1453 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1454
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1455 // set context
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1456 if (!glXMakeCurrent(mDisplay, vo_window, new_context)) {
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1457 mp_msg (MSGT_VO, MSGL_FATAL, "[gl] Could not set GLX context!\n");
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1458 if (!keep_context) {
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1459 glXDestroyContext (mDisplay, new_context);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1460 XFree(new_vinfo);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1461 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1462 return SET_WINDOW_FAILED;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1463 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1464
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1465 // set new values
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1466 vo_window = win;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1467 {
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1468 Window root;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1469 int tmp;
17336
98b064148349 avoid some gcc 4 compiler warnings
reimar
parents: 17335
diff changeset
1470 unsigned utmp;
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1471 XGetGeometry(mDisplay, vo_window, &root, &tmp, &tmp,
17336
98b064148349 avoid some gcc 4 compiler warnings
reimar
parents: 17335
diff changeset
1472 (unsigned *)&vo_dwidth, (unsigned *)&vo_dheight, &utmp, &utmp);
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1473 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1474 if (!keep_context) {
16588
c3dc7f3c716c get rid of global getProcAddress variable
reimar
parents: 16586
diff changeset
1475 void *(*getProcAddress)(const GLubyte *);
17019
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
1476 const char *(*glXExtStr)(Display *, int);
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1477 if (*context)
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1478 glXDestroyContext(mDisplay, *context);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1479 *context = new_context;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1480 if (*vinfo)
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1481 XFree(*vinfo);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1482 *vinfo = new_vinfo;
16111
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1483 getProcAddress = getdladdr("glXGetProcAddress");
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1484 if (!getProcAddress)
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1485 getProcAddress = getdladdr("glXGetProcAddressARB");
5683110fce0a Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents: 16109
diff changeset
1486 if (!getProcAddress)
17336
98b064148349 avoid some gcc 4 compiler warnings
reimar
parents: 17335
diff changeset
1487 getProcAddress = (void *)getdladdr;
17019
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
1488 glXExtStr = getdladdr("glXQueryExtensionsString");
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
1489 getFunctions(getProcAddress, !glXExtStr ? NULL :
fd178c06dc84 Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents: 16984
diff changeset
1490 glXExtStr(mDisplay, DefaultScreen(mDisplay)));
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1491
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1492 // and inform that reinit is neccessary
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1493 return SET_WINDOW_REINIT;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1494 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1495 return SET_WINDOW_OK;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1496 }
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1497
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1498 /**
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1499 * \brief free the VisualInfo and GLXContext of an OpenGL context.
16595
b3a9fb41f475 fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents: 16592
diff changeset
1500 * \ingroup glcontext
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1501 */
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1502 void releaseGlContext(XVisualInfo **vinfo, GLXContext *context) {
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1503 if (*vinfo)
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1504 XFree(*vinfo);
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1505 *vinfo = NULL;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1506 if (*context)
14089
00283cb37fd0 Make the context not current before destroying it.
reimar
parents: 14078
diff changeset
1507 {
00283cb37fd0 Make the context not current before destroying it.
reimar
parents: 14078
diff changeset
1508 glFinish();
00283cb37fd0 Make the context not current before destroying it.
reimar
parents: 14078
diff changeset
1509 glXMakeCurrent(mDisplay, None, NULL);
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1510 glXDestroyContext(mDisplay, *context);
14089
00283cb37fd0 Make the context not current before destroying it.
reimar
parents: 14078
diff changeset
1511 }
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1512 *context = 0;
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1513 }
17116
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
1514
17566
f580a7755ac5 Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents: 17419
diff changeset
1515 void swapGlBuffers(void) {
17116
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
1516 glXSwapBuffers(mDisplay, vo_window);
724353364790 Get rid of most #ifdefs
reimar
parents: 17019
diff changeset
1517 }
13843
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1518 #endif
3f28d2a56758 fullscreen fixes and GUI support for vo_gl
reimar
parents: 13653
diff changeset
1519