Mercurial > mplayer.hg
annotate libvo/gl_common.c @ 21460:62bd8e0d3a0f
Open embedded fonts directly from memory.
FontConfig 2.4.2 (released yesterday) supports scanning fonts with
FcFreeTypeQueryFace without writing them to disk. With earlier FontConfig
versions, the old mechanism is used.
author | eugeni |
---|---|
date | Sun, 03 Dec 2006 18:24:11 +0000 |
parents | 2c1b7fe05973 |
children | 2d3fdf94a50c |
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 | 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 | 13 #include <string.h> |
16592 | 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 | 27 void (APIENTRY *BindBuffer)(GLenum, GLuint); |
28 GLvoid* (APIENTRY *MapBuffer)(GLenum, GLenum); | |
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 | 31 void (APIENTRY *CombinerParameterfv)(GLenum, const GLfloat *); |
32 void (APIENTRY *CombinerParameteri)(GLenum, GLint); | |
33 void (APIENTRY *CombinerInput)(GLenum, GLenum, GLenum, GLenum, GLenum, | |
34 GLenum); | |
35 void (APIENTRY *CombinerOutput)(GLenum, GLenum, GLenum, GLenum, GLenum, | |
36 GLenum, GLenum, GLboolean, GLboolean, | |
37 GLboolean); | |
16625 | 38 void (APIENTRY *BeginFragmentShader)(void); |
39 void (APIENTRY *EndFragmentShader)(void); | |
40 void (APIENTRY *SampleMap)(GLuint, GLuint, GLenum); | |
41 void (APIENTRY *ColorFragmentOp2)(GLenum, GLuint, GLuint, GLuint, GLuint, | |
42 GLuint, GLuint, GLuint, GLuint, GLuint); | |
43 void (APIENTRY *ColorFragmentOp3)(GLenum, GLuint, GLuint, GLuint, GLuint, | |
44 GLuint, GLuint, GLuint, GLuint, GLuint, | |
45 GLuint, GLuint, GLuint); | |
46 void (APIENTRY *SetFragmentShaderConstant)(GLuint, const GLfloat *); | |
16099 | 47 void (APIENTRY *ActiveTexture)(GLenum); |
48 void (APIENTRY *BindTexture)(GLenum, GLuint); | |
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 | 52 void (APIENTRY *BindProgram)(GLenum, GLuint); |
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 | 55 void (APIENTRY *ProgramEnvParameter4f)(GLenum, GLuint, GLfloat, GLfloat, |
56 GLfloat, GLfloat); | |
16270 | 57 int (APIENTRY *SwapInterval)(int); |
18578 | 58 void (APIENTRY *TexImage3D)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, |
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 | 69 |
18961 | 70 static GLint hqtexfmt; |
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 | 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 | 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 | 186 case IMGFMT_YV12: |
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 | 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 | 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 | 250 static void *setNull(const GLubyte *s) { |
251 return NULL; | |
252 } | |
253 | |
17335 | 254 typedef struct { |
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 | 258 } extfunc_desc_t; |
259 | |
260 static const extfunc_desc_t extfuncs[] = { | |
261 {(void **)&GenBuffers, NULL, {"glGenBuffers", "glGenBuffersARB", NULL}}, | |
262 {(void **)&DeleteBuffers, NULL, {"glDeleteBuffers", "glDeleteBuffersARB", NULL}}, | |
263 {(void **)&BindBuffer, NULL, {"glBindBuffer", "glBindBufferARB", NULL}}, | |
264 {(void **)&MapBuffer, NULL, {"glMapBuffer", "glMapBufferARB", NULL}}, | |
265 {(void **)&UnmapBuffer, NULL, {"glUnmapBuffer", "glUnmapBufferARB", NULL}}, | |
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 | 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 | 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 | 286 {(void **)&SwapInterval, "_swap_control", {"glXSwapInterval", "glXSwapIntervalEXT", "glXSwapIntervalSGI", "wglSwapInterval", "wglSwapIntervalEXT", "wglSwapIntervalSGI", NULL}}, |
18578 | 287 {(void **)&TexImage3D, NULL, {"glTexImage3D", NULL}}, |
17335 | 288 {NULL} |
289 }; | |
290 | |
16117 | 291 /** |
292 * \brief find the function pointers of some useful OpenGL extensions | |
16588 | 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 | 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 | 298 const extfunc_desc_t *dsc; |
17336 | 299 const char *extensions = (const char *)glGetString(GL_EXTENSIONS); |
17335 | 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 | 303 allexts = malloc(strlen(extensions) + strlen(ext2) + 2); |
17335 | 304 strcpy(allexts, extensions); |
305 strcat(allexts, " "); | |
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 | 308 if (!getProcAddress) |
309 getProcAddress = setNull; | |
17335 | 310 for (dsc = extfuncs; dsc->funcptr; dsc++) { |
311 void *ptr = NULL; | |
312 int i; | |
313 if (!dsc->extstr || strstr(allexts, dsc->extstr)) { | |
314 for (i = 0; !ptr && dsc->funcnames[i]; i++) | |
315 ptr = getProcAddress((const GLubyte *)dsc->funcnames[i]); | |
316 } | |
317 *(dsc->funcptr) = ptr; | |
16984
94b70ab52695
disable *SwapInterval function when extensions are missing, since it
reimar
parents:
16944
diff
changeset
|
318 } |
18961 | 319 if (strstr(allexts, "_texture_float")) |
320 hqtexfmt = GL_RGB32F; | |
321 else if (strstr(allexts, "NV_float_buffer")) | |
322 hqtexfmt = GL_FLOAT_RGB32_NV; | |
323 else | |
324 hqtexfmt = GL_RGB16; | |
17335 | 325 free(allexts); |
16099 | 326 } |
327 | |
16117 | 328 /** |
329 * \brief create a texture and set some defaults | |
330 * \param target texture taget, usually GL_TEXTURE_2D | |
331 * \param fmt internal texture format | |
332 * \param filter filter used for scaling, e.g. GL_LINEAR | |
333 * \param w texture width | |
334 * \param h texture height | |
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 | 337 */ |
338 void glCreateClearTex(GLenum target, GLenum fmt, GLint filter, | |
16460 | 339 int w, int h, unsigned char val) { |
340 GLfloat fval = (GLfloat)val / 255.0; | |
341 GLfloat border[4] = {fval, fval, fval, fval}; | |
16117 | 342 GLenum clrfmt = (fmt == GL_ALPHA) ? GL_ALPHA : GL_LUMINANCE; |
18878 | 343 char *init = malloc(w * h); |
16117 | 344 memset(init, val, w * h); |
345 glAdjustAlignment(w); | |
346 glPixelStorei(GL_UNPACK_ROW_LENGTH, w); | |
347 glTexImage2D(target, 0, fmt, w, h, 0, clrfmt, GL_UNSIGNED_BYTE, init); | |
348 glTexParameterf(target, GL_TEXTURE_PRIORITY, 1.0); | |
349 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, filter); | |
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 | 356 free(init); |
357 } | |
358 | |
359 /** | |
16592 | 360 * \brief skips whitespace and comments |
361 * \param f file to read from | |
362 */ | |
363 static void ppm_skip(FILE *f) { | |
364 int c, comment = 0; | |
365 do { | |
366 c = fgetc(f); | |
367 if (c == '#') | |
368 comment = 1; | |
369 if (c == '\n') | |
370 comment = 0; | |
371 } while (c != EOF && (isspace(c) || comment)); | |
372 if (c != EOF) | |
373 ungetc(c, f); | |
374 } | |
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 | 378 /** |
379 * \brief creates a texture from a PPM file | |
380 * \param target texture taget, usually GL_TEXTURE_2D | |
18961 | 381 * \param fmt internal texture format, 0 for default |
16592 | 382 * \param filter filter used for scaling, e.g. GL_LINEAR |
383 * \param f file to read PPM from | |
384 * \param width [out] width of texture | |
385 * \param height [out] height of texture | |
386 * \param maxval [out] maxval value from PPM file | |
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 | 389 */ |
390 int glCreatePPMTex(GLenum target, GLenum fmt, GLint filter, | |
391 FILE *f, int *width, int *height, int *maxval) { | |
18961 | 392 unsigned w, h, m, val, bpp; |
16592 | 393 char *data; |
394 ppm_skip(f); | |
395 if (fgetc(f) != 'P' || fgetc(f) != '6') | |
396 return 0; | |
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 | 399 return 0; |
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 | 402 return 0; |
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 | 405 return 0; |
406 val = fgetc(f); | |
407 if (!isspace(val)) | |
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 | 411 bpp = (m > 255) ? 6 : 3; |
412 data = malloc(w * h * bpp); | |
413 if (fread(data, w * bpp, h, f) != h) | |
16592 | 414 return 0; |
18961 | 415 if (!fmt) { |
416 fmt = (m > 255) ? hqtexfmt : 3; | |
417 if (fmt == GL_FLOAT_RGB32_NV && target != GL_TEXTURE_RECTANGLE) | |
418 fmt = GL_RGB16; | |
419 } | |
16592 | 420 glCreateClearTex(target, fmt, filter, w, h, 0); |
18961 | 421 glUploadTex(target, GL_RGB, (m > 255) ? GL_UNSIGNED_SHORT : GL_UNSIGNED_BYTE, |
422 data, w * bpp, 0, 0, w, h, 0); | |
16592 | 423 free(data); |
424 if (width) *width = w; | |
425 if (height) *height = h; | |
426 if (maxval) *maxval = m; | |
427 return 1; | |
428 } | |
429 | |
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 | 432 * \param format OpenGL format |
433 * \param type OpenGL type | |
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 | 436 * |
16435 | 437 * Does not handle all possible variants, just those used by MPlayer |
16117 | 438 */ |
439 int glFmt2bpp(GLenum format, GLenum type) { | |
18961 | 440 int component_size = 0; |
16117 | 441 switch (type) { |
442 case GL_UNSIGNED_BYTE_3_3_2: | |
443 case GL_UNSIGNED_BYTE_2_3_3_REV: | |
444 return 1; | |
445 case GL_UNSIGNED_SHORT_5_5_5_1: | |
446 case GL_UNSIGNED_SHORT_1_5_5_5_REV: | |
447 case GL_UNSIGNED_SHORT_5_6_5: | |
448 case GL_UNSIGNED_SHORT_5_6_5_REV: | |
449 return 2; | |
18961 | 450 case GL_UNSIGNED_BYTE: |
451 component_size = 1; | |
452 break; | |
453 case GL_UNSIGNED_SHORT: | |
454 component_size = 2; | |
455 break; | |
16117 | 456 } |
457 switch (format) { | |
458 case GL_LUMINANCE: | |
459 case GL_ALPHA: | |
18961 | 460 return component_size; |
16117 | 461 case GL_RGB: |
462 case GL_BGR: | |
18961 | 463 return 3 * component_size; |
16117 | 464 case GL_RGBA: |
465 case GL_BGRA: | |
18961 | 466 return 4 * component_size; |
16117 | 467 } |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
468 return 0; // unknown |
16117 | 469 } |
470 | |
471 /** | |
472 * \brief upload a texture, handling things like stride and slices | |
473 * \param target texture target, usually GL_TEXTURE_2D | |
474 * \param format OpenGL format of data | |
475 * \param type OpenGL type of data | |
21201 | 476 * \param dataptr data to upload |
16117 | 477 * \param stride data stride |
478 * \param x x offset in texture | |
479 * \param y y offset in texture | |
480 * \param w width of the texture part to upload | |
481 * \param h height of the texture part to upload | |
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 | 484 */ |
485 void glUploadTex(GLenum target, GLenum format, GLenum type, | |
21201 | 486 const void *dataptr, int stride, |
16117 | 487 int x, int y, int w, int h, int slice) { |
21201 | 488 const uint8_t *data = dataptr; |
16117 | 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 | 491 if (slice <= 0) |
492 slice = h; | |
17220 | 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 | 495 stride = -stride; |
496 } | |
16117 | 497 // this is not always correct, but should work for MPlayer |
498 glAdjustAlignment(stride); | |
499 glPixelStorei(GL_UNPACK_ROW_LENGTH, stride / glFmt2bpp(format, type)); | |
500 for (; y + slice <= y_max; y += slice) { | |
501 glTexSubImage2D(target, 0, x, y, w, slice, format, type, data); | |
502 data += stride * slice; | |
503 } | |
504 if (y < y_max) | |
505 glTexSubImage2D(target, 0, x, y, w, y_max - y, format, type, data); | |
506 } | |
507 | |
16625 | 508 static void fillUVcoeff(GLfloat *ucoef, GLfloat *vcoef, |
509 float uvcos, float uvsin) { | |
510 int i; | |
511 ucoef[0] = 0 * uvcos + 1.403 * uvsin; | |
512 vcoef[0] = 0 * uvsin + 1.403 * uvcos; | |
513 ucoef[1] = -0.344 * uvcos + -0.714 * uvsin; | |
514 vcoef[1] = -0.344 * uvsin + -0.714 * uvcos; | |
515 ucoef[2] = 1.770 * uvcos + 0 * uvsin; | |
516 vcoef[2] = 1.770 * uvsin + 0 * uvcos; | |
517 ucoef[3] = 0; | |
518 vcoef[3] = 0; | |
519 // Coefficients (probably) must be in [0, 1] range, whereas they originally | |
520 // are in [-2, 2] range, so here comes the trick: | |
521 // First put them in the [-0.5, 0.5] range, then add 0.5. | |
522 // This can be undone with the HALF_BIAS and SCALE_BY_FOUR arguments | |
523 // for CombinerInput and CombinerOutput (or the respective ATI variants) | |
524 for (i = 0; i < 4; i++) { | |
525 ucoef[i] = ucoef[i] * 0.25 + 0.5; | |
526 vcoef[i] = vcoef[i] * 0.25 + 0.5; | |
527 } | |
528 } | |
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 | 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 | 586 /** |
587 * \brief Setup ATI version of register combiners for YUV to RGB conversion. | |
588 * \param uvcos used for saturation and hue adjustment | |
589 * \param uvsin used for saturation and hue adjustment | |
590 * | |
591 * ATI called this fragment shader, but the name is confusing in the | |
592 * light of a very different OpenGL 2.0 extension with the same name | |
593 */ | |
594 static void glSetupYUVCombinersATI(float uvcos, float uvsin) { | |
595 GLfloat ucoef[4]; | |
596 GLfloat vcoef[4]; | |
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 | 604 glGetIntegerv(GL_NUM_FRAGMENT_REGISTERS_ATI, &i); |
605 if (i < 3) | |
606 mp_msg(MSGT_VO, MSGL_ERR, | |
607 "[gl] 3 registers needed for YUV combiner (ATI) support (found %i)\n", i); | |
608 glGetIntegerv (GL_MAX_TEXTURE_UNITS, &i); | |
609 if (i < 3) | |
610 mp_msg(MSGT_VO, MSGL_ERR, | |
611 "[gl] 3 texture units needed for YUV combiner (ATI) support (found %i)\n", i); | |
612 fillUVcoeff(ucoef, vcoef, uvcos, uvsin); | |
613 BeginFragmentShader(); | |
614 SetFragmentShaderConstant(GL_CON_0_ATI, ucoef); | |
615 SetFragmentShaderConstant(GL_CON_1_ATI, vcoef); | |
616 SampleMap(GL_REG_0_ATI, GL_TEXTURE0, GL_SWIZZLE_STR_ATI); | |
617 SampleMap(GL_REG_1_ATI, GL_TEXTURE1, GL_SWIZZLE_STR_ATI); | |
618 SampleMap(GL_REG_2_ATI, GL_TEXTURE2, GL_SWIZZLE_STR_ATI); | |
619 // UV first, like this green component cannot overflow | |
620 ColorFragmentOp2(GL_MUL_ATI, GL_REG_1_ATI, GL_NONE, GL_NONE, | |
621 GL_REG_1_ATI, GL_NONE, GL_BIAS_BIT_ATI, | |
622 GL_CON_0_ATI, GL_NONE, GL_BIAS_BIT_ATI); | |
623 ColorFragmentOp3(GL_MAD_ATI, GL_REG_2_ATI, GL_NONE, GL_4X_BIT_ATI, | |
624 GL_REG_2_ATI, GL_NONE, GL_BIAS_BIT_ATI, | |
625 GL_CON_1_ATI, GL_NONE, GL_BIAS_BIT_ATI, | |
626 GL_REG_1_ATI, GL_NONE, GL_NONE); | |
627 ColorFragmentOp2(GL_ADD_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, | |
628 GL_REG_0_ATI, GL_NONE, GL_NONE, | |
629 GL_REG_2_ATI, GL_NONE, GL_NONE); | |
630 EndFragmentShader(); | |
631 } | |
632 | |
19221 | 633 /** |
634 * \brief helper function for gen_spline_lookup_tex | |
635 * \param x subpixel-position ((0,1) range) to calculate weights for | |
636 * \param dst where to store transformed weights, must provide space for 4 GLfloats | |
637 * | |
638 * calculates the weights and stores them after appropriate transformation | |
639 * for the scaler fragment program. | |
640 */ | |
18622 | 641 static void store_weights(float x, GLfloat *dst) { |
642 float w0 = (((-1 * x + 3) * x - 3) * x + 1) / 6; | |
643 float w1 = ((( 3 * x - 6) * x + 0) * x + 4) / 6; | |
644 float w2 = (((-3 * x + 3) * x + 3) * x + 1) / 6; | |
645 float w3 = ((( 1 * x + 0) * x + 0) * x + 0) / 6; | |
646 *dst++ = 1 + x - w1 / (w0 + w1); | |
647 *dst++ = 1 - x + w3 / (w2 + w3); | |
648 *dst++ = w0 + w1; | |
649 *dst++ = 0; | |
650 } | |
651 | |
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 | 654 /** |
655 * \brief creates the 1D lookup texture needed for fast higher-order filtering | |
656 * \param unit texture unit to attach texture to | |
657 */ | |
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 | 661 int i; |
662 for (i = 0; i < LOOKUP_BSPLINE_RES; i++) { | |
663 float x = (float)(i + 0.5) / LOOKUP_BSPLINE_RES; | |
664 store_weights(x, tp); | |
665 tp += 4; | |
666 } | |
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 | 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 | 671 glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_PRIORITY, 1.0); |
672 glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | |
673 glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | |
674 glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT); | |
675 ActiveTexture(GL_TEXTURE0); | |
676 } | |
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 | 681 #define BICUB_FILT_MAIN(textype) \ |
682 /* first y-interpolation */ \ | |
18686 | 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 | 685 "TEX a.r, coord.xyxy, texture[%c], "textype";" \ |
18622 | 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 | 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 | 692 /* x-interpolation */ \ |
693 "LRP yuv.%c, parmx.b, a.bbbb, a.aaaa;" | |
694 | |
695 static const char *bicub_filt_template_2D = | |
696 "MAD coord.xy, fragment.texcoord[%c], {%f, %f}, {0.5, 0.5};" | |
697 "TEX parmx, coord.x, texture[%c], 1D;" | |
18686 | 698 "MUL cdelta.xz, parmx.rrgg, {-%f, 0, %f, 0};" |
18622 | 699 "TEX parmy, coord.y, texture[%c], 1D;" |
18686 | 700 "MUL cdelta.yw, parmy.rrgg, {0, -%f, 0, %f};" |
18622 | 701 BICUB_FILT_MAIN("2D"); |
702 | |
703 static const char *bicub_filt_template_RECT = | |
704 "ADD coord, fragment.texcoord[%c], {0.5, 0.5};" | |
705 "TEX parmx, coord.x, texture[%c], 1D;" | |
18686 | 706 "MUL cdelta.xz, parmx.rrgg, {-1, 0, 1, 0};" |
18622 | 707 "TEX parmy, coord.y, texture[%c], 1D;" |
18686 | 708 "MUL cdelta.yw, parmy.rrgg, {0, -1, 0, 1};" |
18622 | 709 BICUB_FILT_MAIN("RECT"); |
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 | 723 "PARAM ycoef = {%.4f, %.4f, %.4f};" |
724 "PARAM ucoef = {%.4f, %.4f, %.4f};" | |
725 "PARAM vcoef = {%.4f, %.4f, %.4f};" | |
726 "PARAM offsets = {%.4f, %.4f, %.4f};" | |
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 | 732 "POW result.color.r, res.r, gamma.r;" |
733 "POW result.color.g, res.g, gamma.g;" | |
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 | 738 "PARAM ycoef = {%.4f, %.4f, %.4f, 0};" |
739 "PARAM ucoef = {%.4f, %.4f, %.4f, 0};" | |
740 "PARAM vcoef = {%.4f, %.4f, %.4f, 0};" | |
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 | 757 /** |
758 * \brief creates and initializes helper textures needed for scaling texture read | |
759 * \param scaler scaler type to create texture for | |
760 * \param texu contains next free texture unit number | |
761 * \param texs texture unit ids for the scaler are stored in this array | |
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 | 767 case YUV_SCALER_BICUB: |
768 texs[0] = (*texu)++; | |
769 gen_spline_lookup_tex(GL_TEXTURE0 + texs[0]); | |
770 texs[0] += '0'; | |
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 | 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 | 804 /** |
805 * \brief generate a 3D YUV -> RGB map | |
806 * \param map where to store map. Must provide space for (size + 2)^3 elements | |
807 * \param size size of the map, excluding border | |
808 * \param brightness desired brightness adjustment for conversion | |
809 * \param contrast desired contrast adjustment for conversion | |
810 * \param uvcos desired hue/saturation adjustment for conversion | |
811 * \param uvsin desired hue/saturation adjustment for conversion | |
812 * \param rgamma desired red gamma adjustment for conversion | |
813 * \param ggamma desired green gamma adjustment for conversion | |
814 * \param bgamma desired blue gamma adjustment for conversion | |
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 | 865 /** |
866 * \brief creates and initializes helper textures needed for yuv conversion | |
867 * \param texu contains next free texture unit number | |
868 * \param texs texture unit ids for the conversion are stored in this array | |
869 * \param brightness desired brightness adjustment for conversion | |
870 * \param contrast desired contrast adjustment for conversion | |
871 * \param uvcos desired hue/saturation adjustment for conversion | |
872 * \param uvsin desired hue/saturation adjustment for conversion | |
873 * \param rgamma desired red gamma adjustment for conversion | |
874 * \param ggamma desired green gamma adjustment for conversion | |
875 * \param bgamma desired blue gamma adjustment for conversion | |
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 | 878 float brightness, float contrast, float uvcos, float uvsin, |
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 | 932 /** |
933 * \brief adds a scaling texture read at the current fragment program position | |
934 * \param scaler type of scaler to insert | |
935 * \param prog_pos current position in fragment program | |
936 * \param remain how many bytes remain in the buffer given by prog_pos | |
937 * \param texs array containing the texture unit identifiers for this scaler | |
938 * \param in_tex texture unit the scaler should read from | |
939 * \param out_comp component of the yuv variable the scaler stores the result in | |
940 * \param rect if rectangular (pixel) adressing should be used for in_tex | |
941 * \param texw width of the in_tex texture | |
942 * \param texh height of the in_tex texture | |
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 | 951 case YUV_SCALER_BICUB: |
952 if (rect) | |
953 snprintf(*prog_pos, *remain, bicub_filt_template_RECT, | |
954 in_tex, texs[0], texs[0], | |
955 in_tex, in_tex, in_tex, in_tex, in_tex, in_tex, out_comp); | |
956 else | |
957 snprintf(*prog_pos, *remain, bicub_filt_template_2D, | |
958 in_tex, (float)texw, (float)texh, | |
959 texs[0], (float)1.0 / texw, (float)1.0 / texw, | |
960 texs[0], (float)1.0 / texh, (float)1.0 / texh, | |
961 in_tex, in_tex, in_tex, in_tex, in_tex, in_tex, out_comp); | |
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 | 990 /** |
991 * \brief load the specified GPU Program | |
992 * \param target program target to load into, only GL_FRAGMENT_PROGRAM is tested | |
993 * \param prog program string | |
994 * \return 1 on success, 0 otherwise | |
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 | 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 | 1141 void glSetupYUVConversion(GLenum target, int type, |
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 | 1152 case YUV_CONVERSION_COMBINERS_ATI: |
1153 glSetupYUVCombinersATI(uvcos, uvsin); | |
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 | 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 | 1186 case YUV_CONVERSION_COMBINERS_ATI: |
1187 ActiveTexture(GL_TEXTURE1); | |
1188 glEnable(target); | |
1189 ActiveTexture(GL_TEXTURE2); | |
1190 glEnable(target); | |
1191 ActiveTexture(GL_TEXTURE0); | |
1192 glEnable(GL_FRAGMENT_SHADER_ATI); | |
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 | 1220 case YUV_CONVERSION_COMBINERS_ATI: |
1221 ActiveTexture(GL_TEXTURE1); | |
1222 glDisable(target); | |
1223 ActiveTexture(GL_TEXTURE2); | |
1224 glDisable(target); | |
1225 ActiveTexture(GL_TEXTURE0); | |
1226 glDisable(GL_FRAGMENT_SHADER_ATI); | |
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 | 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 | 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 | 1262 if (flip) { |
1263 y += h; | |
1264 h = -h; | |
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 | 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 |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1341 vo_window = win; |
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 | 1370 |
1371 void swapGlBuffers() { | |
1372 SwapBuffers(vo_hdc); | |
1373 } | |
14142
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1374 #else |
16117 | 1375 #ifdef HAVE_LIBDL |
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 | 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 | 1386 static void *getdladdr(const char *s) { |
16117 | 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 | 1389 static void *handle = NULL; |
1390 if (!handle) | |
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 | 1396 #else |
1397 return NULL; | |
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 | 1401 /** |
14269 | 1402 * \brief Returns the XVisualInfo associated with Window win. |
13843 | 1403 * \param win Window whose XVisualInfo is returne. |
1404 * \return XVisualInfo of the window. Caller must use XFree to free it. | |
1405 */ | |
1406 static XVisualInfo *getWindowVisualInfo(Window win) { | |
1407 XWindowAttributes xw_attr; | |
1408 XVisualInfo vinfo_template; | |
1409 int tmp; | |
1410 XGetWindowAttributes(mDisplay, win, &xw_attr); | |
1411 vinfo_template.visualid = XVisualIDFromVisual(xw_attr.visual); | |
1412 return XGetVisualInfo(mDisplay, VisualIDMask, &vinfo_template, &tmp); | |
1413 } | |
1414 | |
1415 /** | |
1416 * \brief Changes the window in which video is displayed. | |
1417 * If possible only transfers the context to the new window, otherwise | |
1418 * creates a new one, which must be initialized by the caller. | |
1419 * \param vinfo Currently used visual. | |
1420 * \param context Currently used context. | |
1421 * \param win window that should be used for drawing. | |
1422 * \return one of SET_WINDOW_FAILED, SET_WINDOW_OK or SET_WINDOW_REINIT. | |
1423 * In case of SET_WINDOW_REINIT the context could not be transfered | |
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 | 1426 */ |
1427 int setGlWindow(XVisualInfo **vinfo, GLXContext *context, Window win) | |
1428 { | |
1429 XVisualInfo *new_vinfo; | |
1430 GLXContext new_context = NULL; | |
1431 int keep_context = 0; | |
1432 | |
1433 // should only be needed when keeping context, but not doing glFinish | |
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 | 1436 glFinish(); |
1437 new_vinfo = getWindowVisualInfo(win); | |
1438 if (*context && *vinfo && new_vinfo && | |
1439 (*vinfo)->visualid == new_vinfo->visualid) { | |
1440 // we can keep the GLXContext | |
1441 new_context = *context; | |
1442 XFree(new_vinfo); | |
1443 new_vinfo = *vinfo; | |
1444 keep_context = 1; | |
1445 } else { | |
1446 // create a context | |
1447 new_context = glXCreateContext(mDisplay, new_vinfo, NULL, True); | |
1448 if (!new_context) { | |
1449 mp_msg(MSGT_VO, MSGL_FATAL, "[gl] Could not create GLX context!\n"); | |
1450 XFree(new_vinfo); | |
1451 return SET_WINDOW_FAILED; | |
1452 } | |
1453 } | |
1454 | |
1455 // set context | |
1456 if (!glXMakeCurrent(mDisplay, vo_window, new_context)) { | |
1457 mp_msg (MSGT_VO, MSGL_FATAL, "[gl] Could not set GLX context!\n"); | |
1458 if (!keep_context) { | |
1459 glXDestroyContext (mDisplay, new_context); | |
1460 XFree(new_vinfo); | |
1461 } | |
1462 return SET_WINDOW_FAILED; | |
1463 } | |
1464 | |
1465 // set new values | |
1466 vo_window = win; | |
1467 { | |
1468 Window root; | |
1469 int tmp; | |
17336 | 1470 unsigned utmp; |
13843 | 1471 XGetGeometry(mDisplay, vo_window, &root, &tmp, &tmp, |
17336 | 1472 (unsigned *)&vo_dwidth, (unsigned *)&vo_dheight, &utmp, &utmp); |
13843 | 1473 } |
1474 if (!keep_context) { | |
16588 | 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 | 1477 if (*context) |
1478 glXDestroyContext(mDisplay, *context); | |
1479 *context = new_context; | |
1480 if (*vinfo) | |
1481 XFree(*vinfo); | |
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 | 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 | 1491 |
1492 // and inform that reinit is neccessary | |
1493 return SET_WINDOW_REINIT; | |
1494 } | |
1495 return SET_WINDOW_OK; | |
1496 } | |
1497 | |
1498 /** | |
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 | 1501 */ |
1502 void releaseGlContext(XVisualInfo **vinfo, GLXContext *context) { | |
1503 if (*vinfo) | |
1504 XFree(*vinfo); | |
1505 *vinfo = NULL; | |
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 | 1510 glXDestroyContext(mDisplay, *context); |
14089
00283cb37fd0
Make the context not current before destroying it.
reimar
parents:
14078
diff
changeset
|
1511 } |
13843 | 1512 *context = 0; |
1513 } | |
17116 | 1514 |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
17419
diff
changeset
|
1515 void swapGlBuffers(void) { |
17116 | 1516 glXSwapBuffers(mDisplay, vo_window); |
1517 } | |
13843 | 1518 #endif |
1519 |