1 /*
2  *  utils_glx.h - GLX utilities
3  *
4  *  libva-vdpau-driver (C) 2009-2011 Splitted-Desktop Systems
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, write to the Free Software
18  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
19  */
20 
21 #ifndef UTILS_GLX_H
22 #define UTILS_GLX_H
23 
24 #include <GL/gl.h>
25 #include <GL/glext.h>
26 #include <GL/glx.h>
27 #include <GL/glxext.h>
28 #include <vdpau/vdpau.h>
29 
30 /* GL_NV_vdpau_interop */
31 #if GL_GLEXT_VERSION < 64
32 typedef GLintptr GLvdpauSurfaceNV;
33 typedef void (*PFNGLVDPAUINITNVPROC)(const GLvoid *vdpDevice, const GLvoid *getProcAddress);
34 typedef void (*PFNGLVDPAUFININVPROC)(void);
35 typedef GLvdpauSurfaceNV (*PFNGLVDPAUREGISTERVIDEOSURFACENVPROC)(const GLvoid *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames);
36 typedef GLvdpauSurfaceNV (*PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC)(const GLvoid *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames);
37 typedef GLboolean (*PFNGLVDPAUISSURFACENVPROC)(GLvdpauSurfaceNV surface);
38 typedef void (*PFNGLVDPAUUNREGISTERSURFACENVPROC)(GLvdpauSurfaceNV surface);
39 typedef void (*PFNGLVDPAUGETSURFACEIVNVPROC)(GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *values);
40 typedef void (*PFNGLVDPAUSURFACEACCESSNVPROC)(GLvdpauSurfaceNV surface, GLenum access);
41 typedef void (*PFNGLVDPAUMAPSURFACESNVPROC)(GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces);
42 typedef void (*PFNGLVDPAUUNMAPSURFACESNVPROC)(GLsizei numSurface, const GLvdpauSurfaceNV *surfaces);
43 #endif
44 
45 #if GL_GLEXT_VERSION >= 85
46 /*
47  * The following typedef is hidden in at least Mesa 9.1.x, because:
48  *     o  GL/glext.h was updated to version 85, moving the typedef inside
49  *        an #ifndef GL_VERSION_1_3 block.
50  *        (Mesa Git: 68060cfb2bbf890a3932c8d25382261a83f393af)
51  *     o  GL/gl.h defines GL_VERSION_1_3 to 1.
52  *
53  * See: https://gitorious.org/vaapi/gstreamer-vaapi/commit/5db2e93d3c930fd8470cfdcd26f514d1cebc59a0/diffs
54  */
55 typedef void (*PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t);
56 #endif
57 
58 /* GLX_EXT_texture_from_pixmap */
59 #if GLX_GLXEXT_VERSION < 18
60 typedef void (*PFNGLXBINDTEXIMAGEEXTPROC)(Display *, GLXDrawable, int, const int *);
61 typedef void (*PFNGLXRELEASETEXIMAGEEXTPROC)(Display *, GLXDrawable, int);
62 #endif
63 
64 #ifndef GL_FRAMEBUFFER_BINDING
65 #define GL_FRAMEBUFFER_BINDING GL_FRAMEBUFFER_BINDING_EXT
66 #endif
67 #ifndef GL_FRAGMENT_PROGRAM
68 #define GL_FRAGMENT_PROGRAM GL_FRAGMENT_PROGRAM_ARB
69 #endif
70 #ifndef GL_PROGRAM_FORMAT_ASCII
71 #define GL_PROGRAM_FORMAT_ASCII GL_PROGRAM_FORMAT_ASCII_ARB
72 #endif
73 #ifndef GL_PROGRAM_ERROR_POSITION
74 #define GL_PROGRAM_ERROR_POSITION GL_PROGRAM_ERROR_POSITION_ARB
75 #endif
76 #ifndef GL_PROGRAM_ERROR_STRING
77 #define GL_PROGRAM_ERROR_STRING GL_PROGRAM_ERROR_STRING_ARB
78 #endif
79 #ifndef GL_PROGRAM_UNDER_NATIVE_LIMITS
80 #define GL_PROGRAM_UNDER_NATIVE_LIMITS GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB
81 #endif
82 
83 const char *
84 gl_get_error_string(GLenum error)
85     attribute_hidden;
86 
87 void
88 gl_purge_errors(void)
89     attribute_hidden;
90 
91 int
92 gl_check_error(void)
93     attribute_hidden;
94 
95 int
96 gl_get_current_color(float color[4])
97     attribute_hidden;
98 
99 int
100 gl_get_param(GLenum param, unsigned int *pval)
101     attribute_hidden;
102 
103 int
104 gl_get_texture_param(GLenum target, GLenum param, unsigned int *pval)
105     attribute_hidden;
106 
107 void
108 gl_set_bgcolor(uint32_t color)
109     attribute_hidden;
110 
111 void
112 gl_set_texture_scaling(GLenum target, GLenum scale)
113     attribute_hidden;
114 
115 void
116 gl_resize(unsigned int width, unsigned int height)
117     attribute_hidden;
118 
119 typedef struct _GLContextState GLContextState;
120 struct _GLContextState {
121     Display     *display;
122     Window       window;
123     XVisualInfo *visual;
124     GLXContext   context;
125 };
126 
127 GLContextState *
128 gl_create_context(Display *dpy, int screen, GLContextState *parent)
129     attribute_hidden;
130 
131 void
132 gl_destroy_context(GLContextState *cs)
133     attribute_hidden;
134 
135 void
136 gl_init_context(GLContextState *cs)
137     attribute_hidden;
138 
139 void
140 gl_get_current_context(GLContextState *cs)
141     attribute_hidden;
142 
143 int
144 gl_set_current_context(GLContextState *new_cs, GLContextState *old_cs)
145     attribute_hidden;
146 
147 void
148 gl_swap_buffers(GLContextState *cs)
149     attribute_hidden;
150 
151 GLuint
152 gl_create_texture(GLenum target, GLenum format, unsigned int width, unsigned int height)
153     attribute_hidden;
154 
155 typedef struct _GLVTable GLVTable;
156 struct _GLVTable {
157     PFNGLXBINDTEXIMAGEEXTPROC             glx_bind_tex_image;
158     PFNGLXRELEASETEXIMAGEEXTPROC          glx_release_tex_image;
159     PFNGLGENFRAMEBUFFERSEXTPROC           gl_gen_framebuffers;
160     PFNGLDELETEFRAMEBUFFERSEXTPROC        gl_delete_framebuffers;
161     PFNGLBINDFRAMEBUFFEREXTPROC           gl_bind_framebuffer;
162     PFNGLGENRENDERBUFFERSEXTPROC          gl_gen_renderbuffers;
163     PFNGLDELETERENDERBUFFERSEXTPROC       gl_delete_renderbuffers;
164     PFNGLBINDRENDERBUFFEREXTPROC          gl_bind_renderbuffer;
165     PFNGLRENDERBUFFERSTORAGEEXTPROC       gl_renderbuffer_storage;
166     PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC   gl_framebuffer_renderbuffer;
167     PFNGLFRAMEBUFFERTEXTURE2DEXTPROC      gl_framebuffer_texture_2d;
168     PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC    gl_check_framebuffer_status;
169     PFNGLGENPROGRAMSARBPROC               gl_gen_programs;
170     PFNGLDELETEPROGRAMSARBPROC            gl_delete_programs;
171     PFNGLBINDPROGRAMARBPROC               gl_bind_program;
172     PFNGLPROGRAMSTRINGARBPROC             gl_program_string;
173     PFNGLGETPROGRAMIVARBPROC              gl_get_program_iv;
174     PFNGLPROGRAMLOCALPARAMETER4FVARBPROC  gl_program_local_parameter_4fv;
175     PFNGLACTIVETEXTUREPROC                gl_active_texture;
176     PFNGLMULTITEXCOORD2FPROC              gl_multi_tex_coord_2f;
177     PFNGLVDPAUINITNVPROC                  gl_vdpau_init;
178     PFNGLVDPAUFININVPROC                  gl_vdpau_fini;
179     PFNGLVDPAUREGISTERVIDEOSURFACENVPROC  gl_vdpau_register_video_surface;
180     PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC gl_vdpau_register_output_surface;
181     PFNGLVDPAUISSURFACENVPROC             gl_vdpau_is_surface;
182     PFNGLVDPAUUNREGISTERSURFACENVPROC     gl_vdpau_unregister_surface;
183     PFNGLVDPAUGETSURFACEIVNVPROC          gl_vdpau_get_surface_iv;
184     PFNGLVDPAUSURFACEACCESSNVPROC         gl_vdpau_surface_access;
185     PFNGLVDPAUMAPSURFACESNVPROC           gl_vdpau_map_surfaces;
186     PFNGLVDPAUUNMAPSURFACESNVPROC         gl_vdpau_unmap_surfaces;
187     unsigned int                          has_texture_non_power_of_two  : 1;
188     unsigned int                          has_texture_rectangle         : 1;
189     unsigned int                          has_texture_from_pixmap       : 1;
190     unsigned int                          has_framebuffer_object        : 1;
191     unsigned int                          has_fragment_program          : 1;
192     unsigned int                          has_multitexture              : 1;
193     unsigned int                          has_vdpau_interop             : 1;
194 };
195 
196 GLVTable *
197 gl_get_vtable(void)
198     attribute_hidden;
199 
200 typedef struct _GLPixmapObject GLPixmapObject;
201 struct _GLPixmapObject {
202     Display        *dpy;
203     GLenum          target;
204     GLuint          texture;
205     unsigned int    width;
206     unsigned int    height;
207     Pixmap          pixmap;
208     GLXPixmap       glx_pixmap;
209     unsigned int    is_bound    : 1;
210 };
211 
212 GLPixmapObject *
213 gl_create_pixmap_object(
214     Display     *dpy,
215     GLenum       target,
216     unsigned int width,
217     unsigned int height
218 ) attribute_hidden;
219 
220 void
221 gl_destroy_pixmap_object(GLPixmapObject *pixo)
222     attribute_hidden;
223 
224 int
225 gl_bind_pixmap_object(GLPixmapObject *pixo)
226     attribute_hidden;
227 
228 int
229 gl_unbind_pixmap_object(GLPixmapObject *pixo)
230     attribute_hidden;
231 
232 typedef struct _GLFramebufferObject GLFramebufferObject;
233 struct _GLFramebufferObject {
234     unsigned int    width;
235     unsigned int    height;
236     GLuint          fbo;
237     GLuint          old_fbo;
238     unsigned int    is_bound    : 1;
239 };
240 
241 GLFramebufferObject *
242 gl_create_framebuffer_object(
243     GLenum       target,
244     GLuint       texture,
245     unsigned int width,
246     unsigned int height
247 ) attribute_hidden;
248 
249 void
250 gl_destroy_framebuffer_object(GLFramebufferObject *fbo)
251     attribute_hidden;
252 
253 int
254 gl_bind_framebuffer_object(GLFramebufferObject *fbo)
255     attribute_hidden;
256 
257 int
258 gl_unbind_framebuffer_object(GLFramebufferObject *fbo)
259     attribute_hidden;
260 
261 int
262 gl_vdpau_init(VdpDevice device, VdpGetProcAddress get_proc_address)
263     attribute_hidden;
264 
265 void
266 gl_vdpau_exit(void)
267     attribute_hidden;
268 
269 typedef struct _GLVdpSurface GLVdpSurface;
270 struct _GLVdpSurface {
271     GLvdpauSurfaceNV    surface;
272     GLenum              target;
273     unsigned int        num_textures;
274     GLuint              textures[4];
275     unsigned int        is_bound        : 1;
276 };
277 
278 GLVdpSurface *
279 gl_vdpau_create_video_surface(GLenum target, VdpVideoSurface surface)
280     attribute_hidden;
281 
282 GLVdpSurface *
283 gl_vdpau_create_output_surface(GLenum target, VdpOutputSurface surface)
284     attribute_hidden;
285 
286 void
287 gl_vdpau_destroy_surface(GLVdpSurface *s)
288     attribute_hidden;
289 
290 int
291 gl_vdpau_bind_surface(GLVdpSurface *s)
292     attribute_hidden;
293 
294 int
295 gl_vdpau_unbind_surface(GLVdpSurface *s)
296     attribute_hidden;
297 
298 #endif /* UTILS_GLX_H */
299