[Glamor] [PATCH 02/15] glamor_create_picture: Fix the format matching method.
zhigang.gong at linux.intel.com
zhigang.gong at linux.intel.com
Fri Jan 20 00:52:00 PST 2012
From: Zhigang Gong <zhigang.gong at linux.intel.com>
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 <zhigang.gong at linux.intel.com>
---
src/glamor_picture.c | 22 ++++++++++++++--------
src/glamor_utils.h | 19 ++++++++++++++++---
2 files changed, 30 insertions(+), 11 deletions(-)
diff --git a/src/glamor_picture.c b/src/glamor_picture.c
index c071608..e013ed2 100644
--- a/src/glamor_picture.c
+++ b/src/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/src/glamor_utils.h b/src/glamor_utils.h
index 49c7e1d..491a1ca 100644
--- a/src/glamor_utils.h
+++ b/src/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)
{
--
1.7.4.4
More information about the Glamor
mailing list