diff options
Diffstat (limited to 'src/glx/glxcmds.c')
-rw-r--r-- | src/glx/glxcmds.c | 195 |
1 files changed, 181 insertions, 14 deletions
diff --git a/src/glx/glxcmds.c b/src/glx/glxcmds.c index 8f809dc5259..4e5243c1fc3 100644 --- a/src/glx/glxcmds.c +++ b/src/glx/glxcmds.c @@ -34,11 +34,17 @@ */ #include "glxclient.h" +#ifdef GLX_USE_APPLEGL +#include "apple_glx_context.h" +#include "apple_glx.h" +#include "glx_error.h" +#else #include "glapi.h" +#endif #include "glxextensions.h" #include "glcontextmodes.h" -#ifdef GLX_DIRECT_RENDERING +#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) #include <sys/time.h> #include <X11/extensions/xf86vmode.h> #include "xf86dri.h" @@ -344,6 +350,12 @@ AllocateGLXContext(Display * dpy) bufSize = __GLX_MAX_RENDER_CMD_SIZE; } gc->maxSmallRenderCommandSize = bufSize; + +#ifdef GLX_USE_APPLEGL + gc->apple = NULL; + gc->do_destroy = False; +#endif + return gc; } @@ -365,10 +377,15 @@ CreateContext(Display * dpy, int generic_id, unsigned code, int renderType, int screen) { GLXContext gc; -#ifdef GLX_DIRECT_RENDERING +#if defined(GLX_DIRECT_RENDERING) || defined(GLX_USE_APPLEGL) __GLXscreenConfigs *const psc = GetGLXScreenConfigs(dpy, screen); #endif - +#ifdef GLX_USE_APPLEGL + const __GLcontextModes *mode; + int errorcode; + bool x11error; +#endif + if (dpy == NULL) return NULL; @@ -379,6 +396,7 @@ CreateContext(Display * dpy, int generic_id, if (!gc) return NULL; +#ifndef GLX_USE_APPLEGL #ifdef GLX_DIRECT_RENDERING if (allowDirect && psc->driScreen) { gc->driContext = psc->driScreen->createContext(psc, fbconfig, gc, @@ -455,9 +473,34 @@ CreateContext(Display * dpy, int generic_id, UnlockDisplay(dpy); SyncHandle(); +#endif gc->imported = GL_FALSE; +#ifdef GLX_USE_APPLEGL + mode = _gl_context_modes_find_fbconfig(psc->configs, + fbconfig->fbconfigID); + + if(NULL == mode) { + __glXSendError(dpy, BadValue, fbconfig->fbconfigID, X_GLXCreateContext, + true); + __glXFreeContext(gc); + return NULL; + } + + if(apple_glx_create_context(&gc->apple, dpy, screen, mode, + shareList ? shareList->apple : NULL, + &errorcode, &x11error)) { + __glXSendError(dpy, errorcode, 0, X_GLXCreateContext, x11error); + __glXFreeContext(gc); + return NULL; + } + + gc->currentContextTag = -1; + gc->mode = mode; + gc->isDirect = allowDirect; +#else gc->renderType = renderType; +#endif return gc; } @@ -504,7 +547,9 @@ __glXFreeContext(__GLXcontext * gc) XFree((char *) gc->version); if (gc->extensions) XFree((char *) gc->extensions); +#ifndef GLX_USE_APPLEGL __glFreeAttributeState(gc); +#endif XFree((char *) gc->buf); Xfree((char *) gc->client_state_private); XFree((char *) gc); @@ -517,6 +562,7 @@ __glXFreeContext(__GLXcontext * gc) static void DestroyContext(Display * dpy, GLXContext gc) { +#ifndef GLX_USE_APPLEGL xGLXDestroyContextReq *req; GLXContextID xid; CARD8 opcode; @@ -552,17 +598,31 @@ DestroyContext(Display * dpy, GLXContext gc) #endif __glXFreeVertexArrayState(gc); +#else + __glXLock(); +#endif /* GLX_USE_APPLEGL */ if (gc->currentDpy) { +#ifdef GLX_USE_APPLEGL + /* + * Set the Bool that indicates that we should destroy this GLX context + * when the context is no longer current. + */ + gc->do_destroy = True; +#endif /* Have to free later cuz it's in use now */ __glXUnlock(); } else { /* Destroy the handle if not current to anybody */ __glXUnlock(); +#ifdef GLX_USE_APPLEGL + if(gc->apple) + apple_glx_destroy_context(&gc->apple, dpy); +#endif __glXFreeContext(gc); } - +#ifndef GLX_USE_APPLEGL if (!imported) { /* ** This dpy also created the server side part of the context. @@ -576,6 +636,7 @@ DestroyContext(Display * dpy, GLXContext gc) UnlockDisplay(dpy); SyncHandle(); } +#endif } PUBLIC void @@ -630,7 +691,9 @@ glXQueryExtension(Display * dpy, int *errorBase, int *eventBase) PUBLIC void glXWaitGL(void) { +#ifndef GLX_USE_APPLEGL xGLXWaitGLReq *req; +#endif GLXContext gc = __glXGetCurrentContext(); Display *dpy = gc->currentDpy; @@ -639,7 +702,9 @@ glXWaitGL(void) /* Flush any pending commands out */ __glXFlushRenderBuffer(gc, gc->pc); - +#ifdef GLX_USE_APPLEGL + glFinish(); +#else #ifdef GLX_DIRECT_RENDERING if (gc->driContext) { int screen; @@ -664,6 +729,7 @@ glXWaitGL(void) req->contextTag = gc->currentContextTag; UnlockDisplay(dpy); SyncHandle(); +#endif /* GLX_USE_APPLEGL */ } /* @@ -673,7 +739,9 @@ glXWaitGL(void) PUBLIC void glXWaitX(void) { +#ifndef GLX_USE_APPLEGL xGLXWaitXReq *req; +#endif GLXContext gc = __glXGetCurrentContext(); Display *dpy = gc->currentDpy; @@ -683,6 +751,9 @@ glXWaitX(void) /* Flush any pending commands out */ __glXFlushRenderBuffer(gc, gc->pc); +#ifdef GLX_USE_APPLEGL + apple_glx_waitx(dpy, gc->apple); +#else #ifdef GLX_DIRECT_RENDERING if (gc->driContext) { int screen; @@ -710,12 +781,15 @@ glXWaitX(void) req->contextTag = gc->currentContextTag; UnlockDisplay(dpy); SyncHandle(); +#endif /* GLX_USE_APPLEGL */ } PUBLIC void glXUseXFont(Font font, int first, int count, int listBase) { +#ifndef GLX_USE_APPLEGL xGLXUseXFontReq *req; +#endif GLXContext gc = __glXGetCurrentContext(); Display *dpy = gc->currentDpy; @@ -724,7 +798,9 @@ glXUseXFont(Font font, int first, int count, int listBase) /* Flush any pending commands out */ (void) __glXFlushRenderBuffer(gc, gc->pc); - +#ifdef GLX_USE_APPLEGL + DRI_glXUseXFont(font, first, count, listBase); +#else #ifdef GLX_DIRECT_RENDERING if (gc->driContext) { DRI_glXUseXFont(font, first, count, listBase); @@ -744,6 +820,7 @@ glXUseXFont(Font font, int first, int count, int listBase) req->listBase = listBase; UnlockDisplay(dpy); SyncHandle(); +#endif /* GLX_USE_APPLEGL */ } /************************************************************************/ @@ -756,6 +833,17 @@ PUBLIC void glXCopyContext(Display * dpy, GLXContext source, GLXContext dest, unsigned long mask) { +#ifdef GLX_USE_APPLEGL + GLXContext gc = __glXGetCurrentContext(); + int errorcode; + bool x11error; + + if(apple_glx_copy_context(gc->apple, source->apple, dest->apple, + mask, &errorcode, &x11error)) { + __glXSendError(dpy, errorcode, 0, X_GLXCopyContext, x11error); + } + +#else xGLXCopyContextReq *req; GLXContext gc = __glXGetCurrentContext(); GLXContextTag tag; @@ -794,9 +882,11 @@ glXCopyContext(Display * dpy, GLXContext source, req->contextTag = tag; UnlockDisplay(dpy); SyncHandle(); +#endif /* GLX_USE_APPLEGL */ } +#ifndef GLX_USE_APPLEGL /** * Determine if a context uses direct rendering. * @@ -844,6 +934,7 @@ __glXIsDirect(Display * dpy, GLXContextID contextID) return reply.isDirect; #endif /* USE_XCB */ } +#endif /* GLX_USE_APPLEGL */ /** * \todo @@ -854,6 +945,17 @@ __glXIsDirect(Display * dpy, GLXContextID contextID) PUBLIC Bool glXIsDirect(Display * dpy, GLXContext gc) { +#ifdef GLX_USE_APPLEGL + /* + * This isn't an ideal test. + * glXIsDirect should probably search a list of contexts. + */ + if(NULL == gc) { + __glXSendError(dpy, GLXBadContext, 0, X_GLXIsDirect, false); + return False; + } + return gc->isDirect; +#else if (!gc) { return GL_FALSE; } @@ -861,11 +963,24 @@ glXIsDirect(Display * dpy, GLXContext gc) return GL_TRUE; } return __glXIsDirect(dpy, gc->xid); +#endif /* GLX_USE_APPLEGL */ } PUBLIC GLXPixmap glXCreateGLXPixmap(Display * dpy, XVisualInfo * vis, Pixmap pixmap) { +#ifdef GLX_USE_APPLEGL + int screen = vis->screen; + __GLXscreenConfigs *const psc = GetGLXScreenConfigs(dpy, screen); + const __GLcontextModes *modes; + + modes = _gl_context_modes_find_visual(psc->visuals, vis->visualid); + + if(apple_glx_pixmap_create(dpy, vis->screen, pixmap, modes)) + return None; + + return pixmap; +#else xGLXCreateGLXPixmapReq *req; GLXPixmap xid; CARD8 opcode; @@ -915,6 +1030,7 @@ glXCreateGLXPixmap(Display * dpy, XVisualInfo * vis, Pixmap pixmap) #endif return xid; +#endif } /* @@ -923,6 +1039,10 @@ glXCreateGLXPixmap(Display * dpy, XVisualInfo * vis, Pixmap pixmap) PUBLIC void glXDestroyGLXPixmap(Display * dpy, GLXPixmap glxpixmap) { +#ifdef GLX_USE_APPLEGL + if(apple_glx_pixmap_destroy(dpy, glxpixmap)) + __glXSendError(dpy, GLXBadPixmap, glxpixmap, X_GLXDestroyPixmap, false); +#else xGLXDestroyGLXPixmapReq *req; CARD8 opcode; @@ -953,11 +1073,20 @@ glXDestroyGLXPixmap(Display * dpy, GLXPixmap glxpixmap) } } #endif +#endif /* GLX_USE_APPLEGL */ } PUBLIC void glXSwapBuffers(Display * dpy, GLXDrawable drawable) { +#ifdef GLX_USE_APPLEGL + GLXContext gc = glXGetCurrentContext(); + if(gc && apple_glx_is_current_drawable(dpy, gc->apple, drawable)) { + apple_glx_swap_buffers(gc->apple); + } else { + __glXSendError(dpy, GLXBadCurrentWindow, 0, X_GLXSwapBuffers, false); + } +#else GLXContext gc; GLXContextTag tag; CARD8 opcode; @@ -1012,6 +1141,7 @@ glXSwapBuffers(Display * dpy, GLXDrawable drawable) SyncHandle(); XFlush(dpy); #endif /* USE_XCB */ +#endif /* GLX_USE_APPLEGL */ } @@ -1436,6 +1566,12 @@ glXChooseVisual(Display * dpy, int screen, int *attribList) } } +#ifdef GLX_USE_APPLEGL + if(visualList && getenv("LIBGL_DUMP_VISUALID")) { + printf("visualid 0x%lx\n", visualList[0].visualid); + } +#endif + return visualList; } @@ -1569,6 +1705,7 @@ PUBLIC GLX_ALIAS(Display *, glXGetCurrentDisplayEXT, (void), (), glXGetCurrentDisplay) +#ifndef GLX_USE_APPLEGL /** * Used internally by libGL to send \c xGLXQueryContextinfoExtReq requests * to the X-server. @@ -1680,9 +1817,12 @@ static int __glXQueryContextInfo(Display * dpy, GLXContext ctx) return retval; } +#endif + PUBLIC int glXQueryContext(Display * dpy, GLXContext ctx, int attribute, int *value) { +#ifndef GLX_USE_APPLEGL int retVal; /* get the information from the server if we don't have it already */ @@ -1695,13 +1835,17 @@ glXQueryContext(Display * dpy, GLXContext ctx, int attribute, int *value) if (Success != retVal) return retVal; } +#endif + switch (attribute) { - case GLX_SHARE_CONTEXT_EXT: +#ifndef GLX_USE_APPLEGL + case GLX_SHARE_CONTEXT_EXT: *value = (int) (ctx->share_xid); break; case GLX_VISUAL_ID_EXT: *value = ctx->mode ? ctx->mode->visualID : None; break; +#endif case GLX_SCREEN: *value = (int) (ctx->screen); break; @@ -1730,6 +1874,9 @@ PUBLIC GLXContextID glXGetContextIDEXT(const GLXContext ctx) PUBLIC GLXContext glXImportContextEXT(Display * dpy, GLXContextID contextID) { +#ifdef GLX_USE_APPLEGL + return NULL; +#else GLXContext ctx; if (contextID == None) { @@ -1750,6 +1897,7 @@ glXImportContextEXT(Display * dpy, GLXContextID contextID) } } return ctx; +#endif } PUBLIC void @@ -1877,7 +2025,7 @@ glXGetVisualFromFBConfig(Display * dpy, GLXFBConfig config) return XGetVisualInfo(dpy, VisualIDMask, &visualTemplate, &count); } - +#ifndef GLX_USE_APPLEGL /* ** GLX_SGI_swap_control */ @@ -2215,6 +2363,7 @@ __glXWaitVideoSyncSGI(int divisor, int remainder, unsigned int *count) return GLX_BAD_CONTEXT; } +#endif /* GLX_USE_APPLEGL */ /* ** GLX_SGIX_fbconfig @@ -2241,17 +2390,24 @@ glXCreateGLXPixmapWithConfigSGIX(Display * dpy, GLXFBConfigSGIX config, Pixmap pixmap) { +#ifndef GLX_USE_APPLEGL xGLXVendorPrivateWithReplyReq *vpreq; xGLXCreateGLXPixmapWithConfigSGIXReq *req; GLXPixmap xid = None; CARD8 opcode; - const __GLcontextModes *const fbconfig = (__GLcontextModes *) config; __GLXscreenConfigs *psc; +#endif + const __GLcontextModes *const fbconfig = (__GLcontextModes *) config; if ((dpy == NULL) || (config == NULL)) { return None; } +#ifdef GLX_USE_APPLEGL + if(apple_glx_pixmap_create(dpy, fbconfig->screen, pixmap, fbconfig)) + return None; + return pixmap; +#else psc = GetGLXScreenConfigs(dpy, fbconfig->screen); if ((psc != NULL) @@ -2279,6 +2435,7 @@ glXCreateGLXPixmapWithConfigSGIX(Display * dpy, } return xid; +#endif } PUBLIC GLXContext @@ -2324,7 +2481,7 @@ glXGetFBConfigFromVisualSGIX(Display * dpy, XVisualInfo * vis) return NULL; } - +#ifndef GLX_USE_APPLEGL /* ** GLX_SGIX_swap_group */ @@ -2922,6 +3079,8 @@ __glXReleaseTexImageEXT(Display * dpy, GLXDrawable drawable, int buffer) /*@}*/ +#endif /* GLX_USE_APPLEGL */ + /** * \c strdup is actually not a standard ANSI C or POSIX routine. * Irix will not define it if ANSI mode is in effect. @@ -2999,6 +3158,7 @@ static const struct name_address_pair GLX_functions[] = { GLX_FUNCTION(glXQueryDrawable), GLX_FUNCTION(glXSelectEvent), +#ifndef GLX_USE_APPLEGL /*** GLX_SGI_swap_control ***/ GLX_FUNCTION2(glXSwapIntervalSGI, __glXSwapIntervalSGI), @@ -3016,6 +3176,7 @@ static const struct name_address_pair GLX_functions[] = { GLX_FUNCTION2(glXGetCurrentDisplayEXT, glXGetCurrentDisplay), GLX_FUNCTION(glXImportContextEXT), GLX_FUNCTION2(glXQueryContextInfoEXT, glXQueryContext), +#endif /*** GLX_SGIX_fbconfig ***/ GLX_FUNCTION2(glXGetFBConfigAttribSGIX, glXGetFBConfigAttrib), @@ -3025,6 +3186,7 @@ static const struct name_address_pair GLX_functions[] = { GLX_FUNCTION2(glXGetVisualFromFBConfigSGIX, glXGetVisualFromFBConfig), GLX_FUNCTION(glXGetFBConfigFromVisualSGIX), +#ifndef GLX_USE_APPLEGL /*** GLX_SGIX_pbuffer ***/ GLX_FUNCTION(glXCreateGLXPbufferSGIX), GLX_FUNCTION(glXDestroyGLXPbufferSGIX), @@ -3062,6 +3224,7 @@ static const struct name_address_pair GLX_functions[] = { GLX_FUNCTION2(glXEndFrameTrackingMESA, __glXEndFrameTrackingMESA), GLX_FUNCTION2(glXGetFrameUsageMESA, __glXGetFrameUsageMESA), GLX_FUNCTION2(glXQueryFrameTrackingMESA, __glXQueryFrameTrackingMESA), +#endif /*** GLX_ARB_get_proc_address ***/ GLX_FUNCTION(glXGetProcAddressARB), @@ -3069,6 +3232,7 @@ static const struct name_address_pair GLX_functions[] = { /*** GLX 1.4 ***/ GLX_FUNCTION2(glXGetProcAddress, glXGetProcAddressARB), +#ifndef GLX_USE_APPLEGL /*** GLX_OML_sync_control ***/ GLX_FUNCTION2(glXWaitForSbcOML, __glXWaitForSbcOML), GLX_FUNCTION2(glXWaitForMscOML, __glXWaitForMscOML), @@ -3079,6 +3243,7 @@ static const struct name_address_pair GLX_functions[] = { /*** GLX_EXT_texture_from_pixmap ***/ GLX_FUNCTION2(glXBindTexImageEXT, __glXBindTexImageEXT), GLX_FUNCTION2(glXReleaseTexImageEXT, __glXReleaseTexImageEXT), +#endif #ifdef GLX_DIRECT_RENDERING /*** DRI configuration ***/ @@ -3089,7 +3254,7 @@ static const struct name_address_pair GLX_functions[] = { {NULL, NULL} /* end of list */ }; - +#ifndef GLX_USE_APPLEGL static const GLvoid * get_glx_proc_address(const char *funcName) { @@ -3103,7 +3268,7 @@ get_glx_proc_address(const char *funcName) return NULL; } - +#endif /** * Get the address of a named GL function. This is the pre-GLX 1.4 name for @@ -3126,13 +3291,15 @@ PUBLIC void (*glXGetProcAddressARB(const GLubyte * procName)) (void) * DRI based drivers from searching the core GL function table for * internal API functions. */ - +#ifdef GLX_USE_APPLEGL + f = (gl_function) apple_glx_get_proc_address(procName); +#else f = (gl_function) get_glx_proc_address((const char *) procName); if ((f == NULL) && (procName[0] == 'g') && (procName[1] == 'l') && (procName[2] != 'X')) { f = (gl_function) _glapi_get_proc_address((const char *) procName); } - +#endif return f; } |