mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-04-26 22:00:37 +02:00
use glXGetProcAddressARB to avoid extension linkage problems
This commit is contained in:
parent
2f3d620398
commit
253270dfcc
6 changed files with 250 additions and 19 deletions
|
|
@ -439,15 +439,15 @@ loadVisuals(int *nitems_return)
|
|||
GLXFBConfigSGIX fbc;
|
||||
int fbconfigID, drawType, renderType;
|
||||
|
||||
fbc = glXGetFBConfigFromVisualSGIX(__glutDisplay, vlist[i]);
|
||||
fbc = __glut_glXGetFBConfigFromVisualSGIX(__glutDisplay, vlist[i]);
|
||||
if (fbc) {
|
||||
rc = glXGetFBConfigAttribSGIX(__glutDisplay, fbc,
|
||||
rc = __glut_glXGetFBConfigAttribSGIX(__glutDisplay, fbc,
|
||||
GLX_FBCONFIG_ID_SGIX, &fbconfigID);
|
||||
if ((rc == 0) && (fbconfigID != None)) {
|
||||
rc = glXGetFBConfigAttribSGIX(__glutDisplay, fbc,
|
||||
rc = __glut_glXGetFBConfigAttribSGIX(__glutDisplay, fbc,
|
||||
GLX_DRAWABLE_TYPE_SGIX, &drawType);
|
||||
if ((rc == 0) && (drawType & GLX_WINDOW_BIT_SGIX)) {
|
||||
rc = glXGetFBConfigAttribSGIX(__glutDisplay, fbc,
|
||||
rc = __glut_glXGetFBConfigAttribSGIX(__glutDisplay, fbc,
|
||||
GLX_RENDER_TYPE_SGIX, &renderType);
|
||||
if ((rc == 0) && (renderType & GLX_RGBA_BIT_SGIX)) {
|
||||
mode->fbc = fbc;
|
||||
|
|
@ -459,7 +459,7 @@ loadVisuals(int *nitems_return)
|
|||
|
||||
/* Start with "j = 1" to skip the GLX_RGBA attribute. */
|
||||
for (j = 1; j < NUM_GLXCAPS; j++) {
|
||||
rc = glXGetFBConfigAttribSGIX(__glutDisplay,
|
||||
rc = __glut_glXGetFBConfigAttribSGIX(__glutDisplay,
|
||||
fbc, glxcap[j], &mode->cap[j]);
|
||||
if (rc != 0) {
|
||||
mode->valid = 0;
|
||||
|
|
@ -509,7 +509,7 @@ loadVisuals(int *nitems_return)
|
|||
#define GLX_VISUAL_CAVEAT_EXT 0x20
|
||||
#endif
|
||||
|
||||
rc = glXGetFBConfigAttribSGIX(__glutDisplay,
|
||||
rc = __glut_glXGetFBConfigAttribSGIX(__glutDisplay,
|
||||
fbc, GLX_VISUAL_CAVEAT_EXT, &rating);
|
||||
if (rc != 0) {
|
||||
mode->cap[SLOW] = 0;
|
||||
|
|
@ -558,7 +558,7 @@ loadVisuals(int *nitems_return)
|
|||
#define GLX_TRANSPARENT_TYPE_EXT 0x23
|
||||
#endif
|
||||
|
||||
rc = glXGetFBConfigAttribSGIX(__glutDisplay,
|
||||
rc = __glut_glXGetFBConfigAttribSGIX(__glutDisplay,
|
||||
fbc, GLX_TRANSPARENT_TYPE_EXT, &transparent);
|
||||
if (rc != 0) {
|
||||
mode->cap[TRANSPARENT] = 0;
|
||||
|
|
@ -573,7 +573,7 @@ loadVisuals(int *nitems_return)
|
|||
#endif
|
||||
#if defined(GLX_VERSION_1_1) && defined(GLX_SGIS_multisample)
|
||||
if (multisample) {
|
||||
rc = glXGetFBConfigAttribSGIX(__glutDisplay,
|
||||
rc = __glut_glXGetFBConfigAttribSGIX(__glutDisplay,
|
||||
fbc, GLX_SAMPLES_SGIS, &mode->cap[SAMPLES]);
|
||||
if (rc != 0) {
|
||||
mode->cap[SAMPLES] = 0;
|
||||
|
|
|
|||
|
|
@ -46,3 +46,210 @@ __glutIsSupportedByGLX(char *extension)
|
|||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Wrapping of GLX extension functions.
|
||||
* Technically, we should do a runtime test to see if we've got the
|
||||
* glXGetProcAddressARB() function. I think GLX_ARB_get_proc_address
|
||||
* is pretty widely supported now and any system that has
|
||||
* GLX_ARB_get_proc_address defined in its header files should be OK
|
||||
* at runtime.
|
||||
*/
|
||||
|
||||
int
|
||||
__glut_glXBindChannelToWindowSGIX(Display *dpy, int screen,
|
||||
int channel, Window window)
|
||||
{
|
||||
#ifdef GLX_ARB_get_proc_address
|
||||
typedef int (*glXBindChannelToWindowSGIX_t) (Display *, int, int, Window);
|
||||
static glXBindChannelToWindowSGIX_t glXBindChannelToWindowSGIX_ptr = NULL;
|
||||
if (!glXBindChannelToWindowSGIX_ptr) {
|
||||
glXBindChannelToWindowSGIX_ptr = (glXBindChannelToWindowSGIX_t)
|
||||
glXGetProcAddressARB((const GLubyte *) "glXBindChannelToWindowSGIX");
|
||||
}
|
||||
if (glXBindChannelToWindowSGIX_ptr)
|
||||
return (*glXBindChannelToWindowSGIX_ptr)(dpy, screen, channel, window);
|
||||
else
|
||||
return 0;
|
||||
#elif defined(GLX_SGIX_video_resize)
|
||||
return glXBindChannelToWindowSGIX(dpy, screen, channel, window);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
__glut_glXChannelRectSGIX(Display *dpy, int screen, int channel,
|
||||
int x, int y, int w, int h)
|
||||
{
|
||||
#ifdef GLX_ARB_get_proc_address
|
||||
typedef int (*glXChannelRectSGIX_t)(Display *, int, int, int, int, int, int);
|
||||
static glXChannelRectSGIX_t glXChannelRectSGIX_ptr = NULL;
|
||||
if (!glXChannelRectSGIX_ptr) {
|
||||
glXChannelRectSGIX_ptr = (glXChannelRectSGIX_t)
|
||||
glXGetProcAddressARB((const GLubyte *) "glXChannelRectSGIX");
|
||||
}
|
||||
if (glXChannelRectSGIX_ptr)
|
||||
return (*glXChannelRectSGIX_ptr)(dpy, screen, channel, x, y, w, h);
|
||||
else
|
||||
return 0;
|
||||
#elif defined(GLX_SGIX_video_resize)
|
||||
return glXChannelRectSGIX(dpy, screen, channel, x, y, w, h);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
__glut_glXQueryChannelRectSGIX(Display *dpy, int screen, int channel,
|
||||
int *x, int *y, int *w, int *h)
|
||||
{
|
||||
#ifdef GLX_ARB_get_proc_address
|
||||
typedef int (*glXQueryChannelRectSGIX_t)(Display *, int, int,
|
||||
int *, int *, int *, int *);
|
||||
static glXQueryChannelRectSGIX_t glXQueryChannelRectSGIX_ptr = NULL;
|
||||
if (!glXQueryChannelRectSGIX_ptr) {
|
||||
glXQueryChannelRectSGIX_ptr = (glXQueryChannelRectSGIX_t)
|
||||
glXGetProcAddressARB((const GLubyte *) "glXQueryChannelRectSGIX");
|
||||
}
|
||||
if (glXQueryChannelRectSGIX_ptr)
|
||||
return (*glXQueryChannelRectSGIX_ptr)(dpy, screen, channel, x, y, w, h);
|
||||
else
|
||||
return 0;
|
||||
#elif defined(GLX_SGIX_video_resize)
|
||||
return glXQueryChannelRectSGIX(dpy, screen, channel, x, y, w, h);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
__glut_glXQueryChannelDeltasSGIX(Display *dpy, int screen, int channel,
|
||||
int *dx, int *dy, int *dw, int *dh)
|
||||
{
|
||||
#ifdef GLX_ARB_get_proc_address
|
||||
typedef int (*glXQueryChannelDeltasSGIX_t)(Display *, int, int,
|
||||
int *, int *, int *, int *);
|
||||
static glXQueryChannelDeltasSGIX_t glXQueryChannelDeltasSGIX_ptr = NULL;
|
||||
if (!glXQueryChannelDeltasSGIX_ptr) {
|
||||
glXQueryChannelDeltasSGIX_ptr = (glXQueryChannelDeltasSGIX_t)
|
||||
glXGetProcAddressARB((const GLubyte *) "glXQueryChannelDeltasSGIX");
|
||||
}
|
||||
if (glXQueryChannelDeltasSGIX_ptr)
|
||||
return (*glXQueryChannelDeltasSGIX_ptr)(dpy, screen, channel,
|
||||
dx, dy, dw, dh);
|
||||
else
|
||||
return 0;
|
||||
#elif defined(GLX_SGIX_video_resize)
|
||||
return glXQueryChannelDeltasSGIX(dpy, screen, channel, dx, dy, dw, dh);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
__glut_glXChannelRectSyncSGIX(Display *dpy, int screen,
|
||||
int channel, GLenum synctype)
|
||||
{
|
||||
#ifdef GLX_ARB_get_proc_address
|
||||
typedef int (*glXChannelRectSyncSGIX_t)(Display *, int, int, GLenum);
|
||||
static glXChannelRectSyncSGIX_t glXChannelRectSyncSGIX_ptr = NULL;
|
||||
if (!glXChannelRectSyncSGIX_ptr) {
|
||||
glXChannelRectSyncSGIX_ptr = (glXChannelRectSyncSGIX_t)
|
||||
glXGetProcAddressARB((const GLubyte *) "glXChannelRectSyncSGIX");
|
||||
}
|
||||
if (glXChannelRectSyncSGIX_ptr)
|
||||
return (*glXChannelRectSyncSGIX_ptr)(dpy, screen, channel, synctype);
|
||||
else
|
||||
return 0;
|
||||
#elif defined(GLX_SGIX_video_resize)
|
||||
return glXChannelRectSyncSGIX(dpy, screen, channel, synctype);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
GLXContext
|
||||
__glut_glXCreateContextWithConfigSGIX(Display *dpy, GLXFBConfigSGIX config,
|
||||
int render_type, GLXContext share_list,
|
||||
Bool direct)
|
||||
{
|
||||
#ifdef GLX_ARB_get_proc_address
|
||||
typedef GLXContext (*glXCreateContextWithConfigSGIX_t)(Display *,
|
||||
GLXFBConfigSGIX, int, GLXContext, Bool);
|
||||
static glXCreateContextWithConfigSGIX_t glXCreateContextWithConfig_ptr = NULL;
|
||||
if (!glXCreateContextWithConfig_ptr) {
|
||||
glXCreateContextWithConfig_ptr = (glXCreateContextWithConfigSGIX_t)
|
||||
glXGetProcAddress((const GLubyte *) "glXCreateContextWithConfigSGIX");
|
||||
}
|
||||
if (glXCreateContextWithConfig_ptr)
|
||||
return (*glXCreateContextWithConfig_ptr)(dpy, config, render_type,
|
||||
share_list, direct);
|
||||
else
|
||||
return 0;
|
||||
#elif defined(GLX_SGIX_fbconfig)
|
||||
return glXCreateContextWithConfigSGIX(dpy, config, render_type,
|
||||
share_list, direct);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
__glut_glXGetFBConfigAttribSGIX(Display *dpy, GLXFBConfigSGIX config,
|
||||
int attribute, int *value)
|
||||
{
|
||||
#ifdef GLX_ARB_get_proc_address
|
||||
typedef int (*glXGetFBConfigAttribSGIX_t)(Display *,
|
||||
GLXFBConfigSGIX, int, int *);
|
||||
static glXGetFBConfigAttribSGIX_t glXGetFBConfigAttrib_ptr = NULL;
|
||||
if (!glXGetFBConfigAttrib_ptr) {
|
||||
glXGetFBConfigAttrib_ptr = (glXGetFBConfigAttribSGIX_t)
|
||||
glXGetProcAddress((const GLubyte *) "glXGetFBConfigAttribSGIX");
|
||||
}
|
||||
if (glXGetFBConfigAttrib_ptr)
|
||||
return (*glXGetFBConfigAttrib_ptr)(dpy, config, attribute, value);
|
||||
else
|
||||
return 0;
|
||||
#elif defined(GLX_SGIX_fbconfig)
|
||||
return glXGetFBConfigAttribSGIX(dpy, config, attribute, value);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
GLXFBConfigSGIX
|
||||
__glut_glXGetFBConfigFromVisualSGIX(Display *dpy, XVisualInfo *vis)
|
||||
{
|
||||
#ifdef GLX_ARB_get_proc_address
|
||||
typedef GLXFBConfigSGIX (*glXGetFBConfigFromVisualSGIX_t)(Display *,
|
||||
XVisualInfo *);
|
||||
static glXGetFBConfigFromVisualSGIX_t glXGetFBConfigFromVisual_ptr = NULL;
|
||||
if (!glXGetFBConfigFromVisual_ptr) {
|
||||
glXGetFBConfigFromVisual_ptr = (glXGetFBConfigFromVisualSGIX_t)
|
||||
glXGetProcAddress((const GLubyte *) "glXGetFBConfigFromVisualSGIX");
|
||||
}
|
||||
if (glXGetFBConfigFromVisual_ptr)
|
||||
return (*glXGetFBConfigFromVisual_ptr)(dpy, vis);
|
||||
else
|
||||
return 0;
|
||||
#elif defined(GLX_SGIX_fbconfig)
|
||||
return glXGetFBConfigFromVisualSGIX(dpy, vis);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -395,7 +395,7 @@ glutEstablishOverlay(void)
|
|||
}
|
||||
#if defined(GLX_VERSION_1_1) && defined(GLX_SGIX_fbconfig)
|
||||
if (fbc) {
|
||||
window->ctx = glXCreateContextWithConfigSGIX(__glutDisplay, fbc,
|
||||
window->ctx = __glut_glXCreateContextWithConfigSGIX(__glutDisplay, fbc,
|
||||
GLX_RGBA_TYPE_SGIX, None, __glutTryDirect);
|
||||
} else
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ glutVideoResizeGet(GLenum param)
|
|||
if (canVideoResize < 0) {
|
||||
canVideoResize = __glutIsSupportedByGLX("GLX_SGIX_video_resize");
|
||||
if (canVideoResize) {
|
||||
#if __sgi
|
||||
#if defined(__sgi) && __sgi
|
||||
/* This is a hack because IRIX 6.2, 6.3, and some 6.4
|
||||
versions were released with GLX_SGIX_video_resize
|
||||
being advertised by the X server though the video
|
||||
|
|
@ -94,7 +94,8 @@ glutVideoResizeGet(GLenum param)
|
|||
|
||||
#if defined(GLX_GLXEXT_PROTOTYPES)
|
||||
#endif
|
||||
glXQueryChannelDeltasSGIX(__glutDisplay, __glutScreen,
|
||||
|
||||
__glut_glXQueryChannelDeltasSGIX(__glutDisplay, __glutScreen,
|
||||
videoResizeChannel, &dx, &dy, &dw, &dh);
|
||||
|
||||
/* glXQueryChannelDeltasSGIX is an inherent X server
|
||||
|
|
@ -138,7 +139,7 @@ glutVideoResizeGet(GLenum param)
|
|||
if (videoResizeInUse) {
|
||||
int x, y, width, height;
|
||||
|
||||
glXQueryChannelRectSGIX(__glutDisplay, __glutScreen,
|
||||
__glut_glXQueryChannelRectSGIX(__glutDisplay, __glutScreen,
|
||||
videoResizeChannel, &x, &y, &width, &height);
|
||||
switch (param) {
|
||||
case GLUT_VIDEO_RESIZE_X:
|
||||
|
|
@ -164,7 +165,7 @@ glutSetupVideoResizing(void)
|
|||
{
|
||||
#if defined(GLX_VERSION_1_1) && defined(GLX_SGIX_video_resize)
|
||||
if (glutVideoResizeGet(GLUT_VIDEO_RESIZE_POSSIBLE)) {
|
||||
glXBindChannelToWindowSGIX(__glutDisplay, __glutScreen,
|
||||
__glut_glXBindChannelToWindowSGIX(__glutDisplay, __glutScreen,
|
||||
videoResizeChannel, __glutCurrentWindow->win);
|
||||
videoResizeInUse = 1;
|
||||
} else
|
||||
|
|
@ -178,7 +179,7 @@ glutStopVideoResizing(void)
|
|||
#if defined(GLX_VERSION_1_1) && defined(GLX_SGIX_video_resize)
|
||||
if (glutVideoResizeGet(GLUT_VIDEO_RESIZE_POSSIBLE)) {
|
||||
if (videoResizeInUse) {
|
||||
glXBindChannelToWindowSGIX(__glutDisplay, __glutScreen,
|
||||
__glut_glXBindChannelToWindowSGIX(__glutDisplay, __glutScreen,
|
||||
videoResizeChannel, None);
|
||||
videoResizeInUse = 0;
|
||||
}
|
||||
|
|
@ -196,10 +197,10 @@ glutVideoResize(int x, int y, int width, int height)
|
|||
/* glXChannelRectSyncSGIX introduced in a patch to IRIX
|
||||
6.2; the original unpatched IRIX 6.2 behavior is always
|
||||
GLX_SYNC_SWAP_SGIX. */
|
||||
glXChannelRectSyncSGIX(__glutDisplay, __glutScreen,
|
||||
__glut_glXChannelRectSyncSGIX(__glutDisplay, __glutScreen,
|
||||
videoResizeChannel, GLX_SYNC_SWAP_SGIX);
|
||||
#endif
|
||||
glXChannelRectSGIX(__glutDisplay, __glutScreen,
|
||||
__glut_glXChannelRectSGIX(__glutDisplay, __glutScreen,
|
||||
videoResizeChannel, x, y, width, height);
|
||||
}
|
||||
#endif
|
||||
|
|
@ -218,10 +219,10 @@ glutVideoPan(int x, int y, int width, int height)
|
|||
accomplish GLX_SYNC_FRAME_SGIX on IRIX unpatched 6.2;
|
||||
this means you'd need a glutSwapBuffers to actually
|
||||
realize the video resize. */
|
||||
glXChannelRectSyncSGIX(__glutDisplay, __glutScreen,
|
||||
__glut_glXChannelRectSyncSGIX(__glutDisplay, __glutScreen,
|
||||
videoResizeChannel, GLX_SYNC_FRAME_SGIX);
|
||||
#endif
|
||||
glXChannelRectSGIX(__glutDisplay, __glutScreen,
|
||||
__glut_glXChannelRectSGIX(__glutDisplay, __glutScreen,
|
||||
videoResizeChannel, x, y, width, height);
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -577,7 +577,7 @@ __glutCreateWindow(GLUTwindow * parent,
|
|||
window->renderWin = window->win;
|
||||
#if defined(GLX_VERSION_1_1) && defined(GLX_SGIX_fbconfig)
|
||||
if (fbc) {
|
||||
window->ctx = glXCreateContextWithConfigSGIX(__glutDisplay, fbc,
|
||||
window->ctx = __glut_glXCreateContextWithConfigSGIX(__glutDisplay, fbc,
|
||||
GLX_RGBA_TYPE_SGIX, None, __glutTryDirect);
|
||||
} else
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -764,6 +764,29 @@ extern void __glutDestroyWindow(
|
|||
#if !defined(_WIN32)
|
||||
/* private routines from glut_glxext.c */
|
||||
extern int __glutIsSupportedByGLX(char *);
|
||||
extern int __glut_glXBindChannelToWindowSGIX(Display *dpy, int screen,
|
||||
int channel, Window window);
|
||||
extern int __glut_glXChannelRectSGIX(Display *dpy, int screen, int channel,
|
||||
int x, int y, int w, int h);
|
||||
extern int __glut_glXQueryChannelRectSGIX(Display *dpy, int screen,
|
||||
int channel, int *x, int *y,
|
||||
int *w, int *h);
|
||||
extern int __glut_glXQueryChannelDeltasSGIX(Display *dpy, int screen,
|
||||
int channel, int *dx, int *dy,
|
||||
int *dw, int *dh);
|
||||
extern int __glut_glXChannelRectSyncSGIX(Display *dpy, int screen, int channel,
|
||||
GLenum synctype);
|
||||
extern GLXContext __glut_glXCreateContextWithConfigSGIX(Display *dpy,
|
||||
GLXFBConfigSGIX config,
|
||||
int render_type,
|
||||
GLXContext share_list,
|
||||
Bool direct);
|
||||
extern int __glut_glXGetFBConfigAttribSGIX(Display *dpy,
|
||||
GLXFBConfigSGIX config,
|
||||
int attribute,
|
||||
int *value);
|
||||
extern GLXFBConfigSGIX __glut_glXGetFBConfigFromVisualSGIX(Display *dpy,
|
||||
XVisualInfo *vis);
|
||||
#endif
|
||||
|
||||
/* private routines from glut_input.c */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue