diff --git a/src/native/common/common_tools.cpp b/src/native/common/common_tools.cpp index b4077b97..96f3d172 100644 --- a/src/native/common/common_tools.cpp +++ b/src/native/common/common_tools.cpp @@ -142,6 +142,20 @@ jclass ext_ResetClass(JNIEnv *env, const char *class_name) { return clazz; } +bool ext_InitializeFunctions(ExtGetProcAddressPROC gpa, int num_functions, ExtFunction *functions) { + for (int i = 0; i < num_functions; i++) { + ExtFunction *function = functions + i; + if (function->ext_function_name != NULL) { + void *ext_func_pointer = gpa(function->ext_function_name); + if (ext_func_pointer == NULL) + return false; + void **ext_function_pointer_pointer = function->ext_function_pointer; + *ext_function_pointer_pointer = ext_func_pointer; + } + } + return true; +} + bool ext_InitializeClass(JNIEnv *env, jclass clazz, jobject ext_set, const char *ext_name, ExtGetProcAddressPROC gpa, int num_functions, JavaMethodAndExtFunction *functions) { JNINativeMethod *methods = (JNINativeMethod *)malloc(num_functions*sizeof(JNINativeMethod)); for (int i = 0; i < num_functions; i++) { diff --git a/src/native/common/common_tools.h b/src/native/common/common_tools.h index 5ffa7610..cc064171 100644 --- a/src/native/common/common_tools.h +++ b/src/native/common/common_tools.h @@ -95,10 +95,16 @@ typedef struct { void **ext_function_pointer; } JavaMethodAndExtFunction; +typedef struct { + char *ext_function_name; + void **ext_function_pointer; +} ExtFunction; + #define NUMFUNCTIONS(x) (sizeof(x)/sizeof(JavaMethodAndExtFunction)); extern void doExtension(JNIEnv *env, jobject ext_set, const char *method_name, const char *ext); extern jclass ext_ResetClass(JNIEnv *env, const char *class_name); extern bool ext_InitializeClass(JNIEnv *env, jclass clazz, jobject ext_set, const char *ext_name, ExtGetProcAddressPROC gpa, int num_functions, JavaMethodAndExtFunction *functions); +extern bool ext_InitializeFunctions(ExtGetProcAddressPROC gpa, int num_functions, ExtFunction *functions); #endif diff --git a/src/native/common/extgl.cpp b/src/native/common/extgl.cpp index 1eb6ac94..6856768f 100755 --- a/src/native/common/extgl.cpp +++ b/src/native/common/extgl.cpp @@ -47,49 +47,6 @@ THE POSSIBILITY OF SUCH DAMAGE. #ifdef _X11 #include - -glXGetFBConfigsPROC glXGetFBConfigs = NULL; -glXChooseFBConfigPROC glXChooseFBConfig = NULL; -glXGetFBConfigAttribPROC glXGetFBConfigAttrib = NULL; -glXGetVisualFromFBConfigPROC glXGetVisualFromFBConfig = NULL; -glXCreateWindowPROC glXCreateWindow = NULL; -glXDestroyWindowPROC glXDestroyWindow = NULL; -glXCreatePixmapPROC glXCreatePixmap = NULL; -glXDestroyPixmapPROC glXDestroyPixmap = NULL; -glXCreatePbufferPROC glXCreatePbuffer = NULL; -glXDestroyPbufferPROC glXDestroyPbuffer = NULL; -glXQueryDrawablePROC glXQueryDrawable = NULL; -glXCreateNewContextPROC glXCreateNewContext = NULL; -glXMakeContextCurrentPROC glXMakeContextCurrent = NULL; -glXGetCurrentReadDrawablePROC glXGetCurrentReadDrawable = NULL; -glXGetCurrentDisplayPROC glXGetCurrentDisplay = NULL; -glXQueryContextPROC glXQueryContext = NULL; -glXSelectEventPROC glXSelectEvent = NULL; -glXGetSelectedEventPROC glXGetSelectedEvent = NULL; -glXGetProcAddressARBPROC glXGetProcAddressARB = NULL; -glXChooseVisualPROC glXChooseVisual = NULL; -glXCopyContextPROC glXCopyContext = NULL; -glXCreateContextPROC glXCreateContext = NULL; -glXCreateGLXPixmapPROC glXCreateGLXPixmap = NULL; -glXDestroyContextPROC glXDestroyContext = NULL; -glXDestroyGLXPixmapPROC glXDestroyGLXPixmap = NULL; -glXGetConfigPROC glXGetConfig = NULL; -glXGetCurrentContextPROC glXGetCurrentContext = NULL; -glXGetCurrentDrawablePROC glXGetCurrentDrawable = NULL; -glXIsDirectPROC glXIsDirect = NULL; -glXMakeCurrentPROC glXMakeCurrent = NULL; -glXQueryExtensionPROC glXQueryExtension = NULL; -glXQueryVersionPROC glXQueryVersion = NULL; -glXSwapBuffersPROC glXSwapBuffers = NULL; -glXUseXFontPROC glXUseXFont = NULL; -glXWaitGLPROC glXWaitGL = NULL; -glXWaitXPROC glXWaitX = NULL; -glXGetClientStringPROC glXGetClientString = NULL; -glXQueryServerStringPROC glXQueryServerString = NULL; -glXQueryExtensionsStringPROC glXQueryExtensionsString = NULL; - -/* GLX_SGI_swap_control */ -glXSwapIntervalSGIPROC glXSwapIntervalSGI = NULL; #endif #ifdef _AGL @@ -199,6 +156,10 @@ HMODULE lib_gl_handle = NULL; #ifdef _X11 void * lib_gl_handle = NULL; + +typedef void * (APIENTRY * glXGetProcAddressARBPROC) (const GLubyte *procName); + +static glXGetProcAddressARBPROC glXGetProcAddressARB; #endif #ifdef _AGL @@ -208,7 +169,7 @@ CFBundleRef agl_bundle_ref = NULL; /* getProcAddress */ -static void *extgl_GetProcAddress(const char *name) +void *extgl_GetProcAddress(const char *name) { #ifdef _WIN32 void *t = wglGetProcAddress(name); @@ -257,6 +218,9 @@ bool extgl_InitializeClass(JNIEnv *env, jclass clazz, jobject ext_set, const cha return ext_InitializeClass(env, clazz, ext_set, ext_name, &extgl_GetProcAddress, num_functions, functions); } +bool extgl_InitializeFunctions(int num_functions, ExtFunction *functions) { + return ext_InitializeFunctions(&extgl_GetProcAddress, num_functions, functions); +} static void insertExtension(JNIEnv *env, jobject ext_set, const char *ext) { doExtension(env, ext_set, "add", ext); @@ -333,7 +297,7 @@ static void aglUnloadFramework(CFBundleRef f) #endif -static bool QueryExtension(JNIEnv *env, jobject ext_set, const GLubyte*extensions, const char *name) +bool extgl_QueryExtension(JNIEnv *env, jobject ext_set, const GLubyte*extensions, const char *name) { const GLubyte *start; GLubyte *where, *terminator; @@ -390,7 +354,7 @@ static bool WGLQueryExtension(JNIEnv *env, const char *name) extensions = (GLubyte*)wglGetExtensionsStringEXT(); else extensions = (GLubyte*)wglGetExtensionsStringARB(wglGetCurrentDC()); - return QueryExtension(env, NULL, extensions, name); + return extgl_QueryExtension(env, NULL, extensions, name); } /*static void extgl_InitWGLARBBufferRegion(JNIEnv *env) @@ -545,108 +509,12 @@ bool extgl_InitAGL(JNIEnv *env) /* AGL stuff END*/ /*-----------------------------------------------------*/ -#ifdef _X11 -/** returns true if the extention is available */ -static bool GLXQueryExtension(JNIEnv* env, Display *disp, int screen, const char *name) -{ - const GLubyte *exts = (const GLubyte *)glXQueryExtensionsString(disp, screen); - return QueryExtension(env, NULL, exts, name); -} -#endif - /** returns true if the extention is available */ static bool GLQueryExtension(JNIEnv *env, jobject ext_set, const char *name) { - return QueryExtension(env, ext_set, glGetString(GL_EXTENSIONS), name); + return extgl_QueryExtension(env, ext_set, glGetString(GL_EXTENSIONS), name); } - -#ifdef _X11 -static void extgl_InitGLX13(JNIEnv *env) -{ - if (extgl_Extensions.GLX13 != 1) - return; - glXGetFBConfigs = (glXGetFBConfigsPROC) extgl_GetProcAddress("glXGetFBConfigs"); - glXChooseFBConfig = (glXChooseFBConfigPROC) extgl_GetProcAddress("glXChooseFBConfig"); - glXGetFBConfigAttrib = (glXGetFBConfigAttribPROC) extgl_GetProcAddress("glXGetFBConfigAttrib"); - glXGetVisualFromFBConfig = (glXGetVisualFromFBConfigPROC) extgl_GetProcAddress("glXGetVisualFromFBConfig"); - glXCreateWindow = (glXCreateWindowPROC) extgl_GetProcAddress("glXCreateWindow"); - glXDestroyWindow = (glXDestroyWindowPROC) extgl_GetProcAddress("glXDestroyWindow"); - glXCreatePixmap = (glXCreatePixmapPROC) extgl_GetProcAddress("glXCreatePixmap"); - glXDestroyPixmap = (glXDestroyPixmapPROC) extgl_GetProcAddress("glXDestroyPixmap"); - glXCreatePbuffer = (glXCreatePbufferPROC) extgl_GetProcAddress("glXCreatePbuffer"); - glXDestroyPbuffer = (glXDestroyPbufferPROC) extgl_GetProcAddress("glXDestroyPbuffer"); - glXQueryDrawable = (glXQueryDrawablePROC) extgl_GetProcAddress("glXQueryDrawable"); - glXCreateNewContext = (glXCreateNewContextPROC) extgl_GetProcAddress("glXCreateNewContext"); - glXMakeContextCurrent = (glXMakeContextCurrentPROC) extgl_GetProcAddress("glXMakeContextCurrent"); - glXGetCurrentReadDrawable = (glXGetCurrentReadDrawablePROC) extgl_GetProcAddress("glXGetCurrentReadDrawable"); - glXGetCurrentDisplay = (glXGetCurrentDisplayPROC) extgl_GetProcAddress("glXGetCurrentDisplay"); - glXQueryContext = (glXQueryContextPROC) extgl_GetProcAddress("glXQueryContext"); - glXSelectEvent = (glXSelectEventPROC) extgl_GetProcAddress("glXSelectEvent"); - glXGetSelectedEvent = (glXGetSelectedEventPROC) extgl_GetProcAddress("glXGetSelectedEvent"); - EXTGL_SANITY_CHECK(env, GLX13); -} - -static bool extgl_InitGLX12(void) -{ - glXChooseVisual = (glXChooseVisualPROC) extgl_GetProcAddress("glXChooseVisual"); - glXCopyContext = (glXCopyContextPROC) extgl_GetProcAddress("glXCopyContext"); - glXCreateContext = (glXCreateContextPROC) extgl_GetProcAddress("glXCreateContext"); - glXCreateGLXPixmap = (glXCreateGLXPixmapPROC) extgl_GetProcAddress("glXCreateGLXPixmap"); - glXDestroyContext = (glXDestroyContextPROC) extgl_GetProcAddress("glXDestroyContext"); - glXDestroyGLXPixmap = (glXDestroyGLXPixmapPROC) extgl_GetProcAddress("glXDestroyGLXPixmap"); - glXGetConfig = (glXGetConfigPROC) extgl_GetProcAddress("glXGetConfig"); - glXGetCurrentContext = (glXGetCurrentContextPROC) extgl_GetProcAddress("glXGetCurrentContext"); - glXGetCurrentDrawable = (glXGetCurrentDrawablePROC) extgl_GetProcAddress("glXGetCurrentDrawable"); - glXIsDirect = (glXIsDirectPROC) extgl_GetProcAddress("glXIsDirect"); - glXMakeCurrent = (glXMakeCurrentPROC) extgl_GetProcAddress("glXMakeCurrent"); - glXQueryExtension = (glXQueryExtensionPROC) extgl_GetProcAddress("glXQueryExtension"); - glXQueryVersion = (glXQueryVersionPROC) extgl_GetProcAddress("glXQueryVersion"); - glXSwapBuffers = (glXSwapBuffersPROC) extgl_GetProcAddress("glXSwapBuffers"); - glXUseXFont = (glXUseXFontPROC) extgl_GetProcAddress("glXUseXFont"); - glXWaitGL = (glXWaitGLPROC) extgl_GetProcAddress("glXWaitGL"); - glXWaitX = (glXWaitXPROC) extgl_GetProcAddress("glXWaitX"); - glXGetClientString = (glXGetClientStringPROC) extgl_GetProcAddress("glXGetClientString"); - glXQueryServerString = (glXQueryServerStringPROC) extgl_GetProcAddress("glXQueryServerString"); - glXQueryExtensionsString = (glXQueryExtensionsStringPROC) extgl_GetProcAddress("glXQueryExtensionsString"); - return !extgl_error; -} - -static void extgl_InitGLXSupportedExtensions(JNIEnv *env, Display *disp, int screen) -{ - extgl_Extensions.GLX_EXT_visual_info = GLXQueryExtension(env, disp, screen, "GLX_EXT_visual_info"); - extgl_Extensions.GLX_EXT_visual_rating = GLXQueryExtension(env, disp, screen, "GLX_EXT_visual_rating"); - extgl_Extensions.GLX_SGI_swap_control = GLXQueryExtension(env, disp, screen, "GLX_SGI_swap_control"); - extgl_Extensions.GLX_ARB_multisample = GLXQueryExtension(env, disp, screen, "GLX_ARB_multisample"); -} - -static void extgl_InitGLXSGISwapControl(JNIEnv *env) -{ - if (extgl_Extensions.GLX_SGI_swap_control != 1) - return; - glXSwapIntervalSGI = (glXSwapIntervalSGIPROC)extgl_GetProcAddress("glXSwapIntervalSGI"); - EXTGL_SANITY_CHECK(env, GLX_SGI_swap_control); -} - -bool extgl_InitGLX(JNIEnv *env, Display *disp, int screen) -{ - int major, minor; - /* Assume glx ver >= 1.2 */ - extgl_Extensions.GLX12 = true; - if (!extgl_InitGLX12()) - return false; - extgl_InitGLXSupportedExtensions(env, disp, screen); - if (glXQueryVersion(disp, &major, &minor) != True) - return false; - if (major > 1 || (major == 1 && minor >= 3)) - extgl_Extensions.GLX13 = true; - extgl_InitGLX13(env); - extgl_InitGLXSGISwapControl(env); - return true; -} -#endif - - static void extgl_InitSupportedExtensions(JNIEnv *env, jobject ext_set) { char *s = (char*) glGetString(GL_VERSION); diff --git a/src/native/common/extgl.h b/src/native/common/extgl.h index c32d0ce1..fb065201 100644 --- a/src/native/common/extgl.h +++ b/src/native/common/extgl.h @@ -123,334 +123,6 @@ typedef double GLdouble; typedef double GLclampd; typedef void GLvoid; -#ifdef _X11 - -#include - -/* - * Names for attributes to glXGetConfig. - */ -#define GLX_USE_GL 1 /* support GLX rendering */ -#define GLX_BUFFER_SIZE 2 /* depth of the color buffer */ -#define GLX_LEVEL 3 /* level in plane stacking */ -#define GLX_RGBA 4 /* true if RGBA mode */ -#define GLX_DOUBLEBUFFER 5 /* double buffering supported */ -#define GLX_STEREO 6 /* stereo buffering supported */ -#define GLX_AUX_BUFFERS 7 /* number of aux buffers */ -#define GLX_RED_SIZE 8 /* number of red component bits */ -#define GLX_GREEN_SIZE 9 /* number of green component bits */ -#define GLX_BLUE_SIZE 10 /* number of blue component bits */ -#define GLX_ALPHA_SIZE 11 /* number of alpha component bits */ -#define GLX_DEPTH_SIZE 12 /* number of depth bits */ -#define GLX_STENCIL_SIZE 13 /* number of stencil bits */ -#define GLX_ACCUM_RED_SIZE 14 /* number of red accum bits */ -#define GLX_ACCUM_GREEN_SIZE 15 /* number of green accum bits */ -#define GLX_ACCUM_BLUE_SIZE 16 /* number of blue accum bits */ -#define GLX_ACCUM_ALPHA_SIZE 17 /* number of alpha accum bits */ - -#define GLX_SAMPLE_BUFFERS_ARB 100000 /* number of multisample buffers */ -#define GLX_SAMPLES_ARB 100001 /* number of multisample samples */ - -/* - * FBConfig-specific attributes - */ -#define GLX_X_VISUAL_TYPE 0x22 -#define GLX_CONFIG_CAVEAT 0x20 /* Like visual_info VISUAL_CAVEAT */ -#define GLX_TRANSPARENT_TYPE 0x23 -#define GLX_TRANSPARENT_INDEX_VALUE 0x24 -#define GLX_TRANSPARENT_RED_VALUE 0x25 -#define GLX_TRANSPARENT_GREEN_VALUE 0x26 -#define GLX_TRANSPARENT_BLUE_VALUE 0x27 -#define GLX_TRANSPARENT_ALPHA_VALUE 0x28 -#define GLX_DRAWABLE_TYPE 0x8010 -#define GLX_RENDER_TYPE 0x8011 -#define GLX_X_RENDERABLE 0x8012 -#define GLX_FBCONFIG_ID 0x8013 -#define GLX_MAX_PBUFFER_WIDTH 0x8016 -#define GLX_MAX_PBUFFER_HEIGHT 0x8017 -#define GLX_MAX_PBUFFER_PIXELS 0x8018 -#define GLX_VISUAL_ID 0x800B - -#define GLX_DRAWABLE_TYPE_SGIX GLX_DRAWABLE_TYPE -#define GLX_RENDER_TYPE_SGIX GLX_RENDER_TYPE -#define GLX_X_RENDERABLE_SGIX GLX_X_RENDERABLE -#define GLX_FBCONFIG_ID_SGIX GLX_FBCONFIG_ID -#define GLX_MAX_PBUFFER_WIDTH_SGIX GLX_MAX_PBUFFER_WIDTH -#define GLX_MAX_PBUFFER_HEIGHT_SGIX GLX_MAX_PBUFFER_HEIGHT -#define GLX_MAX_PBUFFER_PIXELS_SGIX GLX_MAX_PBUFFER_PIXELS -#define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019 -#define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A - -/* - * Error return values from glXGetConfig. Success is indicated by - * a value of 0. - */ -#define GLX_BAD_SCREEN 1 /* screen # is bad */ -#define GLX_BAD_ATTRIBUTE 2 /* attribute to get is bad */ -#define GLX_NO_EXTENSION 3 /* no glx extension on server */ -#define GLX_BAD_VISUAL 4 /* visual # not known by GLX */ -#define GLX_BAD_CONTEXT 5 -#define GLX_BAD_VALUE 6 -#define GLX_BAD_ENUM 7 - - -/* FBConfig attribute values */ - -/* - * Generic "don't care" value for glX ChooseFBConfig attributes (except - * GLX_LEVEL). - */ -#define GLX_DONT_CARE 0xFFFFFFFF - -/* GLX_RENDER_TYPE bits */ -#define GLX_RGBA_BIT 0x00000001 -#define GLX_COLOR_INDEX_BIT 0x00000002 -#define GLX_RGBA_BIT_SGIX GLX_RGBA_BIT -#define GLX_COLOR_INDEX_BIT_SGIX GLX_COLOR_INDEX_BIT - -/* GLX_DRAWABLE_TYPE bits */ -#define GLX_WINDOW_BIT 0x00000001 -#define GLX_PIXMAP_BIT 0x00000002 -#define GLX_PBUFFER_BIT 0x00000004 -#define GLX_WINDOW_BIT_SGIX GLX_WINDOW_BIT -#define GLX_PIXMAP_BIT_SGIX GLX_PIXMAP_BIT -#define GLX_PBUFFER_BIT_SGIX GLX_PBUFFER_BIT - -/* GLX_CONFIG_CAVEAT attribute values */ -#define GLX_NONE 0x8000 -#define GLX_SLOW_CONFIG 0x8001 -#define GLX_NON_CONFORMANT_CONFIG 0x800D - -/* GLX_X_VISUAL_TYPE attribute values */ -#define GLX_TRUE_COLOR 0x8002 -#define GLX_DIRECT_COLOR 0x8003 -#define GLX_PSEUDO_COLOR 0x8004 -#define GLX_STATIC_COLOR 0x8005 -#define GLX_GRAY_SCALE 0x8006 -#define GLX_STATIC_GRAY 0x8007 - -/* GLX_TRANSPARENT_TYPE attribute values */ -/* #define GLX_NONE 0x8000 */ -#define GLX_TRANSPARENT_RGB 0x8008 -#define GLX_TRANSPARENT_INDEX 0x8009 - -/* glXCreateGLXPbuffer attributes */ -#define GLX_PRESERVED_CONTENTS 0x801B -#define GLX_LARGEST_PBUFFER 0x801C -#define GLX_PBUFFER_HEIGHT 0x8040 /* New for GLX 1.3 */ -#define GLX_PBUFFER_WIDTH 0x8041 /* New for GLX 1.3 */ -#define GLX_PRESERVED_CONTENTS_SGIX GLX_PRESERVED_CONTENTS -#define GLX_LARGEST_PBUFFER_SGIX GLX_LARGEST_PBUFFER - -/* glXQueryGLXPBuffer attributes */ -#define GLX_WIDTH 0x801D -#define GLX_HEIGHT 0x801E -#define GLX_EVENT_MASK 0x801F -#define GLX_WIDTH_SGIX GLX_WIDTH -#define GLX_HEIGHT_SGIX GLX_HEIGHT -#define GLX_EVENT_MASK_SGIX GLX_EVENT_MASK - -/* glXCreateNewContext render_type attribute values */ -#define GLX_RGBA_TYPE 0x8014 -#define GLX_COLOR_INDEX_TYPE 0x8015 -#define GLX_RGBA_TYPE_SGIX GLX_RGBA_TYPE -#define GLX_COLOR_INDEX_TYPE_SGIX GLX_COLOR_INDEX_TYPE - -/* glXQueryContext attributes */ -/* #define GLX_FBCONFIG_ID 0x8013 */ -/* #define GLX_RENDER_TYPE 0x8011 */ -#define GLX_SCREEN 0x800C - -/* glXSelectEvent event mask bits */ -#define GLX_PBUFFER_CLOBBER_MASK 0x08000000 -#define GLX_PBUFFER_CLOBBER_MASK_SGIX GLX_PBUFFER_CLOBBER_MASK - -/* GLXPbufferClobberEvent event_type values */ -#define GLX_DAMAGED 0x8020 -#define GLX_SAVED 0x8021 -#define GLX_DAMAGED_SGIX GLX_DAMAGED -#define GLX_SAVED_SGIX GLX_SAVED - -/* GLXPbufferClobberEvent draw_type values */ -#define GLX_WINDOW 0x8022 -#define GLX_PBUFFER 0x8023 -#define GLX_WINDOW_SGIX GLX_WINDOW -#define GLX_PBUFFER_SGIX GLX_PBUFFER - -/* GLXPbufferClobberEvent buffer_mask bits */ -#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001 -#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 -#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 -#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 -#define GLX_AUX_BUFFERS_BIT 0x00000010 -#define GLX_DEPTH_BUFFER_BIT 0x00000020 -#define GLX_STENCIL_BUFFER_BIT 0x00000040 -#define GLX_ACCUM_BUFFER_BIT 0x00000080 -#define GLX_FRONT_LEFT_BUFFER_BIT_SGIX GLX_FRONT_LEFT_BUFFER_BIT -#define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX GLX_FRONT_RIGHT_BUFFER_BIT -#define GLX_BACK_LEFT_BUFFER_BIT_SGIX GLX_BACK_LEFT_BUFFER_BIT -#define GLX_BACK_RIGHT_BUFFER_BIT_SGIX GLX_BACK_RIGHT_BUFFER_BIT -#define GLX_AUX_BUFFERS_BIT_SGIX GLX_AUX_BUFFERS_BIT -#define GLX_DEPTH_BUFFER_BIT_SGIX GLX_DEPTH_BUFFER_BIT -#define GLX_STENCIL_BUFFER_BIT_SGIX GLX_STENCIL_BUFFER_BIT -#define GLX_ACCUM_BUFFER_BIT_SGIX GLX_ACCUM_BUFFER_BIT - -/* - * Extension return values from glXGetConfig. These are also - * accepted as parameter values for glXChooseVisual. - */ - -#define GLX_X_VISUAL_TYPE_EXT 0x22 /* visual_info extension type */ -#define GLX_TRANSPARENT_TYPE_EXT 0x23 /* visual_info extension */ -#define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24 /* visual_info extension */ -#define GLX_TRANSPARENT_RED_VALUE_EXT 0x25 /* visual_info extension */ -#define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26 /* visual_info extension */ -#define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27 /* visual_info extension */ -#define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28 /* visual_info extension */ - -/* Property values for visual_type */ -#define GLX_TRUE_COLOR_EXT 0x8002 -#define GLX_DIRECT_COLOR_EXT 0x8003 -#define GLX_PSEUDO_COLOR_EXT 0x8004 -#define GLX_STATIC_COLOR_EXT 0x8005 -#define GLX_GRAY_SCALE_EXT 0x8006 -#define GLX_STATIC_GRAY_EXT 0x8007 - -/* Property values for transparent pixel */ -#define GLX_NONE_EXT 0x8000 -#define GLX_TRANSPARENT_RGB_EXT 0x8008 -#define GLX_TRANSPARENT_INDEX_EXT 0x8009 - -/* Property values for visual_rating */ -#define GLX_VISUAL_CAVEAT_EXT 0x20 /* visual_rating extension type */ -#define GLX_SLOW_VISUAL_EXT 0x8001 -#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D - -/* - * Names for attributes to glXGetClientString. - */ -#define GLX_VENDOR 0x1 -#define GLX_VERSION 0x2 -#define GLX_EXTENSIONS 0x3 - -/* - * Names for attributes to glXQueryContextInfoEXT. - */ -#define GLX_SHARE_CONTEXT_EXT 0x800A /* id of share context */ -#define GLX_VISUAL_ID_EXT 0x800B /* id of context's visual */ -#define GLX_SCREEN_EXT 0x800C /* screen number */ - -/* NV_float_buffer */ -#define GLX_FLOAT_COMPONENTS_NV 0x20B0 - -typedef XID GLXContextID; -typedef XID GLXPixmap; -typedef XID GLXDrawable; -typedef XID GLXPbuffer; -typedef XID GLXWindow; -typedef XID GLXFBConfigID; - -typedef struct __GLXcontextRec *GLXContext; - -typedef struct __GLXFBConfigRec *GLXFBConfig; - -typedef GLXFBConfig * (APIENTRY * glXGetFBConfigsPROC) (Display *dpy, int screen, int *nelements); -typedef GLXFBConfig * (APIENTRY * glXChooseFBConfigPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); -typedef int (APIENTRY * glXGetFBConfigAttribPROC) (Display *dpy, GLXFBConfig config, int attribute, int *value); -typedef XVisualInfo * (APIENTRY * glXGetVisualFromFBConfigPROC) (Display *dpy, GLXFBConfig config); -typedef GLXWindow (APIENTRY * glXCreateWindowPROC) (Display *dpy, GLXFBConfig config, Window win, const int *attrib_list); -typedef void (APIENTRY * glXDestroyWindowPROC) (Display *dpy, GLXWindow win); -typedef GLXPixmap (APIENTRY * glXCreatePixmapPROC) (Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list); -typedef void (APIENTRY * glXDestroyPixmapPROC) (Display *dpy, GLXPixmap pixmap); -typedef GLXPbuffer (APIENTRY * glXCreatePbufferPROC) (Display *dpy, GLXFBConfig config, const int *attrib_list); -typedef void (APIENTRY * glXDestroyPbufferPROC) (Display *dpy, GLXPbuffer pbuf); -typedef void (APIENTRY * glXQueryDrawablePROC) (Display *dpy, GLXDrawable draw, int attribute, unsigned int *value); -typedef GLXContext (APIENTRY * glXCreateNewContextPROC) (Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); -typedef Bool (APIENTRY * glXMakeContextCurrentPROC) (Display *display, GLXDrawable draw, GLXDrawable read, GLXContext ctx); -typedef GLXDrawable (APIENTRY * glXGetCurrentReadDrawablePROC) (void); -typedef Display * (APIENTRY * glXGetCurrentDisplayPROC) (void); -typedef int (APIENTRY * glXQueryContextPROC) (Display *dpy, GLXContext ctx, int attribute, int *value); -typedef void (APIENTRY * glXSelectEventPROC) (Display *dpy, GLXDrawable draw, unsigned long event_mask); -typedef void (APIENTRY * glXGetSelectedEventPROC) (Display *dpy, GLXDrawable draw, unsigned long *event_mask); - -typedef GLXContextID (APIENTRY * glXGetContextIDEXTPROC) (const GLXContext ctx); -typedef GLXDrawable (APIENTRY * glXGetCurrentDrawableEXTPROC) (void); -typedef GLXContext (APIENTRY * glXImportContextEXTPROC) (Display *dpy, GLXContextID contextID); -typedef void (APIENTRY * glXFreeContextEXTPROC) (Display *dpy, GLXContext ctx); -typedef int (APIENTRY * glXQueryContextInfoEXTPROC) (Display *dpy, GLXContext ctx, int attribute, int *value); - -typedef void (* (APIENTRY * glXGetProcAddressARBPROC) (const GLubyte *procName))(void); - -typedef XVisualInfo* (APIENTRY * glXChooseVisualPROC) (Display *dpy, int screen, int *attribList); -typedef void (APIENTRY * glXCopyContextPROC) (Display *dpy, GLXContext src, GLXContext dst, unsigned long mask); -typedef GLXContext (APIENTRY * glXCreateContextPROC) (Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct); -typedef GLXPixmap (APIENTRY * glXCreateGLXPixmapPROC) (Display *dpy, XVisualInfo *vis, Pixmap pixmap); -typedef void (APIENTRY * glXDestroyContextPROC) (Display *dpy, GLXContext ctx); -typedef void (APIENTRY * glXDestroyGLXPixmapPROC) (Display *dpy, GLXPixmap pix); -typedef int (APIENTRY * glXGetConfigPROC) (Display *dpy, XVisualInfo *vis, int attrib, int *value); -typedef GLXContext (APIENTRY * glXGetCurrentContextPROC) (void); -typedef GLXDrawable (APIENTRY * glXGetCurrentDrawablePROC) (void); -typedef Bool (APIENTRY * glXIsDirectPROC) (Display *dpy, GLXContext ctx); -typedef Bool (APIENTRY * glXMakeCurrentPROC) (Display *dpy, GLXDrawable drawable, GLXContext ctx); -typedef Bool (APIENTRY * glXQueryExtensionPROC) (Display *dpy, int *errorBase, int *eventBase); -typedef Bool (APIENTRY * glXQueryVersionPROC) (Display *dpy, int *major, int *minor); -typedef void (APIENTRY * glXSwapBuffersPROC) (Display *dpy, GLXDrawable drawable); -typedef void (APIENTRY * glXUseXFontPROC) (Font font, int first, int count, int listBase); -typedef void (APIENTRY * glXWaitGLPROC) (void); -typedef void (APIENTRY * glXWaitXPROC) (void); -typedef const char * (APIENTRY * glXGetClientStringPROC) (Display *dpy, int name ); -typedef const char * (APIENTRY * glXQueryServerStringPROC) (Display *dpy, int screen, int name ); -typedef const char * (APIENTRY * glXQueryExtensionsStringPROC) (Display *dpy, int screen ); - -extern glXGetFBConfigsPROC glXGetFBConfigs; -extern glXChooseFBConfigPROC glXChooseFBConfig; -extern glXGetFBConfigAttribPROC glXGetFBConfigAttrib; -extern glXGetVisualFromFBConfigPROC glXGetVisualFromFBConfig; -extern glXCreateWindowPROC glXCreateWindow; -extern glXDestroyWindowPROC glXDestroyWindow; -extern glXCreatePixmapPROC glXCreatePixmap; -extern glXDestroyPixmapPROC glXDestroyPixmap; -extern glXCreatePbufferPROC glXCreatePbuffer; -extern glXDestroyPbufferPROC glXDestroyPbuffer; -extern glXQueryDrawablePROC glXQueryDrawable; -extern glXCreateNewContextPROC glXCreateNewContext; -extern glXMakeContextCurrentPROC glXMakeContextCurrent; -extern glXGetCurrentReadDrawablePROC glXGetCurrentReadDrawable; -extern glXGetCurrentDisplayPROC glXGetCurrentDisplay; -extern glXQueryContextPROC glXQueryContext; -extern glXSelectEventPROC glXSelectEvent; -extern glXGetSelectedEventPROC glXGetSelectedEvent; - -extern glXGetProcAddressARBPROC glXGetProcAddressARB; - -extern glXChooseVisualPROC glXChooseVisual; -extern glXCopyContextPROC glXCopyContext; -extern glXCreateContextPROC glXCreateContext; -extern glXCreateGLXPixmapPROC glXCreateGLXPixmap; -extern glXDestroyContextPROC glXDestroyContext; -extern glXDestroyGLXPixmapPROC glXDestroyGLXPixmap; -extern glXGetConfigPROC glXGetConfig; -extern glXGetCurrentContextPROC glXGetCurrentContext; -extern glXGetCurrentDrawablePROC glXGetCurrentDrawable; -extern glXIsDirectPROC glXIsDirect; -extern glXMakeCurrentPROC glXMakeCurrent; -extern glXQueryExtensionPROC glXQueryExtension; -extern glXQueryVersionPROC glXQueryVersion; -extern glXSwapBuffersPROC glXSwapBuffers; -extern glXUseXFontPROC glXUseXFont; -extern glXWaitGLPROC glXWaitGL; -extern glXWaitXPROC glXWaitX; -extern glXGetClientStringPROC glXGetClientString; -extern glXQueryServerStringPROC glXQueryServerString; -extern glXQueryExtensionsStringPROC glXQueryExtensionsString; - -/* GLX_SGI_swap_control */ -typedef void (APIENTRY * glXSwapIntervalSGIPROC)(int interval); - -extern glXSwapIntervalSGIPROC glXSwapIntervalSGI; - -#endif /* X11 */ - #ifdef _AGL #include #include @@ -2485,21 +2157,19 @@ typedef const GLubyte * (APIENTRY * glGetStringPROC) (GLenum name); extern glGetErrorPROC glGetError; extern glGetStringPROC glGetString; - /* initializes everything, call this right after the rc is created. the function returns 0 if successful */ -bool extgl_Initialize(JNIEnv *env, jobject gl_extensions); -bool extgl_Open(void); +extern bool extgl_Initialize(JNIEnv *env, jobject gl_extensions); +extern bool extgl_Open(void); #ifdef _WIN32 -void extgl_InitWGL(JNIEnv *env); -#endif -#ifdef _X11 -bool extgl_InitGLX(JNIEnv *env, Display *disp, int screen); +extern void extgl_InitWGL(JNIEnv *env); #endif #ifdef _AGL -bool extgl_InitAGL(JNIEnv *env); +extern bool extgl_InitAGL(JNIEnv *env); #endif -void extgl_Close(void); -bool extgl_InitializeClass(JNIEnv *env, jclass clazz, jobject ext_set, const char *ext_name, int num_functions, JavaMethodAndExtFunction *functions); +extern void extgl_Close(void); +extern bool extgl_InitializeClass(JNIEnv *env, jclass clazz, jobject ext_set, const char *ext_name, int num_functions, JavaMethodAndExtFunction *functions); +extern bool extgl_InitializeFunctions(int num_functions, ExtFunction *functions); +extern bool extgl_QueryExtension(JNIEnv *env, jobject ext_set, const GLubyte*extensions, const char *name); #define EXTGL_SANITY_CHECK(e,x) if (extgl_error) { \ extgl_Extensions.x = false; \ diff --git a/src/native/linux/Makefile.am b/src/native/linux/Makefile.am index 1ea2b504..196d2a03 100644 --- a/src/native/linux/Makefile.am +++ b/src/native/linux/Makefile.am @@ -12,5 +12,6 @@ NATIVE = \ org_lwjgl_input_Cursor.cpp \ org_lwjgl_opengl_Window.cpp \ org_lwjgl_opengl_Pbuffer.cpp \ + extgl_glx.cpp \ extxcursor.cpp diff --git a/src/native/linux/Window.h b/src/native/linux/Window.h index 7954a4aa..a4991edb 100644 --- a/src/native/linux/Window.h +++ b/src/native/linux/Window.h @@ -47,6 +47,7 @@ #include #include #include "extgl.h" + #include "extgl_glx.h" /* * update input grabbing(keyboard, mouse) diff --git a/src/native/linux/extgl_glx.cpp b/src/native/linux/extgl_glx.cpp new file mode 100644 index 00000000..fedf90c9 --- /dev/null +++ b/src/native/linux/extgl_glx.cpp @@ -0,0 +1,134 @@ +#include "extgl_glx.h" + +glXGetFBConfigsPROC glXGetFBConfigs = NULL; +glXChooseFBConfigPROC glXChooseFBConfig = NULL; +glXGetFBConfigAttribPROC glXGetFBConfigAttrib = NULL; +glXGetVisualFromFBConfigPROC glXGetVisualFromFBConfig = NULL; +glXCreateWindowPROC glXCreateWindow = NULL; +glXDestroyWindowPROC glXDestroyWindow = NULL; +glXCreatePixmapPROC glXCreatePixmap = NULL; +glXDestroyPixmapPROC glXDestroyPixmap = NULL; +glXCreatePbufferPROC glXCreatePbuffer = NULL; +glXDestroyPbufferPROC glXDestroyPbuffer = NULL; +glXQueryDrawablePROC glXQueryDrawable = NULL; +glXCreateNewContextPROC glXCreateNewContext = NULL; +glXMakeContextCurrentPROC glXMakeContextCurrent = NULL; +glXGetCurrentReadDrawablePROC glXGetCurrentReadDrawable = NULL; +glXGetCurrentDisplayPROC glXGetCurrentDisplay = NULL; +glXQueryContextPROC glXQueryContext = NULL; +glXSelectEventPROC glXSelectEvent = NULL; +glXGetSelectedEventPROC glXGetSelectedEvent = NULL; +glXChooseVisualPROC glXChooseVisual = NULL; +glXCopyContextPROC glXCopyContext = NULL; +glXCreateContextPROC glXCreateContext = NULL; +glXCreateGLXPixmapPROC glXCreateGLXPixmap = NULL; +glXDestroyContextPROC glXDestroyContext = NULL; +glXDestroyGLXPixmapPROC glXDestroyGLXPixmap = NULL; +glXGetConfigPROC glXGetConfig = NULL; +glXGetCurrentContextPROC glXGetCurrentContext = NULL; +glXGetCurrentDrawablePROC glXGetCurrentDrawable = NULL; +glXIsDirectPROC glXIsDirect = NULL; +glXMakeCurrentPROC glXMakeCurrent = NULL; +glXQueryExtensionPROC glXQueryExtension = NULL; +glXQueryVersionPROC glXQueryVersion = NULL; +glXSwapBuffersPROC glXSwapBuffers = NULL; +glXUseXFontPROC glXUseXFont = NULL; +glXWaitGLPROC glXWaitGL = NULL; +glXWaitXPROC glXWaitX = NULL; +glXGetClientStringPROC glXGetClientString = NULL; +glXQueryServerStringPROC glXQueryServerString = NULL; +glXQueryExtensionsStringPROC glXQueryExtensionsString = NULL; + +/* GLX_SGI_swap_control */ +glXSwapIntervalSGIPROC glXSwapIntervalSGI = NULL; + +/** returns true if the extention is available */ +static bool GLXQueryExtension(JNIEnv* env, Display *disp, int screen, const char *name) +{ + const GLubyte *exts = (const GLubyte *)glXQueryExtensionsString(disp, screen); + return extgl_QueryExtension(env, NULL, exts, name); +} + +static void extgl_InitGLX13(JNIEnv *env) +{ + ExtFunction functions[] = { + {"glXGetFBConfigs", (void **)&glXGetFBConfigs}, + {"glXChooseFBConfig", (void **)&glXChooseFBConfig}, + {"glXGetFBConfigAttrib", (void **)&glXGetFBConfigAttrib}, + {"glXGetVisualFromFBConfig", (void **)&glXGetVisualFromFBConfig}, + {"glXCreateWindow", (void **)&glXCreateWindow}, + {"glXDestroyWindow", (void **)&glXDestroyWindow}, + {"glXCreatePixmap", (void **)&glXCreatePixmap}, + {"glXDestroyPixmap", (void **)&glXDestroyPixmap}, + {"glXCreatePbuffer", (void **)&glXCreatePbuffer}, + {"glXDestroyPbuffer", (void **)&glXDestroyPbuffer}, + {"glXQueryDrawable", (void **)&glXQueryDrawable}, + {"glXCreateNewContext", (void **)&glXCreateNewContext}, + {"glXMakeContextCurrent", (void **)&glXMakeContextCurrent}, + {"glXGetCurrentReadDrawable", (void **)&glXGetCurrentReadDrawable}, + {"glXGetCurrentDisplay", (void **)&glXGetCurrentDisplay}, + {"glXQueryContext", (void **)&glXQueryContext}, + {"glXSelectEvent", (void **)&glXSelectEvent}, + {"glXGetSelectedEvent", (void **)&glXGetSelectedEvent}}; + if (extgl_Extensions.GLX13) + extgl_Extensions.GLX13 = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions); +} + +static bool extgl_InitGLX12(void) +{ + ExtFunction functions[] = { + {"glXChooseVisual", (void **)&glXChooseVisual}, + {"glXCopyContext", (void **)&glXCopyContext}, + {"glXCreateContext", (void **)&glXCreateContext}, + {"glXCreateGLXPixmap", (void **)&glXCreateGLXPixmap}, + {"glXDestroyContext", (void **)&glXDestroyContext}, + {"glXDestroyGLXPixmap", (void **)&glXDestroyGLXPixmap}, + {"glXGetConfig", (void **)&glXGetConfig}, + {"glXGetCurrentContext", (void **)&glXGetCurrentContext}, + {"glXGetCurrentDrawable", (void **)&glXGetCurrentDrawable}, + {"glXIsDirect", (void **)&glXIsDirect}, + {"glXMakeCurrent", (void **)&glXMakeCurrent}, + {"glXQueryExtension", (void **)&glXQueryExtension}, + {"glXQueryVersion", (void **)&glXQueryVersion}, + {"glXSwapBuffers", (void **)&glXSwapBuffers}, + {"glXUseXFont", (void **)&glXUseXFont}, + {"glXWaitGL", (void **)&glXWaitGL}, + {"glXWaitX", (void **)&glXWaitX}, + {"glXGetClientString", (void **)&glXGetClientString}, + {"glXQueryServerString", (void **)&glXQueryServerString}, + {"glXQueryExtensionsString", (void **)&glXQueryExtensionsString}}; + return extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions); +} + +static void extgl_InitGLXSupportedExtensions(JNIEnv *env, Display *disp, int screen) +{ + extgl_Extensions.GLX_EXT_visual_info = GLXQueryExtension(env, disp, screen, "GLX_EXT_visual_info"); + extgl_Extensions.GLX_EXT_visual_rating = GLXQueryExtension(env, disp, screen, "GLX_EXT_visual_rating"); + extgl_Extensions.GLX_SGI_swap_control = GLXQueryExtension(env, disp, screen, "GLX_SGI_swap_control"); + extgl_Extensions.GLX_ARB_multisample = GLXQueryExtension(env, disp, screen, "GLX_ARB_multisample"); +} + +static void extgl_InitGLXSGISwapControl(JNIEnv *env) +{ + ExtFunction functions[] = { + {"glXSwapIntervalSGI", (void **)&glXSwapIntervalSGI}}; + if (extgl_Extensions.GLX_SGI_swap_control) + extgl_Extensions.GLX_SGI_swap_control = extgl_InitializeFunctions(sizeof(functions)/sizeof(ExtFunction), functions); +} + +bool extgl_InitGLX(JNIEnv *env, Display *disp, int screen) +{ + int major, minor; + /* Assume glx ver >= 1.2 */ + extgl_Extensions.GLX12 = true; + if (!extgl_InitGLX12()) + return false; + extgl_InitGLXSupportedExtensions(env, disp, screen); + if (glXQueryVersion(disp, &major, &minor) != True) + return false; + if (major > 1 || (major == 1 && minor >= 3)) + extgl_Extensions.GLX13 = true; + extgl_InitGLX13(env); + extgl_InitGLXSGISwapControl(env); + return true; +} diff --git a/src/native/linux/extgl_glx.h b/src/native/linux/extgl_glx.h new file mode 100644 index 00000000..3a64cfa0 --- /dev/null +++ b/src/native/linux/extgl_glx.h @@ -0,0 +1,327 @@ +#ifndef EXTGL_GLX_H +#define EXTGL_GLX_H + +#include +#include "extgl.h" + +/* + * Names for attributes to glXGetConfig. + */ +#define GLX_USE_GL 1 /* support GLX rendering */ +#define GLX_BUFFER_SIZE 2 /* depth of the color buffer */ +#define GLX_LEVEL 3 /* level in plane stacking */ +#define GLX_RGBA 4 /* true if RGBA mode */ +#define GLX_DOUBLEBUFFER 5 /* double buffering supported */ +#define GLX_STEREO 6 /* stereo buffering supported */ +#define GLX_AUX_BUFFERS 7 /* number of aux buffers */ +#define GLX_RED_SIZE 8 /* number of red component bits */ +#define GLX_GREEN_SIZE 9 /* number of green component bits */ +#define GLX_BLUE_SIZE 10 /* number of blue component bits */ +#define GLX_ALPHA_SIZE 11 /* number of alpha component bits */ +#define GLX_DEPTH_SIZE 12 /* number of depth bits */ +#define GLX_STENCIL_SIZE 13 /* number of stencil bits */ +#define GLX_ACCUM_RED_SIZE 14 /* number of red accum bits */ +#define GLX_ACCUM_GREEN_SIZE 15 /* number of green accum bits */ +#define GLX_ACCUM_BLUE_SIZE 16 /* number of blue accum bits */ +#define GLX_ACCUM_ALPHA_SIZE 17 /* number of alpha accum bits */ + +#define GLX_SAMPLE_BUFFERS_ARB 100000 /* number of multisample buffers */ +#define GLX_SAMPLES_ARB 100001 /* number of multisample samples */ + +/* + * FBConfig-specific attributes + */ +#define GLX_X_VISUAL_TYPE 0x22 +#define GLX_CONFIG_CAVEAT 0x20 /* Like visual_info VISUAL_CAVEAT */ +#define GLX_TRANSPARENT_TYPE 0x23 +#define GLX_TRANSPARENT_INDEX_VALUE 0x24 +#define GLX_TRANSPARENT_RED_VALUE 0x25 +#define GLX_TRANSPARENT_GREEN_VALUE 0x26 +#define GLX_TRANSPARENT_BLUE_VALUE 0x27 +#define GLX_TRANSPARENT_ALPHA_VALUE 0x28 +#define GLX_DRAWABLE_TYPE 0x8010 +#define GLX_RENDER_TYPE 0x8011 +#define GLX_X_RENDERABLE 0x8012 +#define GLX_FBCONFIG_ID 0x8013 +#define GLX_MAX_PBUFFER_WIDTH 0x8016 +#define GLX_MAX_PBUFFER_HEIGHT 0x8017 +#define GLX_MAX_PBUFFER_PIXELS 0x8018 +#define GLX_VISUAL_ID 0x800B + +#define GLX_DRAWABLE_TYPE_SGIX GLX_DRAWABLE_TYPE +#define GLX_RENDER_TYPE_SGIX GLX_RENDER_TYPE +#define GLX_X_RENDERABLE_SGIX GLX_X_RENDERABLE +#define GLX_FBCONFIG_ID_SGIX GLX_FBCONFIG_ID +#define GLX_MAX_PBUFFER_WIDTH_SGIX GLX_MAX_PBUFFER_WIDTH +#define GLX_MAX_PBUFFER_HEIGHT_SGIX GLX_MAX_PBUFFER_HEIGHT +#define GLX_MAX_PBUFFER_PIXELS_SGIX GLX_MAX_PBUFFER_PIXELS +#define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019 +#define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A + +/* + * Error return values from glXGetConfig. Success is indicated by + * a value of 0. + */ +#define GLX_BAD_SCREEN 1 /* screen # is bad */ +#define GLX_BAD_ATTRIBUTE 2 /* attribute to get is bad */ +#define GLX_NO_EXTENSION 3 /* no glx extension on server */ +#define GLX_BAD_VISUAL 4 /* visual # not known by GLX */ +#define GLX_BAD_CONTEXT 5 +#define GLX_BAD_VALUE 6 +#define GLX_BAD_ENUM 7 + + +/* FBConfig attribute values */ + +/* + * Generic "don't care" value for glX ChooseFBConfig attributes (except + * GLX_LEVEL). + */ +#define GLX_DONT_CARE 0xFFFFFFFF + +/* GLX_RENDER_TYPE bits */ +#define GLX_RGBA_BIT 0x00000001 +#define GLX_COLOR_INDEX_BIT 0x00000002 +#define GLX_RGBA_BIT_SGIX GLX_RGBA_BIT +#define GLX_COLOR_INDEX_BIT_SGIX GLX_COLOR_INDEX_BIT + +/* GLX_DRAWABLE_TYPE bits */ +#define GLX_WINDOW_BIT 0x00000001 +#define GLX_PIXMAP_BIT 0x00000002 +#define GLX_PBUFFER_BIT 0x00000004 +#define GLX_WINDOW_BIT_SGIX GLX_WINDOW_BIT +#define GLX_PIXMAP_BIT_SGIX GLX_PIXMAP_BIT +#define GLX_PBUFFER_BIT_SGIX GLX_PBUFFER_BIT + +/* GLX_CONFIG_CAVEAT attribute values */ +#define GLX_NONE 0x8000 +#define GLX_SLOW_CONFIG 0x8001 +#define GLX_NON_CONFORMANT_CONFIG 0x800D + +/* GLX_X_VISUAL_TYPE attribute values */ +#define GLX_TRUE_COLOR 0x8002 +#define GLX_DIRECT_COLOR 0x8003 +#define GLX_PSEUDO_COLOR 0x8004 +#define GLX_STATIC_COLOR 0x8005 +#define GLX_GRAY_SCALE 0x8006 +#define GLX_STATIC_GRAY 0x8007 + +/* GLX_TRANSPARENT_TYPE attribute values */ +/* #define GLX_NONE 0x8000 */ +#define GLX_TRANSPARENT_RGB 0x8008 +#define GLX_TRANSPARENT_INDEX 0x8009 + +/* glXCreateGLXPbuffer attributes */ +#define GLX_PRESERVED_CONTENTS 0x801B +#define GLX_LARGEST_PBUFFER 0x801C +#define GLX_PBUFFER_HEIGHT 0x8040 /* New for GLX 1.3 */ +#define GLX_PBUFFER_WIDTH 0x8041 /* New for GLX 1.3 */ +#define GLX_PRESERVED_CONTENTS_SGIX GLX_PRESERVED_CONTENTS +#define GLX_LARGEST_PBUFFER_SGIX GLX_LARGEST_PBUFFER + +/* glXQueryGLXPBuffer attributes */ +#define GLX_WIDTH 0x801D +#define GLX_HEIGHT 0x801E +#define GLX_EVENT_MASK 0x801F +#define GLX_WIDTH_SGIX GLX_WIDTH +#define GLX_HEIGHT_SGIX GLX_HEIGHT +#define GLX_EVENT_MASK_SGIX GLX_EVENT_MASK + +/* glXCreateNewContext render_type attribute values */ +#define GLX_RGBA_TYPE 0x8014 +#define GLX_COLOR_INDEX_TYPE 0x8015 +#define GLX_RGBA_TYPE_SGIX GLX_RGBA_TYPE +#define GLX_COLOR_INDEX_TYPE_SGIX GLX_COLOR_INDEX_TYPE + +/* glXQueryContext attributes */ +/* #define GLX_FBCONFIG_ID 0x8013 */ +/* #define GLX_RENDER_TYPE 0x8011 */ +#define GLX_SCREEN 0x800C + +/* glXSelectEvent event mask bits */ +#define GLX_PBUFFER_CLOBBER_MASK 0x08000000 +#define GLX_PBUFFER_CLOBBER_MASK_SGIX GLX_PBUFFER_CLOBBER_MASK + +/* GLXPbufferClobberEvent event_type values */ +#define GLX_DAMAGED 0x8020 +#define GLX_SAVED 0x8021 +#define GLX_DAMAGED_SGIX GLX_DAMAGED +#define GLX_SAVED_SGIX GLX_SAVED + +/* GLXPbufferClobberEvent draw_type values */ +#define GLX_WINDOW 0x8022 +#define GLX_PBUFFER 0x8023 +#define GLX_WINDOW_SGIX GLX_WINDOW +#define GLX_PBUFFER_SGIX GLX_PBUFFER + +/* GLXPbufferClobberEvent buffer_mask bits */ +#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001 +#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 +#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 +#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 +#define GLX_AUX_BUFFERS_BIT 0x00000010 +#define GLX_DEPTH_BUFFER_BIT 0x00000020 +#define GLX_STENCIL_BUFFER_BIT 0x00000040 +#define GLX_ACCUM_BUFFER_BIT 0x00000080 +#define GLX_FRONT_LEFT_BUFFER_BIT_SGIX GLX_FRONT_LEFT_BUFFER_BIT +#define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX GLX_FRONT_RIGHT_BUFFER_BIT +#define GLX_BACK_LEFT_BUFFER_BIT_SGIX GLX_BACK_LEFT_BUFFER_BIT +#define GLX_BACK_RIGHT_BUFFER_BIT_SGIX GLX_BACK_RIGHT_BUFFER_BIT +#define GLX_AUX_BUFFERS_BIT_SGIX GLX_AUX_BUFFERS_BIT +#define GLX_DEPTH_BUFFER_BIT_SGIX GLX_DEPTH_BUFFER_BIT +#define GLX_STENCIL_BUFFER_BIT_SGIX GLX_STENCIL_BUFFER_BIT +#define GLX_ACCUM_BUFFER_BIT_SGIX GLX_ACCUM_BUFFER_BIT + +/* + * Extension return values from glXGetConfig. These are also + * accepted as parameter values for glXChooseVisual. + */ + +#define GLX_X_VISUAL_TYPE_EXT 0x22 /* visual_info extension type */ +#define GLX_TRANSPARENT_TYPE_EXT 0x23 /* visual_info extension */ +#define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24 /* visual_info extension */ +#define GLX_TRANSPARENT_RED_VALUE_EXT 0x25 /* visual_info extension */ +#define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26 /* visual_info extension */ +#define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27 /* visual_info extension */ +#define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28 /* visual_info extension */ + +/* Property values for visual_type */ +#define GLX_TRUE_COLOR_EXT 0x8002 +#define GLX_DIRECT_COLOR_EXT 0x8003 +#define GLX_PSEUDO_COLOR_EXT 0x8004 +#define GLX_STATIC_COLOR_EXT 0x8005 +#define GLX_GRAY_SCALE_EXT 0x8006 +#define GLX_STATIC_GRAY_EXT 0x8007 + +/* Property values for transparent pixel */ +#define GLX_NONE_EXT 0x8000 +#define GLX_TRANSPARENT_RGB_EXT 0x8008 +#define GLX_TRANSPARENT_INDEX_EXT 0x8009 + +/* Property values for visual_rating */ +#define GLX_VISUAL_CAVEAT_EXT 0x20 /* visual_rating extension type */ +#define GLX_SLOW_VISUAL_EXT 0x8001 +#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D + +/* + * Names for attributes to glXGetClientString. + */ +#define GLX_VENDOR 0x1 +#define GLX_VERSION 0x2 +#define GLX_EXTENSIONS 0x3 + +/* + * Names for attributes to glXQueryContextInfoEXT. + */ +#define GLX_SHARE_CONTEXT_EXT 0x800A /* id of share context */ +#define GLX_VISUAL_ID_EXT 0x800B /* id of context's visual */ +#define GLX_SCREEN_EXT 0x800C /* screen number */ + +/* NV_float_buffer */ +#define GLX_FLOAT_COMPONENTS_NV 0x20B0 + +typedef XID GLXContextID; +typedef XID GLXPixmap; +typedef XID GLXDrawable; +typedef XID GLXPbuffer; +typedef XID GLXWindow; +typedef XID GLXFBConfigID; + +typedef struct __GLXcontextRec *GLXContext; + +typedef struct __GLXFBConfigRec *GLXFBConfig; + +typedef GLXFBConfig * (APIENTRY * glXGetFBConfigsPROC) (Display *dpy, int screen, int *nelements); +typedef GLXFBConfig * (APIENTRY * glXChooseFBConfigPROC) (Display *dpy, int screen, const int *attrib_list, int *nelements); +typedef int (APIENTRY * glXGetFBConfigAttribPROC) (Display *dpy, GLXFBConfig config, int attribute, int *value); +typedef XVisualInfo * (APIENTRY * glXGetVisualFromFBConfigPROC) (Display *dpy, GLXFBConfig config); +typedef GLXWindow (APIENTRY * glXCreateWindowPROC) (Display *dpy, GLXFBConfig config, Window win, const int *attrib_list); +typedef void (APIENTRY * glXDestroyWindowPROC) (Display *dpy, GLXWindow win); +typedef GLXPixmap (APIENTRY * glXCreatePixmapPROC) (Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list); +typedef void (APIENTRY * glXDestroyPixmapPROC) (Display *dpy, GLXPixmap pixmap); +typedef GLXPbuffer (APIENTRY * glXCreatePbufferPROC) (Display *dpy, GLXFBConfig config, const int *attrib_list); +typedef void (APIENTRY * glXDestroyPbufferPROC) (Display *dpy, GLXPbuffer pbuf); +typedef void (APIENTRY * glXQueryDrawablePROC) (Display *dpy, GLXDrawable draw, int attribute, unsigned int *value); +typedef GLXContext (APIENTRY * glXCreateNewContextPROC) (Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); +typedef Bool (APIENTRY * glXMakeContextCurrentPROC) (Display *display, GLXDrawable draw, GLXDrawable read, GLXContext ctx); +typedef GLXDrawable (APIENTRY * glXGetCurrentReadDrawablePROC) (void); +typedef Display * (APIENTRY * glXGetCurrentDisplayPROC) (void); +typedef int (APIENTRY * glXQueryContextPROC) (Display *dpy, GLXContext ctx, int attribute, int *value); +typedef void (APIENTRY * glXSelectEventPROC) (Display *dpy, GLXDrawable draw, unsigned long event_mask); +typedef void (APIENTRY * glXGetSelectedEventPROC) (Display *dpy, GLXDrawable draw, unsigned long *event_mask); + +typedef GLXContextID (APIENTRY * glXGetContextIDEXTPROC) (const GLXContext ctx); +typedef GLXDrawable (APIENTRY * glXGetCurrentDrawableEXTPROC) (void); +typedef GLXContext (APIENTRY * glXImportContextEXTPROC) (Display *dpy, GLXContextID contextID); +typedef void (APIENTRY * glXFreeContextEXTPROC) (Display *dpy, GLXContext ctx); +typedef int (APIENTRY * glXQueryContextInfoEXTPROC) (Display *dpy, GLXContext ctx, int attribute, int *value); + +typedef XVisualInfo* (APIENTRY * glXChooseVisualPROC) (Display *dpy, int screen, int *attribList); +typedef void (APIENTRY * glXCopyContextPROC) (Display *dpy, GLXContext src, GLXContext dst, unsigned long mask); +typedef GLXContext (APIENTRY * glXCreateContextPROC) (Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct); +typedef GLXPixmap (APIENTRY * glXCreateGLXPixmapPROC) (Display *dpy, XVisualInfo *vis, Pixmap pixmap); +typedef void (APIENTRY * glXDestroyContextPROC) (Display *dpy, GLXContext ctx); +typedef void (APIENTRY * glXDestroyGLXPixmapPROC) (Display *dpy, GLXPixmap pix); +typedef int (APIENTRY * glXGetConfigPROC) (Display *dpy, XVisualInfo *vis, int attrib, int *value); +typedef GLXContext (APIENTRY * glXGetCurrentContextPROC) (void); +typedef GLXDrawable (APIENTRY * glXGetCurrentDrawablePROC) (void); +typedef Bool (APIENTRY * glXIsDirectPROC) (Display *dpy, GLXContext ctx); +typedef Bool (APIENTRY * glXMakeCurrentPROC) (Display *dpy, GLXDrawable drawable, GLXContext ctx); +typedef Bool (APIENTRY * glXQueryExtensionPROC) (Display *dpy, int *errorBase, int *eventBase); +typedef Bool (APIENTRY * glXQueryVersionPROC) (Display *dpy, int *major, int *minor); +typedef void (APIENTRY * glXSwapBuffersPROC) (Display *dpy, GLXDrawable drawable); +typedef void (APIENTRY * glXUseXFontPROC) (Font font, int first, int count, int listBase); +typedef void (APIENTRY * glXWaitGLPROC) (void); +typedef void (APIENTRY * glXWaitXPROC) (void); +typedef const char * (APIENTRY * glXGetClientStringPROC) (Display *dpy, int name ); +typedef const char * (APIENTRY * glXQueryServerStringPROC) (Display *dpy, int screen, int name ); +typedef const char * (APIENTRY * glXQueryExtensionsStringPROC) (Display *dpy, int screen ); + +/* GLX_SGI_swap_control */ +typedef void (APIENTRY * glXSwapIntervalSGIPROC)(int interval); + +extern glXGetFBConfigsPROC glXGetFBConfigs; +extern glXChooseFBConfigPROC glXChooseFBConfig; +extern glXGetFBConfigAttribPROC glXGetFBConfigAttrib; +extern glXGetVisualFromFBConfigPROC glXGetVisualFromFBConfig; +extern glXCreateWindowPROC glXCreateWindow; +extern glXDestroyWindowPROC glXDestroyWindow; +extern glXCreatePixmapPROC glXCreatePixmap; +extern glXDestroyPixmapPROC glXDestroyPixmap; +extern glXCreatePbufferPROC glXCreatePbuffer; +extern glXDestroyPbufferPROC glXDestroyPbuffer; +extern glXQueryDrawablePROC glXQueryDrawable; +extern glXCreateNewContextPROC glXCreateNewContext; +extern glXMakeContextCurrentPROC glXMakeContextCurrent; +extern glXGetCurrentReadDrawablePROC glXGetCurrentReadDrawable; +extern glXGetCurrentDisplayPROC glXGetCurrentDisplay; +extern glXQueryContextPROC glXQueryContext; +extern glXSelectEventPROC glXSelectEvent; +extern glXGetSelectedEventPROC glXGetSelectedEvent; + +extern glXChooseVisualPROC glXChooseVisual; +extern glXCopyContextPROC glXCopyContext; +extern glXCreateContextPROC glXCreateContext; +extern glXCreateGLXPixmapPROC glXCreateGLXPixmap; +extern glXDestroyContextPROC glXDestroyContext; +extern glXDestroyGLXPixmapPROC glXDestroyGLXPixmap; +extern glXGetConfigPROC glXGetConfig; +extern glXGetCurrentContextPROC glXGetCurrentContext; +extern glXGetCurrentDrawablePROC glXGetCurrentDrawable; +extern glXIsDirectPROC glXIsDirect; +extern glXMakeCurrentPROC glXMakeCurrent; +extern glXQueryExtensionPROC glXQueryExtension; +extern glXQueryVersionPROC glXQueryVersion; +extern glXSwapBuffersPROC glXSwapBuffers; +extern glXUseXFontPROC glXUseXFont; +extern glXWaitGLPROC glXWaitGL; +extern glXWaitXPROC glXWaitX; +extern glXGetClientStringPROC glXGetClientString; +extern glXQueryServerStringPROC glXQueryServerString; +extern glXQueryExtensionsStringPROC glXQueryExtensionsString; + +extern glXSwapIntervalSGIPROC glXSwapIntervalSGI; + +extern bool extgl_InitGLX(JNIEnv *env, Display *disp, int screen); + +#endif diff --git a/src/native/linux/org_lwjgl_opengl_Window.cpp b/src/native/linux/org_lwjgl_opengl_Window.cpp index 29e35695..5a2686fa 100644 --- a/src/native/linux/org_lwjgl_opengl_Window.cpp +++ b/src/native/linux/org_lwjgl_opengl_Window.cpp @@ -49,6 +49,7 @@ #include #include "common_tools.h" #include "extgl.h" +#include "extgl_glx.h" #include "Window.h" #include "org_lwjgl_opengl_Window.h"