st/egl: add get_pixmap_format callback to native_display

And use it for EGL_MATCH_NATIVE_PIXMAP.  Remove is_pixmap_supported
meanwhile.
This commit is contained in:
Chia-I Wu
2011-06-25 16:44:11 +09:00
parent 31520548b7
commit a0ad339915
5 changed files with 65 additions and 47 deletions
@@ -86,11 +86,18 @@ egl_g3d_choose_st(_EGLDriver *drv, _EGLContext *ctx,
return stapi;
}
struct egl_g3d_choose_config_data {
_EGLConfig criteria;
enum pipe_format format;
};
static int
egl_g3d_compare_config(const _EGLConfig *conf1, const _EGLConfig *conf2,
void *priv_data)
{
const _EGLConfig *criteria = (const _EGLConfig *) priv_data;
struct egl_g3d_choose_config_data *data =
(struct egl_g3d_choose_config_data *) priv_data;
const _EGLConfig *criteria = &data->criteria;;
/* EGL_NATIVE_VISUAL_TYPE ignored? */
return _eglCompareConfigs(conf1, conf2, criteria, EGL_TRUE);
@@ -99,36 +106,39 @@ egl_g3d_compare_config(const _EGLConfig *conf1, const _EGLConfig *conf2,
static EGLBoolean
egl_g3d_match_config(const _EGLConfig *conf, void *priv_data)
{
const _EGLConfig *criteria = (const _EGLConfig *) priv_data;
struct egl_g3d_choose_config_data *data =
(struct egl_g3d_choose_config_data *) priv_data;
struct egl_g3d_config *gconf = egl_g3d_config(conf);
if (!_eglMatchConfig(conf, criteria))
if (data->format != PIPE_FORMAT_NONE &&
data->format != gconf->native->color_format)
return EGL_FALSE;
if (criteria->MatchNativePixmap != EGL_NONE &&
criteria->MatchNativePixmap != EGL_DONT_CARE) {
struct egl_g3d_display *gdpy = egl_g3d_display(conf->Display);
struct egl_g3d_config *gconf = egl_g3d_config(conf);
EGLNativePixmapType pix =
(EGLNativePixmapType) criteria->MatchNativePixmap;
if (!gdpy->native->is_pixmap_supported(gdpy->native, pix, gconf->native))
return EGL_FALSE;
}
return EGL_TRUE;
return _eglMatchConfig(conf, &data->criteria);
}
static EGLBoolean
egl_g3d_choose_config(_EGLDriver *drv, _EGLDisplay *dpy, const EGLint *attribs,
EGLConfig *configs, EGLint size, EGLint *num_configs)
{
_EGLConfig criteria;
struct egl_g3d_choose_config_data data;
if (!_eglParseConfigAttribList(&criteria, dpy, attribs))
if (!_eglParseConfigAttribList(&data.criteria, dpy, attribs))
return _eglError(EGL_BAD_ATTRIBUTE, "eglChooseConfig");
data.format = PIPE_FORMAT_NONE;
if (data.criteria.MatchNativePixmap != EGL_NONE &&
data.criteria.MatchNativePixmap != EGL_DONT_CARE) {
struct egl_g3d_display *gdpy = egl_g3d_display(dpy);
if (!gdpy->native->get_pixmap_format(gdpy->native,
(EGLNativePixmapType) data.criteria.MatchNativePixmap,
&data.format))
return _eglError(EGL_BAD_NATIVE_PIXMAP, "eglChooseConfig");
}
return _eglFilterConfigArray(dpy->Configs, configs, size, num_configs,
egl_g3d_match_config, egl_g3d_compare_config, &criteria);
egl_g3d_match_config, egl_g3d_compare_config, &data);
}
static _EGLContext *
+5 -11
View File
@@ -175,18 +175,12 @@ struct native_display {
int *num_configs);
/**
* Test if a pixmap is supported by the given config. Required unless no
* config has pixmap_bit set.
*
* This function is usually called to find a config that supports a given
* pixmap. Thus, it is usually called with the same pixmap in a row.
*
* TODO should be get_pixmap_format() and return the pipe format of the
* pixmap.
* Get the color format of the pixmap. Required unless no config has
* pixmap_bit set.
*/
boolean (*is_pixmap_supported)(struct native_display *ndpy,
EGLNativePixmapType pix,
const struct native_config *nconf);
boolean (*get_pixmap_format)(struct native_display *ndpy,
EGLNativePixmapType pix,
enum pipe_format *format);
/**
* Copy the contents of the resource to the pixmap's front-left attachment.
@@ -114,11 +114,12 @@ wayland_display_get_param(struct native_display *ndpy,
}
static boolean
wayland_display_is_pixmap_supported(struct native_display *ndpy,
EGLNativePixmapType pix,
const struct native_config *nconf)
wayland_display_get_pixmap_format(struct native_display *ndpy,
EGLNativePixmapType pix,
enum pipe_format *format)
{
/* all wl_egl_pixmaps are supported */
*format = PIPE_FORMAT_NONE;
return TRUE;
}
@@ -476,7 +477,7 @@ native_create_display(void *dpy, boolean use_sw)
display->base.get_param = wayland_display_get_param;
display->base.get_configs = wayland_display_get_configs;
display->base.is_pixmap_supported = wayland_display_is_pixmap_supported;
display->base.get_pixmap_format = wayland_display_get_pixmap_format;
display->base.copy_to_pixmap = native_display_copy_to_pixmap;
display->base.create_window_surface = wayland_create_window_surface;
display->base.create_pixmap_surface = wayland_create_pixmap_surface;
@@ -683,18 +683,30 @@ dri2_display_get_configs(struct native_display *ndpy, int *num_configs)
}
static boolean
dri2_display_is_pixmap_supported(struct native_display *ndpy,
EGLNativePixmapType pix,
const struct native_config *nconf)
dri2_display_get_pixmap_format(struct native_display *ndpy,
EGLNativePixmapType pix,
enum pipe_format *format)
{
struct dri2_display *dri2dpy = dri2_display(ndpy);
uint depth, nconf_depth;
boolean ret = EGL_TRUE;
uint depth;
depth = x11_drawable_get_depth(dri2dpy->xscr, (Drawable) pix);
nconf_depth = util_format_get_blocksizebits(nconf->color_format);
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;
}
/* simple depth match for now */
return (depth == nconf_depth || (depth == 24 && depth + 8 == nconf_depth));
return ret;
}
static int
@@ -909,7 +921,7 @@ x11_create_dri2_display(Display *dpy,
dri2dpy->base.destroy = dri2_display_destroy;
dri2dpy->base.get_param = dri2_display_get_param;
dri2dpy->base.get_configs = dri2_display_get_configs;
dri2dpy->base.is_pixmap_supported = dri2_display_is_pixmap_supported;
dri2dpy->base.get_pixmap_format = dri2_display_get_pixmap_format;
dri2dpy->base.copy_to_pixmap = native_display_copy_to_pixmap;
dri2dpy->base.create_window_surface = dri2_display_create_window_surface;
dri2dpy->base.create_pixmap_surface = dri2_display_create_pixmap_surface;
@@ -437,14 +437,15 @@ ximage_display_get_configs(struct native_display *ndpy, int *num_configs)
}
static boolean
ximage_display_is_pixmap_supported(struct native_display *ndpy,
EGLNativePixmapType pix,
const struct native_config *nconf)
ximage_display_get_pixmap_format(struct native_display *ndpy,
EGLNativePixmapType pix,
enum pipe_format *format)
{
struct ximage_display *xdpy = ximage_display(ndpy);
enum pipe_format fmt = get_pixmap_format(&xdpy->base, pix);
return (fmt == nconf->color_format);
*format = get_pixmap_format(&xdpy->base, pix);
return (*format != PIPE_FORMAT_NONE);
}
static boolean
@@ -580,7 +581,7 @@ x11_create_ximage_display(Display *dpy,
xdpy->base.get_param = ximage_display_get_param;
xdpy->base.get_configs = ximage_display_get_configs;
xdpy->base.is_pixmap_supported = ximage_display_is_pixmap_supported;
xdpy->base.get_pixmap_format = ximage_display_get_pixmap_format;
xdpy->base.copy_to_pixmap = ximage_display_copy_to_pixmap;
xdpy->base.create_window_surface = ximage_display_create_window_surface;
xdpy->base.create_pixmap_surface = ximage_display_create_pixmap_surface;