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