diff options
author | Alex Deucher <alexdeucher@gmail.com> | 2010-04-16 18:42:56 -0400 |
---|---|---|
committer | Alex Deucher <alexdeucher@gmail.com> | 2010-04-16 20:51:04 -0400 |
commit | 5ee320a6b1b4c65fe592c8ac4d1981799242d59e (patch) | |
tree | 6b7eda139c2fb891f45d6f024cf8c79d9b6562f2 /src | |
parent | 47af3f4f266232517486238917d82fc5ca9c82e6 (diff) |
r3xx texvid: deal with large numbers of verts
should fix fdo bug 25884
Diffstat (limited to 'src')
-rw-r--r-- | src/radeon_textured_videofuncs.c | 51 |
1 files changed, 30 insertions, 21 deletions
diff --git a/src/radeon_textured_videofuncs.c b/src/radeon_textured_videofuncs.c index 2027f453..701abf86 100644 --- a/src/radeon_textured_videofuncs.c +++ b/src/radeon_textured_videofuncs.c @@ -2431,6 +2431,23 @@ FUNC_NAME(R300PrepareTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) OUT_ACCEL_REG(R300_VAP_VTX_SIZE, pPriv->vtx_count); FINISH_ACCEL(); + if (pPriv->vsync) { + xf86CrtcPtr crtc; + if (pPriv->desired_crtc) + crtc = pPriv->desired_crtc; + else + crtc = radeon_pick_best_crtc(pScrn, + pPriv->drw_x, + pPriv->drw_x + pPriv->dst_w, + pPriv->drw_y, + pPriv->drw_y + pPriv->dst_h); + if (crtc) + FUNC_NAME(RADEONWaitForVLine)(pScrn, pPixmap, + crtc, + pPriv->drw_y - crtc->y, + (pPriv->drw_y - crtc->y) + pPriv->dst_h); + } + return TRUE; } @@ -2455,22 +2472,6 @@ FUNC_NAME(R300DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) if (!FUNC_NAME(R300PrepareTexturedVideo)(pScrn, pPriv)) return; - if (pPriv->vsync) { - xf86CrtcPtr crtc; - if (pPriv->desired_crtc) - crtc = pPriv->desired_crtc; - else - crtc = radeon_pick_best_crtc(pScrn, - pPriv->drw_x, - pPriv->drw_x + pPriv->dst_w, - pPriv->drw_y, - pPriv->drw_y + pPriv->dst_h); - if (crtc) - FUNC_NAME(RADEONWaitForVLine)(pScrn, pPixmap, - crtc, - pPriv->drw_y - crtc->y, - (pPriv->drw_y - crtc->y) + pPriv->dst_h); - } /* * Rendering of the actual polygon is done in two different * ways depending on chip generation: @@ -2495,6 +2496,19 @@ FUNC_NAME(R300DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) int srcX, srcY, srcw, srch; int dstX, dstY, dstw, dsth; Bool use_quad = FALSE; +#ifdef ACCEL_CP + int draw_size = 4 * pPriv->vtx_count + 4 + 2 + 3; + + if (draw_size > radeon_cs_space_remaining(pScrn)) { + if (info->cs) + radeon_cs_flush_indirect(pScrn); + else + RADEONCPFlushIndirect(pScrn, 1); + if (!FUNC_NAME(R300PrepareTexturedVideo)(pScrn, pPriv)) + return; + } +#endif + dstX = pBox->x1 + dstxoff; dstY = pBox->y1 + dstyoff; dstw = pBox->x2 - pBox->x1; @@ -2510,11 +2524,6 @@ FUNC_NAME(R300DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) srcw = (pPriv->src_w * dstw) / pPriv->dst_w; srch = (pPriv->src_h * dsth) / pPriv->dst_h; -#if 0 - ErrorF("dst: %d, %d, %d, %d\n", dstX, dstY, dstw, dsth); - ErrorF("src: %d, %d, %d, %d\n", srcX, srcY, srcw, srch); -#endif - if (IS_R400_3D) { if ((dstw+dsth) > 4021) use_quad = TRUE; |