diff options
author | Ben Skeggs <skeggsb@beleth.(none)> | 2009-11-04 16:31:56 +1000 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2009-11-04 18:00:02 +1000 |
commit | a97501a4e64d690be4232b01f9a3663fc2338c8a (patch) | |
tree | 243cbd62744f462323a13bd7ccf24b9e9748f2ad /src/nv30_exa.c | |
parent | 222d13a03b41eb610a05063f81f0c47f57e6098e (diff) | |
download | xorg-driver-xf86-video-nouveau-a97501a4e64d690be4232b01f9a3663fc2338c8a.tar.gz |
exa/nv30: handle reloc failures
Diffstat (limited to 'src/nv30_exa.c')
-rw-r--r-- | src/nv30_exa.c | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/src/nv30_exa.c b/src/nv30_exa.c index 67a8720..4c25ebc 100644 --- a/src/nv30_exa.c +++ b/src/nv30_exa.c @@ -322,7 +322,8 @@ NV30EXATexture(ScrnInfoPtr pScrn, PixmapPtr pPix, PicturePtr pPict, int unit) card_filter = 1; BEGIN_RING(chan, rankine, NV34TCL_TX_OFFSET(unit), 8); - OUT_RELOCl(chan, bo, delta, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD); + if (OUT_RELOCl(chan, bo, delta, NOUVEAU_BO_VRAM | NOUVEAU_BO_RD)) + return FALSE; OUT_RING (chan, NV34TCL_TX_FORMAT_DIMS_2D | (fmt->card_fmt << NV34TCL_TX_FORMAT_FORMAT_SHIFT) | @@ -373,7 +374,8 @@ NV30_SetupSurface(ScrnInfoPtr pScrn, PixmapPtr pPix, PicturePtr pPict) BEGIN_RING(chan, rankine, NV34TCL_RT_FORMAT, 3); OUT_RING (chan, fmt->card_fmt); /* format */ OUT_RING (chan, pitch << 16 | pitch); - OUT_RELOCl(chan, bo, delta, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR); + if (OUT_RELOCl(chan, bo, delta, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR)) + return FALSE; return TRUE; } @@ -476,7 +478,8 @@ NV30EXAPrepareComposite(int op, PicturePtr psPict, int fpid = NV30EXA_FPID_PASS_COL0; NV30EXA_STATE; - WAIT_RING(chan, 128); + if (MARK_RING(chan, 128, 1 + 1 + 2)) + return FALSE; blend = NV30_GetPictOpRec(op); @@ -484,8 +487,11 @@ NV30EXAPrepareComposite(int op, PicturePtr psPict, (pmPict && pmPict->componentAlpha && PICT_FORMAT_RGB(pmPict->format))); - NV30_SetupSurface(pScrn, pdPix, pdPict); - NV30EXATexture(pScrn, psPix, psPict, 0); + if (!NV30_SetupSurface(pScrn, pdPix, pdPict) || + !NV30EXATexture(pScrn, psPix, psPict, 0)) { + MARK_UNDO(chan); + return FALSE; + } #if 0 #define printformat(f) ErrorF("(%xh %s %dbpp A%dR%dG%dB%d)",f,(f>>16)&0xf==2?"ARGB":"ABGR",(f>>24),(f&0xf000)>>12,(f&0xf00)>>8,(f&0xf0)>>4,f&0xf) @@ -502,7 +508,10 @@ NV30EXAPrepareComposite(int op, PicturePtr psPict, #endif if (pmPict) { - NV30EXATexture(pScrn, pmPix, pmPict, 1); + if (!NV30EXATexture(pScrn, pmPix, pmPict, 1)) { + MARK_UNDO(chan); + return FALSE; + } if (pmPict->componentAlpha && PICT_FORMAT_RGB(pmPict->format)) { if (blend->src_alpha) @@ -520,10 +529,11 @@ NV30EXAPrepareComposite(int op, PicturePtr psPict, state->have_mask = FALSE; } - if (pdPict->format == PICT_a8) - NV30_LoadFragProg(pScrn, nv40_fp_map_a8[fpid]); - else - NV30_LoadFragProg(pScrn, nv40_fp_map[fpid]); + if (!NV30_LoadFragProg(pScrn, (pdPict->format == PICT_a8) ? + nv40_fp_map_a8[fpid] : nv40_fp_map[fpid])) { + MARK_UNDO(chan); + return FALSE; + } BEGIN_RING(chan, rankine, 0x23c, 1); OUT_RING (chan, pmPict?3:1); |