[Xquartz-changes] [167] AppleSGLX/trunk

source_changes at macosforge.org source_changes at macosforge.org
Wed Feb 18 03:23:59 PST 2009


Revision: 167
          http://trac.macosforge.org/projects/xquartz/changeset/167
Author:   gstaplin at apple.com
Date:     2009-02-18 03:23:56 -0800 (Wed, 18 Feb 2009)
Log Message:
-----------
Make the OffScreen attribute not be enabled for every CGLPixelFormatObj.

This works, but could use further testing, especially with context and
drawable destruction when the active context was from a GLXPixmap.

Modified Paths:
--------------
    AppleSGLX/trunk/apple_glx_context.c
    AppleSGLX/trunk/apple_glx_pixmap.c
    AppleSGLX/trunk/apple_glx_pixmap.h
    AppleSGLX/trunk/apple_visual.c
    AppleSGLX/trunk/apple_visual.h
    AppleSGLX/trunk/glxcmds.c

Modified: AppleSGLX/trunk/apple_glx_context.c
===================================================================
--- AppleSGLX/trunk/apple_glx_context.c	2009-02-18 08:07:43 UTC (rev 166)
+++ AppleSGLX/trunk/apple_glx_context.c	2009-02-18 11:23:56 UTC (rev 167)
@@ -141,7 +141,7 @@
     ac->made_current = false;
     
     apple_visual_create_pfobj(&ac->pixel_format_obj, mode, 
-			      &ac->double_buffered);
+			      &ac->double_buffered, /*offscreen*/ false);
     
     error = apple_cgl.create_context(ac->pixel_format_obj, 
 				     sharedac ? sharedac->context_obj : NULL,
@@ -427,17 +427,30 @@
     case APPLE_GLX_DRAWABLE_PIXMAP: {
 	int width, height, pitch, bpp;
 	void *ptr;
-
+	CGLContextObj ctxobj;
+	void *ctxobjptr;
 	
 	apple_cgl.clear_drawable(ac->context_obj);
 
 	if(false == apple_glx_pixmap_data(dpy, ac->drawable->drawable,
 					  &width, &height, &pitch, &bpp,
-					  &ptr)) {
+					  &ptr, &ctxobjptr,
+					  /*mark current*/ true)) {
 	    return true;
 	}
+
+	ctxobj = ctxobjptr;
 	
-	cglerr = apple_cgl.set_off_screen(ac->context_obj, width, height,
+	cglerr = apple_cgl.set_current_context(ctxobj);
+
+	if(kCGLNoError != cglerr) {
+	    fprintf(stderr, "set current context: %s\n",
+		    apple_cgl.error_string(cglerr));
+	    
+	    return true;
+	}
+
+	cglerr = apple_cgl.set_off_screen(ctxobj, width, height,
 					  pitch, ptr);
 
 	if(kCGLNoError != cglerr) {

Modified: AppleSGLX/trunk/apple_glx_pixmap.c
===================================================================
--- AppleSGLX/trunk/apple_glx_pixmap.c	2009-02-18 08:07:43 UTC (rev 166)
+++ AppleSGLX/trunk/apple_glx_pixmap.c	2009-02-18 11:23:56 UTC (rev 167)
@@ -34,6 +34,8 @@
 #include <sys/types.h>
 #include <sys/mman.h>
 #include <unistd.h>
+#include "apple_cgl.h"
+#include "apple_visual.h"
 #include "apple_glx_pixmap.h"
 #include "appledri.h"
 
@@ -44,6 +46,9 @@
     size_t size;
     char path[PATH_MAX];
     int fd;
+    CGLPixelFormatObj pixel_format_obj;
+    CGLContextObj context_obj;
+    bool is_current;
     struct apple_glx_pixmap *next, *previous;
 };
 
@@ -89,9 +94,12 @@
 
 
 /* Return true if an error occurred. */
-bool apple_glx_pixmap_create(Display *dpy, int screen, Pixmap pixmap) {
+bool apple_glx_pixmap_create(Display *dpy, int screen, Pixmap pixmap, 
+			     const void *mode) {
     struct apple_glx_pixmap *p;
-
+    bool double_buffered;
+    CGLError error;
+    
     p = malloc(sizeof(*p));
 
     p->xpixmap = pixmap;
@@ -127,6 +135,23 @@
 	return true;
     }
 
+    apple_visual_create_pfobj(&p->pixel_format_obj, mode, &double_buffered,
+			      /*offscreen*/ true);
+
+    error = apple_cgl.create_context(p->pixel_format_obj, NULL,
+				     &p->context_obj);
+
+    if(kCGLNoError != error) {
+	(void)apple_cgl.destroy_pixel_format(p->pixel_format_obj); 
+	munmap(p->buffer, p->size);
+	XAppleDRIDestroyPixmap(dpy, pixmap);
+	shm_unlink(p->path);
+	free(p);
+	return true;
+    }
+
+    p->is_current = false;
+
     lock_pixmap_list();
     
     p->previous = NULL;
@@ -149,11 +174,12 @@
     lock_pixmap_list();
 
     if(find_pixmap(pixmap, &p)) {
+	(void)apple_cgl.destroy_pixel_format(p->pixel_format_obj);
+	(void)apple_cgl.destroy_context(p->context_obj);
 	XAppleDRIDestroyPixmap(dpy, pixmap);
 	munmap(p->buffer, p->size);
 	close(p->fd);
         shm_unlink(p->path);
-	free(p);
 
 	if(p->previous) {
 	    p->previous->next = p->next;
@@ -163,6 +189,8 @@
 
 	if(p->next)
 	    p->next->previous = p->previous;
+
+	free(p);
     }
 
     unlock_pixmap_list();
@@ -183,7 +211,8 @@
 }
 
 bool apple_glx_pixmap_data(Display *dpy, GLXPixmap pixmap, int *width,
-			   int *height, int *pitch, int *bpp, void **ptr) {
+			   int *height, int *pitch, int *bpp, void **ptr,
+			   void **contextptr, bool mark_current) {
     struct apple_glx_pixmap *p;
     bool result = false;
 
@@ -195,6 +224,10 @@
 	*pitch = p->pitch;
 	*bpp = p->bpp;
 	*ptr = p->buffer;
+	*contextptr = p->context_obj;
+	
+	p->is_current = mark_current;
+
 	result = true;
     }
 

Modified: AppleSGLX/trunk/apple_glx_pixmap.h
===================================================================
--- AppleSGLX/trunk/apple_glx_pixmap.h	2009-02-18 08:07:43 UTC (rev 166)
+++ AppleSGLX/trunk/apple_glx_pixmap.h	2009-02-18 11:23:56 UTC (rev 167)
@@ -33,8 +33,10 @@
 #include <limits.h>
 #include "GL/glx.h"
 
+/* mode is a __GLcontextModes * */
 /* Returns true if an error occurred. */
-bool apple_glx_pixmap_create(Display *dpy, int screen, Pixmap pixmap);
+bool apple_glx_pixmap_create(Display *dpy, int screen, Pixmap pixmap,
+			     const void *mode);
 
 void apple_glx_pixmap_destroy(Display *dpy, Pixmap pixmap);
 
@@ -42,6 +44,7 @@
 
 /* Returns true if the pixmap is valid, and there is data for it. */
 bool apple_glx_pixmap_data(Display *dpy, GLXPixmap pixmap, int *width,
-			   int *height, int *pitch, int *bpp, void **ptr);
+			   int *height, int *pitch, int *bpp, void **ptr,
+			   void **contextptr, bool mark_current);
 
 #endif

Modified: AppleSGLX/trunk/apple_visual.c
===================================================================
--- AppleSGLX/trunk/apple_visual.c	2009-02-18 08:07:43 UTC (rev 166)
+++ AppleSGLX/trunk/apple_visual.c	2009-02-18 11:23:56 UTC (rev 167)
@@ -35,24 +35,24 @@
 #include <OpenGL/CGLContext.h>
 #include "glcontextmodes.h" 
 #include "apple_cgl.h"
+#include "apple_visual.h"
 
 /*mode is a __GlcontextModes*/
 void apple_visual_create_pfobj(CGLPixelFormatObj *pfobj, const void *mode,
-			       bool *double_buffered) {
+			       bool *double_buffered, bool offscreen) {
     CGLPixelFormatAttribute attr[60];
     const __GLcontextModes *c = mode;
     int numattr = 0;
     GLint vsref = 0;
     CGLError error = 0;
 
-#if 1
-    /*TODO we only need this sometimes -- for GLXPixmaps!*/
-    attr[numattr++] = kCGLPFAOffScreen;
+    if(offscreen) {
+	attr[numattr++] = kCGLPFAOffScreen;
+	
+	attr[numattr++] = kCGLPFAColorSize;
+	attr[numattr++] = 32;
+    }
     
-    attr[numattr++] = kCGLPFAColorSize;
-    attr[numattr++] = 32;
-#endif
-
     if(c->stereoMode) 
 	attr[numattr++] = kCGLPFAStereo;
     

Modified: AppleSGLX/trunk/apple_visual.h
===================================================================
--- AppleSGLX/trunk/apple_visual.h	2009-02-18 08:07:43 UTC (rev 166)
+++ AppleSGLX/trunk/apple_visual.h	2009-02-18 11:23:56 UTC (rev 167)
@@ -30,10 +30,11 @@
 #ifndef APPLE_VISUAL_H
 #define APPLE_VISUAL_H
 
+#include <stdbool.h>
 #include <OpenGL/CGLTypes.h>
 
 /* mode is expected to be of type __GLcontextModes. */
 void apple_visual_create_pfobj(CGLPixelFormatObj *pfobj, const void *mode,
-			       bool *double_buffered);
+			       bool *double_buffered, bool offscreen);
 
 #endif

Modified: AppleSGLX/trunk/glxcmds.c
===================================================================
--- AppleSGLX/trunk/glxcmds.c	2009-02-18 08:07:43 UTC (rev 166)
+++ AppleSGLX/trunk/glxcmds.c	2009-02-18 11:23:56 UTC (rev 167)
@@ -682,7 +682,13 @@
 PUBLIC GLXPixmap glXCreateGLXPixmap(Display *dpy, XVisualInfo *vis, 
 				    Pixmap pixmap)
 {
-    if(apple_glx_pixmap_create(dpy, vis->screen, pixmap))
+    int screen = vis->screen;
+    __GLXscreenConfigs *const psc = GetGLXScreenConfigs(dpy, screen);
+    const __GLcontextModes *mode;
+    
+    mode = _gl_context_modes_find_visual(psc->visuals, vis->visualid);
+
+    if(apple_glx_pixmap_create(dpy, vis->screen, pixmap, mode))
 	return None;
 
     return pixmap;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/xquartz-changes/attachments/20090218/5c7c6454/attachment-0001.html>


More information about the Xquartz-changes mailing list