[PATCH] radeon: fallback to software when we get picture bigger than pixmap v2
j.glisse at gmail.com
j.glisse at gmail.com
Wed Nov 14 13:26:28 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.
v2: Handle the other degenerate case of NULL drawable
Signed-off-by: Jerome Glisse <jglisse at redhat.com>
---
src/evergreen_exa.c | 14 +++++++++-----
src/r600_exa.c | 14 +++++++++-----
src/radeon_exa_render.c | 12 ++++++++++++
3 files changed, 30 insertions(+), 10 deletions(-)
diff --git a/src/evergreen_exa.c b/src/evergreen_exa.c
index 883fa5c..9f79da8 100644
--- a/src/evergreen_exa.c
+++ b/src/evergreen_exa.c
@@ -837,13 +837,12 @@ static Bool EVERGREENTextureSetup(PicturePtr pPict, PixmapPtr pPix,
CLEAR (tex_res);
CLEAR (tex_samp);
- for (i = 0; i < sizeof(EVERGREENTexFormats) / sizeof(EVERGREENTexFormats[0]); i++) {
- if (EVERGREENTexFormats[i].fmt == pPict->format)
- break;
- }
-
/* Texture */
if (pPict->pDrawable) {
+ if (pPict->pDrawable->width > pPix->drawable.width || pPict->pDrawable->height > pPix->drawable.height) {
+ /* just let software fallback handle this degenerate case */
+ return FALSE;
+ }
tex_res.w = pPict->pDrawable->width;
tex_res.h = pPict->pDrawable->height;
repeatType = pPict->repeat ? pPict->repeatType : RepeatNone;
@@ -853,6 +852,11 @@ static Bool EVERGREENTextureSetup(PicturePtr pPict, PixmapPtr pPix,
repeatType = RepeatNormal;
}
+ for (i = 0; i < sizeof(EVERGREENTexFormats) / sizeof(EVERGREENTexFormats[0]); i++) {
+ if (EVERGREENTexFormats[i].fmt == pPict->format)
+ break;
+ }
+
tex_res.id = unit;
tex_res.pitch = accel_state->src_obj[unit].pitch;
tex_res.depth = 0;
diff --git a/src/r600_exa.c b/src/r600_exa.c
index 21df084..fa56ec5 100644
--- a/src/r600_exa.c
+++ b/src/r600_exa.c
@@ -854,13 +854,12 @@ static Bool R600TextureSetup(PicturePtr pPict, PixmapPtr pPix,
CLEAR (tex_res);
CLEAR (tex_samp);
- for (i = 0; i < sizeof(R600TexFormats) / sizeof(R600TexFormats[0]); i++) {
- if (R600TexFormats[i].fmt == pPict->format)
- break;
- }
-
/* Texture */
if (pPict->pDrawable) {
+ if (pPict->pDrawable->width > pPix->drawable.width || pPict->pDrawable->height > pPix->drawable.height) {
+ /* just let software fallback handle this degenerate case */
+ return FALSE;
+ }
tex_res.w = pPict->pDrawable->width;
tex_res.h = pPict->pDrawable->height;
repeatType = pPict->repeat ? pPict->repeatType : RepeatNone;
@@ -869,6 +868,11 @@ static Bool R600TextureSetup(PicturePtr pPict, PixmapPtr pPix,
tex_res.h = 1;
repeatType = RepeatNormal;
}
+ for (i = 0; i < sizeof(R600TexFormats) / sizeof(R600TexFormats[0]); i++) {
+ if (R600TexFormats[i].fmt == pPict->format)
+ break;
+ }
+
tex_res.id = unit;
tex_res.pitch = accel_state->src_obj[unit].pitch;
tex_res.depth = 0;
diff --git a/src/radeon_exa_render.c b/src/radeon_exa_render.c
index c673f2c..df754b7 100644
--- a/src/radeon_exa_render.c
+++ b/src/radeon_exa_render.c
@@ -360,6 +360,10 @@ static Bool R100TextureSetup(PicturePtr pPict, PixmapPtr pPix,
struct radeon_exa_pixmap_priv *driver_priv;
if (pPict->pDrawable) {
+ if (pPict->pDrawable->width > pPix->drawable.width || pPict->pDrawable->height > pPix->drawable.height) {
+ /* just let software fallback handle this degenerate case */
+ return FALSE;
+ }
w = pPict->pDrawable->width;
h = pPict->pDrawable->height;
repeatType = pPict->repeat ? pPict->repeatType : RepeatNone;
@@ -757,6 +761,10 @@ static Bool R200TextureSetup(PicturePtr pPict, PixmapPtr pPix,
struct radeon_exa_pixmap_priv *driver_priv;
if (pPict->pDrawable) {
+ if (pPict->pDrawable->width > pPix->drawable.width || pPict->pDrawable->height > pPix->drawable.height) {
+ /* just let software fallback handle this degenerate case */
+ return FALSE;
+ }
w = pPict->pDrawable->width;
h = pPict->pDrawable->height;
repeatType = pPict->repeat ? pPict->repeatType : RepeatNone;
@@ -1141,6 +1149,10 @@ static Bool R300TextureSetup(PicturePtr pPict, PixmapPtr pPix,
TRACE;
if (pPict->pDrawable) {
+ if (pPict->pDrawable->width > pPix->drawable.width || pPict->pDrawable->height > pPix->drawable.height) {
+ /* just let software fallback handle this degenerate case */
+ return FALSE;
+ }
w = pPict->pDrawable->width;
h = pPict->pDrawable->height;
repeatType = pPict->repeat ? pPict->repeatType : RepeatNone;
--
1.7.1
More information about the xorg-driver-ati
mailing list