XMesaBuffer XMesaCreatePBuffer(XMesaVisual v, Colormap cmap, unsigned int width, unsigned int height) { Window root; Drawable drawable; /* X Pixmap Drawable */ XMesaBuffer b; /* allocate pixmap for front buffer */ root = RootWindow( v->display, v->visinfo->screen ); drawable = XCreatePixmap(v->display, root, width, height, v->visinfo->depth); if (!drawable) return NULL; b = create_xmesa_buffer(drawable, PBUFFER, v, cmap); if (!b) return NULL; if (!initialize_visual_and_buffer(v, b, v->mesa_visual.rgbMode, drawable, cmap)) { xmesa_free_buffer(b); return NULL; } return b; }
/** * For GLX_EXT_texture_from_pixmap */ XMesaBuffer XMesaCreatePixmapTextureBuffer(XMesaVisual v, XMesaPixmap p, XMesaColormap cmap, int format, int target, int mipmap) { GET_CURRENT_CONTEXT(ctx); XMesaBuffer b; GLuint width, height; assert(v); b = create_xmesa_buffer((XMesaDrawable) p, PIXMAP, v, cmap); if (!b) return NULL; /* get pixmap size, update framebuffer/renderbuffer dims */ xmesa_get_window_size(v->display, b, &width, &height); _mesa_resize_framebuffer(NULL, &(b->mesa_buffer), width, height); if (target == 0) { /* examine dims */ if (ctx->Extensions.ARB_texture_non_power_of_two) { target = GLX_TEXTURE_2D_EXT; } else if ( _mesa_bitcount(width) == 1 && _mesa_bitcount(height) == 1) { /* power of two size */ if (height == 1) { target = GLX_TEXTURE_1D_EXT; } else { target = GLX_TEXTURE_2D_EXT; } } else if (ctx->Extensions.NV_texture_rectangle) { target = GLX_TEXTURE_RECTANGLE_EXT; } else { /* non power of two textures not supported */ XMesaDestroyBuffer(b); return 0; } } b->TextureTarget = target; b->TextureFormat = format; b->TextureMipmap = mipmap; if (!initialize_visual_and_buffer(v, b, (XMesaDrawable) p, cmap)) { xmesa_free_buffer(b); return NULL; } return b; }
/** * Create a new XMesaBuffer from an X pixmap. * * \param v the XMesaVisual * \param p the pixmap * \param cmap the colormap, may be 0 if using a \c GLX_TRUE_COLOR or * \c GLX_DIRECT_COLOR visual for the pixmap * \returns new XMesaBuffer or NULL if error */ PUBLIC XMesaBuffer XMesaCreatePixmapBuffer(XMesaVisual v, XMesaPixmap p, XMesaColormap cmap) { XMesaBuffer b; assert(v); b = create_xmesa_buffer((XMesaDrawable) p, PIXMAP, v, cmap); if (!b) return NULL; if (!initialize_visual_and_buffer(v, b, (XMesaDrawable) p, cmap)) { xmesa_free_buffer(b); return NULL; } return b; }
/** * Private function for creating an XMesaBuffer which corresponds to an * X window or pixmap. * \param v the window's XMesaVisual * \param w the window we're wrapping * \return new XMesaBuffer or NULL if error */ PUBLIC XMesaBuffer XMesaCreateWindowBuffer(XMesaVisual v, Window w) { XWindowAttributes attr; XMesaBuffer b; Colormap cmap; int depth; assert(v); assert(w); /* Check that window depth matches visual depth */ XGetWindowAttributes( v->display, w, &attr ); depth = attr.depth; if (v->visinfo->depth != depth) { _mesa_warning(NULL, "XMesaCreateWindowBuffer: depth mismatch between visual (%d) and window (%d)!\n", v->visinfo->depth, depth); return NULL; } /* Find colormap */ if (attr.colormap) { cmap = attr.colormap; } else { _mesa_warning(NULL, "Window %u has no colormap!\n", (unsigned int) w); /* this is weird, a window w/out a colormap!? */ /* OK, let's just allocate a new one and hope for the best */ cmap = XCreateColormap(v->display, w, attr.visual, AllocNone); } b = create_xmesa_buffer((Drawable) w, WINDOW, v, cmap); if (!b) return NULL; if (!initialize_visual_and_buffer( v, b, v->mesa_visual.rgbMode, (Drawable) w, cmap )) { xmesa_free_buffer(b); return NULL; } return b; }