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