[Xquartz-changes] [147] AppleSGLX/trunk
source_changes at macosforge.org
source_changes at macosforge.org
Mon Feb 16 14:45:56 PST 2009
Revision: 147
http://trac.macosforge.org/projects/xquartz/changeset/147
Author: gstaplin at apple.com
Date: 2009-02-16 14:45:56 -0800 (Mon, 16 Feb 2009)
Log Message:
-----------
Add support for GLXPixmaps and restructure the struct apple_glx_drawable a bit.
Add appropriate branching in the apple_glx_context.c code for GLXPixmaps, and
cleanup some of the Pbuffer code.
Modified Paths:
--------------
AppleSGLX/trunk/apple_glx_context.c
AppleSGLX/trunk/apple_glx_drawable.c
AppleSGLX/trunk/apple_glx_drawable.h
Modified: AppleSGLX/trunk/apple_glx_context.c
===================================================================
--- AppleSGLX/trunk/apple_glx_context.c 2009-02-16 22:44:20 UTC (rev 146)
+++ AppleSGLX/trunk/apple_glx_context.c 2009-02-16 22:45:56 UTC (rev 147)
@@ -351,15 +351,7 @@
}
if(NULL == newagd) {
- CGLPBufferObj pbufobj;
- bool is_pbuffer = false;
-
- /* First check if it's a pbuffer. */
- if(apple_glx_pbuffer_get(drawable, &pbufobj))
- is_pbuffer = true;
-
- if(apple_glx_create_drawable(dpy, ac, drawable,
- is_pbuffer ? pbufobj : NULL, &newagd))
+ if(apple_glx_create_drawable(dpy, ac, drawable, &newagd))
return true;
/* Save the new drawable with the context structure. */
@@ -388,23 +380,31 @@
ac->is_current = true;
assert(NULL != ac->context_obj);
-
assert(NULL != ac->drawable);
- if(ac->drawable->is_pbuffer(ac->drawable)) {
-
- assert(NULL != ac->drawable->pbuffer_obj);
+ switch(ac->drawable->type) {
+ case APPLE_GLX_DRAWABLE_PBUFFER: {
+ CGLPBufferObj pbufobj;
+ if(false == apple_glx_pbuffer_get(ac->drawable->drawable, &pbufobj)) {
+ fprintf(stderr, "internal error: drawable is a pbuffer, "
+ "but the pbuffer layer was unable to retrieve "
+ "the CGLPBufferObj!\n");
+ return true;
+ }
+
cglerr = apple_cgl.set_pbuffer(ac->context_obj,
- ac->drawable->pbuffer_obj,
+ pbufobj,
0, 0, 0);
-
+
if(kCGLNoError != cglerr) {
fprintf(stderr, "set_pbuffer: %s\n", apple_cgl.error_string(cglerr));
return true;
}
-
- } else {
+ }
+ break;
+
+ case APPLE_GLX_DRAWABLE_SURFACE:
error = xp_attach_gl_context(ac->context_obj, ac->drawable->surface_id);
if(error) {
@@ -419,10 +419,42 @@
* The first time a new context is made current the glViewport
* and glScissor should be updated.
*/
- update_viewport_and_scissor(dpy, drawable);
+ update_viewport_and_scissor(dpy, ac->drawable->drawable);
ac->made_current = true;
}
+ break;
+
+ case APPLE_GLX_DRAWABLE_PIXMAP: {
+ int width, height;
+ void *ptr;
+
+
+ apple_cgl.clear_drawable(ac->context_obj);
+
+ if(false == apple_glx_pixmap_data(dpy, ac->drawable->drawable,
+ &width, &height,
+ &ptr)) {
+
+
+ fprintf(stderr, "invalid GLXPixmap: 0x%lx\n", ac->drawable->drawable);
+ return true;
+ }
+
+ printf("%s ptr %p\n", __func__, ptr);
+
+ cglerr = apple_cgl.set_off_screen(ac->context_obj, width, height,
+ width * /*FIXME?*/ 4, ptr);
+
+ if(kCGLNoError != cglerr) {
+ fprintf(stderr, "set off screen: %s\n",
+ apple_cgl.error_string(cglerr));
+
+ return true;
+ }
}
+ break;
+ }
+
ac->thread_id = pthread_self();
Modified: AppleSGLX/trunk/apple_glx_drawable.c
===================================================================
--- AppleSGLX/trunk/apple_glx_drawable.c 2009-02-16 22:44:20 UTC (rev 146)
+++ AppleSGLX/trunk/apple_glx_drawable.c 2009-02-16 22:45:56 UTC (rev 147)
@@ -180,12 +180,8 @@
if(agd->next)
agd->next->previous = agd->previous;
- /*
- * Only destroy the surface if it wasn't a pbuffer.
- *
- * The pbuffer should be cleaned up explicitly with glXDestroyPbuffer.
- */
- if(!agd->pbuffer_obj) {
+
+ if(APPLE_GLX_DRAWABLE_SURFACE == agd->type) {
error = xp_destroy_surface(agd->surface_id);
if(error) {
@@ -216,15 +212,19 @@
}
static bool is_pbuffer(struct apple_glx_drawable *agd) {
- return agd->pbuffer_obj ? true : false;
+ return APPLE_GLX_DRAWABLE_PBUFFER == agd->type;
}
+static bool is_pixmap(struct apple_glx_drawable *agd) {
+ return APPLE_GLX_DRAWABLE_PIXMAP == agd->type;
+}
+
bool apple_glx_create_drawable(Display *dpy,
struct apple_glx_context *ac,
GLXDrawable drawable,
- CGLPBufferObj pbuf,
struct apple_glx_drawable **agdResult) {
struct apple_glx_drawable *agd;
+ CGLPBufferObj pbufobj;
int err;
*agdResult = NULL;
@@ -241,8 +241,15 @@
agd->drawable = drawable;
agd->surface_id = 0;
agd->uid = 0;
- agd->pbuffer_obj = pbuf;
+ agd->type = APPLE_GLX_DRAWABLE_SURFACE;
+
+ if(apple_glx_pbuffer_get(drawable, &pbufobj))
+ agd->type = APPLE_GLX_DRAWABLE_PBUFFER;
+
+ if(apple_glx_is_pixmap(dpy, drawable))
+ agd->type = APPLE_GLX_DRAWABLE_PIXMAP;
+
err = pthread_mutex_init(&agd->mutex, NULL);
if(err) {
@@ -259,6 +266,7 @@
agd->destroy = destroy_drawable_callback;
agd->is_pbuffer = is_pbuffer;
+ agd->is_pixmap = is_pixmap;
agd->width = -1;
agd->height = -1;
@@ -270,7 +278,8 @@
agd->previous = NULL;
- if(!agd->pbuffer_obj && create_surface(dpy, ac, agd)) {
+ if(APPLE_GLX_DRAWABLE_SURFACE == agd->type
+ && create_surface(dpy, ac, agd)) {
free(agd);
return true;
}
Modified: AppleSGLX/trunk/apple_glx_drawable.h
===================================================================
--- AppleSGLX/trunk/apple_glx_drawable.h 2009-02-16 22:44:20 UTC (rev 146)
+++ AppleSGLX/trunk/apple_glx_drawable.h 2009-02-16 22:45:56 UTC (rev 147)
@@ -37,14 +37,21 @@
#define XP_NO_X_HEADERS
#include <Xplugin.h>
#undef XP_NO_X_HEADERS
+#include "apple_glx_pixmap.h"
+enum {
+ APPLE_GLX_DRAWABLE_SURFACE = 1,
+ APPLE_GLX_DRAWABLE_PBUFFER,
+ APPLE_GLX_DRAWABLE_PIXMAP
+};
+
struct apple_glx_drawable {
Display *display;
int reference_count;
GLXDrawable drawable;
xp_surface_id surface_id;
unsigned int uid;
- CGLPBufferObj pbuffer_obj;
+ int type; /* APPLE_GLX_DRAWABLE_* */
/*
* This mutex protects the reference count and any other drawable data.
@@ -61,6 +68,8 @@
bool (*is_pbuffer)(struct apple_glx_drawable *agd);
+ bool (*is_pixmap)(struct apple_glx_drawable *agd);
+
/*BEGIN These are used for the mixed mode drawing... */
int width, height;
int row_bytes;
@@ -83,7 +92,6 @@
bool apple_glx_create_drawable(Display *dpy,
struct apple_glx_context *ac,
GLXDrawable drawable,
- CGLPBufferObj pbuf,
struct apple_glx_drawable **agd);
void apple_glx_garbage_collect_drawables(Display *dpy);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/xquartz-changes/attachments/20090216/ac6af2c5/attachment-0001.html>
More information about the Xquartz-changes
mailing list