Mercurial > mplayer.hg
annotate libvo/gl_common.c @ 27524:39937f39cb2d
Make internal Matroska demuxer default again
Undo Aurelien's previous commit which made the lavf demuxer the
default. SSA/ASS subtitles do not work properly with the lavf demuxer
at the moment. That's much more important than any issues with the
internal demuxer. The internal demuxer must remain the default at least
until the subtitle issues are resolved.
author | uau |
---|---|
date | Tue, 09 Sep 2008 14:45:50 +0000 |
parents | d97a607821f1 |
children | 53b5cf466361 |
rev | line source |
---|---|
27509
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
1 /* |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
2 * common OpenGL routines |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
3 * |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
4 * copyleft (C) 2005 Reimar Döffinger <Reimar.Doeffinger@stud.uni-karlsruhe.de> |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
5 * Special thanks go to the xine team and Matthias Hopf, whose video_out_opengl.c |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
6 * gave me lots of good ideas. |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
7 * |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
8 * This file is part of MPlayer. |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
9 * |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
10 * MPlayer is free software; you can redistribute it and/or modify |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
11 * it under the terms of the GNU General Public License as published by |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
12 * the Free Software Foundation; either version 2 of the License, or |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
13 * (at your option) any later version. |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
14 * |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
15 * MPlayer is distributed in the hope that it will be useful, |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
18 * GNU General Public License for more details. |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
19 * |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
20 * You should have received a copy of the GNU General Public License along |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
21 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
23 */ |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
24 |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
25 /** |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
26 * \file gl_common.c |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
27 * \brief OpenGL helper functions used by vo_gl.c and vo_gl2.c |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
28 */ |
27509
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
26839
diff
changeset
|
29 |
16117 | 30 #include <stdlib.h> |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
31 #include <stdio.h> |
16117 | 32 #include <string.h> |
16592 | 33 #include <ctype.h> |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
34 #include <math.h> |
13653
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff
changeset
|
35 #include "gl_common.h" |
26839 | 36 #include "libavutil/common.h" |
13653
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff
changeset
|
37 |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
38 /** |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
39 * \defgroup glextfunctions OpenGL extension functions |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
40 * |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
41 * 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
|
42 * context is created |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
43 * \{ |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
44 */ |
16233
f00a2826ee11
use GenBuffers to get a buffer number instead of hardcoding 1.
reimar
parents:
16223
diff
changeset
|
45 void (APIENTRY *GenBuffers)(GLsizei, GLuint *); |
f00a2826ee11
use GenBuffers to get a buffer number instead of hardcoding 1.
reimar
parents:
16223
diff
changeset
|
46 void (APIENTRY *DeleteBuffers)(GLsizei, const GLuint *); |
16099 | 47 void (APIENTRY *BindBuffer)(GLenum, GLuint); |
48 GLvoid* (APIENTRY *MapBuffer)(GLenum, GLenum); | |
49 GLboolean (APIENTRY *UnmapBuffer)(GLenum); | |
16109
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
50 void (APIENTRY *BufferData)(GLenum, intptr_t, const GLvoid *, GLenum); |
16099 | 51 void (APIENTRY *CombinerParameterfv)(GLenum, const GLfloat *); |
52 void (APIENTRY *CombinerParameteri)(GLenum, GLint); | |
53 void (APIENTRY *CombinerInput)(GLenum, GLenum, GLenum, GLenum, GLenum, | |
54 GLenum); | |
55 void (APIENTRY *CombinerOutput)(GLenum, GLenum, GLenum, GLenum, GLenum, | |
56 GLenum, GLenum, GLboolean, GLboolean, | |
57 GLboolean); | |
16625 | 58 void (APIENTRY *BeginFragmentShader)(void); |
59 void (APIENTRY *EndFragmentShader)(void); | |
60 void (APIENTRY *SampleMap)(GLuint, GLuint, GLenum); | |
61 void (APIENTRY *ColorFragmentOp2)(GLenum, GLuint, GLuint, GLuint, GLuint, | |
62 GLuint, GLuint, GLuint, GLuint, GLuint); | |
63 void (APIENTRY *ColorFragmentOp3)(GLenum, GLuint, GLuint, GLuint, GLuint, | |
64 GLuint, GLuint, GLuint, GLuint, GLuint, | |
65 GLuint, GLuint, GLuint); | |
66 void (APIENTRY *SetFragmentShaderConstant)(GLuint, const GLfloat *); | |
16099 | 67 void (APIENTRY *ActiveTexture)(GLenum); |
68 void (APIENTRY *BindTexture)(GLenum, GLuint); | |
69 void (APIENTRY *MultiTexCoord2f)(GLenum, GLfloat, GLfloat); | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
70 void (APIENTRY *GenPrograms)(GLsizei, GLuint *); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
71 void (APIENTRY *DeletePrograms)(GLsizei, const GLuint *); |
16099 | 72 void (APIENTRY *BindProgram)(GLenum, GLuint); |
73 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
|
74 void (APIENTRY *GetProgramiv)(GLenum, GLenum, GLint *); |
16099 | 75 void (APIENTRY *ProgramEnvParameter4f)(GLenum, GLuint, GLfloat, GLfloat, |
76 GLfloat, GLfloat); | |
16270 | 77 int (APIENTRY *SwapInterval)(int); |
18578 | 78 void (APIENTRY *TexImage3D)(GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, |
79 GLint, GLenum, GLenum, const GLvoid *); | |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
80 /** \} */ // end of glextfunctions group |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
81 |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
82 //! \defgroup glgeneral OpenGL general helper functions |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
83 |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
84 //! \defgroup glcontext OpenGL context management helper functions |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
85 |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
86 //! \defgroup gltexture OpenGL texture handling helper functions |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
87 |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
88 //! \defgroup glconversion OpenGL conversion helper functions |
16099 | 89 |
18961 | 90 static GLint hqtexfmt; |
91 | |
13653
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff
changeset
|
92 /** |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
93 * \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
|
94 * \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
|
95 * \ingroup glgeneral |
13653
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff
changeset
|
96 */ |
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff
changeset
|
97 void glAdjustAlignment(int stride) { |
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff
changeset
|
98 GLint gl_alignment; |
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff
changeset
|
99 if (stride % 8 == 0) |
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff
changeset
|
100 gl_alignment=8; |
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff
changeset
|
101 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
|
102 gl_alignment=4; |
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff
changeset
|
103 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
|
104 gl_alignment=2; |
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff
changeset
|
105 else |
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff
changeset
|
106 gl_alignment=1; |
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff
changeset
|
107 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
|
108 } |
799f81d3cb19
added gl_common for code used by both vo_gl.c and vo_gl2.c.
reimar
parents:
diff
changeset
|
109 |
14078
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
110 struct gl_name_map_struct { |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
111 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
|
112 const char *name; |
14078
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
113 }; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
114 |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
115 #undef MAP |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
116 #define MAP(a) {a, #a} |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
117 //! mapping table for the glValName function |
14078
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
118 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
|
119 // internal format |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
120 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
|
121 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
|
122 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
|
123 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
|
124 |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
125 // format |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
126 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
|
127 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
|
128 MAP(GL_COLOR_INDEX), |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
129 // rest 1.2 only |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
130 MAP(GL_BGR), MAP(GL_BGRA), |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
131 |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
132 //type |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
133 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
|
134 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
|
135 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
|
136 // rest 1.2 only |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
137 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
|
138 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
|
139 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
|
140 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
|
141 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
|
142 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
|
143 {0, 0} |
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 #undef MAP |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
146 |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
147 /** |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
148 * \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
|
149 * \param value the constant |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
150 * \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
|
151 * \ingroup glgeneral |
14078
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
152 */ |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
153 const char *glValName(GLint value) |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
154 { |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
155 int i = 0; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
156 |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
157 while (gl_name_map[i].name) { |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
158 if (gl_name_map[i].value == value) |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
159 return gl_name_map[i].name; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
160 i++; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
161 } |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
162 return "Unknown format!"; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
163 } |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
164 |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
165 //! 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
|
166 #define TEXTUREFORMAT_ALWAYS GL_RGB8 |
16474 | 167 #undef TEXTUREFORMAT_ALWAYS |
14078
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
168 |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
169 /** |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
170 * \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
|
171 * |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
172 * All parameters may be NULL. |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
173 * \param fmt MPlayer format to analyze. |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
174 * \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
|
175 * \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
|
176 * 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
|
177 * \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
|
178 * \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
|
179 * \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
|
180 * \ingroup gltexture |
14078
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
181 */ |
16879
6ea220b10e8e
More consistent and sane types. Also avoids some gcc 4 warnings.
reimar
parents:
16648
diff
changeset
|
182 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
|
183 GLenum *gl_format, GLenum *gl_type) |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
184 { |
16474 | 185 int supported = 1; |
14078
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
186 int dummy1; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
187 GLenum dummy2; |
16303
a87c6cf3fe52
Fix texture format variable types. Internal format is GLint, others are GLenum
reimar
parents:
16270
diff
changeset
|
188 GLint dummy3; |
14078
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
189 if (bpp == NULL) bpp = &dummy1; |
16303
a87c6cf3fe52
Fix texture format variable types. Internal format is GLint, others are GLenum
reimar
parents:
16270
diff
changeset
|
190 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
|
191 if (gl_format == NULL) gl_format = &dummy2; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
192 if (gl_type == NULL) gl_type = &dummy2; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
193 |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
194 *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
|
195 *gl_texfmt = 3; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
196 switch (fmt) { |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
197 case IMGFMT_RGB24: |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
198 *gl_format = GL_RGB; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
199 *gl_type = GL_UNSIGNED_BYTE; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
200 break; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
201 case IMGFMT_RGBA: |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
202 *gl_texfmt = 4; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
203 *gl_format = GL_RGBA; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
204 *gl_type = GL_UNSIGNED_BYTE; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
205 break; |
16474 | 206 case IMGFMT_YV12: |
207 supported = 0; // no native YV12 support | |
14078
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
208 case IMGFMT_Y800: |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
209 case IMGFMT_Y8: |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
210 *gl_texfmt = 1; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
211 *bpp = 8; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
212 *gl_format = GL_LUMINANCE; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
213 *gl_type = GL_UNSIGNED_BYTE; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
214 break; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
215 #if 0 |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
216 // 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
|
217 // swscale produces works |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
218 case IMGFMT_RGB8: |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
219 gl_format = GL_RGB; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
220 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
|
221 break; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
222 #endif |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
223 case IMGFMT_RGB15: |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
224 *gl_format = GL_RGBA; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
225 *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
|
226 break; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
227 case IMGFMT_RGB16: |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
228 *gl_format = GL_RGB; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
229 *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
|
230 break; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
231 #if 0 |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
232 case IMGFMT_BGR8: |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
233 // 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
|
234 // 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
|
235 // 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
|
236 // 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
|
237 gl_format = GL_RGB; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
238 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
|
239 break; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
240 #endif |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
241 case IMGFMT_BGR15: |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
242 *gl_format = GL_BGRA; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
243 *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
|
244 break; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
245 case IMGFMT_BGR16: |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
246 *gl_format = GL_RGB; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
247 *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
|
248 break; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
249 case IMGFMT_BGR24: |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
250 *gl_format = GL_BGR; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
251 *gl_type = GL_UNSIGNED_BYTE; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
252 break; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
253 case IMGFMT_BGRA: |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
254 *gl_texfmt = 4; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
255 *gl_format = GL_BGRA; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
256 *gl_type = GL_UNSIGNED_BYTE; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
257 break; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
258 default: |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
259 *gl_texfmt = 4; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
260 *gl_format = GL_RGBA; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
261 *gl_type = GL_UNSIGNED_BYTE; |
16474 | 262 supported = 0; |
14078
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
263 } |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
264 #ifdef TEXTUREFORMAT_ALWAYS |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
265 *gl_texfmt = TEXTUREFORMAT_ALWAYS; |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
266 #endif |
16474 | 267 return supported; |
14078
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
268 } |
c4033dcb986f
More similar code from gl and gl2 moved to gl_common
reimar
parents:
13843
diff
changeset
|
269 |
16099 | 270 static void *setNull(const GLubyte *s) { |
271 return NULL; | |
272 } | |
273 | |
17335 | 274 typedef struct { |
25762 | 275 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
|
276 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
|
277 const char *funcnames[7]; |
17335 | 278 } extfunc_desc_t; |
279 | |
280 static const extfunc_desc_t extfuncs[] = { | |
25762 | 281 {&GenBuffers, NULL, {"glGenBuffers", "glGenBuffersARB", NULL}}, |
282 {&DeleteBuffers, NULL, {"glDeleteBuffers", "glDeleteBuffersARB", NULL}}, | |
283 {&BindBuffer, NULL, {"glBindBuffer", "glBindBufferARB", NULL}}, | |
284 {&MapBuffer, NULL, {"glMapBuffer", "glMapBufferARB", NULL}}, | |
285 {&UnmapBuffer, NULL, {"glUnmapBuffer", "glUnmapBufferARB", NULL}}, | |
286 {&BufferData, NULL, {"glBufferData", "glBufferDataARB", NULL}}, | |
287 {&CombinerParameterfv, "NV_register_combiners", {"glCombinerParameterfv", "glCombinerParameterfvNV", NULL}}, | |
288 {&CombinerParameteri, "NV_register_combiners", {"glCombinerParameteri", "glCombinerParameteriNV", NULL}}, | |
289 {&CombinerInput, "NV_register_combiners", {"glCombinerInput", "glCombinerInputNV", NULL}}, | |
290 {&CombinerOutput, "NV_register_combiners", {"glCombinerOutput", "glCombinerOutputNV", NULL}}, | |
291 {&BeginFragmentShader, "ATI_fragment_shader", {"glBeginFragmentShaderATI", NULL}}, | |
292 {&EndFragmentShader, "ATI_fragment_shader", {"glEndFragmentShaderATI", NULL}}, | |
293 {&SampleMap, "ATI_fragment_shader", {"glSampleMapATI", NULL}}, | |
294 {&ColorFragmentOp2, "ATI_fragment_shader", {"glColorFragmentOp2ATI", NULL}}, | |
295 {&ColorFragmentOp3, "ATI_fragment_shader", {"glColorFragmentOp3ATI", NULL}}, | |
296 {&SetFragmentShaderConstant, "ATI_fragment_shader", {"glSetFragmentShaderConstantATI", NULL}}, | |
297 {&ActiveTexture, NULL, {"glActiveTexture", "glActiveTextureARB", NULL}}, | |
298 {&BindTexture, NULL, {"glBindTexture", "glBindTextureARB", "glBindTextureEXT", NULL}}, | |
299 {&MultiTexCoord2f, NULL, {"glMultiTexCoord2f", "glMultiTexCoord2fARB", NULL}}, | |
300 {&GenPrograms, "_program", {"glGenProgramsARB", NULL}}, | |
301 {&DeletePrograms, "_program", {"glDeleteProgramsARB", NULL}}, | |
302 {&BindProgram, "_program", {"glBindProgramARB", NULL}}, | |
303 {&ProgramString, "_program", {"glProgramStringARB", NULL}}, | |
304 {&GetProgramiv, "_program", {"glGetProgramivARB", NULL}}, | |
305 {&ProgramEnvParameter4f, "_program", {"glProgramEnvParameter4fARB", NULL}}, | |
306 {&SwapInterval, "_swap_control", {"glXSwapInterval", "glXSwapIntervalEXT", "glXSwapIntervalSGI", "wglSwapInterval", "wglSwapIntervalEXT", "wglSwapIntervalSGI", NULL}}, | |
307 {&TexImage3D, NULL, {"glTexImage3D", NULL}}, | |
17335 | 308 {NULL} |
309 }; | |
310 | |
16117 | 311 /** |
312 * \brief find the function pointers of some useful OpenGL extensions | |
16588 | 313 * \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
|
314 * \param ext2 an extra extension string |
16117 | 315 */ |
17019
fd178c06dc84
Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents:
16984
diff
changeset
|
316 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
|
317 const char *ext2) { |
17335 | 318 const extfunc_desc_t *dsc; |
17336 | 319 const char *extensions = (const char *)glGetString(GL_EXTENSIONS); |
17335 | 320 char *allexts; |
17019
fd178c06dc84
Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents:
16984
diff
changeset
|
321 if (!extensions) extensions = ""; |
fd178c06dc84
Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents:
16984
diff
changeset
|
322 if (!ext2) ext2 = ""; |
18878 | 323 allexts = malloc(strlen(extensions) + strlen(ext2) + 2); |
17335 | 324 strcpy(allexts, extensions); |
325 strcat(allexts, " "); | |
326 strcat(allexts, ext2); | |
18495
56e78892c895
show OpenGL extension string with -v, very helpful for debugging
reimar
parents:
18494
diff
changeset
|
327 mp_msg(MSGT_VO, MSGL_V, "OpenGL extensions string:\n%s\n", allexts); |
16099 | 328 if (!getProcAddress) |
329 getProcAddress = setNull; | |
17335 | 330 for (dsc = extfuncs; dsc->funcptr; dsc++) { |
331 void *ptr = NULL; | |
332 int i; | |
333 if (!dsc->extstr || strstr(allexts, dsc->extstr)) { | |
334 for (i = 0; !ptr && dsc->funcnames[i]; i++) | |
335 ptr = getProcAddress((const GLubyte *)dsc->funcnames[i]); | |
336 } | |
25762 | 337 *(void **)dsc->funcptr = ptr; |
16984
94b70ab52695
disable *SwapInterval function when extensions are missing, since it
reimar
parents:
16944
diff
changeset
|
338 } |
18961 | 339 if (strstr(allexts, "_texture_float")) |
340 hqtexfmt = GL_RGB32F; | |
341 else if (strstr(allexts, "NV_float_buffer")) | |
342 hqtexfmt = GL_FLOAT_RGB32_NV; | |
343 else | |
344 hqtexfmt = GL_RGB16; | |
17335 | 345 free(allexts); |
16099 | 346 } |
347 | |
16117 | 348 /** |
349 * \brief create a texture and set some defaults | |
350 * \param target texture taget, usually GL_TEXTURE_2D | |
351 * \param fmt internal texture format | |
352 * \param filter filter used for scaling, e.g. GL_LINEAR | |
353 * \param w texture width | |
354 * \param h texture height | |
355 * \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
|
356 * \ingroup gltexture |
16117 | 357 */ |
358 void glCreateClearTex(GLenum target, GLenum fmt, GLint filter, | |
16460 | 359 int w, int h, unsigned char val) { |
360 GLfloat fval = (GLfloat)val / 255.0; | |
361 GLfloat border[4] = {fval, fval, fval, fval}; | |
16117 | 362 GLenum clrfmt = (fmt == GL_ALPHA) ? GL_ALPHA : GL_LUMINANCE; |
18878 | 363 char *init = malloc(w * h); |
16117 | 364 memset(init, val, w * h); |
365 glAdjustAlignment(w); | |
366 glPixelStorei(GL_UNPACK_ROW_LENGTH, w); | |
367 glTexImage2D(target, 0, fmt, w, h, 0, clrfmt, GL_UNSIGNED_BYTE, init); | |
368 glTexParameterf(target, GL_TEXTURE_PRIORITY, 1.0); | |
369 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, filter); | |
370 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
|
371 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
|
372 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
|
373 // 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
|
374 // 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
|
375 glTexParameterfv(target, GL_TEXTURE_BORDER_COLOR, border); |
16117 | 376 free(init); |
377 } | |
378 | |
379 /** | |
16592 | 380 * \brief skips whitespace and comments |
381 * \param f file to read from | |
382 */ | |
383 static void ppm_skip(FILE *f) { | |
384 int c, comment = 0; | |
385 do { | |
386 c = fgetc(f); | |
387 if (c == '#') | |
388 comment = 1; | |
389 if (c == '\n') | |
390 comment = 0; | |
391 } while (c != EOF && (isspace(c) || comment)); | |
392 if (c != EOF) | |
393 ungetc(c, f); | |
394 } | |
395 | |
18175
01ca8a5fb8a6
minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents:
17566
diff
changeset
|
396 #define MAXDIM (16 * 1024) |
01ca8a5fb8a6
minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents:
17566
diff
changeset
|
397 |
16592 | 398 /** |
399 * \brief creates a texture from a PPM file | |
400 * \param target texture taget, usually GL_TEXTURE_2D | |
18961 | 401 * \param fmt internal texture format, 0 for default |
16592 | 402 * \param filter filter used for scaling, e.g. GL_LINEAR |
403 * \param f file to read PPM from | |
404 * \param width [out] width of texture | |
405 * \param height [out] height of texture | |
406 * \param maxval [out] maxval value from PPM file | |
407 * \return 0 on error, 1 otherwise | |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
408 * \ingroup gltexture |
16592 | 409 */ |
410 int glCreatePPMTex(GLenum target, GLenum fmt, GLint filter, | |
411 FILE *f, int *width, int *height, int *maxval) { | |
18961 | 412 unsigned w, h, m, val, bpp; |
16592 | 413 char *data; |
414 ppm_skip(f); | |
415 if (fgetc(f) != 'P' || fgetc(f) != '6') | |
416 return 0; | |
417 ppm_skip(f); | |
18175
01ca8a5fb8a6
minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents:
17566
diff
changeset
|
418 if (fscanf(f, "%u", &w) != 1) |
16592 | 419 return 0; |
420 ppm_skip(f); | |
18175
01ca8a5fb8a6
minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents:
17566
diff
changeset
|
421 if (fscanf(f, "%u", &h) != 1) |
16592 | 422 return 0; |
423 ppm_skip(f); | |
18175
01ca8a5fb8a6
minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents:
17566
diff
changeset
|
424 if (fscanf(f, "%u", &m) != 1) |
16592 | 425 return 0; |
426 val = fgetc(f); | |
427 if (!isspace(val)) | |
428 return 0; | |
18175
01ca8a5fb8a6
minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents:
17566
diff
changeset
|
429 if (w > MAXDIM || h > MAXDIM) |
01ca8a5fb8a6
minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents:
17566
diff
changeset
|
430 return 0; |
18961 | 431 bpp = (m > 255) ? 6 : 3; |
432 data = malloc(w * h * bpp); | |
433 if (fread(data, w * bpp, h, f) != h) | |
16592 | 434 return 0; |
18961 | 435 if (!fmt) { |
436 fmt = (m > 255) ? hqtexfmt : 3; | |
437 if (fmt == GL_FLOAT_RGB32_NV && target != GL_TEXTURE_RECTANGLE) | |
438 fmt = GL_RGB16; | |
439 } | |
16592 | 440 glCreateClearTex(target, fmt, filter, w, h, 0); |
18961 | 441 glUploadTex(target, GL_RGB, (m > 255) ? GL_UNSIGNED_SHORT : GL_UNSIGNED_BYTE, |
442 data, w * bpp, 0, 0, w, h, 0); | |
16592 | 443 free(data); |
444 if (width) *width = w; | |
445 if (height) *height = h; | |
446 if (maxval) *maxval = m; | |
447 return 1; | |
448 } | |
449 | |
450 /** | |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
451 * \brief return the number of bytes per pixel for the given format |
16117 | 452 * \param format OpenGL format |
453 * \param type OpenGL type | |
454 * \return bytes per pixel | |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
455 * \ingroup glgeneral |
16117 | 456 * |
16435 | 457 * Does not handle all possible variants, just those used by MPlayer |
16117 | 458 */ |
459 int glFmt2bpp(GLenum format, GLenum type) { | |
18961 | 460 int component_size = 0; |
16117 | 461 switch (type) { |
462 case GL_UNSIGNED_BYTE_3_3_2: | |
463 case GL_UNSIGNED_BYTE_2_3_3_REV: | |
464 return 1; | |
465 case GL_UNSIGNED_SHORT_5_5_5_1: | |
466 case GL_UNSIGNED_SHORT_1_5_5_5_REV: | |
467 case GL_UNSIGNED_SHORT_5_6_5: | |
468 case GL_UNSIGNED_SHORT_5_6_5_REV: | |
469 return 2; | |
18961 | 470 case GL_UNSIGNED_BYTE: |
471 component_size = 1; | |
472 break; | |
473 case GL_UNSIGNED_SHORT: | |
474 component_size = 2; | |
475 break; | |
16117 | 476 } |
477 switch (format) { | |
478 case GL_LUMINANCE: | |
479 case GL_ALPHA: | |
18961 | 480 return component_size; |
16117 | 481 case GL_RGB: |
482 case GL_BGR: | |
18961 | 483 return 3 * component_size; |
16117 | 484 case GL_RGBA: |
485 case GL_BGRA: | |
18961 | 486 return 4 * component_size; |
16117 | 487 } |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
488 return 0; // unknown |
16117 | 489 } |
490 | |
491 /** | |
492 * \brief upload a texture, handling things like stride and slices | |
493 * \param target texture target, usually GL_TEXTURE_2D | |
494 * \param format OpenGL format of data | |
495 * \param type OpenGL type of data | |
21201 | 496 * \param dataptr data to upload |
16117 | 497 * \param stride data stride |
498 * \param x x offset in texture | |
499 * \param y y offset in texture | |
500 * \param w width of the texture part to upload | |
501 * \param h height of the texture part to upload | |
502 * \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
|
503 * \ingroup gltexture |
16117 | 504 */ |
505 void glUploadTex(GLenum target, GLenum format, GLenum type, | |
21201 | 506 const void *dataptr, int stride, |
16117 | 507 int x, int y, int w, int h, int slice) { |
21201 | 508 const uint8_t *data = dataptr; |
16117 | 509 int y_max = y + h; |
16223
f540609340ac
extra check for glUploadTex to avoid a possible hang.
reimar
parents:
16221
diff
changeset
|
510 if (w <= 0 || h <= 0) return; |
16117 | 511 if (slice <= 0) |
512 slice = h; | |
17220 | 513 if (stride < 0) { |
18988
a61ef37d3c71
Fix off-by-one error for negative strides (flipped image)
reimar
parents:
18961
diff
changeset
|
514 data += (h - 1) * stride; |
17220 | 515 stride = -stride; |
516 } | |
16117 | 517 // this is not always correct, but should work for MPlayer |
518 glAdjustAlignment(stride); | |
519 glPixelStorei(GL_UNPACK_ROW_LENGTH, stride / glFmt2bpp(format, type)); | |
520 for (; y + slice <= y_max; y += slice) { | |
521 glTexSubImage2D(target, 0, x, y, w, slice, format, type, data); | |
522 data += stride * slice; | |
523 } | |
524 if (y < y_max) | |
525 glTexSubImage2D(target, 0, x, y, w, y_max - y, format, type, data); | |
526 } | |
527 | |
16625 | 528 static void fillUVcoeff(GLfloat *ucoef, GLfloat *vcoef, |
529 float uvcos, float uvsin) { | |
530 int i; | |
531 ucoef[0] = 0 * uvcos + 1.403 * uvsin; | |
532 vcoef[0] = 0 * uvsin + 1.403 * uvcos; | |
533 ucoef[1] = -0.344 * uvcos + -0.714 * uvsin; | |
534 vcoef[1] = -0.344 * uvsin + -0.714 * uvcos; | |
535 ucoef[2] = 1.770 * uvcos + 0 * uvsin; | |
536 vcoef[2] = 1.770 * uvsin + 0 * uvcos; | |
537 ucoef[3] = 0; | |
538 vcoef[3] = 0; | |
539 // Coefficients (probably) must be in [0, 1] range, whereas they originally | |
540 // are in [-2, 2] range, so here comes the trick: | |
541 // First put them in the [-0.5, 0.5] range, then add 0.5. | |
542 // This can be undone with the HALF_BIAS and SCALE_BY_FOUR arguments | |
543 // for CombinerInput and CombinerOutput (or the respective ATI variants) | |
544 for (i = 0; i < 4; i++) { | |
545 ucoef[i] = ucoef[i] * 0.25 + 0.5; | |
546 vcoef[i] = vcoef[i] * 0.25 + 0.5; | |
547 } | |
548 } | |
549 | |
16214
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
550 /** |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
551 * \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
|
552 * \param uvcos used for saturation and hue adjustment |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
553 * \param uvsin used for saturation and hue adjustment |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
554 */ |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
555 static void glSetupYUVCombiners(float uvcos, float uvsin) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
556 GLfloat ucoef[4]; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
557 GLfloat vcoef[4]; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
558 GLint i; |
18579
fc3f25278021
Move/add checks to avoid crashes and make error messages less confusing
reimar
parents:
18578
diff
changeset
|
559 if (!CombinerInput || !CombinerOutput || |
fc3f25278021
Move/add checks to avoid crashes and make error messages less confusing
reimar
parents:
18578
diff
changeset
|
560 !CombinerParameterfv || !CombinerParameteri) { |
fc3f25278021
Move/add checks to avoid crashes and make error messages less confusing
reimar
parents:
18578
diff
changeset
|
561 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
|
562 return; |
fc3f25278021
Move/add checks to avoid crashes and make error messages less confusing
reimar
parents:
18578
diff
changeset
|
563 } |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
564 glGetIntegerv(GL_MAX_GENERAL_COMBINERS_NV, &i); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
565 if (i < 2) |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
566 mp_msg(MSGT_VO, MSGL_ERR, |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
567 "[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
|
568 glGetIntegerv (GL_MAX_TEXTURE_UNITS, &i); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
569 if (i < 3) |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
570 mp_msg(MSGT_VO, MSGL_ERR, |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
571 "[gl] 3 texture units needed for YUV combiner support (found %i)\n", i); |
16625 | 572 fillUVcoeff(ucoef, vcoef, uvcos, uvsin); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
573 CombinerParameterfv(GL_CONSTANT_COLOR0_NV, ucoef); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
574 CombinerParameterfv(GL_CONSTANT_COLOR1_NV, vcoef); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
575 |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
576 // UV first, like this green component cannot overflow |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
577 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
|
578 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
|
579 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
|
580 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
|
581 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
|
582 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
|
583 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
|
584 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
|
585 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
|
586 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
|
587 GL_FALSE, GL_FALSE); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
588 |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
589 // stage 2 |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
590 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
|
591 GL_SIGNED_IDENTITY_NV, GL_RGB); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
592 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
|
593 GL_UNSIGNED_INVERT_NV, GL_RGB); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
594 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
|
595 GL_TEXTURE0, GL_SIGNED_IDENTITY_NV, GL_RGB); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
596 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
|
597 GL_UNSIGNED_INVERT_NV, GL_RGB); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
598 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
|
599 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
|
600 GL_FALSE, GL_FALSE); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
601 |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
602 // leave final combiner stage in default mode |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
603 CombinerParameteri(GL_NUM_GENERAL_COMBINERS_NV, 2); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
604 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
605 |
16625 | 606 /** |
607 * \brief Setup ATI version of register combiners for YUV to RGB conversion. | |
608 * \param uvcos used for saturation and hue adjustment | |
609 * \param uvsin used for saturation and hue adjustment | |
610 * | |
611 * ATI called this fragment shader, but the name is confusing in the | |
612 * light of a very different OpenGL 2.0 extension with the same name | |
613 */ | |
614 static void glSetupYUVCombinersATI(float uvcos, float uvsin) { | |
615 GLfloat ucoef[4]; | |
616 GLfloat vcoef[4]; | |
617 GLint i; | |
18579
fc3f25278021
Move/add checks to avoid crashes and make error messages less confusing
reimar
parents:
18578
diff
changeset
|
618 if (!BeginFragmentShader || !EndFragmentShader || |
fc3f25278021
Move/add checks to avoid crashes and make error messages less confusing
reimar
parents:
18578
diff
changeset
|
619 !SetFragmentShaderConstant || !SampleMap || |
fc3f25278021
Move/add checks to avoid crashes and make error messages less confusing
reimar
parents:
18578
diff
changeset
|
620 !ColorFragmentOp2 || !ColorFragmentOp3) { |
fc3f25278021
Move/add checks to avoid crashes and make error messages less confusing
reimar
parents:
18578
diff
changeset
|
621 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
|
622 return; |
fc3f25278021
Move/add checks to avoid crashes and make error messages less confusing
reimar
parents:
18578
diff
changeset
|
623 } |
16625 | 624 glGetIntegerv(GL_NUM_FRAGMENT_REGISTERS_ATI, &i); |
625 if (i < 3) | |
626 mp_msg(MSGT_VO, MSGL_ERR, | |
627 "[gl] 3 registers needed for YUV combiner (ATI) support (found %i)\n", i); | |
628 glGetIntegerv (GL_MAX_TEXTURE_UNITS, &i); | |
629 if (i < 3) | |
630 mp_msg(MSGT_VO, MSGL_ERR, | |
631 "[gl] 3 texture units needed for YUV combiner (ATI) support (found %i)\n", i); | |
632 fillUVcoeff(ucoef, vcoef, uvcos, uvsin); | |
633 BeginFragmentShader(); | |
634 SetFragmentShaderConstant(GL_CON_0_ATI, ucoef); | |
635 SetFragmentShaderConstant(GL_CON_1_ATI, vcoef); | |
636 SampleMap(GL_REG_0_ATI, GL_TEXTURE0, GL_SWIZZLE_STR_ATI); | |
637 SampleMap(GL_REG_1_ATI, GL_TEXTURE1, GL_SWIZZLE_STR_ATI); | |
638 SampleMap(GL_REG_2_ATI, GL_TEXTURE2, GL_SWIZZLE_STR_ATI); | |
639 // UV first, like this green component cannot overflow | |
640 ColorFragmentOp2(GL_MUL_ATI, GL_REG_1_ATI, GL_NONE, GL_NONE, | |
641 GL_REG_1_ATI, GL_NONE, GL_BIAS_BIT_ATI, | |
642 GL_CON_0_ATI, GL_NONE, GL_BIAS_BIT_ATI); | |
643 ColorFragmentOp3(GL_MAD_ATI, GL_REG_2_ATI, GL_NONE, GL_4X_BIT_ATI, | |
644 GL_REG_2_ATI, GL_NONE, GL_BIAS_BIT_ATI, | |
645 GL_CON_1_ATI, GL_NONE, GL_BIAS_BIT_ATI, | |
646 GL_REG_1_ATI, GL_NONE, GL_NONE); | |
647 ColorFragmentOp2(GL_ADD_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, | |
648 GL_REG_0_ATI, GL_NONE, GL_NONE, | |
649 GL_REG_2_ATI, GL_NONE, GL_NONE); | |
650 EndFragmentShader(); | |
651 } | |
652 | |
19221 | 653 /** |
654 * \brief helper function for gen_spline_lookup_tex | |
655 * \param x subpixel-position ((0,1) range) to calculate weights for | |
656 * \param dst where to store transformed weights, must provide space for 4 GLfloats | |
657 * | |
658 * calculates the weights and stores them after appropriate transformation | |
659 * for the scaler fragment program. | |
660 */ | |
18622 | 661 static void store_weights(float x, GLfloat *dst) { |
662 float w0 = (((-1 * x + 3) * x - 3) * x + 1) / 6; | |
663 float w1 = ((( 3 * x - 6) * x + 0) * x + 4) / 6; | |
664 float w2 = (((-3 * x + 3) * x + 3) * x + 1) / 6; | |
665 float w3 = ((( 1 * x + 0) * x + 0) * x + 0) / 6; | |
666 *dst++ = 1 + x - w1 / (w0 + w1); | |
667 *dst++ = 1 - x + w3 / (w2 + w3); | |
668 *dst++ = w0 + w1; | |
669 *dst++ = 0; | |
670 } | |
671 | |
672 //! 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
|
673 #define LOOKUP_BSPLINE_RES (2 * 1024) |
18622 | 674 /** |
675 * \brief creates the 1D lookup texture needed for fast higher-order filtering | |
676 * \param unit texture unit to attach texture to | |
677 */ | |
678 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
|
679 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
|
680 GLfloat *tp = tex; |
18622 | 681 int i; |
682 for (i = 0; i < LOOKUP_BSPLINE_RES; i++) { | |
683 float x = (float)(i + 0.5) / LOOKUP_BSPLINE_RES; | |
684 store_weights(x, tp); | |
685 tp += 4; | |
686 } | |
687 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
|
688 store_weights(1, &tex[4 * (LOOKUP_BSPLINE_RES - 1)]); |
18622 | 689 ActiveTexture(unit); |
18693
a4a6b2cf5022
Do not use border for bicubic filter helper texture, since it will cause ATI
reimar
parents:
18686
diff
changeset
|
690 glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA16, LOOKUP_BSPLINE_RES, 0, GL_RGBA, GL_FLOAT, tex); |
18622 | 691 glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_PRIORITY, 1.0); |
692 glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | |
693 glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | |
694 glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT); | |
695 ActiveTexture(GL_TEXTURE0); | |
696 } | |
697 | |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
698 static const char *bilin_filt_template = |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
699 "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
|
700 |
18622 | 701 #define BICUB_FILT_MAIN(textype) \ |
702 /* first y-interpolation */ \ | |
18686 | 703 "ADD coord, fragment.texcoord[%c].xyxy, cdelta.xyxw;" \ |
18787
5a2e45cd754f
reduce number of texture indirections to support older cards
reimar
parents:
18693
diff
changeset
|
704 "ADD coord2, fragment.texcoord[%c].xyxy, cdelta.zyzw;" \ |
18686 | 705 "TEX a.r, coord.xyxy, texture[%c], "textype";" \ |
18622 | 706 "TEX a.g, coord.zwzw, texture[%c], "textype";" \ |
18787
5a2e45cd754f
reduce number of texture indirections to support older cards
reimar
parents:
18693
diff
changeset
|
707 /* second y-interpolation */ \ |
5a2e45cd754f
reduce number of texture indirections to support older cards
reimar
parents:
18693
diff
changeset
|
708 "TEX b.r, coord2.xyxy, texture[%c], "textype";" \ |
5a2e45cd754f
reduce number of texture indirections to support older cards
reimar
parents:
18693
diff
changeset
|
709 "TEX b.g, coord2.zwzw, texture[%c], "textype";" \ |
18622 | 710 "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
|
711 "LRP a.a, parmy.b, b.rrrr, b.gggg;" \ |
18622 | 712 /* x-interpolation */ \ |
713 "LRP yuv.%c, parmx.b, a.bbbb, a.aaaa;" | |
714 | |
715 static const char *bicub_filt_template_2D = | |
716 "MAD coord.xy, fragment.texcoord[%c], {%f, %f}, {0.5, 0.5};" | |
717 "TEX parmx, coord.x, texture[%c], 1D;" | |
18686 | 718 "MUL cdelta.xz, parmx.rrgg, {-%f, 0, %f, 0};" |
18622 | 719 "TEX parmy, coord.y, texture[%c], 1D;" |
18686 | 720 "MUL cdelta.yw, parmy.rrgg, {0, -%f, 0, %f};" |
18622 | 721 BICUB_FILT_MAIN("2D"); |
722 | |
723 static const char *bicub_filt_template_RECT = | |
724 "ADD coord, fragment.texcoord[%c], {0.5, 0.5};" | |
725 "TEX parmx, coord.x, texture[%c], 1D;" | |
18686 | 726 "MUL cdelta.xz, parmx.rrgg, {-1, 0, 1, 0};" |
18622 | 727 "TEX parmy, coord.y, texture[%c], 1D;" |
18686 | 728 "MUL cdelta.yw, parmy.rrgg, {0, -1, 0, 1};" |
18622 | 729 BICUB_FILT_MAIN("RECT"); |
730 | |
24318
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
731 #define CALCWEIGHTS(t, s) \ |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
732 "MAD "t", {-0.5, 0.1666, 0.3333, -0.3333}, "s", {1, 0, -0.5, 0.5};" \ |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
733 "MAD "t", "t", "s", {0, 0, -0.5, 0.5};" \ |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
734 "MAD "t", "t", "s", {-0.6666, 0, 0.8333, 0.1666};" \ |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
735 "RCP a.x, "t".z;" \ |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
736 "RCP a.y, "t".w;" \ |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
737 "MAD "t".xy, "t".xyxy, a.xyxy, {1, 1, 0, 0};" \ |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
738 "ADD "t".x, "t".xxxx, "s";" \ |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
739 "SUB "t".y, "t".yyyy, "s";" |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
740 |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
741 static const char *bicub_notex_filt_template_2D = |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
742 "MAD coord.xy, fragment.texcoord[%c], {%f, %f}, {0.5, 0.5};" |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
743 "FRC coord.xy, coord.xyxy;" |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
744 CALCWEIGHTS("parmx", "coord.xxxx") |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
745 "MUL cdelta.xz, parmx.rrgg, {-%f, 0, %f, 0};" |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
746 CALCWEIGHTS("parmy", "coord.yyyy") |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
747 "MUL cdelta.yw, parmy.rrgg, {0, -%f, 0, %f};" |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
748 BICUB_FILT_MAIN("2D"); |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
749 |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
750 static const char *bicub_notex_filt_template_RECT = |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
751 "ADD coord, fragment.texcoord[%c], {0.5, 0.5};" |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
752 "FRC coord.xy, coord.xyxy;" |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
753 CALCWEIGHTS("parmx", "coord.xxxx") |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
754 "MUL cdelta.xz, parmx.rrgg, {-1, 0, 1, 0};" |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
755 CALCWEIGHTS("parmy", "coord.yyyy") |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
756 "MUL cdelta.yw, parmy.rrgg, {0, -1, 0, 1};" |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
757 BICUB_FILT_MAIN("RECT"); |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
758 |
22489 | 759 #define BICUB_X_FILT_MAIN(textype) \ |
26195
802c489f77f0
Fix and simplify lscale=2 (bicub_x) scaler, produced funny
reimar
parents:
25953
diff
changeset
|
760 "ADD coord.xy, fragment.texcoord[%c].xyxy, cdelta.xyxy;" \ |
802c489f77f0
Fix and simplify lscale=2 (bicub_x) scaler, produced funny
reimar
parents:
25953
diff
changeset
|
761 "ADD coord2.xy, fragment.texcoord[%c].xyxy, cdelta.zyzy;" \ |
22489 | 762 "TEX a.r, coord, texture[%c], "textype";" \ |
763 "TEX b.r, coord2, texture[%c], "textype";" \ | |
764 /* x-interpolation */ \ | |
765 "LRP yuv.%c, parmx.b, a.rrrr, b.rrrr;" | |
766 | |
767 static const char *bicub_x_filt_template_2D = | |
26195
802c489f77f0
Fix and simplify lscale=2 (bicub_x) scaler, produced funny
reimar
parents:
25953
diff
changeset
|
768 "MAD coord.x, fragment.texcoord[%c], {%f}, {0.5};" |
22489 | 769 "TEX parmx, coord, texture[%c], 1D;" |
26195
802c489f77f0
Fix and simplify lscale=2 (bicub_x) scaler, produced funny
reimar
parents:
25953
diff
changeset
|
770 "MUL cdelta.xyz, parmx.rrgg, {-%f, 0, %f};" |
22489 | 771 BICUB_X_FILT_MAIN("2D"); |
772 | |
773 static const char *bicub_x_filt_template_RECT = | |
26195
802c489f77f0
Fix and simplify lscale=2 (bicub_x) scaler, produced funny
reimar
parents:
25953
diff
changeset
|
774 "ADD coord.x, fragment.texcoord[%c], {0.5};" |
22489 | 775 "TEX parmx, coord, texture[%c], 1D;" |
26195
802c489f77f0
Fix and simplify lscale=2 (bicub_x) scaler, produced funny
reimar
parents:
25953
diff
changeset
|
776 "MUL cdelta.xyz, parmx.rrgg, {-1, 0, 1};" |
22489 | 777 BICUB_X_FILT_MAIN("RECT"); |
778 | |
25755
4ece7bfc77b7
Use the same unsharp filter template for 2D and RECT textures
reimar
parents:
25745
diff
changeset
|
779 static const char *unsharp_filt_template = |
25760 | 780 "PARAM dcoord%c = {%f, %f, %f, %f};" |
781 "ADD coord, fragment.texcoord[%c].xyxy, dcoord%c;" | |
782 "SUB coord2, fragment.texcoord[%c].xyxy, dcoord%c;" | |
25755
4ece7bfc77b7
Use the same unsharp filter template for 2D and RECT textures
reimar
parents:
25745
diff
changeset
|
783 "TEX a.r, fragment.texcoord[%c], texture[%c], %s;" |
4ece7bfc77b7
Use the same unsharp filter template for 2D and RECT textures
reimar
parents:
25745
diff
changeset
|
784 "TEX b.r, coord.xyxy, texture[%c], %s;" |
4ece7bfc77b7
Use the same unsharp filter template for 2D and RECT textures
reimar
parents:
25745
diff
changeset
|
785 "TEX b.g, coord.zwzw, texture[%c], %s;" |
25757 | 786 "ADD b.r, b.r, b.g;" |
25755
4ece7bfc77b7
Use the same unsharp filter template for 2D and RECT textures
reimar
parents:
25745
diff
changeset
|
787 "TEX b.b, coord2.xyxy, texture[%c], %s;" |
4ece7bfc77b7
Use the same unsharp filter template for 2D and RECT textures
reimar
parents:
25745
diff
changeset
|
788 "TEX b.g, coord2.zwzw, texture[%c], %s;" |
4ece7bfc77b7
Use the same unsharp filter template for 2D and RECT textures
reimar
parents:
25745
diff
changeset
|
789 "DP3 b, b, {0.25, 0.25, 0.25};" |
4ece7bfc77b7
Use the same unsharp filter template for 2D and RECT textures
reimar
parents:
25745
diff
changeset
|
790 "SUB b.r, a.r, b.r;" |
26836
ba086caf1230
Add a filter strength parameter for blurring/sharpening scalers.
reimar
parents:
26834
diff
changeset
|
791 "MAD yuv.%c, b.r, {%f}, a.r;"; |
25729
9a96fd14d1c5
Add experimental unsharp-mask OpenGL scaler. Certainly not yet perfect.
reimar
parents:
25727
diff
changeset
|
792 |
25758 | 793 static const char *unsharp_filt_template2 = |
25760 | 794 "PARAM dcoord%c = {%f, %f, %f, %f};" |
795 "PARAM dcoord2%c = {%f, 0, 0, %f};" | |
796 "ADD coord, fragment.texcoord[%c].xyxy, dcoord%c;" | |
797 "SUB coord2, fragment.texcoord[%c].xyxy, dcoord%c;" | |
25758 | 798 "TEX a.r, fragment.texcoord[%c], texture[%c], %s;" |
799 "TEX b.r, coord.xyxy, texture[%c], %s;" | |
800 "TEX b.g, coord.zwzw, texture[%c], %s;" | |
801 "ADD b.r, b.r, b.g;" | |
802 "TEX b.b, coord2.xyxy, texture[%c], %s;" | |
803 "TEX b.g, coord2.zwzw, texture[%c], %s;" | |
804 "ADD b.r, b.r, b.b;" | |
805 "ADD b.a, b.r, b.g;" | |
25760 | 806 "ADD coord, fragment.texcoord[%c].xyxy, dcoord2%c;" |
807 "SUB coord2, fragment.texcoord[%c].xyxy, dcoord2%c;" | |
25758 | 808 "TEX b.r, coord.xyxy, texture[%c], %s;" |
809 "TEX b.g, coord.zwzw, texture[%c], %s;" | |
810 "ADD b.r, b.r, b.g;" | |
811 "TEX b.b, coord2.xyxy, texture[%c], %s;" | |
812 "TEX b.g, coord2.zwzw, texture[%c], %s;" | |
25769 | 813 "DP4 b.r, b, {-0.1171875, -0.1171875, -0.1171875, -0.09765625};" |
25758 | 814 "MAD b.r, a.r, {0.859375}, b.r;" |
26836
ba086caf1230
Add a filter strength parameter for blurring/sharpening scalers.
reimar
parents:
26834
diff
changeset
|
815 "MAD yuv.%c, b.r, {%f}, a.r;"; |
25758 | 816 |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
817 static const char *yuv_prog_template = |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
818 "PARAM ycoef = {%.4f, %.4f, %.4f};" |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
819 "PARAM ucoef = {%.4f, %.4f, %.4f};" |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
820 "PARAM vcoef = {%.4f, %.4f, %.4f};" |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
821 "PARAM offsets = {%.4f, %.4f, %.4f};" |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
822 "TEMP res;" |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
823 "MAD res.rgb, yuv.rrrr, ycoef, offsets;" |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
824 "MAD res.rgb, yuv.gggg, ucoef, res;" |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
825 "MAD result.color.rgb, yuv.bbbb, vcoef, res;" |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
826 "END"; |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
827 |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
828 static const char *yuv_pow_prog_template = |
16648 | 829 "PARAM ycoef = {%.4f, %.4f, %.4f};" |
830 "PARAM ucoef = {%.4f, %.4f, %.4f};" | |
831 "PARAM vcoef = {%.4f, %.4f, %.4f};" | |
832 "PARAM offsets = {%.4f, %.4f, %.4f};" | |
833 "PARAM gamma = {%.4f, %.4f, %.4f};" | |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
834 "TEMP res;" |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
835 "MAD res.rgb, yuv.rrrr, ycoef, offsets;" |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
836 "MAD res.rgb, yuv.gggg, ucoef, res;" |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
837 "MAD_SAT res.rgb, yuv.bbbb, vcoef, res;" |
16648 | 838 "POW result.color.r, res.r, gamma.r;" |
839 "POW result.color.g, res.g, gamma.g;" | |
840 "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
|
841 "END"; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
842 |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
843 static const char *yuv_lookup_prog_template = |
16648 | 844 "PARAM ycoef = {%.4f, %.4f, %.4f, 0};" |
845 "PARAM ucoef = {%.4f, %.4f, %.4f, 0};" | |
846 "PARAM vcoef = {%.4f, %.4f, %.4f, 0};" | |
847 "PARAM offsets = {%.4f, %.4f, %.4f, 0.125};" | |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
848 "TEMP res;" |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
849 "MAD res, yuv.rrrr, ycoef, offsets;" |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
850 "MAD res.rgb, yuv.gggg, ucoef, res;" |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
851 "MAD res.rgb, yuv.bbbb, vcoef, res;" |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
852 "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
|
853 "ADD res.a, res.a, 0.25;" |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
854 "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
|
855 "ADD res.a, res.a, 0.25;" |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
856 "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
|
857 "END"; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
858 |
18655
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
859 static const char *yuv_lookup3d_prog_template = |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
860 "TEX result.color, yuv, texture[%c], 3D;" |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
861 "END"; |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
862 |
19221 | 863 /** |
864 * \brief creates and initializes helper textures needed for scaling texture read | |
865 * \param scaler scaler type to create texture for | |
866 * \param texu contains next free texture unit number | |
867 * \param texs texture unit ids for the scaler are stored in this array | |
868 */ | |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
869 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
|
870 switch (scaler) { |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
871 case YUV_SCALER_BILIN: |
25727
7934f12c76f0
Add a forgotten case to create_scaler_textures, avoids an incorrect warning.
reimar
parents:
24777
diff
changeset
|
872 case YUV_SCALER_BICUB_NOTEX: |
25729
9a96fd14d1c5
Add experimental unsharp-mask OpenGL scaler. Certainly not yet perfect.
reimar
parents:
25727
diff
changeset
|
873 case YUV_SCALER_UNSHARP: |
25758 | 874 case YUV_SCALER_UNSHARP2: |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
875 break; |
18622 | 876 case YUV_SCALER_BICUB: |
22489 | 877 case YUV_SCALER_BICUB_X: |
18622 | 878 texs[0] = (*texu)++; |
879 gen_spline_lookup_tex(GL_TEXTURE0 + texs[0]); | |
880 texs[0] += '0'; | |
881 break; | |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
882 default: |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
883 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
|
884 } |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
885 } |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
886 |
19167
4daef6e86041
Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents:
18988
diff
changeset
|
887 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
|
888 |
26839 | 889 #define ROW_R 0 |
890 #define ROW_G 1 | |
891 #define ROW_B 2 | |
892 #define COL_Y 0 | |
893 #define COL_U 1 | |
894 #define COL_V 2 | |
895 #define COL_C 3 | |
896 | |
897 static void get_yuv2rgb_coeffs(gl_conversion_params_t *params, float yuv2rgb[3][4]) { | |
26834
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
898 float uvcos = params->saturation * cos(params->hue); |
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
899 float uvsin = params->saturation * sin(params->hue); |
26839 | 900 int i; |
901 float uv_coeffs[3][2] = { | |
902 { 0.000, 1.596}, | |
903 {-0.391, -0.813}, | |
904 { 2.018, 0.000} | |
905 }; | |
906 for (i = 0; i < 3; i++) { | |
907 yuv2rgb[i][COL_C] = params->brightness; | |
908 yuv2rgb[i][COL_Y] = 1.164 * params->contrast; | |
909 yuv2rgb[i][COL_C] += (-16 / 255.0) * yuv2rgb[i][COL_Y]; | |
910 yuv2rgb[i][COL_U] = uv_coeffs[i][0] * uvcos + uv_coeffs[i][1] * uvsin; | |
911 yuv2rgb[i][COL_C] += (-128 / 255.0) * yuv2rgb[i][COL_U]; | |
912 yuv2rgb[i][COL_V] = uv_coeffs[i][0] * uvsin + uv_coeffs[i][1] * uvcos; | |
913 yuv2rgb[i][COL_C] += (-128 / 255.0) * yuv2rgb[i][COL_V]; | |
914 // this "centers" contrast control so that e.g. a contrast of 0 | |
915 // leads to a grey image, not a black one | |
916 yuv2rgb[i][COL_C] += 0.5 - params->contrast / 2.0; | |
917 } | |
19167
4daef6e86041
Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents:
18988
diff
changeset
|
918 } |
4daef6e86041
Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents:
18988
diff
changeset
|
919 |
19221 | 920 //! 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
|
921 #define GMAP_SIZE (1024) |
19221 | 922 /** |
923 * \brief generate a 3D YUV -> RGB map | |
26837 | 924 * \param params struct containing parameters like brightness, gamma, ... |
19221 | 925 * \param map where to store map. Must provide space for (size + 2)^3 elements |
926 * \param size size of the map, excluding border | |
927 */ | |
26834
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
928 static void gen_yuv2rgb_map(gl_conversion_params_t *params, unsigned char *map, int size) { |
26839 | 929 int i, j, k, l; |
18655
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
930 float step = 1.0 / size; |
19167
4daef6e86041
Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents:
18988
diff
changeset
|
931 float y, u, v; |
26839 | 932 float yuv2rgb[3][4]; |
19167
4daef6e86041
Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents:
18988
diff
changeset
|
933 unsigned char gmaps[3][GMAP_SIZE]; |
26834
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
934 gen_gamma_map(gmaps[0], GMAP_SIZE, params->rgamma); |
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
935 gen_gamma_map(gmaps[1], GMAP_SIZE, params->ggamma); |
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
936 gen_gamma_map(gmaps[2], GMAP_SIZE, params->bgamma); |
26839 | 937 get_yuv2rgb_coeffs(params, yuv2rgb); |
938 for (i = 0; i < 3; i++) | |
939 for (j = 0; j < 4; j++) | |
940 yuv2rgb[i][j] *= GMAP_SIZE - 1; | |
19167
4daef6e86041
Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents:
18988
diff
changeset
|
941 v = 0; |
18655
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
942 for (i = -1; i <= size; i++) { |
19167
4daef6e86041
Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents:
18988
diff
changeset
|
943 u = 0; |
18655
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
944 for (j = -1; j <= size; j++) { |
19167
4daef6e86041
Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents:
18988
diff
changeset
|
945 y = 0; |
18655
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
946 for (k = -1; k <= size; k++) { |
26839 | 947 for (l = 0; l < 3; l++) { |
948 float rgb = yuv2rgb[l][COL_Y] * y + yuv2rgb[l][COL_U] * u + yuv2rgb[l][COL_V] * v + yuv2rgb[l][COL_C]; | |
949 *map++ = gmaps[l][av_clip(rgb, 0, GMAP_SIZE - 1)]; | |
950 } | |
18655
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
951 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
|
952 } |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
953 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
|
954 } |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
955 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
|
956 } |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
957 } |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
958 |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
959 //! resolution of texture for gamma lookup table |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
960 #define LOOKUP_RES 512 |
18655
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
961 //! resolution for 3D yuv->rgb conversion lookup table |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
962 #define LOOKUP_3DRES 32 |
19221 | 963 /** |
964 * \brief creates and initializes helper textures needed for yuv conversion | |
26837 | 965 * \param params struct containing parameters like brightness, gamma, ... |
19221 | 966 * \param texu contains next free texture unit number |
967 * \param texs texture unit ids for the conversion are stored in this array | |
968 */ | |
26834
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
969 static void create_conv_textures(gl_conversion_params_t *params, int *texu, char *texs) { |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
970 unsigned char *lookup_data = NULL; |
26834
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
971 int conv = YUV_CONVERSION(params->type); |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
972 switch (conv) { |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
973 case YUV_CONVERSION_FRAGMENT: |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
974 case YUV_CONVERSION_FRAGMENT_POW: |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
975 break; |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
976 case YUV_CONVERSION_FRAGMENT_LOOKUP: |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
977 texs[0] = (*texu)++; |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
978 ActiveTexture(GL_TEXTURE0 + texs[0]); |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
979 lookup_data = malloc(4 * LOOKUP_RES); |
26834
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
980 gen_gamma_map(lookup_data, LOOKUP_RES, params->rgamma); |
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
981 gen_gamma_map(&lookup_data[LOOKUP_RES], LOOKUP_RES, params->ggamma); |
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
982 gen_gamma_map(&lookup_data[2 * LOOKUP_RES], LOOKUP_RES, params->bgamma); |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
983 glCreateClearTex(GL_TEXTURE_2D, GL_LUMINANCE8, GL_LINEAR, |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
984 LOOKUP_RES, 4, 0); |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
985 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
|
986 LOOKUP_RES, 0, 0, LOOKUP_RES, 4, 0); |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
987 ActiveTexture(GL_TEXTURE0); |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
988 texs[0] += '0'; |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
989 break; |
18655
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
990 case YUV_CONVERSION_FRAGMENT_LOOKUP3D: |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
991 { |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
992 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
|
993 if (!TexImage3D) { |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
994 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
|
995 break; |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
996 } |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
997 texs[0] = (*texu)++; |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
998 ActiveTexture(GL_TEXTURE0 + texs[0]); |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
999 lookup_data = malloc(3 * sz * sz * sz); |
26834
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
1000 gen_yuv2rgb_map(params, lookup_data, LOOKUP_3DRES); |
18655
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1001 glAdjustAlignment(sz); |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1002 glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1003 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
|
1004 GL_RGB, GL_UNSIGNED_BYTE, lookup_data); |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1005 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
|
1006 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
|
1007 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
|
1008 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
|
1009 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
|
1010 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
|
1011 ActiveTexture(GL_TEXTURE0); |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1012 texs[0] += '0'; |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1013 } |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1014 break; |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1015 default: |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1016 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
|
1017 } |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1018 if (lookup_data) |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1019 free(lookup_data); |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1020 } |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1021 |
19221 | 1022 /** |
1023 * \brief adds a scaling texture read at the current fragment program position | |
1024 * \param scaler type of scaler to insert | |
1025 * \param prog_pos current position in fragment program | |
1026 * \param remain how many bytes remain in the buffer given by prog_pos | |
1027 * \param texs array containing the texture unit identifiers for this scaler | |
1028 * \param in_tex texture unit the scaler should read from | |
1029 * \param out_comp component of the yuv variable the scaler stores the result in | |
1030 * \param rect if rectangular (pixel) adressing should be used for in_tex | |
1031 * \param texw width of the in_tex texture | |
1032 * \param texh height of the in_tex texture | |
26837 | 1033 * \param strength strength of filter effect if the scaler does some kind of filtering |
19221 | 1034 */ |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1035 static void add_scaler(int scaler, char **prog_pos, int *remain, char *texs, |
26836
ba086caf1230
Add a filter strength parameter for blurring/sharpening scalers.
reimar
parents:
26834
diff
changeset
|
1036 char in_tex, char out_comp, int rect, int texw, int texh, |
ba086caf1230
Add a filter strength parameter for blurring/sharpening scalers.
reimar
parents:
26834
diff
changeset
|
1037 double strength) { |
25755
4ece7bfc77b7
Use the same unsharp filter template for 2D and RECT textures
reimar
parents:
25745
diff
changeset
|
1038 const char *ttype = rect ? "RECT" : "2D"; |
4ece7bfc77b7
Use the same unsharp filter template for 2D and RECT textures
reimar
parents:
25745
diff
changeset
|
1039 const float ptw = rect ? 1.0 : 1.0 / texw; |
4ece7bfc77b7
Use the same unsharp filter template for 2D and RECT textures
reimar
parents:
25745
diff
changeset
|
1040 const float pth = rect ? 1.0 : 1.0 / texh; |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1041 switch (scaler) { |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1042 case YUV_SCALER_BILIN: |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1043 snprintf(*prog_pos, *remain, bilin_filt_template, out_comp, in_tex, |
25755
4ece7bfc77b7
Use the same unsharp filter template for 2D and RECT textures
reimar
parents:
25745
diff
changeset
|
1044 in_tex, ttype); |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1045 break; |
18622 | 1046 case YUV_SCALER_BICUB: |
1047 if (rect) | |
1048 snprintf(*prog_pos, *remain, bicub_filt_template_RECT, | |
1049 in_tex, texs[0], texs[0], | |
1050 in_tex, in_tex, in_tex, in_tex, in_tex, in_tex, out_comp); | |
1051 else | |
1052 snprintf(*prog_pos, *remain, bicub_filt_template_2D, | |
1053 in_tex, (float)texw, (float)texh, | |
25756 | 1054 texs[0], ptw, ptw, texs[0], pth, pth, |
18622 | 1055 in_tex, in_tex, in_tex, in_tex, in_tex, in_tex, out_comp); |
1056 break; | |
22489 | 1057 case YUV_SCALER_BICUB_X: |
1058 if (rect) | |
1059 snprintf(*prog_pos, *remain, bicub_x_filt_template_RECT, | |
1060 in_tex, texs[0], | |
1061 in_tex, in_tex, in_tex, in_tex, out_comp); | |
1062 else | |
1063 snprintf(*prog_pos, *remain, bicub_x_filt_template_2D, | |
26195
802c489f77f0
Fix and simplify lscale=2 (bicub_x) scaler, produced funny
reimar
parents:
25953
diff
changeset
|
1064 in_tex, (float)texw, |
25756 | 1065 texs[0], ptw, ptw, |
22489 | 1066 in_tex, in_tex, in_tex, in_tex, out_comp); |
1067 break; | |
24318
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
1068 case YUV_SCALER_BICUB_NOTEX: |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
1069 if (rect) |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
1070 snprintf(*prog_pos, *remain, bicub_notex_filt_template_RECT, |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
1071 in_tex, |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
1072 in_tex, in_tex, in_tex, in_tex, in_tex, in_tex, out_comp); |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
1073 else |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
1074 snprintf(*prog_pos, *remain, bicub_notex_filt_template_2D, |
25756 | 1075 in_tex, (float)texw, (float)texh, ptw, ptw, pth, pth, |
24318
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
1076 in_tex, in_tex, in_tex, in_tex, in_tex, in_tex, out_comp); |
e6e8bf060dae
Add a bicubic scaler that needs a lot more instruction but no
reimar
parents:
24315
diff
changeset
|
1077 break; |
25729
9a96fd14d1c5
Add experimental unsharp-mask OpenGL scaler. Certainly not yet perfect.
reimar
parents:
25727
diff
changeset
|
1078 case YUV_SCALER_UNSHARP: |
25755
4ece7bfc77b7
Use the same unsharp filter template for 2D and RECT textures
reimar
parents:
25745
diff
changeset
|
1079 snprintf(*prog_pos, *remain, unsharp_filt_template, |
25760 | 1080 out_comp, 0.5 * ptw, 0.5 * pth, 0.5 * ptw, -0.5 * pth, |
1081 in_tex, out_comp, in_tex, out_comp, in_tex, | |
25755
4ece7bfc77b7
Use the same unsharp filter template for 2D and RECT textures
reimar
parents:
25745
diff
changeset
|
1082 in_tex, ttype, in_tex, ttype, in_tex, ttype, in_tex, ttype, |
26836
ba086caf1230
Add a filter strength parameter for blurring/sharpening scalers.
reimar
parents:
26834
diff
changeset
|
1083 in_tex, ttype, out_comp, strength); |
25729
9a96fd14d1c5
Add experimental unsharp-mask OpenGL scaler. Certainly not yet perfect.
reimar
parents:
25727
diff
changeset
|
1084 break; |
25758 | 1085 case YUV_SCALER_UNSHARP2: |
1086 snprintf(*prog_pos, *remain, unsharp_filt_template2, | |
25760 | 1087 out_comp, 1.2 * ptw, 1.2 * pth, 1.2 * ptw, -1.2 * pth, |
1088 out_comp, 1.5 * ptw, 1.5 * pth, | |
1089 in_tex, out_comp, in_tex, out_comp, in_tex, | |
25758 | 1090 in_tex, ttype, in_tex, ttype, in_tex, ttype, in_tex, ttype, |
25760 | 1091 in_tex, ttype, in_tex, out_comp, in_tex, out_comp, |
1092 in_tex, ttype, in_tex, ttype, in_tex, ttype, | |
26836
ba086caf1230
Add a filter strength parameter for blurring/sharpening scalers.
reimar
parents:
26834
diff
changeset
|
1093 in_tex, ttype, out_comp, strength); |
25758 | 1094 break; |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1095 } |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1096 *remain -= strlen(*prog_pos); |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1097 *prog_pos += strlen(*prog_pos); |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1098 } |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1099 |
18653
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1100 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
|
1101 const char *name; |
18653
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1102 GLenum cur; |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1103 GLenum max; |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1104 } progstats[] = { |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1105 {"instructions", 0x88A0, 0x88A1}, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1106 {"native instructions", 0x88A2, 0x88A3}, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1107 {"temporaries", 0x88A4, 0x88A5}, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1108 {"native temporaries", 0x88A6, 0x88A7}, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1109 {"parameters", 0x88A8, 0x88A9}, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1110 {"native parameters", 0x88AA, 0x88AB}, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1111 {"attribs", 0x88AC, 0x88AD}, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1112 {"native attribs", 0x88AE, 0x88AF}, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1113 {"ALU instructions", 0x8805, 0x880B}, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1114 {"TEX instructions", 0x8806, 0x880C}, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1115 {"TEX indirections", 0x8807, 0x880D}, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1116 {"native ALU instructions", 0x8808, 0x880E}, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1117 {"native TEX instructions", 0x8809, 0x880F}, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1118 {"native TEX indirections", 0x880A, 0x8810}, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1119 {NULL, 0, 0} |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1120 }; |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1121 |
19221 | 1122 /** |
1123 * \brief load the specified GPU Program | |
1124 * \param target program target to load into, only GL_FRAGMENT_PROGRAM is tested | |
1125 * \param prog program string | |
1126 * \return 1 on success, 0 otherwise | |
1127 */ | |
18653
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1128 int loadGPUProgram(GLenum target, char *prog) { |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1129 int i; |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1130 GLint cur = 0, max = 0, err = 0; |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1131 if (!ProgramString) { |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1132 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
|
1133 return 0; |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1134 } |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1135 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
|
1136 glGetIntegerv(GL_PROGRAM_ERROR_POSITION, &err); |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1137 if (err != -1) { |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1138 mp_msg(MSGT_VO, MSGL_ERR, |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1139 "[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
|
1140 "[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
|
1141 "[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
|
1142 glGetString(GL_PROGRAM_ERROR_STRING), &prog[err]); |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1143 return 0; |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1144 } |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1145 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
|
1146 return 1; |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1147 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
|
1148 for (i = 0; progstats[i].name; i++) { |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1149 GetProgramiv(target, progstats[i].cur, &cur); |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1150 GetProgramiv(target, progstats[i].max, &max); |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1151 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
|
1152 } |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1153 return 1; |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1154 } |
5af43a16abc3
loadGPUProgram function to load fragment program with error checking and statistics
reimar
parents:
18622
diff
changeset
|
1155 |
25885 | 1156 #define MAX_PROGSZ (1024*1024) |
1157 | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1158 /** |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1159 * \brief setup a fragment program that will do YUV->RGB conversion |
26837 | 1160 * \param parms struct containing parameters like conversion and scaler type, |
1161 * brightness, ... | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1162 */ |
26834
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
1163 static void glSetupYUVFragprog(gl_conversion_params_t *params) { |
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
1164 int type = params->type; |
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
1165 int texw = params->texw; |
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
1166 int texh = params->texh; |
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
1167 int rect = params->target == GL_TEXTURE_RECTANGLE; |
25885 | 1168 static const char prog_hdr[] = |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1169 "!!ARBfp1.0\n" |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1170 "OPTION ARB_precision_hint_fastest;" |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1171 // 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
|
1172 // 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
|
1173 "TEMP coord, coord2, cdelta, parmx, parmy, a, b, yuv;"; |
25885 | 1174 int prog_remain; |
1175 char *yuv_prog, *prog_pos; | |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1176 int cur_texu = 3; |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1177 char lum_scale_texs[1]; |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1178 char chrom_scale_texs[1]; |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1179 char conv_texs[1]; |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1180 GLint i; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1181 // 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
|
1182 // for red, green, blue and the constant offsets |
26839 | 1183 float yuv2rgb[3][4]; |
26834
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
1184 create_conv_textures(params, &cur_texu, conv_texs); |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1185 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
|
1186 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
|
1187 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
|
1188 else |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1189 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
|
1190 glGetIntegerv(GL_MAX_TEXTURE_UNITS, &i); |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1191 if (i < cur_texu) |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1192 mp_msg(MSGT_VO, MSGL_ERR, |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1193 "[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
|
1194 cur_texu, i); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1195 if (!ProgramString) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1196 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
|
1197 return; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1198 } |
25885 | 1199 yuv_prog = malloc(MAX_PROGSZ); |
1200 strcpy(yuv_prog, prog_hdr); | |
1201 prog_pos = yuv_prog + sizeof(prog_hdr) - 1; | |
1202 prog_remain = MAX_PROGSZ - sizeof(prog_hdr); | |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1203 add_scaler(YUV_LUM_SCALER(type), &prog_pos, &prog_remain, lum_scale_texs, |
26836
ba086caf1230
Add a filter strength parameter for blurring/sharpening scalers.
reimar
parents:
26834
diff
changeset
|
1204 '0', 'r', rect, texw, texh, params->filter_strength); |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1205 add_scaler(YUV_CHROM_SCALER(type), &prog_pos, &prog_remain, chrom_scale_texs, |
26836
ba086caf1230
Add a filter strength parameter for blurring/sharpening scalers.
reimar
parents:
26834
diff
changeset
|
1206 '1', 'g', rect, texw / 2, texh / 2, params->filter_strength); |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1207 add_scaler(YUV_CHROM_SCALER(type), &prog_pos, &prog_remain, chrom_scale_texs, |
26836
ba086caf1230
Add a filter strength parameter for blurring/sharpening scalers.
reimar
parents:
26834
diff
changeset
|
1208 '2', 'b', rect, texw / 2, texh / 2, params->filter_strength); |
26839 | 1209 get_yuv2rgb_coeffs(params, yuv2rgb); |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1210 switch (YUV_CONVERSION(type)) { |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1211 case YUV_CONVERSION_FRAGMENT: |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1212 snprintf(prog_pos, prog_remain, yuv_prog_template, |
26839 | 1213 yuv2rgb[ROW_R][COL_Y], yuv2rgb[ROW_G][COL_Y], yuv2rgb[ROW_B][COL_Y], |
1214 yuv2rgb[ROW_R][COL_U], yuv2rgb[ROW_G][COL_U], yuv2rgb[ROW_B][COL_U], | |
1215 yuv2rgb[ROW_R][COL_V], yuv2rgb[ROW_G][COL_V], yuv2rgb[ROW_B][COL_V], | |
1216 yuv2rgb[ROW_R][COL_C], yuv2rgb[ROW_G][COL_C], yuv2rgb[ROW_B][COL_C]); | |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1217 break; |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1218 case YUV_CONVERSION_FRAGMENT_POW: |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1219 snprintf(prog_pos, prog_remain, yuv_pow_prog_template, |
26839 | 1220 yuv2rgb[ROW_R][COL_Y], yuv2rgb[ROW_G][COL_Y], yuv2rgb[ROW_B][COL_Y], |
1221 yuv2rgb[ROW_R][COL_U], yuv2rgb[ROW_G][COL_U], yuv2rgb[ROW_B][COL_U], | |
1222 yuv2rgb[ROW_R][COL_V], yuv2rgb[ROW_G][COL_V], yuv2rgb[ROW_B][COL_V], | |
1223 yuv2rgb[ROW_R][COL_C], yuv2rgb[ROW_G][COL_C], yuv2rgb[ROW_B][COL_C], | |
26834
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
1224 (float)1.0 / params->rgamma, (float)1.0 / params->bgamma, (float)1.0 / params->bgamma); |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1225 break; |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1226 case YUV_CONVERSION_FRAGMENT_LOOKUP: |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1227 snprintf(prog_pos, prog_remain, yuv_lookup_prog_template, |
26839 | 1228 yuv2rgb[ROW_R][COL_Y], yuv2rgb[ROW_G][COL_Y], yuv2rgb[ROW_B][COL_Y], |
1229 yuv2rgb[ROW_R][COL_U], yuv2rgb[ROW_G][COL_U], yuv2rgb[ROW_B][COL_U], | |
1230 yuv2rgb[ROW_R][COL_V], yuv2rgb[ROW_G][COL_V], yuv2rgb[ROW_B][COL_V], | |
1231 yuv2rgb[ROW_R][COL_C], yuv2rgb[ROW_G][COL_C], yuv2rgb[ROW_B][COL_C], | |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1232 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
|
1233 break; |
18655
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1234 case YUV_CONVERSION_FRAGMENT_LOOKUP3D: |
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1235 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
|
1236 break; |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1237 default: |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1238 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
|
1239 break; |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1240 } |
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1241 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
|
1242 loadGPUProgram(GL_FRAGMENT_PROGRAM, yuv_prog); |
25885 | 1243 free(yuv_prog); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1244 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1245 |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1246 /** |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1247 * \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
|
1248 * \param map buffer to create map into |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1249 * \param size size of buffer |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1250 * \param gamma gamma value |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1251 */ |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1252 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
|
1253 int i; |
19167
4daef6e86041
Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents:
18988
diff
changeset
|
1254 if (gamma == 1.0) { |
4daef6e86041
Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents:
18988
diff
changeset
|
1255 for (i = 0; i < size; i++) |
4daef6e86041
Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents:
18988
diff
changeset
|
1256 map[i] = 255 * i / (size - 1); |
4daef6e86041
Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents:
18988
diff
changeset
|
1257 return; |
4daef6e86041
Simplify and and speedup generation of yuv2rgb and gamma map tables
reimar
parents:
18988
diff
changeset
|
1258 } |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1259 gamma = 1.0 / gamma; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1260 for (i = 0; i < size; i++) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1261 float tmp = (float)i / (size - 1.0); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1262 tmp = pow(tmp, gamma); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1263 if (tmp > 1.0) tmp = 1.0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1264 if (tmp < 0.0) tmp = 0.0; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1265 map[i] = 255 * tmp; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1266 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1267 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1268 |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1269 /** |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1270 * \brief setup YUV->RGB conversion |
26837 | 1271 * \param parms struct containing parameters like conversion and scaler type, |
1272 * brightness, ... | |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
1273 * \ingroup glconversion |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1274 */ |
26834
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
1275 void glSetupYUVConversion(gl_conversion_params_t *params) { |
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
1276 float uvcos = params->saturation * cos(params->hue); |
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
1277 float uvsin = params->saturation * sin(params->hue); |
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
1278 switch (YUV_CONVERSION(params->type)) { |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1279 case YUV_CONVERSION_COMBINERS: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1280 glSetupYUVCombiners(uvcos, uvsin); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1281 break; |
16625 | 1282 case YUV_CONVERSION_COMBINERS_ATI: |
1283 glSetupYUVCombinersATI(uvcos, uvsin); | |
1284 break; | |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1285 case YUV_CONVERSION_FRAGMENT_LOOKUP: |
18655
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1286 case YUV_CONVERSION_FRAGMENT_LOOKUP3D: |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1287 case YUV_CONVERSION_FRAGMENT: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1288 case YUV_CONVERSION_FRAGMENT_POW: |
26834
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
1289 glSetupYUVFragprog(params); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1290 break; |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1291 default: |
26834
aadfce1c25c8
Use a struct instead of a huge and further growing argument list.
reimar
parents:
26195
diff
changeset
|
1292 mp_msg(MSGT_VO, MSGL_ERR, "[gl] unknown conversion type %i\n", YUV_CONVERSION(params->type)); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1293 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1294 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1295 |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1296 /** |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1297 * \brief enable the specified YUV conversion |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1298 * \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
|
1299 * \param type type of YUV conversion |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
1300 * \ingroup glconversion |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1301 */ |
18175
01ca8a5fb8a6
minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents:
17566
diff
changeset
|
1302 void glEnableYUVConversion(GLenum target, int type) { |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1303 if (type <= 0) return; |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1304 switch (YUV_CONVERSION(type)) { |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1305 case YUV_CONVERSION_COMBINERS: |
16582
cbd0ee58633b
texture units do not need to be explicitly enabled when using a fragment
reimar
parents:
16488
diff
changeset
|
1306 ActiveTexture(GL_TEXTURE1); |
cbd0ee58633b
texture units do not need to be explicitly enabled when using a fragment
reimar
parents:
16488
diff
changeset
|
1307 glEnable(target); |
cbd0ee58633b
texture units do not need to be explicitly enabled when using a fragment
reimar
parents:
16488
diff
changeset
|
1308 ActiveTexture(GL_TEXTURE2); |
cbd0ee58633b
texture units do not need to be explicitly enabled when using a fragment
reimar
parents:
16488
diff
changeset
|
1309 glEnable(target); |
cbd0ee58633b
texture units do not need to be explicitly enabled when using a fragment
reimar
parents:
16488
diff
changeset
|
1310 ActiveTexture(GL_TEXTURE0); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1311 glEnable(GL_REGISTER_COMBINERS_NV); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1312 break; |
16625 | 1313 case YUV_CONVERSION_COMBINERS_ATI: |
1314 ActiveTexture(GL_TEXTURE1); | |
1315 glEnable(target); | |
1316 ActiveTexture(GL_TEXTURE2); | |
1317 glEnable(target); | |
1318 ActiveTexture(GL_TEXTURE0); | |
1319 glEnable(GL_FRAGMENT_SHADER_ATI); | |
1320 break; | |
18655
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1321 case YUV_CONVERSION_FRAGMENT_LOOKUP3D: |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1322 case YUV_CONVERSION_FRAGMENT_LOOKUP: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1323 case YUV_CONVERSION_FRAGMENT_POW: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1324 case YUV_CONVERSION_FRAGMENT: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1325 glEnable(GL_FRAGMENT_PROGRAM); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1326 break; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1327 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1328 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1329 |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1330 /** |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1331 * \brief disable the specified YUV conversion |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1332 * \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
|
1333 * \param type type of YUV conversion |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
1334 * \ingroup glconversion |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1335 */ |
18175
01ca8a5fb8a6
minor fixes: get rid of pointless inline attributes and some additional checks
reimar
parents:
17566
diff
changeset
|
1336 void glDisableYUVConversion(GLenum target, int type) { |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1337 if (type <= 0) return; |
18619
106a0c366002
Reworked YUV2RGB fragment program setup in preparation for upcoming patches
reimar
parents:
18579
diff
changeset
|
1338 switch (YUV_CONVERSION(type)) { |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1339 case YUV_CONVERSION_COMBINERS: |
16582
cbd0ee58633b
texture units do not need to be explicitly enabled when using a fragment
reimar
parents:
16488
diff
changeset
|
1340 ActiveTexture(GL_TEXTURE1); |
cbd0ee58633b
texture units do not need to be explicitly enabled when using a fragment
reimar
parents:
16488
diff
changeset
|
1341 glDisable(target); |
cbd0ee58633b
texture units do not need to be explicitly enabled when using a fragment
reimar
parents:
16488
diff
changeset
|
1342 ActiveTexture(GL_TEXTURE2); |
cbd0ee58633b
texture units do not need to be explicitly enabled when using a fragment
reimar
parents:
16488
diff
changeset
|
1343 glDisable(target); |
cbd0ee58633b
texture units do not need to be explicitly enabled when using a fragment
reimar
parents:
16488
diff
changeset
|
1344 ActiveTexture(GL_TEXTURE0); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1345 glDisable(GL_REGISTER_COMBINERS_NV); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1346 break; |
16625 | 1347 case YUV_CONVERSION_COMBINERS_ATI: |
1348 ActiveTexture(GL_TEXTURE1); | |
1349 glDisable(target); | |
1350 ActiveTexture(GL_TEXTURE2); | |
1351 glDisable(target); | |
1352 ActiveTexture(GL_TEXTURE0); | |
1353 glDisable(GL_FRAGMENT_SHADER_ATI); | |
1354 break; | |
18655
6aa0b26d584b
Add yuv to rgb conversion using a 3D lookup texture
reimar
parents:
18653
diff
changeset
|
1355 case YUV_CONVERSION_FRAGMENT_LOOKUP3D: |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1356 case YUV_CONVERSION_FRAGMENT_LOOKUP: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1357 case YUV_CONVERSION_FRAGMENT_POW: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1358 case YUV_CONVERSION_FRAGMENT: |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1359 glDisable(GL_FRAGMENT_PROGRAM); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1360 break; |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1361 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1362 } |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1363 |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1364 /** |
16214
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1365 * \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
|
1366 * \param x screen top coordinate |
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1367 * \param y screen left coordinate |
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1368 * \param w screen width coordinate |
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1369 * \param h screen height coordinate |
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1370 * \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
|
1371 * \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
|
1372 * \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
|
1373 * \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
|
1374 * \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
|
1375 * \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
|
1376 * \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
|
1377 * \param is_yv12 if set, also draw the textures from units 1 and 2 |
17220 | 1378 * \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
|
1379 * \ingroup gltexture |
16214
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1380 */ |
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1381 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
|
1382 GLfloat tx, GLfloat ty, GLfloat tw, GLfloat th, |
17220 | 1383 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
|
1384 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
|
1385 if (!rect_tex) { |
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1386 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
|
1387 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
|
1388 } |
17220 | 1389 if (flip) { |
1390 y += h; | |
1391 h = -h; | |
1392 } | |
16214
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1393 glBegin(GL_QUADS); |
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1394 glTexCoord2f(tx, ty); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1395 if (is_yv12) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1396 MultiTexCoord2f(GL_TEXTURE1, tx2, ty2); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1397 MultiTexCoord2f(GL_TEXTURE2, tx2, ty2); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1398 } |
16214
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1399 glVertex2f(x, y); |
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1400 glTexCoord2f(tx, ty + th); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1401 if (is_yv12) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1402 MultiTexCoord2f(GL_TEXTURE1, tx2, ty2 + th2); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1403 MultiTexCoord2f(GL_TEXTURE2, tx2, ty2 + th2); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1404 } |
16214
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1405 glVertex2f(x, y + h); |
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1406 glTexCoord2f(tx + tw, ty + th); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1407 if (is_yv12) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1408 MultiTexCoord2f(GL_TEXTURE1, tx2 + tw2, ty2 + th2); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1409 MultiTexCoord2f(GL_TEXTURE2, tx2 + tw2, ty2 + th2); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1410 } |
16214
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1411 glVertex2f(x + w, y + h); |
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1412 glTexCoord2f(tx + tw, ty); |
16488
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1413 if (is_yv12) { |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1414 MultiTexCoord2f(GL_TEXTURE1, tx2 + tw2, ty2); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1415 MultiTexCoord2f(GL_TEXTURE2, tx2 + tw2, ty2); |
3191dcb27a12
hardware color-space conversion for vo_gl and vo_gl2
reimar
parents:
16474
diff
changeset
|
1416 } |
16214
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1417 glVertex2f(x + w, y); |
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1418 glEnd(); |
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1419 } |
ede5b4afd262
Helper function for drawing texture and general cleanup of vo_gl2.c
reimar
parents:
16117
diff
changeset
|
1420 |
14142
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1421 #ifdef GL_WIN32 |
17116 | 1422 #include "w32_common.h" |
16595
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
1423 /** |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
1424 * \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
|
1425 * getProcAddress |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
1426 * \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
|
1427 * \return function pointer returned by wglGetProcAddress |
b3a9fb41f475
fix/improve code doxumentation. Also group gl_common functions in several
reimar
parents:
16592
diff
changeset
|
1428 */ |
16109
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
1429 static void *w32gpa(const GLubyte *procName) { |
25953 | 1430 HMODULE oglmod; |
1431 void *res = wglGetProcAddress(procName); | |
1432 if (res) return res; | |
1433 oglmod = GetModuleHandle("opengl32.dll"); | |
1434 return GetProcAddress(oglmod, procName); | |
16109
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
1435 } |
519a307e3ccf
OpenGL fixes for windows and vo_gl.c ported to windows.
reimar
parents:
16099
diff
changeset
|
1436 |
14142
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1437 int setGlWindow(int *vinfo, HGLRC *context, HWND win) |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1438 { |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1439 int new_vinfo; |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1440 HDC windc = GetDC(win); |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1441 HGLRC new_context = 0; |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1442 int keep_context = 0; |
24314
20359547f3c3
Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents:
22489
diff
changeset
|
1443 int res = SET_WINDOW_FAILED; |
14142
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1444 |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1445 // 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
|
1446 // 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
|
1447 if (*context) |
14142
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1448 glFinish(); |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1449 new_vinfo = GetPixelFormat(windc); |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1450 if (*context && *vinfo && new_vinfo && *vinfo == new_vinfo) { |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1451 // we can keep the wglContext |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1452 new_context = *context; |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1453 keep_context = 1; |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1454 } else { |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1455 // create a context |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1456 new_context = wglCreateContext(windc); |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1457 if (!new_context) { |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1458 mp_msg(MSGT_VO, MSGL_FATAL, "[gl] Could not create GL context!\n"); |
24314
20359547f3c3
Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents:
22489
diff
changeset
|
1459 goto out; |
14142
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1460 } |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1461 } |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1462 |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1463 // set context |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1464 if (!wglMakeCurrent(windc, new_context)) { |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1465 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
|
1466 if (!keep_context) { |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1467 wglDeleteContext(new_context); |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1468 } |
24314
20359547f3c3
Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents:
22489
diff
changeset
|
1469 goto out; |
14142
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1470 } |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1471 |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1472 // set new values |
21631 | 1473 vo_w32_window = win; |
14142
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1474 { |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1475 RECT rect; |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1476 GetClientRect(win, &rect); |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1477 vo_dwidth = rect.right; |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1478 vo_dheight = rect.bottom; |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1479 } |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1480 if (!keep_context) { |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1481 if (*context) |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1482 wglDeleteContext(*context); |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1483 *context = new_context; |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1484 *vinfo = new_vinfo; |
17019
fd178c06dc84
Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents:
16984
diff
changeset
|
1485 getFunctions(w32gpa, NULL); |
14142
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1486 |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1487 // and inform that reinit is neccessary |
24314
20359547f3c3
Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents:
22489
diff
changeset
|
1488 res = SET_WINDOW_REINIT; |
20359547f3c3
Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents:
22489
diff
changeset
|
1489 } else |
20359547f3c3
Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents:
22489
diff
changeset
|
1490 res = SET_WINDOW_OK; |
20359547f3c3
Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents:
22489
diff
changeset
|
1491 |
20359547f3c3
Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents:
22489
diff
changeset
|
1492 out: |
24315
12f2487fb845
Fix compilation after patch to remove global vo_hdc
reimar
parents:
24314
diff
changeset
|
1493 ReleaseDC(win, windc); |
24314
20359547f3c3
Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents:
22489
diff
changeset
|
1494 return res; |
14142
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1495 } |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1496 |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1497 void releaseGlContext(int *vinfo, HGLRC *context) { |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1498 *vinfo = 0; |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1499 if (*context) { |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1500 wglMakeCurrent(0, 0); |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1501 wglDeleteContext(*context); |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1502 } |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1503 *context = 0; |
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1504 } |
17116 | 1505 |
1506 void swapGlBuffers() { | |
24314
20359547f3c3
Remove global vo_hdc, since it is recommended to release a DC as soon as possible.
reimar
parents:
22489
diff
changeset
|
1507 HDC vo_hdc = GetDC(vo_w32_window); |
17116 | 1508 SwapBuffers(vo_hdc); |
24315
12f2487fb845
Fix compilation after patch to remove global vo_hdc
reimar
parents:
24314
diff
changeset
|
1509 ReleaseDC(vo_w32_window, vo_hdc); |
17116 | 1510 } |
14142
f0c1ee83b216
Improving gl2 under windows, moving some functionality to gl_common
reimar
parents:
14089
diff
changeset
|
1511 #else |
16117 | 1512 #ifdef HAVE_LIBDL |
1513 #include <dlfcn.h> | |
16111
5683110fce0a
Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents:
16109
diff
changeset
|
1514 #endif |
17116 | 1515 #include "x11_common.h" |
16111
5683110fce0a
Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents:
16109
diff
changeset
|
1516 /** |
5683110fce0a
Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents:
16109
diff
changeset
|
1517 * \brief find address of a linked function |
5683110fce0a
Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents:
16109
diff
changeset
|
1518 * \param s name of function to find |
5683110fce0a
Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents:
16109
diff
changeset
|
1519 * \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
|
1520 * |
5683110fce0a
Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents:
16109
diff
changeset
|
1521 * Copied from xine |
5683110fce0a
Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents:
16109
diff
changeset
|
1522 */ |
17336 | 1523 static void *getdladdr(const char *s) { |
16117 | 1524 #ifdef HAVE_LIBDL |
16111
5683110fce0a
Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents:
16109
diff
changeset
|
1525 #if defined(__sun) || defined(__sgi) |
17419 | 1526 static void *handle = NULL; |
1527 if (!handle) | |
1528 handle = dlopen(NULL, RTLD_LAZY); | |
16111
5683110fce0a
Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents:
16109
diff
changeset
|
1529 return dlsym(handle, s); |
5683110fce0a
Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents:
16109
diff
changeset
|
1530 #else |
5683110fce0a
Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents:
16109
diff
changeset
|
1531 return dlsym(0, s); |
5683110fce0a
Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents:
16109
diff
changeset
|
1532 #endif |
16117 | 1533 #else |
1534 return NULL; | |
1535 #endif | |
16111
5683110fce0a
Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents:
16109
diff
changeset
|
1536 } |
5683110fce0a
Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents:
16109
diff
changeset
|
1537 |
13843 | 1538 /** |
14269 | 1539 * \brief Returns the XVisualInfo associated with Window win. |
13843 | 1540 * \param win Window whose XVisualInfo is returne. |
1541 * \return XVisualInfo of the window. Caller must use XFree to free it. | |
1542 */ | |
1543 static XVisualInfo *getWindowVisualInfo(Window win) { | |
1544 XWindowAttributes xw_attr; | |
1545 XVisualInfo vinfo_template; | |
1546 int tmp; | |
1547 XGetWindowAttributes(mDisplay, win, &xw_attr); | |
1548 vinfo_template.visualid = XVisualIDFromVisual(xw_attr.visual); | |
1549 return XGetVisualInfo(mDisplay, VisualIDMask, &vinfo_template, &tmp); | |
1550 } | |
1551 | |
1552 /** | |
1553 * \brief Changes the window in which video is displayed. | |
1554 * If possible only transfers the context to the new window, otherwise | |
1555 * creates a new one, which must be initialized by the caller. | |
1556 * \param vinfo Currently used visual. | |
1557 * \param context Currently used context. | |
1558 * \param win window that should be used for drawing. | |
1559 * \return one of SET_WINDOW_FAILED, SET_WINDOW_OK or SET_WINDOW_REINIT. | |
1560 * In case of SET_WINDOW_REINIT the context could not be transfered | |
1561 * 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
|
1562 * \ingroup glcontext |
13843 | 1563 */ |
1564 int setGlWindow(XVisualInfo **vinfo, GLXContext *context, Window win) | |
1565 { | |
1566 XVisualInfo *new_vinfo; | |
1567 GLXContext new_context = NULL; | |
1568 int keep_context = 0; | |
1569 | |
1570 // should only be needed when keeping context, but not doing glFinish | |
1571 // 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
|
1572 if (*context) |
13843 | 1573 glFinish(); |
1574 new_vinfo = getWindowVisualInfo(win); | |
1575 if (*context && *vinfo && new_vinfo && | |
1576 (*vinfo)->visualid == new_vinfo->visualid) { | |
1577 // we can keep the GLXContext | |
1578 new_context = *context; | |
1579 XFree(new_vinfo); | |
1580 new_vinfo = *vinfo; | |
1581 keep_context = 1; | |
1582 } else { | |
1583 // create a context | |
1584 new_context = glXCreateContext(mDisplay, new_vinfo, NULL, True); | |
1585 if (!new_context) { | |
1586 mp_msg(MSGT_VO, MSGL_FATAL, "[gl] Could not create GLX context!\n"); | |
1587 XFree(new_vinfo); | |
1588 return SET_WINDOW_FAILED; | |
1589 } | |
1590 } | |
1591 | |
1592 // set context | |
1593 if (!glXMakeCurrent(mDisplay, vo_window, new_context)) { | |
1594 mp_msg (MSGT_VO, MSGL_FATAL, "[gl] Could not set GLX context!\n"); | |
1595 if (!keep_context) { | |
1596 glXDestroyContext (mDisplay, new_context); | |
1597 XFree(new_vinfo); | |
1598 } | |
1599 return SET_WINDOW_FAILED; | |
1600 } | |
1601 | |
1602 // set new values | |
1603 vo_window = win; | |
1604 { | |
1605 Window root; | |
1606 int tmp; | |
17336 | 1607 unsigned utmp; |
13843 | 1608 XGetGeometry(mDisplay, vo_window, &root, &tmp, &tmp, |
17336 | 1609 (unsigned *)&vo_dwidth, (unsigned *)&vo_dheight, &utmp, &utmp); |
13843 | 1610 } |
1611 if (!keep_context) { | |
16588 | 1612 void *(*getProcAddress)(const GLubyte *); |
17019
fd178c06dc84
Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents:
16984
diff
changeset
|
1613 const char *(*glXExtStr)(Display *, int); |
13843 | 1614 if (*context) |
1615 glXDestroyContext(mDisplay, *context); | |
1616 *context = new_context; | |
1617 if (*vinfo) | |
1618 XFree(*vinfo); | |
1619 *vinfo = new_vinfo; | |
16111
5683110fce0a
Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents:
16109
diff
changeset
|
1620 getProcAddress = getdladdr("glXGetProcAddress"); |
5683110fce0a
Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents:
16109
diff
changeset
|
1621 if (!getProcAddress) |
5683110fce0a
Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents:
16109
diff
changeset
|
1622 getProcAddress = getdladdr("glXGetProcAddressARB"); |
5683110fce0a
Use dlsym to get glXGetProcAddress, only way to (hopefully) make it
reimar
parents:
16109
diff
changeset
|
1623 if (!getProcAddress) |
17336 | 1624 getProcAddress = (void *)getdladdr; |
17019
fd178c06dc84
Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents:
16984
diff
changeset
|
1625 glXExtStr = getdladdr("glXQueryExtensionsString"); |
fd178c06dc84
Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents:
16984
diff
changeset
|
1626 getFunctions(getProcAddress, !glXExtStr ? NULL : |
fd178c06dc84
Also parse glX extension string, makes -vo gl:swapinterval work again on linux
reimar
parents:
16984
diff
changeset
|
1627 glXExtStr(mDisplay, DefaultScreen(mDisplay))); |
13843 | 1628 |
1629 // and inform that reinit is neccessary | |
1630 return SET_WINDOW_REINIT; | |
1631 } | |
1632 return SET_WINDOW_OK; | |
1633 } | |
1634 | |
1635 /** | |
1636 * \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
|
1637 * \ingroup glcontext |
13843 | 1638 */ |
1639 void releaseGlContext(XVisualInfo **vinfo, GLXContext *context) { | |
1640 if (*vinfo) | |
1641 XFree(*vinfo); | |
1642 *vinfo = NULL; | |
1643 if (*context) | |
14089
00283cb37fd0
Make the context not current before destroying it.
reimar
parents:
14078
diff
changeset
|
1644 { |
00283cb37fd0
Make the context not current before destroying it.
reimar
parents:
14078
diff
changeset
|
1645 glFinish(); |
00283cb37fd0
Make the context not current before destroying it.
reimar
parents:
14078
diff
changeset
|
1646 glXMakeCurrent(mDisplay, None, NULL); |
13843 | 1647 glXDestroyContext(mDisplay, *context); |
14089
00283cb37fd0
Make the context not current before destroying it.
reimar
parents:
14078
diff
changeset
|
1648 } |
13843 | 1649 *context = 0; |
1650 } | |
17116 | 1651 |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
17419
diff
changeset
|
1652 void swapGlBuffers(void) { |
17116 | 1653 glXSwapBuffers(mDisplay, vo_window); |
1654 } | |
13843 | 1655 #endif |
1656 |