Revision: 177 http://trac.macosforge.org/projects/xquartz/changeset/177 Author: gstaplin@apple.com Date: 2009-02-19 15:09:20 -0800 (Thu, 19 Feb 2009) Log Message: ----------- Simplify the glXQueryDrawable path and extend it to support windows. Redesign the private interface for the pbuffer querying, and make it use the get_max_size() for the LARGEST_PBUFFER attribute. Tested with ./builds/pbuffer and ./builds/pbuffer_destroy. The latter still generates an XError message, as it should (to indicate correct behavior). Modified Paths: -------------- AppleSGLX/trunk/apple_glx_pbuffer.c AppleSGLX/trunk/apple_glx_pbuffer.h AppleSGLX/trunk/glx_pbuffer.c Modified: AppleSGLX/trunk/apple_glx_pbuffer.c =================================================================== --- AppleSGLX/trunk/apple_glx_pbuffer.c 2009-02-19 22:39:03 UTC (rev 176) +++ AppleSGLX/trunk/apple_glx_pbuffer.c 2009-02-19 23:09:20 UTC (rev 177) @@ -36,7 +36,7 @@ struct apple_glx_pbuffer { GLXPbuffer xid; /* our pixmap */ int width, height; - XID fbconfig_id; + GLint fbconfigID; CGLPBufferObj buffer_obj; struct apple_glx_pbuffer *previous, *next; }; @@ -95,7 +95,7 @@ struct apple_glx_pbuffer *pbuf; Window root; int screen; - __GLcontextModes *mode = (__GLcontextModes *)config; + __GLcontextModes *modes = (__GLcontextModes *)config; pbuf = malloc(sizeof(*pbuf)); @@ -109,9 +109,9 @@ pbuf->previous = NULL; pbuf->next = NULL; - /*TODO perhaps use GL_RGB if the config specifies a 0 alpha. */ err = apple_cgl.create_pbuffer(width, height, GL_TEXTURE_RECTANGLE_EXT, - GL_RGBA, 0, &pbuf->buffer_obj); + (modes->alphaBits > 0) ? GL_RGBA : GL_RGB, + 0, &pbuf->buffer_obj); if(kCGLNoError != err) { free(pbuf); @@ -138,8 +138,7 @@ return true; } - printf("mode->fbconfigID %d\n", mode->fbconfigID); - pbuf->fbconfig_id = mode->fbconfigID; + pbuf->fbconfigID = modes->fbconfigID; *result = pbuf->xid; @@ -204,41 +203,8 @@ return false; } -bool apple_glx_pbuffer_get_width(GLXDrawable d, int *width) { - struct apple_glx_pbuffer *pbuf; - - if(find_pbuffer(d, &pbuf)) { - *width = pbuf->width; - return true; - } - - return false; -} - -bool apple_glx_pbuffer_get_height(GLXDrawable d, int *height) { - struct apple_glx_pbuffer *pbuf; - - if(find_pbuffer(d, &pbuf)) { - *height = pbuf->height; - return true; - } - - return false; -} - -bool apple_glx_pbuffer_get_fbconfig_id(GLXDrawable d, XID *id) { - struct apple_glx_pbuffer *pbuf; - - if(find_pbuffer(d, &pbuf)) { - *id = pbuf->fbconfig_id; - return true; - } - - return false; -} - /* Return true if an error occurred. */ -bool apple_glx_pbuffer_get_max_size(int *widthresult, int *heightresult) { +static bool get_max_size(int *widthresult, int *heightresult) { CGLContextObj oldcontext; GLint ar[2]; @@ -299,6 +265,8 @@ apple_cgl.destroy_context(newcontext); apple_cgl.destroy_pixel_format(pfobj); } else { + /* We have a valid context. */ + glGetIntegerv(GL_MAX_VIEWPORT_DIMS, ar); } @@ -307,3 +275,46 @@ return false; } + +bool apple_glx_pbuffer_query(GLXPbuffer p, int attr, unsigned int *value) { + bool result = false; + struct apple_glx_pbuffer *pbuf; + + if(find_pbuffer(p, &pbuf)) { + switch(attr) { + case GLX_WIDTH: + *value = pbuf->width; + result = true; + break; + + case GLX_HEIGHT: + *value = pbuf->height; + result = true; + break; + + case GLX_PRESERVED_CONTENTS: + *value = true; + result = true; + break; + + case GLX_LARGEST_PBUFFER: { + int width, height; + if(get_max_size(&width, &height)) { + fprintf(stderr, "internal error: " + "unable to find the largest pbuffer!\n"); + } else { + *value = width; + result = true; + } + } + break; + + case GLX_FBCONFIG_ID: + *value = pbuf->fbconfigID; + result = true; + break; + } + } + + return result; +} Modified: AppleSGLX/trunk/apple_glx_pbuffer.h =================================================================== --- AppleSGLX/trunk/apple_glx_pbuffer.h 2009-02-19 22:39:03 UTC (rev 176) +++ AppleSGLX/trunk/apple_glx_pbuffer.h 2009-02-19 23:09:20 UTC (rev 177) @@ -42,6 +42,10 @@ /* Returns true if the drawable has a valid pbuffer object result. */ bool apple_glx_pbuffer_get(GLXDrawable d, CGLPBufferObj *result); +/* Returns true if the pbuffer was valid and the attribute. */ +bool apple_glx_pbuffer_query(GLXDrawable d, int attribute, + unsigned int *value); + /* These return true if the drawable is a valid Pbuffer: */ bool apple_glx_pbuffer_get_width(GLXDrawable d, int *width); bool apple_glx_pbuffer_get_height(GLXDrawable d, int *height); Modified: AppleSGLX/trunk/glx_pbuffer.c =================================================================== --- AppleSGLX/trunk/glx_pbuffer.c 2009-02-19 22:39:03 UTC (rev 176) +++ AppleSGLX/trunk/glx_pbuffer.c 2009-02-19 23:09:20 UTC (rev 177) @@ -649,54 +649,31 @@ glXQueryDrawable(Display *dpy, GLXDrawable drawable, int attribute, unsigned int *value) { GLXContext gc = __glXGetCurrentContext(); + Window root; + int x, y; + unsigned int width, height, bd, depth; xError error; if(apple_glx_pixmap_query(drawable, attribute, value)) return; /*done*/ - switch(attribute) { - case GLX_WIDTH: { - int width; + if(apple_glx_pbuffer_query(drawable, attribute, value)) + return; /*done*/ - if(apple_glx_pbuffer_get_width(drawable, &width)) { - *value = (unsigned int)width; + if(XGetGeometry(dpy, drawable, &root, &x, &y, &width, &height, &bd, &depth)) { + switch(attribute) { + case GLX_WIDTH: + *value = width; return; - } - } - break; - case GLX_HEIGHT: { - int height; - - if(apple_glx_pbuffer_get_height(drawable, &height)) { - *value = (unsigned int)height; + case GLX_HEIGHT: + *value = height; return; } + /*FALL THROUGH*/ } - break; - - case GLX_PRESERVED_CONTENTS: - *value = true; - return; - break; - - case GLX_FBCONFIG_ID: { - XID id; - - if(apple_glx_pbuffer_get_fbconfig_id(drawable, &id)) { - *value = id; - return; - } - } - break; - - default: - fprintf(stderr, "%s invalid attribute: %d\n", __func__, attribute); - abort(); - } - - + LockDisplay(dpy); error.errorCode = GLXBadDrawable;
participants (1)
-
source_changes@macosforge.org