static boolean ximage_display_is_pixmap_supported(struct native_display *ndpy, EGLNativePixmapType pix, const struct native_config *nconf) { struct ximage_display *xdpy = ximage_display(ndpy); enum pipe_format fmt; uint depth; depth = x11_drawable_get_depth(xdpy->xscr, (Drawable) pix); switch (depth) { case 32: fmt = PIPE_FORMAT_B8G8R8A8_UNORM; break; case 24: fmt = PIPE_FORMAT_B8G8R8X8_UNORM; break; case 16: fmt = PIPE_FORMAT_B5G6R5_UNORM; break; default: fmt = PIPE_FORMAT_NONE; break; } return (fmt == nconf->color_format); }
static struct native_surface * dri2_display_create_pixmap_surface(struct native_display *ndpy, EGLNativePixmapType pix, const struct native_config *nconf) { struct dri2_surface *dri2surf; if (!nconf) { struct dri2_display *dri2dpy = dri2_display(ndpy); uint depth, nconf_depth; int i; depth = x11_drawable_get_depth(dri2dpy->xscr, (Drawable) pix); for (i = 0; i < dri2dpy->num_configs; i++) { nconf_depth = util_format_get_blocksizebits( dri2dpy->configs[i].base.color_format); /* simple depth match for now */ if (depth == nconf_depth || (depth == 24 && depth + 8 == nconf_depth)) { nconf = &dri2dpy->configs[i].base; break; } } if (!nconf) return NULL; } dri2surf = dri2_display_create_surface(ndpy, (Drawable) pix, nconf->color_format); return (dri2surf) ? &dri2surf->base : NULL; }
static boolean dri2_display_get_pixmap_format(struct native_display *ndpy, EGLNativePixmapType pix, enum pipe_format *format) { struct dri2_display *dri2dpy = dri2_display(ndpy); boolean ret = EGL_TRUE; uint depth; depth = x11_drawable_get_depth(dri2dpy->xscr, (Drawable) pix); switch (depth) { case 32: case 24: *format = PIPE_FORMAT_B8G8R8A8_UNORM; break; case 16: *format = PIPE_FORMAT_B5G6R5_UNORM; break; default: *format = PIPE_FORMAT_NONE; ret = EGL_FALSE; break; } return ret; }
static enum pipe_format get_pixmap_format(struct native_display *ndpy, EGLNativePixmapType pix) { struct ximage_display *xdpy = ximage_display(ndpy); enum pipe_format fmt; uint depth; depth = x11_drawable_get_depth(xdpy->xscr, (Drawable) pix); switch (depth) { case 32: fmt = PIPE_FORMAT_B8G8R8A8_UNORM; break; case 24: fmt = PIPE_FORMAT_B8G8R8X8_UNORM; break; case 16: fmt = PIPE_FORMAT_B5G6R5_UNORM; break; default: fmt = PIPE_FORMAT_NONE; break; } return fmt; }