/* Last saved: Sun 06 Sep 2009 02:09:59 PM */ /* Copyright (c) 1998 Kenneth Albanowski. All rights reserved. * Copyright (c) 2007 Bob Free. All rights reserved. * Copyright (c) 2009 Chris Marshall. All rights reserved. * This program is free software; you can redistribute it and/or * modify it under the same terms as Perl itself. */ /* OpenGL GLX bindings */ #define IN_POGL_GLX_XS #include #include "pgopogl.h" #ifdef HAVE_GL #include "gl_util.h" /* Note: this is caching procs once for all contexts */ /* !!! This should instead cache per context */ #if defined(_WIN32) || (defined(__CYGWIN__) && defined(HAVE_W32API)) #define loadProc(proc,name) \ { \ if (!proc) \ { \ proc = (void *)wglGetProcAddress(name); \ if (!proc) croak(name " is not supported by this renderer"); \ } \ } #define testProc(proc,name) ((proc) ? 1 : !!(proc = (void *)wglGetProcAddress(name))) #else /* not using WGL */ #define loadProc(proc,name) #define testProc(proc,name) 1 #endif /* not defined _WIN32, __CYGWIN__, and HAVE_W32API */ #endif /* defined HAVE_GL */ #ifdef HAVE_GLX #include "glx_util.h" #endif /* defined HAVE_GLX */ #ifdef HAVE_GLU #include "glu_util.h" #endif /* defined HAVE_GLU */ MODULE = OpenGL::GL::MultProg PACKAGE = OpenGL #ifdef HAVE_GL #ifdef GL_ARB_multitexture #//# glMultiTexCoord3dARB($target,$s,$t,$r); void glMultiTexCoord3dARB(target,s,t,r) GLenum target GLdouble s GLdouble t GLdouble r INIT: loadProc(glMultiTexCoord3dARB,"glMultiTexCoord3dARB"); CODE: glMultiTexCoord3dARB(target,s,t,r); #//# glMultiTexCoord3dvARB_c(target,(CPTR)v); void glMultiTexCoord3dvARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord3dvARB,"glMultiTexCoord3dvARB"); CODE: glMultiTexCoord3dvARB(target,v); #//# glMultiTexCoord3dvARB_s(target,(PACKED)v); void glMultiTexCoord3dvARB_s(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord3dvARB,"glMultiTexCoord3dvARB"); CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)); glMultiTexCoord3dvARB(target,v_s); } #//!!! Do we really need this? It duplicates glMultiTexCoord3dARB #//# glMultiTexCoord3dvARB_p($target,$s,$t,$r); void glMultiTexCoord3dvARB_p(target,s,t,r) GLenum target GLdouble s GLdouble t GLdouble r INIT: loadProc(glMultiTexCoord3dvARB,"glMultiTexCoord3dvARB"); CODE: { GLdouble param[3]; param[0] = s; param[1] = t; param[2] = r; glMultiTexCoord3dvARB(target,param); } #//# glMultiTexCoord3fARB($target,$s,$t,$r); void glMultiTexCoord3fARB(target,s,t,r) GLenum target GLfloat s GLfloat t GLfloat r INIT: loadProc(glMultiTexCoord3fARB,"glMultiTexCoord3fARB"); CODE: glMultiTexCoord3fARB(target,s,t,r); #//# glMultiTexCoord3fvARB_c($target,(CPTR)v); void glMultiTexCoord3fvARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord3fvARB,"glMultiTexCoord3fvARB"); CODE: glMultiTexCoord3fvARB(target,v); #//# glMultiTexCoord3fvARB_s($target,(PACKED)v); void glMultiTexCoord3fvARB_s(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord3fvARB,"glMultiTexCoord3fvARB"); CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)); glMultiTexCoord3fvARB(target,v_s); } #//!!! Do we really need this? It duplicates glMultiTexCoord3fARB #//# glMultiTexCoord3fvARB_p($target,$s,$t,$r); void glMultiTexCoord3fvARB_p(target,s,t,r) GLenum target GLfloat s GLfloat t GLfloat r INIT: loadProc(glMultiTexCoord3fvARB,"glMultiTexCoord3fvARB"); CODE: { GLfloat param[3]; param[0] = s; param[1] = t; param[2] = r; glMultiTexCoord3fvARB(target,param); } #//# glMultiTexCoord3iARB($target,$s,$t,$r); void glMultiTexCoord3iARB(target,s,t,r) GLenum target GLint s GLint t GLint r INIT: loadProc(glMultiTexCoord3iARB,"glMultiTexCoord3iARB"); CODE: glMultiTexCoord3iARB(target,s,t,r); #//# glMultiTexCoord3ivARB_c($target,(CPTR)v); void glMultiTexCoord3ivARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord3ivARB,"glMultiTexCoord3ivARB"); CODE: glMultiTexCoord3ivARB(target,v); #//# glMultiTexCoord3ivARB_s($target,(PACKED)v); void glMultiTexCoord3ivARB_s(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord3ivARB,"glMultiTexCoord3ivARB"); CODE: { GLint * v_s = EL(v, sizeof(GLint)); glMultiTexCoord3ivARB(target,v_s); } #//!!! Do we really need this? It duplicates glMultiTexCoord3iARB #//# glMultiTexCoord3ivARB_p($target,$s,$t,$r); void glMultiTexCoord3ivARB_p(target,s,t,r) GLenum target GLint s GLint t GLint r INIT: loadProc(glMultiTexCoord3ivARB,"glMultiTexCoord3ivARB"); CODE: { GLint param[3]; param[0] = s; param[1] = t; param[2] = r; glMultiTexCoord3ivARB(target,param); } #//# glMultiTexCoord3sARB($target,$s,$t,$r); void glMultiTexCoord3sARB(target,s,t,r) GLenum target GLshort s GLshort t GLshort r INIT: loadProc(glMultiTexCoord3sARB,"glMultiTexCoord3sARB"); CODE: glMultiTexCoord3sARB(target,s,t,r); #//# glMultiTexCoord3svARB_c($target,(CPTR)v); void glMultiTexCoord3svARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord3svARB,"glMultiTexCoord3svARB"); CODE: glMultiTexCoord3svARB(target,v); #//# glMultiTexCoord3svARB_s($target,(PACKED)v); void glMultiTexCoord3svARB_s(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord3svARB,"glMultiTexCoord3svARB"); CODE: { GLshort * v_s = EL(v, sizeof(GLshort)); glMultiTexCoord3svARB(target,v_s); } #//!!! Do we really need this? It duplicates glMultiTexCoord3sARB #//# glMultiTexCoord3svARB_p($target,$s,$t,$r); void glMultiTexCoord3svARB_p(target,s,t,r) GLenum target GLshort s GLshort t GLshort r INIT: loadProc(glMultiTexCoord3svARB,"glMultiTexCoord3svARB"); CODE: { GLshort param[3]; param[0] = s; param[1] = t; param[2] = r; glMultiTexCoord3svARB(target,param); } #//# glMultiTexCoord4dARB($target,$s,$t,$r,$q); void glMultiTexCoord4dARB(target,s,t,r,q) GLenum target GLdouble s GLdouble t GLdouble r GLdouble q INIT: loadProc(glMultiTexCoord4dARB,"glMultiTexCoord4dARB"); CODE: glMultiTexCoord4dARB(target,s,t,r,q); #//# glMultiTexCoord4dvARB_c($target,(CPTR)v); void glMultiTexCoord4dvARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord4dvARB,"glMultiTexCoord4dvARB"); CODE: glMultiTexCoord4dvARB(target,v); #//# glMultiTexCoord4dvARB_s($target,(PACKED)v); void glMultiTexCoord4dvARB_s(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord4dvARB,"glMultiTexCoord4dvARB"); CODE: { GLdouble * v_s = EL(v, sizeof(GLdouble)); glMultiTexCoord4dvARB(target,v_s); } #//!!! Do we really need this? It duplicates glMultiTexCoord4dARB #//# glMultiTexCoord4dvARB_p($target,$s,$t,$r,$q); void glMultiTexCoord4dvARB_p(target,s,t,r,q) GLenum target GLdouble s GLdouble t GLdouble r GLdouble q INIT: loadProc(glMultiTexCoord4dvARB,"glMultiTexCoord4dvARB"); CODE: { GLdouble param[4]; param[0] = s; param[1] = t; param[2] = r; param[3] = q; glMultiTexCoord4dvARB(target,param); } #//# glMultiTexCoord4fARB($target,$s,$t,$r,$q); void glMultiTexCoord4fARB(target,s,t,r,q) GLenum target GLfloat s GLfloat t GLfloat r GLfloat q INIT: loadProc(glMultiTexCoord4fARB,"glMultiTexCoord4fARB"); CODE: glMultiTexCoord4fARB(target,s,t,r,q); #//# glMultiTexCoord4fvARB_c($target,(CPTR)v); void glMultiTexCoord4fvARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord4fvARB,"glMultiTexCoord4fvARB"); CODE: glMultiTexCoord4fvARB(target,v); #//# glMultiTexCoord4fvARB_s($target,(PACKED)v); void glMultiTexCoord4fvARB_s(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord4fvARB,"glMultiTexCoord4fvARB"); CODE: { GLfloat * v_s = EL(v, sizeof(GLfloat)); glMultiTexCoord4fvARB(target,v_s); } #//!!! Do we really need this? It duplicates glMultiTexCoord4fARB #//# glMultiTexCoord4fvARB_p($target,$s,$t,$r,$q); void glMultiTexCoord4fvARB_p(target,s,t,r,q) GLenum target GLfloat s GLfloat t GLfloat r GLfloat q INIT: loadProc(glMultiTexCoord4fvARB,"glMultiTexCoord4fvARB"); CODE: { GLfloat param[4]; param[0] = s; param[1] = t; param[2] = r; param[3] = q; glMultiTexCoord4fvARB(target,param); } #//# glMultiTexCoord4iARB($target,$s,$t,$r,$q) void glMultiTexCoord4iARB(target,s,t,r,q) GLenum target GLint s GLint t GLint r GLint q INIT: loadProc(glMultiTexCoord4iARB,"glMultiTexCoord4iARB"); CODE: glMultiTexCoord4iARB(target,s,t,r,q); #//# glMultiTexCoord4ivARB_c($target,(CPTR)v); void glMultiTexCoord4ivARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord4ivARB,"glMultiTexCoord4ivARB"); CODE: glMultiTexCoord4ivARB(target,v); #//# glMultiTexCoord4ivARB_s($target,(PACKED)v); void glMultiTexCoord4ivARB_s(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord4ivARB,"glMultiTexCoord4ivARB"); CODE: { GLint * v_s = EL(v, sizeof(GLint)); glMultiTexCoord4ivARB(target,v_s); } #//!!! Do we really need this? It duplicates glMultiTexCoord4iARB #//# glMultiTexCoord4ivARB_p($target,$s,$t,$r,$q); void glMultiTexCoord4ivARB_p(target,s,t,r,q) GLenum target GLint s GLint t GLint r GLint q INIT: loadProc(glMultiTexCoord4ivARB,"glMultiTexCoord4ivARB"); CODE: { GLint param[4]; param[0] = s; param[1] = t; param[2] = r; param[3] = q; glMultiTexCoord4ivARB(target,param); } #//# glMultiTexCoord4sARB($target,$s,$t,$r,$q); void glMultiTexCoord4sARB(target,s,t,r,q) GLenum target GLshort s GLshort t GLshort r GLshort q INIT: loadProc(glMultiTexCoord4sARB,"glMultiTexCoord4sARB"); CODE: glMultiTexCoord4sARB(target,s,t,r,q); #//# glMultiTexCoord4svARB_c($target,(CPTR)v); void glMultiTexCoord4svARB_c(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord4svARB,"glMultiTexCoord4svARB"); CODE: glMultiTexCoord4svARB(target,v); #//# glMultiTexCoord4svARB_s($target,(PACKED)v); void glMultiTexCoord4svARB_s(target,v) GLenum target void *v INIT: loadProc(glMultiTexCoord4svARB,"glMultiTexCoord4svARB"); CODE: { GLshort * v_s = EL(v, sizeof(GLshort)); glMultiTexCoord4svARB(target,v_s); } #//!!! Do we really need this? It duplicates glMultiTexCoord4sARB #//# glMultiTexCoord4svARB_p($target,$s,$t,$r,$q); void glMultiTexCoord4svARB_p(target,s,t,r,q) GLenum target GLshort s GLshort t GLshort r GLshort q INIT: loadProc(glMultiTexCoord4svARB,"glMultiTexCoord4svARB"); CODE: { GLshort param[4]; param[0] = s; param[1] = t; param[2] = r; param[3] = q; glMultiTexCoord4svARB(target,param); } #endif #ifdef GL_ARB_shader_objects #//# glDeleteObjectARB($obj); void glDeleteObjectARB(obj) GLhandleARB obj INIT: loadProc(glDeleteObjectARB,"glDeleteObjectARB"); CODE: { glDeleteObjectARB(obj); } #//# glGetHandleARB($pname); GLhandleARB glGetHandleARB(pname) GLenum pname INIT: loadProc(glGetHandleARB,"glGetHandleARB"); CODE: { RETVAL = glGetHandleARB(pname); } OUTPUT: RETVAL #//# glDetachObjectARB($containerObj, $attachedObj); void glDetachObjectARB(containerObj, attachedObj) GLhandleARB containerObj GLhandleARB attachedObj INIT: loadProc(glDetachObjectARB,"glDetachObjectARB"); CODE: { glDetachObjectARB(containerObj, attachedObj); } #//# glCreateShaderObjectARB($shaderType); GLhandleARB glCreateShaderObjectARB(shaderType) GLenum shaderType INIT: loadProc(glCreateShaderObjectARB,"glCreateShaderObjectARB"); CODE: { RETVAL = glCreateShaderObjectARB(shaderType); } OUTPUT: RETVAL #//# glShaderSourceARB_c($shaderObj, $count, (CPTR)string, (CPTR)length); void glShaderSourceARB_c(shaderObj, count, string, length) GLhandleARB shaderObj GLsizei count void *string void *length INIT: loadProc(glShaderSourceARB,"glShaderSourceARB"); CODE: { glShaderSourceARB(shaderObj, count, string, length); } #//# glShaderSourceARB_p($shaderObj, @string); void glShaderSourceARB_p(shaderObj, ...) GLhandleARB shaderObj INIT: loadProc(glShaderSourceARB,"glShaderSourceARB"); CODE: { int i; int count = items - 1; GLcharARB **string = malloc(sizeof(GLcharARB *) * count); GLint *length = malloc(sizeof(GLint) * count); for(i=0;i> 1; GLfloat *value = malloc(sizeof(GLfloat) * elements); for(i=0;i> 2; GLfloat *value = malloc(sizeof(GLfloat) * elements); for(i=0;i> 1; GLint *value = malloc(sizeof(GLint) * elements); for(i=0;i> 2; GLint *value = malloc(sizeof(GLint) * elements); for(i=0;i