summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlia Mirkin <imirkin@alum.mit.edu>2015-05-19 16:11:17 -0400
committerIlia Mirkin <imirkin@alum.mit.edu>2015-05-20 18:35:26 -0400
commit7583471e1fe181dc7c26b7d0a0d16f70eb10dd21 (patch)
tree22dd7a4e4672416c10942a0d679fdec9bf0e8427
parent212fc5354ed60ba282d5eabf468c0e2dd0d0afe6 (diff)
Check before trying a solid fill
Pre-nv50 has all sorts of funny requirements for non-copy alu operations, and will bail out of solid fills left and right. Account for that case and fall back to the memset. Reported-by: Andrew Randrianasulu <randrianasulu@gmail.com> Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu> Reviewed-by: Martin Peres <martin.peres@free.fr>
-rw-r--r--src/drmmode_display.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 7c1d2bb..2ca1dba 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -410,12 +410,15 @@ drmmode_fbcon_copy(ScreenPtr pScreen)
fallback:
if (pdpix) {
- pNv->EXADriverPtr->PrepareSolid(pdpix, GXclear, ~0, 0);
- pNv->EXADriverPtr->Solid(pdpix, 0, 0, w, h);
- pNv->EXADriverPtr->DoneSolid(pdpix);
- nouveau_bo_wait(pNv->scanout, NOUVEAU_BO_RDWR, pNv->client);
+ if (exa->PrepareSolid(pdpix, GXclear, ~0, 0)) {
+ exa->Solid(pdpix, 0, 0, w, h);
+ exa->DoneSolid(pdpix);
+ PUSH_KICK(pNv->pushbuf);
+ nouveau_bo_wait(pNv->scanout, NOUVEAU_BO_RDWR, pNv->client);
+ pScreen->DestroyPixmap(pdpix);
+ return;
+ }
pScreen->DestroyPixmap(pdpix);
- return;
}
#endif
if (nouveau_bo_map(pNv->scanout, NOUVEAU_BO_WR, pNv->client))