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