/* 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_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