summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Whitwell <keithw@vmware.com>2010-03-09 11:39:40 +0000
committerKeith Whitwell <keithw@vmware.com>2010-03-09 11:39:40 +0000
commitd5bf9c0a5e51d160e7037297faf7657a0e2c6360 (patch)
treea4292c36c88e98033dadf0f41df83c5a21076123
parent0c96690a5b6e1c2d114e7ec5f1e9d60a4ff2a330 (diff)
ws/xlib: manage the GC internally
No need for the user of this winsys to supply/manage the x11 gc for us.
-rw-r--r--src/gallium/include/state_tracker/xlib_sw_winsys.h1
-rw-r--r--src/gallium/state_trackers/egl/x11/native_ximage.c12
-rw-r--r--src/gallium/state_trackers/glx/xlib/xm_api.c12
-rw-r--r--src/gallium/winsys/xlib/xlib_sw_winsys.c43
4 files changed, 37 insertions, 31 deletions
diff --git a/src/gallium/include/state_tracker/xlib_sw_winsys.h b/src/gallium/include/state_tracker/xlib_sw_winsys.h
index 915a7b37fb..3cb679426d 100644
--- a/src/gallium/include/state_tracker/xlib_sw_winsys.h
+++ b/src/gallium/include/state_tracker/xlib_sw_winsys.h
@@ -16,7 +16,6 @@ struct xlib_drawable {
Visual *visual;
int depth;
Drawable drawable;
- GC gc; /* temporary? */
};
diff --git a/src/gallium/state_trackers/egl/x11/native_ximage.c b/src/gallium/state_trackers/egl/x11/native_ximage.c
index 0006b0caca..0aa25ead25 100644
--- a/src/gallium/state_trackers/egl/x11/native_ximage.c
+++ b/src/gallium/state_trackers/egl/x11/native_ximage.c
@@ -73,8 +73,6 @@ struct ximage_surface {
XVisualInfo visual;
struct ximage_display *xdpy;
- GC gc;
-
unsigned int server_stamp;
unsigned int client_stamp;
int width, height;
@@ -155,7 +153,6 @@ ximage_surface_alloc_buffer(struct native_surface *nsurf,
xbuf->xdraw.visual = xsurf->visual.visual;
xbuf->xdraw.depth = xsurf->visual.depth;
xbuf->xdraw.drawable = xsurf->drawable;
- xbuf->xdraw.gc = xsurf->gc;
}
/* clean up the buffer if allocation failed */
@@ -373,8 +370,6 @@ ximage_surface_destroy(struct native_surface *nsurf)
for (i = 0; i < NUM_NATIVE_ATTACHMENTS; i++)
ximage_surface_free_buffer(&xsurf->base, i);
- if (xsurf->type != XIMAGE_SURFACE_TYPE_PBUFFER)
- XFreeGC(xsurf->xdpy->dpy, xsurf->gc);
free(xsurf);
}
@@ -400,13 +395,6 @@ ximage_display_create_surface(struct native_display *ndpy,
if (xsurf->type != XIMAGE_SURFACE_TYPE_PBUFFER) {
xsurf->drawable = drawable;
xsurf->visual = *xconf->visual;
-
- xsurf->gc = XCreateGC(xdpy->dpy, xsurf->drawable, 0, NULL);
- if (!xsurf->gc) {
- free(xsurf);
- return NULL;
- }
-
/* initialize the geometry */
ximage_surface_update_buffers(&xsurf->base, 0x0);
}
diff --git a/src/gallium/state_trackers/glx/xlib/xm_api.c b/src/gallium/state_trackers/glx/xlib/xm_api.c
index d8aa59b3b7..cf9a399209 100644
--- a/src/gallium/state_trackers/glx/xlib/xm_api.c
+++ b/src/gallium/state_trackers/glx/xlib/xm_api.c
@@ -446,8 +446,6 @@ xmesa_free_buffer(XMesaBuffer buffer)
/* Unreference. If count = zero we'll really delete the buffer */
_mesa_reference_framebuffer(&fb, NULL);
- XFreeGC(b->xm_visual->display, b->ws.gc);
-
free(buffer);
return;
@@ -524,16 +522,6 @@ initialize_visual_and_buffer(XMesaVisual v, XMesaBuffer b,
printf("X/Mesa bits per pixel = %d\n", v->BitsPerPixel);
}
- if (b && window) {
- /* these should have been set in create_xmesa_buffer */
- ASSERT(b->ws.drawable == window);
-
-
- /* X11 graphics context */
- b->ws.gc = XCreateGC( v->display, window, 0, NULL );
- XSetFunction( v->display, b->ws.gc, GXcopy );
- }
-
return GL_TRUE;
}
diff --git a/src/gallium/winsys/xlib/xlib_sw_winsys.c b/src/gallium/winsys/xlib/xlib_sw_winsys.c
index 9a4ae39aeb..846d79c0eb 100644
--- a/src/gallium/winsys/xlib/xlib_sw_winsys.c
+++ b/src/gallium/winsys/xlib/xlib_sw_winsys.c
@@ -73,6 +73,12 @@ struct xm_displaytarget
Display *display;
Visual *visual;
XImage *tempImage;
+ GC gc;
+
+ /* This is the last drawable that this display target was presented
+ * against. May need to recreate gc, tempImage when this changes??
+ */
+ Drawable drawable;
XShmSegmentInfo shminfo;
int shm;
@@ -260,6 +266,12 @@ xm_displaytarget_destroy(struct sw_winsys *ws,
FREE(xm_dt->data);
}
+ if (xm_dt->tempImage)
+ XDestroyImage(xm_dt->tempImage);
+
+ if (xm_dt->gc)
+ XFreeGC(xm_dt->display, xm_dt->gc);
+
FREE(xm_dt);
}
@@ -272,10 +284,11 @@ void
xlib_sw_display(struct xlib_drawable *xlib_drawable,
struct sw_displaytarget *dt)
{
- XImage *ximage;
- struct xm_displaytarget *xm_dt = xm_displaytarget(dt);
static boolean no_swap = 0;
static boolean firsttime = 1;
+ struct xm_displaytarget *xm_dt = xm_displaytarget(dt);
+ Display *display = xm_dt->display;
+ XImage *ximage;
if (firsttime) {
no_swap = getenv("SP_NO_RAST") != NULL;
@@ -285,8 +298,21 @@ xlib_sw_display(struct xlib_drawable *xlib_drawable,
if (no_swap)
return;
- if (xm_dt->tempImage == NULL)
- {
+ if (xm_dt->drawable != xlib_drawable->drawable) {
+ if (xm_dt->gc) {
+ XFreeGC( display, xm_dt->gc );
+ xm_dt->gc = NULL;
+ }
+
+ if (xm_dt->tempImage) {
+ XDestroyImage( xm_dt->tempImage );
+ xm_dt->tempImage = NULL;
+ }
+
+ xm_dt->drawable = xlib_drawable->drawable;
+ }
+
+ if (xm_dt->tempImage == NULL) {
assert(util_format_get_blockwidth(xm_dt->format) == 1);
assert(util_format_get_blockheight(xm_dt->format) == 1);
alloc_ximage(xm_dt, xlib_drawable,
@@ -296,6 +322,11 @@ xlib_sw_display(struct xlib_drawable *xlib_drawable,
return;
}
+ if (xm_dt->gc == NULL) {
+ xm_dt->gc = XCreateGC( display, xlib_drawable->drawable, 0, NULL );
+ XSetFunction( display, xm_dt->gc, GXcopy );
+ }
+
#ifdef USE_XSHM
if (xm_dt->shm)
{
@@ -303,7 +334,7 @@ xlib_sw_display(struct xlib_drawable *xlib_drawable,
ximage->data = xm_dt->data;
/* _debug_printf("XSHM\n"); */
- XShmPutImage(xm_dt->display, xlib_drawable->drawable, xlib_drawable->gc,
+ XShmPutImage(xm_dt->display, xlib_drawable->drawable, xm_dt->gc,
ximage, 0, 0, 0, 0, xm_dt->width, xm_dt->height, False);
}
else
@@ -323,7 +354,7 @@ xlib_sw_display(struct xlib_drawable *xlib_drawable,
ximage->bytes_per_line = xm_dt->stride;
/* _debug_printf("XPUT\n"); */
- XPutImage(xm_dt->display, xlib_drawable->drawable, xlib_drawable->gc,
+ XPutImage(xm_dt->display, xlib_drawable->drawable, xm_dt->gc,
ximage, 0, 0, 0, 0, xm_dt->width, xm_dt->height);
}
}