[PATCH] radeon: fallback to software when we get picture bigger than pixmap

j.glisse at gmail.com j.glisse at gmail.com
Wed Nov 14 10:09:08 PST 2012


From: Jerome Glisse <jglisse at redhat.com>

This is some kind off degenerate case that we might get from time to
time, just fallback to software when facing it.

Signed-off-by: Jerome Glisse <jglisse at redhat.com>
---
 src/evergreen_exa.c     |  4 ++++
 src/r600_exa.c          |  4 ++++
 src/radeon_exa_render.c | 13 +++++++++++++
 3 files changed, 21 insertions(+)

diff --git a/src/evergreen_exa.c b/src/evergreen_exa.c
index 883fa5c..405acf0 100644
--- a/src/evergreen_exa.c
+++ b/src/evergreen_exa.c
@@ -837,6 +837,10 @@ static Bool EVERGREENTextureSetup(PicturePtr pPict, PixmapPtr pPix,
     CLEAR (tex_res);
     CLEAR (tex_samp);
 
+    if (pPict->pDrawable->width > pPix->drawable.width || pPict->pDrawable->height > pPix->drawable.height) {
+        /* just let software fallback handle this degenerate case */
+        return FALSE;
+    }
     for (i = 0; i < sizeof(EVERGREENTexFormats) / sizeof(EVERGREENTexFormats[0]); i++) {
 	if (EVERGREENTexFormats[i].fmt == pPict->format)
 	    break;
diff --git a/src/r600_exa.c b/src/r600_exa.c
index 21df084..e051b19 100644
--- a/src/r600_exa.c
+++ b/src/r600_exa.c
@@ -854,6 +854,10 @@ static Bool R600TextureSetup(PicturePtr pPict, PixmapPtr pPix,
     CLEAR (tex_res);
     CLEAR (tex_samp);
 
+    if (pPict->pDrawable->width > pPix->drawable.width || pPict->pDrawable->height > pPix->drawable.height) {
+        /* just let software fallback handle this degenerate case */
+        return FALSE;
+    }
     for (i = 0; i < sizeof(R600TexFormats) / sizeof(R600TexFormats[0]); i++) {
 	if (R600TexFormats[i].fmt == pPict->format)
 	    break;
diff --git a/src/radeon_exa_render.c b/src/radeon_exa_render.c
index c673f2c..8486676 100644
--- a/src/radeon_exa_render.c
+++ b/src/radeon_exa_render.c
@@ -359,6 +359,11 @@ static Bool R100TextureSetup(PicturePtr pPict, PixmapPtr pPix,
     int i, w, h;
     struct radeon_exa_pixmap_priv *driver_priv;
 
+    if (pPict->pDrawable->width > pPix->drawable.width || pPict->pDrawable->height > pPix->drawable.height) {
+        /* just let software fallback handle this degenerate case */
+        return FALSE;
+    }
+
     if (pPict->pDrawable) {
 	w = pPict->pDrawable->width;
 	h = pPict->pDrawable->height;
@@ -756,6 +761,10 @@ static Bool R200TextureSetup(PicturePtr pPict, PixmapPtr pPix,
     int i, w, h;
     struct radeon_exa_pixmap_priv *driver_priv;
 
+    if (pPict->pDrawable->width > pPix->drawable.width || pPict->pDrawable->height > pPix->drawable.height) {
+        /* just let software fallback handle this degenerate case */
+        return FALSE;
+    }
     if (pPict->pDrawable) {
 	w = pPict->pDrawable->width;
 	h = pPict->pDrawable->height;
@@ -1140,6 +1149,10 @@ static Bool R300TextureSetup(PicturePtr pPict, PixmapPtr pPix,
 
     TRACE;
 
+    if (pPict->pDrawable->width > pPix->drawable.width || pPict->pDrawable->height > pPix->drawable.height) {
+        /* just let software fallback handle this degenerate case */
+        return FALSE;
+    }
     if (pPict->pDrawable) {
 	w = pPict->pDrawable->width;
 	h = pPict->pDrawable->height;
-- 
1.8.0



More information about the xorg-driver-ati mailing list