From 994a9ff7f58161bf5651f83d810eb77b7718ab00 Mon Sep 17 00:00:00 2001 From: Zhigang Gong Date: Wed, 18 Jan 2012 17:07:25 +0800 Subject: glamor_create_picture: Fix the format matching method. We should not simply set a TEXTURE_DRM pixmap to a separated texture pixmap. If the format is compatible with current fbo then it is just fine to keep it as TEXTURE_DRM type and we can safely fallback to DDX layer on it. Signed-off-by: Zhigang Gong --- glamor/glamor_picture.c | 22 ++++++++++++++-------- glamor/glamor_utils.h | 19 ++++++++++++++++--- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/glamor/glamor_picture.c b/glamor/glamor_picture.c index a9e3c267d..6904dab20 100644 --- a/glamor/glamor_picture.c +++ b/glamor/glamor_picture.c @@ -65,15 +65,21 @@ glamor_create_picture(PicturePtr picture) * the uploading, we need to know the picture format. */ glamor_set_pixmap_type(pixmap, GLAMOR_MEMORY); pixmap_priv = glamor_get_pixmap_private(pixmap); + } else { + if (GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) { + /* If the picture format is not compatible with glamor fbo format, + * we have to mark this pixmap as a separated texture, and don't + * fallback to DDX layer. */ + if (pixmap_priv->type == GLAMOR_TEXTURE_DRM + && !glamor_pict_format_is_compatible(picture->format, + pixmap->drawable.depth)) + glamor_set_pixmap_type(pixmap, GLAMOR_SEPARATE_TEXTURE); + } } - - if (pixmap_priv) { - pixmap_priv->is_picture = 1; - pixmap_priv->pict_format = picture->format; - /* XXX Some formats are compatible between glamor and ddx driver*/ - if (pixmap_priv->type == GLAMOR_TEXTURE_DRM) - glamor_set_pixmap_type(pixmap, GLAMOR_SEPARATE_TEXTURE); - } + + pixmap_priv->is_picture = 1; + pixmap_priv->pict_format = picture->format; + return miCreatePicture(picture); } diff --git a/glamor/glamor_utils.h b/glamor/glamor_utils.h index 49c7e1de6..491a1ca2e 100644 --- a/glamor/glamor_utils.h +++ b/glamor/glamor_utils.h @@ -232,18 +232,16 @@ gl_iformat_for_depth(int depth, GLenum * format) case 8: *format = GL_ALPHA; break; -#endif case 24: *format = GL_RGB; break; +#endif default: *format = GL_RGBA; break; } } - - static inline CARD32 format_for_pixmap(PixmapPtr pixmap) { @@ -561,6 +559,21 @@ glamor_get_rgba_from_pixel(CARD32 pixel, return TRUE; } +inline static Bool glamor_pict_format_is_compatible(PictFormatShort pict_format, int depth) +{ + GLenum iformat; + + gl_iformat_for_depth(depth, &iformat); + switch (iformat) { + case GL_RGBA: + return (pict_format == PICT_a8r8g8b8 || pict_format == PICT_x8r8g8b8); + case GL_ALPHA: + return (pict_format == PICT_a8); + default: + return FALSE; + } +} + /* return TRUE if we can access this pixmap at DDX driver. */ inline static Bool glamor_ddx_fallback_check_pixmap(DrawablePtr drawable) { -- cgit v1.2.3