[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