static void osmesa_UnmapRenderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb) { if (rb->ClassID == OSMESA_RENDERBUFFER_CLASS) { /* no-op */ } else { _swrast_unmap_soft_renderbuffer(ctx, rb); } }
/** * Called via ctx->Driver.UnmapRenderbuffer() */ void xmesa_UnmapRenderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb) { struct xmesa_renderbuffer *xrb = xmesa_renderbuffer(rb); if (xrb->Base.Base.ClassID == XMESA_RENDERBUFFER) { XImage *ximage = xrb->ximage; if (!ximage) { /* this must be a pixmap/window renderbuffer */ assert(xrb->pixmap); assert(xrb->map_ximage); if (xrb->map_ximage) { if (xrb->map_mode & GL_MAP_WRITE_BIT) { /* put modified ximage data back into the pixmap/window */ int y2 = rb->Height - xrb->map_y - xrb->map_h; GC gc = XCreateGC(xrb->Parent->display, xrb->pixmap, 0, NULL); XPutImage(xrb->Parent->display, xrb->pixmap, /* dest */ gc, xrb->map_ximage, /* source */ 0, 0, /* src x, y */ xrb->map_x, y2, /* dest x, y */ xrb->map_w, xrb->map_h); /* size */ XFreeGC(xrb->Parent->display, gc); } XMesaDestroyImage(xrb->map_ximage); xrb->map_ximage = NULL; } } xrb->map_mode = 0x0; return; } /* otherwise, this is an ordinary malloc-based renderbuffer */ _swrast_unmap_soft_renderbuffer(ctx, rb); }
static void sw_UnmapRenderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb) { if (rb->ClassID== SW_FRONT_RENDERBUFFER_CLASS) { /* This is our front buffer */ struct sw_front_renderbuffer* srb = (struct sw_front_renderbuffer*)rb; if(srb->write) { /* Copy the bits to our display */ BitBlt(IntGetCurrentDC(), srb->x, srb->y, srb->w, srb->h, srb->hdcmem, srb->x, srb->y, SRCCOPY); srb->write = FALSE; } return; } if(rb->ClassID == SW_BACK_RENDERBUFFER_CLASS) return; /* nothing to do */ /* Let mesa rasterizer take care of this */ _swrast_unmap_soft_renderbuffer(ctx, rb); }