diff options
author | Dave Airlie <airlied@redhat.com> | 2009-07-02 15:17:13 +1000 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2009-07-02 15:17:13 +1000 |
commit | 851b2b8cab883e4422745cca1827aa8ac9f193a3 (patch) | |
tree | 15fc08b54a09c146d2105002108462dfe2778107 | |
parent | 9d092060236e8587697fdd57a7a01f3c0dddd680 (diff) |
radeon/kms: add textured video BO size checks
-rw-r--r-- | src/radeon_textured_video.c | 8 | ||||
-rw-r--r-- | src/radeon_textured_videofuncs.c | 114 |
2 files changed, 101 insertions, 21 deletions
diff --git a/src/radeon_textured_video.c b/src/radeon_textured_video.c index 10414b91..184258c9 100644 --- a/src/radeon_textured_video.c +++ b/src/radeon_textured_video.c @@ -137,6 +137,14 @@ static REF_TRANSFORM trans[2] = {1.1643, 0.0, 1.7927, -0.2132, -0.5329, 2.1124, 0.0} /* BT.709 */ }; +static inline void radeon_add_bo(struct radeon_cs_space_check *bos, int index, struct radeon_bo *bo, int read_domains, int write_domain) +{ + bos[index].bo = bo; + bos[index].read_domains = read_domains; + bos[index].write_domain = write_domain; + bos[index].new_accounted = 0; +} + #define ACCEL_MMIO #define ACCEL_PREAMBLE() unsigned char *RADEONMMIO = info->MMIO #define BEGIN_ACCEL(n) RADEONWaitForFifo(pScrn, (n)) diff --git a/src/radeon_textured_videofuncs.c b/src/radeon_textured_videofuncs.c index b9930c7a..2efe449a 100644 --- a/src/radeon_textured_videofuncs.c +++ b/src/radeon_textured_videofuncs.c @@ -106,39 +106,25 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv retry: if (info->cs) { - i = 0; - bos[i].bo = pPriv->src_bo; - bos[i].read_domains = RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM; - bos[i].write_domain = 0; - bos[i].new_accounted = 0; - i++; + radeon_add_bo(bos, i++, pPriv->src_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); - if (pPriv->bicubic_enabled) { - bos[i].bo = pPriv->bicubic_bo; - bos[i].read_domains = RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM; - bos[i].write_domain = 0; - bos[i].new_accounted = 0; - i++; - } + if (pPriv->bicubic_enabled) + radeon_add_bo(bos, i++, pPriv->bicubic_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); driver_priv = exaGetPixmapDriverPrivate(pPixmap); - bos[i].bo = driver_priv->bo; - bos[i].read_domains = 0; - bos[i].write_domain = RADEON_GEM_DOMAIN_VRAM; - bos[i].new_accounted = 0; - i++; + radeon_add_bo(bos, i++, driver_priv->bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); ret = radeon_cs_space_check(info->cs, bos, i); if (ret == RADEON_CS_SPACE_OP_TO_BIG) { - ErrorF("Not enough RAM to hw accel composite operation\n"); + ErrorF("Not enough RAM to hw accel xv operation\n"); return; } if (ret == RADEON_CS_SPACE_FLUSH) { radeon_cs_flush_indirect(pScrn); retry_count++; if (retry_count == 2) { - ErrorF("Not enough RAM to hw accel composite operation\n"); + ErrorF("Not enough RAM to hw accel xv operation\n"); return; } goto retry; @@ -511,9 +497,37 @@ FUNC_NAME(R200DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) int ref = pPriv->transform_index; float ucscale = 0.25, vcscale = 0.25; Bool needux8 = FALSE, needvx8 = FALSE; - + struct radeon_cs_space_check bos[3]; + int i, ret, retry_count = 0; ACCEL_PREAMBLE(); + retry: + if (info->cs) { + i = 0; + radeon_add_bo(bos, i++, pPriv->src_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); + + if (pPriv->bicubic_enabled) + radeon_add_bo(bos, i++, pPriv->bicubic_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); + + driver_priv = exaGetPixmapDriverPrivate(pPixmap); + radeon_add_bo(bos, i++, driver_priv->bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); + + ret = radeon_cs_space_check(info->cs, bos, i); + if (ret == RADEON_CS_SPACE_OP_TO_BIG) { + ErrorF("Not enough RAM to hw accel xv operation\n"); + return; + } + if (ret == RADEON_CS_SPACE_FLUSH) { + radeon_cs_flush_indirect(pScrn); + retry_count++; + if (retry_count == 2) { + ErrorF("Not enough RAM to hw accel xv operation\n"); + return; + } + goto retry; + } + } + pixel_shift = pPixmap->drawable.bitsPerPixel >> 4; #ifdef USE_EXA @@ -1033,8 +1047,37 @@ FUNC_NAME(R300DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) int dstxoff, dstyoff, pixel_shift, vtx_count; BoxPtr pBox = REGION_RECTS(&pPriv->clip); int nBox = REGION_NUM_RECTS(&pPriv->clip); + struct radeon_cs_space_check bos[3]; + int i, ret, retry_count = 0; ACCEL_PREAMBLE(); + retry: + if (info->cs) { + i = 0; + radeon_add_bo(bos, i++, pPriv->src_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); + + if (pPriv->bicubic_enabled) + radeon_add_bo(bos, i++, pPriv->bicubic_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); + + driver_priv = exaGetPixmapDriverPrivate(pPixmap); + radeon_add_bo(bos, i++, driver_priv->bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); + + ret = radeon_cs_space_check(info->cs, bos, i); + if (ret == RADEON_CS_SPACE_OP_TO_BIG) { + ErrorF("Not enough RAM to hw accel xv operation\n"); + return; + } + if (ret == RADEON_CS_SPACE_FLUSH) { + radeon_cs_flush_indirect(pScrn); + retry_count++; + if (retry_count == 2) { + ErrorF("Not enough RAM to hw accel xv operation\n"); + return; + } + goto retry; + } + } + pixel_shift = pPixmap->drawable.bitsPerPixel >> 4; #ifdef USE_EXA @@ -2463,8 +2506,37 @@ FUNC_NAME(R500DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) int dstxoff, dstyoff, pixel_shift, vtx_count; BoxPtr pBox = REGION_RECTS(&pPriv->clip); int nBox = REGION_NUM_RECTS(&pPriv->clip); + struct radeon_cs_space_check bos[3]; + int i, ret, retry_count = 0; ACCEL_PREAMBLE(); + retry: + if (info->cs) { + i = 0; + radeon_add_bo(bos, i++, pPriv->src_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); + + if (pPriv->bicubic_enabled) + radeon_add_bo(bos, i++, pPriv->bicubic_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); + + driver_priv = exaGetPixmapDriverPrivate(pPixmap); + radeon_add_bo(bos, i++, driver_priv->bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); + + ret = radeon_cs_space_check(info->cs, bos, i); + if (ret == RADEON_CS_SPACE_OP_TO_BIG) { + ErrorF("Not enough RAM to hw accel xv operation\n"); + return; + } + if (ret == RADEON_CS_SPACE_FLUSH) { + radeon_cs_flush_indirect(pScrn); + retry_count++; + if (retry_count == 2) { + ErrorF("Not enough RAM to hw accel xv operation\n"); + return; + } + goto retry; + } + } + pixel_shift = pPixmap->drawable.bitsPerPixel >> 4; #ifdef USE_EXA |