xf86-video-ati: Branch 'master' - 9 commits
Alex Deucher
agd5f at kemper.freedesktop.org
Fri Apr 16 17:53:27 PDT 2010
src/radeon.h | 1
src/radeon_accel.c | 12
src/radeon_textured_videofuncs.c | 504 +++++++++++++++++++++++++++------------
src/radeon_video.h | 2
4 files changed, 364 insertions(+), 155 deletions(-)
New commits:
commit 6c07816025f70e522986614c29c300ea13e5d932
Author: Alex Deucher <alexdeucher at gmail.com>
Date: Fri Apr 16 18:50:17 2010 -0400
r5xx texvid: deal with large numbers of verts
should fix fdo bug 25884
diff --git a/src/radeon_textured_videofuncs.c b/src/radeon_textured_videofuncs.c
index 701abf8..138dfa3 100644
--- a/src/radeon_textured_videofuncs.c
+++ b/src/radeon_textured_videofuncs.c
@@ -4039,6 +4039,23 @@ FUNC_NAME(R500PrepareTexturedVideo)(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;
}
@@ -4063,22 +4080,6 @@ FUNC_NAME(R500DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
if (!FUNC_NAME(R500PrepareTexturedVideo)(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:
@@ -4102,6 +4103,19 @@ FUNC_NAME(R500DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
while (nBox--) {
int srcX, srcY, srcw, srch;
int dstX, dstY, dstw, dsth;
+#ifdef ACCEL_CP
+ int draw_size = 3 * 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(R500PrepareTexturedVideo)(pScrn, pPriv))
+ return;
+ }
+#endif
+
dstX = pBox->x1 + dstxoff;
dstY = pBox->y1 + dstyoff;
dstw = pBox->x2 - pBox->x1;
commit 5ee320a6b1b4c65fe592c8ac4d1981799242d59e
Author: Alex Deucher <alexdeucher at gmail.com>
Date: Fri Apr 16 18:42:56 2010 -0400
r3xx texvid: deal with large numbers of verts
should fix fdo bug 25884
diff --git a/src/radeon_textured_videofuncs.c b/src/radeon_textured_videofuncs.c
index 2027f45..701abf8 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;
commit 47af3f4f266232517486238917d82fc5ca9c82e6
Author: Alex Deucher <alexdeucher at gmail.com>
Date: Fri Apr 16 20:50:18 2010 -0400
r2xx texvid: deal with large numbers of verts
should fix fdo bug 25884
diff --git a/src/radeon_textured_videofuncs.c b/src/radeon_textured_videofuncs.c
index 270d0dc..2027f45 100644
--- a/src/radeon_textured_videofuncs.c
+++ b/src/radeon_textured_videofuncs.c
@@ -981,6 +981,23 @@ FUNC_NAME(R200PrepareTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
(scissor_h << RADEON_RE_HEIGHT_SHIFT)));
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;
}
@@ -1005,22 +1022,6 @@ FUNC_NAME(R200DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
if (!FUNC_NAME(R200PrepareTexturedVideo)(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:
@@ -1042,20 +1043,82 @@ FUNC_NAME(R200DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
*/
#ifdef ACCEL_CP
- BEGIN_RING(nBox * 3 * pPriv->vtx_count + 4);
+ while (nBox) {
+ int draw_size = 3 * pPriv->vtx_count + 4;
+ int loop_boxes;
+
+ if (draw_size > radeon_cs_space_remaining(pScrn)) {
+ if (info->cs)
+ radeon_cs_flush_indirect(pScrn);
+ else
+ RADEONCPFlushIndirect(pScrn, 1);
+ if (!FUNC_NAME(R200PrepareTexturedVideo)(pScrn, pPriv))
+ return;
+ }
+ loop_boxes = MIN(radeon_cs_space_remaining(pScrn) / draw_size, nBox);
+ nBox -= loop_boxes;
+
+ BEGIN_RING(loop_boxes * 3 * pPriv->vtx_count + 4);
OUT_RING(CP_PACKET3(R200_CP_PACKET3_3D_DRAW_IMMD_2,
- nBox * 3 * pPriv->vtx_count));
+ loop_boxes * 3 * pPriv->vtx_count));
OUT_RING(RADEON_CP_VC_CNTL_PRIM_TYPE_RECT_LIST |
RADEON_CP_VC_CNTL_PRIM_WALK_RING |
- ((nBox * 3) << RADEON_CP_VC_CNTL_NUM_SHIFT));
-#else /* ACCEL_CP */
- BEGIN_ACCEL(nBox * 3 * pPriv->vtx_count + 2);
- OUT_ACCEL_REG(RADEON_SE_VF_CNTL, (RADEON_VF_PRIM_TYPE_RECTANGLE_LIST |
- RADEON_VF_PRIM_WALK_DATA |
- ((nBox * 3) << RADEON_VF_NUM_VERTICES_SHIFT)));
+ ((loop_boxes * 3) << RADEON_CP_VC_CNTL_NUM_SHIFT));
-#endif
+ while (loop_boxes--) {
+ int srcX, srcY, srcw, srch;
+ int dstX, dstY, dstw, dsth;
+ dstX = pBox->x1 + dstxoff;
+ dstY = pBox->y1 + dstyoff;
+ dstw = pBox->x2 - pBox->x1;
+ dsth = pBox->y2 - pBox->y1;
+
+ srcX = pPriv->src_x;
+ srcX += ((pBox->x1 - pPriv->drw_x) *
+ pPriv->src_w) / pPriv->dst_w;
+ srcY = pPriv->src_y;
+ srcY += ((pBox->y1 - pPriv->drw_y) *
+ pPriv->src_h) / pPriv->dst_h;
+
+ srcw = (pPriv->src_w * dstw) / pPriv->dst_w;
+ srch = (pPriv->src_h * dsth) / pPriv->dst_h;
+
+ if (pPriv->is_planar) {
+ /*
+ * Just render a rect (using three coords).
+ */
+ VTX_OUT_6((float)dstX, (float)(dstY + dsth),
+ (float)srcX / pPriv->w, (float)(srcY + srch) / pPriv->h,
+ (float)srcX / pPriv->w, (float)(srcY + srch) / pPriv->h);
+ VTX_OUT_6((float)(dstX + dstw), (float)(dstY + dsth),
+ (float)(srcX + srcw) / pPriv->w, (float)(srcY + srch) / pPriv->h,
+ (float)(srcX + srcw) / pPriv->w, (float)(srcY + srch) / pPriv->h);
+ VTX_OUT_6((float)(dstX + dstw), (float)dstY,
+ (float)(srcX + srcw) / pPriv->w, (float)srcY / pPriv->h,
+ (float)(srcX + srcw) / pPriv->w, (float)srcY / pPriv->h);
+ } else {
+ /*
+ * Just render a rect (using three coords).
+ */
+ VTX_OUT_4((float)dstX, (float)(dstY + dsth),
+ (float)srcX / pPriv->w, (float)(srcY + srch) / pPriv->h);
+ VTX_OUT_4((float)(dstX + dstw), (float)(dstY + dsth),
+ (float)(srcX + srcw) / pPriv->w, (float)(srcY + srch) / pPriv->h);
+ VTX_OUT_4((float)(dstX + dstw), (float)dstY,
+ (float)(srcX + srcw) / pPriv->w, (float)srcY / pPriv->h);
+ }
+ pBox++;
+ }
+
+ OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN);
+ ADVANCE_RING();
+ }
+#else /* ACCEL_CP */
+ BEGIN_ACCEL(nBox * 3 * pPriv->vtx_count + 2);
+ OUT_ACCEL_REG(RADEON_SE_VF_CNTL, (RADEON_VF_PRIM_TYPE_RECTANGLE_LIST |
+ RADEON_VF_PRIM_WALK_DATA |
+ ((nBox * 3) << RADEON_VF_NUM_VERTICES_SHIFT)));
while (nBox--) {
int srcX, srcY, srcw, srch;
int dstX, dstY, dstw, dsth;
@@ -1103,10 +1166,6 @@ FUNC_NAME(R200DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
}
OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN);
-
-#ifdef ACCEL_CP
- ADVANCE_RING();
-#else
FINISH_ACCEL();
#endif /* !ACCEL_CP */
commit 57577d5cd0641b7cad02242478699bcfece59227
Author: Alex Deucher <alexdeucher at gmail.com>
Date: Fri Apr 16 20:40:56 2010 -0400
r1xx texvid: deal with large numbers of verts
should fix fdo bug 25884
diff --git a/src/radeon.h b/src/radeon.h
index 961c59e..859224c 100644
--- a/src/radeon.h
+++ b/src/radeon.h
@@ -1138,6 +1138,7 @@ extern Bool RADEONSetupMemXAA_DRI(int scrnIndex, ScreenPtr pScreen);
# endif
uint32_t radeonGetPixmapOffset(PixmapPtr pPix);
#endif
+extern int radeon_cs_space_remaining(ScrnInfoPtr pScrn);
#ifdef USE_XAA
/* radeon_accelfuncs.c */
diff --git a/src/radeon_accel.c b/src/radeon_accel.c
index 0250d91..823f91d 100644
--- a/src/radeon_accel.c
+++ b/src/radeon_accel.c
@@ -573,6 +573,18 @@ uint32_t radeonGetPixmapOffset(PixmapPtr pPix)
return offset;
}
+int radeon_cs_space_remaining(ScrnInfoPtr pScrn)
+{
+ RADEONInfoPtr info = RADEONPTR(pScrn);
+
+#ifdef XF86DRM_MODE
+ if (info->cs)
+ return (info->cs->ndw - info->cs->cdw);
+ else
+#endif
+ return (info->cp->indirectBuffer->total - info->cp->indirectBuffer->used) / (int)sizeof(uint32_t);
+}
+
#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 0bf7a10..270d0dc 100644
--- a/src/radeon_textured_videofuncs.c
+++ b/src/radeon_textured_videofuncs.c
@@ -342,6 +342,23 @@ FUNC_NAME(RADEONPrepareTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv
(scissor_h << RADEON_RE_HEIGHT_SHIFT)));
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;
}
@@ -366,22 +383,6 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv
if (!FUNC_NAME(RADEONPrepareTexturedVideo)(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:
@@ -401,11 +402,25 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv
* the single triangle up to 2560/4021 pixels; above that we
* render as a quad.
*/
-
#ifdef ACCEL_CP
- BEGIN_RING(nBox * 3 * pPriv->vtx_count + 5);
+ while (nBox) {
+ int draw_size = 3 * pPriv->vtx_count + 5;
+ int loop_boxes;
+
+ if (draw_size > radeon_cs_space_remaining(pScrn)) {
+ if (info->cs)
+ radeon_cs_flush_indirect(pScrn);
+ else
+ RADEONCPFlushIndirect(pScrn, 1);
+ if (!FUNC_NAME(RADEONPrepareTexturedVideo)(pScrn, pPriv))
+ return;
+ }
+ loop_boxes = MIN(radeon_cs_space_remaining(pScrn) / draw_size, nBox);
+ nBox -= loop_boxes;
+
+ BEGIN_RING(loop_boxes * 3 * pPriv->vtx_count + 5);
OUT_RING(CP_PACKET3(RADEON_CP_PACKET3_3D_DRAW_IMMD,
- nBox * 3 * pPriv->vtx_count + 1));
+ loop_boxes * 3 * pPriv->vtx_count + 1));
if (pPriv->is_planar)
OUT_RING(RADEON_CP_VC_FRMT_XY |
RADEON_CP_VC_FRMT_ST0 |
@@ -417,15 +432,64 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv
RADEON_CP_VC_CNTL_PRIM_WALK_RING |
RADEON_CP_VC_CNTL_MAOS_ENABLE |
RADEON_CP_VC_CNTL_VTX_FMT_RADEON_MODE |
- ((nBox * 3) << RADEON_CP_VC_CNTL_NUM_SHIFT));
-#else /* ACCEL_CP */
- BEGIN_ACCEL(nBox * pPriv->vtx_count * 3 + 2);
- OUT_ACCEL_REG(RADEON_SE_VF_CNTL, (RADEON_VF_PRIM_TYPE_RECTANGLE_LIST |
- RADEON_VF_PRIM_WALK_DATA |
- RADEON_VF_RADEON_MODE |
- ((nBox * 3) << RADEON_VF_NUM_VERTICES_SHIFT)));
-#endif
+ ((loop_boxes * 3) << RADEON_CP_VC_CNTL_NUM_SHIFT));
+
+ while (loop_boxes--) {
+ int srcX, srcY, srcw, srch;
+ int dstX, dstY, dstw, dsth;
+ dstX = pBox->x1 + dstxoff;
+ dstY = pBox->y1 + dstyoff;
+ dstw = pBox->x2 - pBox->x1;
+ dsth = pBox->y2 - pBox->y1;
+
+ srcX = pPriv->src_x;
+ srcX += ((pBox->x1 - pPriv->drw_x) *
+ pPriv->src_w) / pPriv->dst_w;
+ srcY = pPriv->src_y;
+ srcY += ((pBox->y1 - pPriv->drw_y) *
+ pPriv->src_h) / pPriv->dst_h;
+
+ srcw = (pPriv->src_w * dstw) / pPriv->dst_w;
+ srch = (pPriv->src_h * dsth) / pPriv->dst_h;
+
+
+ if (pPriv->is_planar) {
+ /*
+ * Just render a rect (using three coords).
+ */
+ VTX_OUT_6((float)dstX, (float)(dstY + dsth),
+ (float)srcX / pPriv->w, (float)(srcY + srch) / pPriv->h,
+ (float)srcX / pPriv->w, (float)(srcY + srch) / pPriv->h);
+ VTX_OUT_6((float)(dstX + dstw), (float)(dstY + dsth),
+ (float)(srcX + srcw) / pPriv->w, (float)(srcY + srch) / pPriv->h,
+ (float)(srcX + srcw) / pPriv->w, (float)(srcY + srch) / pPriv->h);
+ VTX_OUT_6((float)(dstX + dstw), (float)dstY,
+ (float)(srcX + srcw) / pPriv->w, (float)srcY / pPriv->h,
+ (float)(srcX + srcw) / pPriv->w, (float)srcY / pPriv->h);
+ } else {
+ /*
+ * Just render a rect (using three coords).
+ */
+ VTX_OUT_4((float)dstX, (float)(dstY + dsth),
+ (float)srcX / pPriv->w, (float)(srcY + srch) / pPriv->h);
+ VTX_OUT_4((float)(dstX + dstw), (float)(dstY + dsth),
+ (float)(srcX + srcw) / pPriv->w, (float)(srcY + srch) / pPriv->h);
+ VTX_OUT_4((float)(dstX + dstw), (float)dstY,
+ (float)(srcX + srcw) / pPriv->w, (float)srcY / pPriv->h);
+ }
+
+ pBox++;
+ }
+ OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN);
+ ADVANCE_RING();
+ }
+#else /* ACCEL_CP */
+ BEGIN_ACCEL(nBox * pPriv->vtx_count * 3 + 2);
+ OUT_ACCEL_REG(RADEON_SE_VF_CNTL, (RADEON_VF_PRIM_TYPE_RECTANGLE_LIST |
+ RADEON_VF_PRIM_WALK_DATA |
+ RADEON_VF_RADEON_MODE |
+ ((nBox * 3) << RADEON_VF_NUM_VERTICES_SHIFT)));
while (nBox--) {
int srcX, srcY, srcw, srch;
int dstX, dstY, dstw, dsth;
@@ -474,9 +538,6 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv
}
OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN);
-#ifdef ACCEL_CP
- ADVANCE_RING();
-#else
FINISH_ACCEL();
#endif /* !ACCEL_CP */
commit 31a888e78fa403f2bddacee098a29f36eaa969cb
Author: Alex Deucher <alexdeucher at gmail.com>
Date: Fri Apr 16 15:52:59 2010 -0400
r5xx textured video: split into prepare and draw functions
diff --git a/src/radeon_textured_videofuncs.c b/src/radeon_textured_videofuncs.c
index 36363f7..0bf7a10 100644
--- a/src/radeon_textured_videofuncs.c
+++ b/src/radeon_textured_videofuncs.c
@@ -2525,8 +2525,8 @@ FUNC_NAME(R300DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
DamageDamageRegion(pPriv->pDraw, &pPriv->clip);
}
-static void
-FUNC_NAME(R500DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
+static Bool
+FUNC_NAME(R500PrepareTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
{
RADEONInfoPtr info = RADEONPTR(pScrn);
PixmapPtr pPixmap = pPriv->pPixmap;
@@ -2536,9 +2536,7 @@ FUNC_NAME(R500DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
uint32_t dst_pitch, dst_format;
uint32_t txenable, colorpitch, bicubic_offset;
uint32_t output_fmt;
- int dstxoff, dstyoff, pixel_shift;
- BoxPtr pBox = REGION_RECTS(&pPriv->clip);
- int nBox = REGION_NUM_RECTS(&pPriv->clip);
+ int pixel_shift;
ACCEL_PREAMBLE();
#ifdef XF86DRM_MODE
@@ -2557,7 +2555,7 @@ FUNC_NAME(R500DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
ret = radeon_cs_space_check(info->cs);
if (ret) {
ErrorF("Not enough RAM to hw accel xv operation\n");
- return;
+ return FALSE;
}
}
#endif
@@ -2573,14 +2571,6 @@ FUNC_NAME(R500DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
dst_pitch = pPixmap->devKind;
}
-#ifdef COMPOSITE
- dstxoff = -pPixmap->screen_x + pPixmap->drawable.x;
- dstyoff = -pPixmap->screen_y + pPixmap->drawable.y;
-#else
- dstxoff = 0;
- dstyoff = 0;
-#endif
-
#ifdef USE_EXA
if (info->useEXA) {
RADEON_SWITCH_TO_3D();
@@ -2617,7 +2607,7 @@ FUNC_NAME(R500DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
dst_format = R300_COLORFORMAT_ARGB8888;
break;
default:
- return;
+ return FALSE;
}
output_fmt = (R300_OUT_FMT_C4_8 |
@@ -3920,6 +3910,30 @@ FUNC_NAME(R500DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
OUT_ACCEL_REG(R300_VAP_VTX_SIZE, pPriv->vtx_count);
FINISH_ACCEL();
+ return TRUE;
+}
+
+static void
+FUNC_NAME(R500DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
+{
+ RADEONInfoPtr info = RADEONPTR(pScrn);
+ PixmapPtr pPixmap = pPriv->pPixmap;
+ int dstxoff, dstyoff;
+ BoxPtr pBox = REGION_RECTS(&pPriv->clip);
+ int nBox = REGION_NUM_RECTS(&pPriv->clip);
+ ACCEL_PREAMBLE();
+
+#ifdef COMPOSITE
+ dstxoff = -pPixmap->screen_x + pPixmap->drawable.x;
+ dstyoff = -pPixmap->screen_y + pPixmap->drawable.y;
+#else
+ dstxoff = 0;
+ dstyoff = 0;
+#endif
+
+ if (!FUNC_NAME(R500PrepareTexturedVideo)(pScrn, pPriv))
+ return;
+
if (pPriv->vsync) {
xf86CrtcPtr crtc;
if (pPriv->desired_crtc)
commit f7ebe4a127965bb9e46d20c60331bcc4dab76fc5
Author: Alex Deucher <alexdeucher at gmail.com>
Date: Fri Apr 16 15:46:24 2010 -0400
r3xx textured video: split into prepare and draw functions
diff --git a/src/radeon_textured_videofuncs.c b/src/radeon_textured_videofuncs.c
index ff4c055..36363f7 100644
--- a/src/radeon_textured_videofuncs.c
+++ b/src/radeon_textured_videofuncs.c
@@ -1052,8 +1052,8 @@ FUNC_NAME(R200DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
DamageDamageRegion(pPriv->pDraw, &pPriv->clip);
}
-static void
-FUNC_NAME(R300DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
+static Bool
+FUNC_NAME(R300PrepareTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
{
RADEONInfoPtr info = RADEONPTR(pScrn);
PixmapPtr pPixmap = pPriv->pPixmap;
@@ -1063,9 +1063,7 @@ FUNC_NAME(R300DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
uint32_t dst_pitch, dst_format;
uint32_t txenable, colorpitch, bicubic_offset;
uint32_t output_fmt;
- int dstxoff, dstyoff, pixel_shift;
- BoxPtr pBox = REGION_RECTS(&pPriv->clip);
- int nBox = REGION_NUM_RECTS(&pPriv->clip);
+ int pixel_shift;
ACCEL_PREAMBLE();
#ifdef XF86DRM_MODE
@@ -1084,7 +1082,7 @@ FUNC_NAME(R300DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
ret = radeon_cs_space_check(info->cs);
if (ret) {
ErrorF("Not enough RAM to hw accel xv operation\n");
- return;
+ return FALSE;
}
}
#endif
@@ -1100,14 +1098,6 @@ FUNC_NAME(R300DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
dst_pitch = pPixmap->devKind;
}
-#ifdef COMPOSITE
- dstxoff = -pPixmap->screen_x + pPixmap->drawable.x;
- dstyoff = -pPixmap->screen_y + pPixmap->drawable.y;
-#else
- dstxoff = 0;
- dstyoff = 0;
-#endif
-
#ifdef USE_EXA
if (info->useEXA) {
RADEON_SWITCH_TO_3D();
@@ -1144,7 +1134,7 @@ FUNC_NAME(R300DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
dst_format = R300_COLORFORMAT_ARGB8888;
break;
default:
- return;
+ return FALSE;
}
output_fmt = (R300_OUT_FMT_C4_8 |
@@ -2321,6 +2311,30 @@ FUNC_NAME(R300DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
OUT_ACCEL_REG(R300_VAP_VTX_SIZE, pPriv->vtx_count);
FINISH_ACCEL();
+ return TRUE;
+}
+
+static void
+FUNC_NAME(R300DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
+{
+ RADEONInfoPtr info = RADEONPTR(pScrn);
+ PixmapPtr pPixmap = pPriv->pPixmap;
+ int dstxoff, dstyoff;
+ BoxPtr pBox = REGION_RECTS(&pPriv->clip);
+ int nBox = REGION_NUM_RECTS(&pPriv->clip);
+ ACCEL_PREAMBLE();
+
+#ifdef COMPOSITE
+ dstxoff = -pPixmap->screen_x + pPixmap->drawable.x;
+ dstyoff = -pPixmap->screen_y + pPixmap->drawable.y;
+#else
+ dstxoff = 0;
+ dstyoff = 0;
+#endif
+
+ if (!FUNC_NAME(R300PrepareTexturedVideo)(pScrn, pPriv))
+ return;
+
if (pPriv->vsync) {
xf86CrtcPtr crtc;
if (pPriv->desired_crtc)
commit 10799b4ce0c18c5a7d92d688549e8e777344f111
Author: Alex Deucher <alexdeucher at gmail.com>
Date: Fri Apr 16 15:38:49 2010 -0400
r2xx textured video: split into prepare and draw functions
diff --git a/src/radeon_textured_videofuncs.c b/src/radeon_textured_videofuncs.c
index f5f9101..ff4c055 100644
--- a/src/radeon_textured_videofuncs.c
+++ b/src/radeon_textured_videofuncs.c
@@ -475,16 +475,16 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv
OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN);
#ifdef ACCEL_CP
- ADVANCE_RING();
+ ADVANCE_RING();
#else
- FINISH_ACCEL();
+ FINISH_ACCEL();
#endif /* !ACCEL_CP */
DamageDamageRegion(pPriv->pDraw, &pPriv->clip);
}
-static void
-FUNC_NAME(R200DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
+static Bool
+FUNC_NAME(R200PrepareTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
{
RADEONInfoPtr info = RADEONPTR(pScrn);
PixmapPtr pPixmap = pPriv->pPixmap;
@@ -494,10 +494,9 @@ FUNC_NAME(R200DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
uint32_t txfilter, txsize, txpitch, txoffset;
uint32_t dst_pitch, dst_format;
uint32_t colorpitch;
- int dstxoff, dstyoff, pixel_shift;
- BoxPtr pBox = REGION_RECTS(&pPriv->clip);
- int nBox = REGION_NUM_RECTS(&pPriv->clip);
-
+ int pixel_shift;
+ int scissor_w = MIN(pPixmap->drawable.width, 2047);
+ int scissor_h = MIN(pPixmap->drawable.height, 2047);
/* note: in contrast to r300, use input biasing on uv components */
const float Loff = -0.0627;
float uvcosf, uvsinf;
@@ -525,7 +524,7 @@ FUNC_NAME(R200DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
ret = radeon_cs_space_check(info->cs);
if (ret) {
ErrorF("Not enough RAM to hw accel xv operation\n");
- return;
+ return FALSE;
}
}
#endif
@@ -541,14 +540,6 @@ FUNC_NAME(R200DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
dst_pitch = pPixmap->devKind;
}
-#ifdef COMPOSITE
- dstxoff = -pPixmap->screen_x + pPixmap->drawable.x;
- dstyoff = -pPixmap->screen_y + pPixmap->drawable.y;
-#else
- dstxoff = 0;
- dstyoff = 0;
-#endif
-
#ifdef USE_EXA
if (info->useEXA) {
RADEON_SWITCH_TO_3D();
@@ -581,7 +572,7 @@ FUNC_NAME(R200DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
dst_format = RADEON_COLOR_FORMAT_ARGB8888;
break;
default:
- return;
+ return FALSE;
}
if (pPriv->id == FOURCC_I420 || pPriv->id == FOURCC_YV12) {
@@ -923,17 +914,36 @@ FUNC_NAME(R200DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
FINISH_ACCEL();
}
- {
- int scissor_w, scissor_h;
- scissor_w = MIN(pPixmap->drawable.width, 2047);
- scissor_h = MIN(pPixmap->drawable.height, 2047);
- BEGIN_ACCEL(2);
- OUT_ACCEL_REG(RADEON_RE_TOP_LEFT, 0);
- OUT_ACCEL_REG(RADEON_RE_WIDTH_HEIGHT, ((scissor_w << RADEON_RE_WIDTH_SHIFT) |
- (scissor_h << RADEON_RE_HEIGHT_SHIFT)));
- }
+ BEGIN_ACCEL(2);
+ OUT_ACCEL_REG(RADEON_RE_TOP_LEFT, 0);
+ OUT_ACCEL_REG(RADEON_RE_WIDTH_HEIGHT, ((scissor_w << RADEON_RE_WIDTH_SHIFT) |
+ (scissor_h << RADEON_RE_HEIGHT_SHIFT)));
FINISH_ACCEL();
+ return TRUE;
+}
+
+static void
+FUNC_NAME(R200DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
+{
+ RADEONInfoPtr info = RADEONPTR(pScrn);
+ PixmapPtr pPixmap = pPriv->pPixmap;
+ int dstxoff, dstyoff;
+ BoxPtr pBox = REGION_RECTS(&pPriv->clip);
+ int nBox = REGION_NUM_RECTS(&pPriv->clip);
+ ACCEL_PREAMBLE();
+
+#ifdef COMPOSITE
+ dstxoff = -pPixmap->screen_x + pPixmap->drawable.x;
+ dstyoff = -pPixmap->screen_y + pPixmap->drawable.y;
+#else
+ dstxoff = 0;
+ dstyoff = 0;
+#endif
+
+ if (!FUNC_NAME(R200PrepareTexturedVideo)(pScrn, pPriv))
+ return;
+
if (pPriv->vsync) {
xf86CrtcPtr crtc;
if (pPriv->desired_crtc)
@@ -1034,9 +1044,9 @@ FUNC_NAME(R200DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN);
#ifdef ACCEL_CP
- ADVANCE_RING();
+ ADVANCE_RING();
#else
- FINISH_ACCEL();
+ FINISH_ACCEL();
#endif /* !ACCEL_CP */
DamageDamageRegion(pPriv->pDraw, &pPriv->clip);
commit bd1cf42201a1f918080bf34786a6de327cb31b5f
Author: Alex Deucher <alexdeucher at gmail.com>
Date: Fri Apr 16 15:31:40 2010 -0400
r1xx textured video: split into prepare and draw functions
diff --git a/src/radeon_textured_videofuncs.c b/src/radeon_textured_videofuncs.c
index 63ef2e8..f5f9101 100644
--- a/src/radeon_textured_videofuncs.c
+++ b/src/radeon_textured_videofuncs.c
@@ -87,8 +87,8 @@ do { \
#endif /* !ACCEL_CP */
-static void
-FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
+static Bool
+FUNC_NAME(RADEONPrepareTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
{
RADEONInfoPtr info = RADEONPTR(pScrn);
PixmapPtr pPixmap = pPriv->pPixmap;
@@ -97,9 +97,9 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv
uint32_t txformat, txsize, txpitch, txoffset;
uint32_t dst_pitch, dst_format;
uint32_t colorpitch;
- int dstxoff, dstyoff, pixel_shift;
- BoxPtr pBox = REGION_RECTS(&pPriv->clip);
- int nBox = REGION_NUM_RECTS(&pPriv->clip);
+ int pixel_shift;
+ int scissor_w = MIN(pPixmap->drawable.width, 2047);
+ int scissor_h = MIN(pPixmap->drawable.height, 2047);
ACCEL_PREAMBLE();
#ifdef XF86DRM_MODE
@@ -118,14 +118,14 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv
ret = radeon_cs_space_check(info->cs);
if (ret) {
ErrorF("Not enough RAM to hw accel xv operation\n");
- return;
+ return FALSE;
}
}
#endif
pixel_shift = pPixmap->drawable.bitsPerPixel >> 4;
-
+
#ifdef USE_EXA
if (info->useEXA) {
dst_pitch = exaGetPixmapPitch(pPixmap);
@@ -135,14 +135,6 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv
dst_pitch = pPixmap->devKind;
}
-#ifdef COMPOSITE
- dstxoff = -pPixmap->screen_x + pPixmap->drawable.x;
- dstyoff = -pPixmap->screen_y + pPixmap->drawable.y;
-#else
- dstxoff = 0;
- dstyoff = 0;
-#endif
-
#ifdef USE_EXA
if (info->useEXA) {
RADEON_SWITCH_TO_3D();
@@ -175,7 +167,7 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv
dst_format = RADEON_COLOR_FORMAT_ARGB8888;
break;
default:
- return;
+ return FALSE;
}
if (pPriv->id == FOURCC_I420 || pPriv->id == FOURCC_YV12) {
@@ -344,17 +336,36 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv
FINISH_ACCEL();
}
- {
- int scissor_w, scissor_h;
- scissor_w = MIN(pPixmap->drawable.width, 2047);
- scissor_h = MIN(pPixmap->drawable.height, 2047);
+ BEGIN_ACCEL(2);
+ OUT_ACCEL_REG(RADEON_RE_TOP_LEFT, 0);
+ OUT_ACCEL_REG(RADEON_RE_WIDTH_HEIGHT, ((scissor_w << RADEON_RE_WIDTH_SHIFT) |
+ (scissor_h << RADEON_RE_HEIGHT_SHIFT)));
+ FINISH_ACCEL();
+
+ return TRUE;
+}
+
+static void
+FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
+{
+ RADEONInfoPtr info = RADEONPTR(pScrn);
+ PixmapPtr pPixmap = pPriv->pPixmap;
+ int dstxoff, dstyoff;
+ BoxPtr pBox = REGION_RECTS(&pPriv->clip);
+ int nBox = REGION_NUM_RECTS(&pPriv->clip);
+ ACCEL_PREAMBLE();
+
+#ifdef COMPOSITE
+ dstxoff = -pPixmap->screen_x + pPixmap->drawable.x;
+ dstyoff = -pPixmap->screen_y + pPixmap->drawable.y;
+#else
+ dstxoff = 0;
+ dstyoff = 0;
+#endif
+
+ if (!FUNC_NAME(RADEONPrepareTexturedVideo)(pScrn, pPriv))
+ return;
- BEGIN_ACCEL(2);
- OUT_ACCEL_REG(RADEON_RE_TOP_LEFT, 0);
- OUT_ACCEL_REG(RADEON_RE_WIDTH_HEIGHT, ((scissor_w << RADEON_RE_WIDTH_SHIFT) |
- (scissor_h << RADEON_RE_HEIGHT_SHIFT)));
- FINISH_ACCEL();
- }
if (pPriv->vsync) {
xf86CrtcPtr crtc;
if (pPriv->desired_crtc)
commit c1136f94b80346065893f8a43c0fbf60c8c9b057
Author: Alex Deucher <alexdeucher at gmail.com>
Date: Fri Apr 16 15:23:14 2010 -0400
Xv: track vtx_count, is_planar in port priv
diff --git a/src/radeon_textured_videofuncs.c b/src/radeon_textured_videofuncs.c
index f967331..63ef2e8 100644
--- a/src/radeon_textured_videofuncs.c
+++ b/src/radeon_textured_videofuncs.c
@@ -97,8 +97,7 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv
uint32_t txformat, txsize, txpitch, txoffset;
uint32_t dst_pitch, dst_format;
uint32_t colorpitch;
- Bool isplanar = FALSE;
- int dstxoff, dstyoff, pixel_shift, vtx_count;
+ int dstxoff, dstyoff, pixel_shift;
BoxPtr pBox = REGION_RECTS(&pPriv->clip);
int nBox = REGION_NUM_RECTS(&pPriv->clip);
ACCEL_PREAMBLE();
@@ -180,9 +179,10 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv
}
if (pPriv->id == FOURCC_I420 || pPriv->id == FOURCC_YV12) {
- isplanar = TRUE;
+ pPriv->is_planar = TRUE;
txformat = RADEON_TXFORMAT_Y8;
} else {
+ pPriv->is_planar = FALSE;
if (pPriv->id == FOURCC_UYVY)
txformat = RADEON_TXFORMAT_YVYU422;
else
@@ -208,11 +208,11 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv
FINISH_ACCEL();
- if (isplanar) {
+ if (pPriv->is_planar) {
/* need 2 texcoord sets (even though they are identical) due
to denormalization! hw apparently can't premultiply
same coord set by different texture size */
- vtx_count = 6;
+ pPriv->vtx_count = 6;
txsize = (((((pPriv->w + 1 ) >> 1) - 1) & 0x7ff) |
(((((pPriv->h + 1 ) >> 1) - 1) & 0x7ff) << RADEON_TEX_VSIZE_SHIFT));
@@ -307,7 +307,7 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv
OUT_ACCEL_REG(RADEON_PP_TEX_PITCH_2, txpitch);
FINISH_ACCEL();
} else {
- vtx_count = 4;
+ pPriv->vtx_count = 4;
BEGIN_ACCEL_RELOC(9, 1);
OUT_ACCEL_REG(RADEON_SE_VTX_FMT, (RADEON_SE_VTX_FMT_XY |
@@ -392,10 +392,10 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv
*/
#ifdef ACCEL_CP
- BEGIN_RING(nBox * 3 * vtx_count + 5);
+ BEGIN_RING(nBox * 3 * pPriv->vtx_count + 5);
OUT_RING(CP_PACKET3(RADEON_CP_PACKET3_3D_DRAW_IMMD,
- nBox * 3 * vtx_count + 1));
- if (isplanar)
+ nBox * 3 * pPriv->vtx_count + 1));
+ if (pPriv->is_planar)
OUT_RING(RADEON_CP_VC_FRMT_XY |
RADEON_CP_VC_FRMT_ST0 |
RADEON_CP_VC_FRMT_ST1);
@@ -408,7 +408,7 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv
RADEON_CP_VC_CNTL_VTX_FMT_RADEON_MODE |
((nBox * 3) << RADEON_CP_VC_CNTL_NUM_SHIFT));
#else /* ACCEL_CP */
- BEGIN_ACCEL(nBox * vtx_count * 3 + 2);
+ BEGIN_ACCEL(nBox * pPriv->vtx_count * 3 + 2);
OUT_ACCEL_REG(RADEON_SE_VF_CNTL, (RADEON_VF_PRIM_TYPE_RECTANGLE_LIST |
RADEON_VF_PRIM_WALK_DATA |
RADEON_VF_RADEON_MODE |
@@ -434,7 +434,7 @@ FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv
srch = (pPriv->src_h * dsth) / pPriv->dst_h;
- if (isplanar) {
+ if (pPriv->is_planar) {
/*
* Just render a rect (using three coords).
*/
@@ -483,8 +483,7 @@ FUNC_NAME(R200DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
uint32_t txfilter, txsize, txpitch, txoffset;
uint32_t dst_pitch, dst_format;
uint32_t colorpitch;
- Bool isplanar = FALSE;
- int dstxoff, dstyoff, pixel_shift, vtx_count;
+ int dstxoff, dstyoff, pixel_shift;
BoxPtr pBox = REGION_RECTS(&pPriv->clip);
int nBox = REGION_NUM_RECTS(&pPriv->clip);
@@ -575,9 +574,10 @@ FUNC_NAME(R200DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
}
if (pPriv->id == FOURCC_I420 || pPriv->id == FOURCC_YV12) {
- isplanar = TRUE;
+ pPriv->is_planar = TRUE;
txformat = RADEON_TXFORMAT_I8;
} else {
+ pPriv->is_planar = FALSE;
if (pPriv->id == FOURCC_UYVY)
txformat = RADEON_TXFORMAT_YVYU422;
else
@@ -640,11 +640,11 @@ FUNC_NAME(R200DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
txoffset = info->cs ? 0 : pPriv->src_offset;
- if (isplanar) {
+ if (pPriv->is_planar) {
/* need 2 texcoord sets (even though they are identical) due
to denormalization! hw apparently can't premultiply
same coord set by different texture size */
- vtx_count = 6;
+ pPriv->vtx_count = 6;
txsize = (((((pPriv->w + 1 ) >> 1) - 1) & 0x7ff) |
(((((pPriv->h + 1 ) >> 1) - 1) & 0x7ff) << RADEON_TEX_VSIZE_SHIFT));
@@ -807,7 +807,7 @@ FUNC_NAME(R200DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
FINISH_ACCEL();
} else {
- vtx_count = 4;
+ pPriv->vtx_count = 4;
BEGIN_ACCEL_RELOC(24, 1);
@@ -960,14 +960,14 @@ FUNC_NAME(R200DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
*/
#ifdef ACCEL_CP
- BEGIN_RING(nBox * 3 * vtx_count + 4);
+ BEGIN_RING(nBox * 3 * pPriv->vtx_count + 4);
OUT_RING(CP_PACKET3(R200_CP_PACKET3_3D_DRAW_IMMD_2,
- nBox * 3 * vtx_count));
+ nBox * 3 * pPriv->vtx_count));
OUT_RING(RADEON_CP_VC_CNTL_PRIM_TYPE_RECT_LIST |
RADEON_CP_VC_CNTL_PRIM_WALK_RING |
((nBox * 3) << RADEON_CP_VC_CNTL_NUM_SHIFT));
#else /* ACCEL_CP */
- BEGIN_ACCEL(nBox * 3 * vtx_count + 2);
+ BEGIN_ACCEL(nBox * 3 * pPriv->vtx_count + 2);
OUT_ACCEL_REG(RADEON_SE_VF_CNTL, (RADEON_VF_PRIM_TYPE_RECTANGLE_LIST |
RADEON_VF_PRIM_WALK_DATA |
((nBox * 3) << RADEON_VF_NUM_VERTICES_SHIFT)));
@@ -992,7 +992,7 @@ FUNC_NAME(R200DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
srcw = (pPriv->src_w * dstw) / pPriv->dst_w;
srch = (pPriv->src_h * dsth) / pPriv->dst_h;
- if (isplanar) {
+ if (pPriv->is_planar) {
/*
* Just render a rect (using three coords).
*/
@@ -1042,8 +1042,7 @@ FUNC_NAME(R300DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
uint32_t dst_pitch, dst_format;
uint32_t txenable, colorpitch, bicubic_offset;
uint32_t output_fmt;
- Bool isplanar = FALSE;
- int dstxoff, dstyoff, pixel_shift, vtx_count;
+ int dstxoff, dstyoff, pixel_shift;
BoxPtr pBox = REGION_RECTS(&pPriv->clip);
int nBox = REGION_NUM_RECTS(&pPriv->clip);
ACCEL_PREAMBLE();
@@ -1109,9 +1108,9 @@ FUNC_NAME(R300DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
}
if (pPriv->bicubic_enabled)
- vtx_count = 6;
+ pPriv->vtx_count = 6;
else
- vtx_count = 4;
+ pPriv->vtx_count = 4;
switch (pPixmap->drawable.bitsPerPixel) {
case 16:
@@ -1142,9 +1141,11 @@ FUNC_NAME(R300DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
if (((pPriv->bicubic_state == BICUBIC_OFF)) &&
(pPriv->id == FOURCC_I420 || pPriv->id == FOURCC_YV12))
- isplanar = TRUE;
+ pPriv->is_planar = TRUE;
+ else
+ pPriv->is_planar = FALSE;
- if (isplanar) {
+ if (pPriv->is_planar) {
txformat1 = R300_TX_FORMAT_X8 | R300_TX_FORMAT_CACHE_HALF_REGION_0;
txpitch = pPriv->src_pitch;
} else {
@@ -1177,7 +1178,7 @@ FUNC_NAME(R300DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
OUT_ACCEL_REG(R300_TX_FILTER0_0, txfilter);
OUT_ACCEL_REG(R300_TX_FILTER1_0, 0);
OUT_ACCEL_REG(R300_TX_FORMAT0_0, txformat0);
- if (isplanar)
+ if (pPriv->is_planar)
OUT_ACCEL_REG(R300_TX_FORMAT1_0, txformat1 | R300_TX_FORMAT_CACHE_HALF_REGION_0);
else
OUT_ACCEL_REG(R300_TX_FORMAT1_0, txformat1);
@@ -1187,7 +1188,7 @@ FUNC_NAME(R300DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
txenable = R300_TEX_0_ENABLE;
- if (isplanar) {
+ if (pPriv->is_planar) {
txformat0 = ((((((pPriv->w + 1 ) >> 1) - 1) & 0x7ff) << R300_TXWIDTH_SHIFT) |
(((((pPriv->h + 1 ) >> 1 ) - 1) & 0x7ff) << R300_TXHEIGHT_SHIFT) |
R300_TXPITCH_EN);
@@ -1824,7 +1825,7 @@ FUNC_NAME(R300DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
if that's of any use. */
}
- if (isplanar) {
+ if (pPriv->is_planar) {
BEGIN_ACCEL(needgamma ? 28 + 33 : 33);
/* 2 components: same 2 for tex0/1/2 */
OUT_ACCEL_REG(R300_RS_COUNT,
@@ -2296,7 +2297,7 @@ FUNC_NAME(R300DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
/* no need to enable blending */
OUT_ACCEL_REG(R300_RB3D_BLENDCNTL, RADEON_SRC_BLEND_GL_ONE | RADEON_DST_BLEND_GL_ZERO);
- OUT_ACCEL_REG(R300_VAP_VTX_SIZE, vtx_count);
+ OUT_ACCEL_REG(R300_VAP_VTX_SIZE, pPriv->vtx_count);
FINISH_ACCEL();
if (pPriv->vsync) {
@@ -2379,25 +2380,25 @@ FUNC_NAME(R300DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
#ifdef ACCEL_CP
if (use_quad) {
- BEGIN_RING(4 * vtx_count + 4);
+ BEGIN_RING(4 * pPriv->vtx_count + 4);
OUT_RING(CP_PACKET3(R200_CP_PACKET3_3D_DRAW_IMMD_2,
- 4 * vtx_count));
+ 4 * pPriv->vtx_count));
OUT_RING(RADEON_CP_VC_CNTL_PRIM_TYPE_QUAD_LIST |
RADEON_CP_VC_CNTL_PRIM_WALK_RING |
(4 << RADEON_CP_VC_CNTL_NUM_SHIFT));
} else {
- BEGIN_RING(3 * vtx_count + 4);
+ BEGIN_RING(3 * pPriv->vtx_count + 4);
OUT_RING(CP_PACKET3(R200_CP_PACKET3_3D_DRAW_IMMD_2,
- 3 * vtx_count));
+ 3 * pPriv->vtx_count));
OUT_RING(RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST |
RADEON_CP_VC_CNTL_PRIM_WALK_RING |
(3 << RADEON_CP_VC_CNTL_NUM_SHIFT));
}
#else /* ACCEL_CP */
if (use_quad)
- BEGIN_ACCEL(2 + vtx_count * 4);
+ BEGIN_ACCEL(2 + pPriv->vtx_count * 4);
else
- BEGIN_ACCEL(2 + vtx_count * 3);
+ BEGIN_ACCEL(2 + pPriv->vtx_count * 3);
if (use_quad)
OUT_ACCEL_REG(RADEON_SE_VF_CNTL, (RADEON_VF_PRIM_TYPE_QUAD_LIST |
@@ -2500,8 +2501,7 @@ FUNC_NAME(R500DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
uint32_t dst_pitch, dst_format;
uint32_t txenable, colorpitch, bicubic_offset;
uint32_t output_fmt;
- Bool isplanar = FALSE;
- int dstxoff, dstyoff, pixel_shift, vtx_count;
+ int dstxoff, dstyoff, pixel_shift;
BoxPtr pBox = REGION_RECTS(&pPriv->clip);
int nBox = REGION_NUM_RECTS(&pPriv->clip);
ACCEL_PREAMBLE();
@@ -2567,9 +2567,9 @@ FUNC_NAME(R500DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
}
if (pPriv->bicubic_enabled)
- vtx_count = 6;
+ pPriv->vtx_count = 6;
else
- vtx_count = 4;
+ pPriv->vtx_count = 4;
switch (pPixmap->drawable.bitsPerPixel) {
case 16:
@@ -2599,9 +2599,11 @@ FUNC_NAME(R500DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
if (((pPriv->bicubic_state == BICUBIC_OFF)) &&
(pPriv->id == FOURCC_I420 || pPriv->id == FOURCC_YV12))
- isplanar = TRUE;
+ pPriv->is_planar = TRUE;
+ else
+ pPriv->is_planar = FALSE;
- if (isplanar) {
+ if (pPriv->is_planar) {
txformat1 = R300_TX_FORMAT_X8;
txpitch = pPriv->src_pitch;
} else {
@@ -2648,7 +2650,7 @@ FUNC_NAME(R500DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
txenable = R300_TEX_0_ENABLE;
- if (isplanar) {
+ if (pPriv->is_planar) {
txformat0 = ((((((pPriv->w + 1 ) >> 1) - 1) & 0x7ff) << R300_TXWIDTH_SHIFT) |
(((((pPriv->h + 1 ) >> 1 ) - 1) & 0x7ff) << R300_TXHEIGHT_SHIFT) |
R300_TXPITCH_EN);
@@ -3439,7 +3441,7 @@ FUNC_NAME(R500DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
if that's of any use. */
}
- if (isplanar) {
+ if (pPriv->is_planar) {
BEGIN_ACCEL(56);
/* 2 components: 2 for tex0 */
OUT_ACCEL_REG(R300_RS_COUNT,
@@ -3880,7 +3882,7 @@ FUNC_NAME(R500DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
/* no need to enable blending */
OUT_ACCEL_REG(R300_RB3D_BLENDCNTL, RADEON_SRC_BLEND_GL_ONE | RADEON_DST_BLEND_GL_ZERO);
- OUT_ACCEL_REG(R300_VAP_VTX_SIZE, vtx_count);
+ OUT_ACCEL_REG(R300_VAP_VTX_SIZE, pPriv->vtx_count);
FINISH_ACCEL();
if (pPriv->vsync) {
@@ -3945,14 +3947,14 @@ FUNC_NAME(R500DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
FINISH_ACCEL();
#ifdef ACCEL_CP
- BEGIN_RING(3 * vtx_count + 4);
+ BEGIN_RING(3 * pPriv->vtx_count + 4);
OUT_RING(CP_PACKET3(R200_CP_PACKET3_3D_DRAW_IMMD_2,
- 3 * vtx_count));
+ 3 * pPriv->vtx_count));
OUT_RING(RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST |
RADEON_CP_VC_CNTL_PRIM_WALK_RING |
(3 << RADEON_CP_VC_CNTL_NUM_SHIFT));
#else /* ACCEL_CP */
- BEGIN_ACCEL(2 + vtx_count * 3);
+ BEGIN_ACCEL(2 + pPriv->vtx_count * 3);
OUT_ACCEL_REG(RADEON_SE_VF_CNTL, (RADEON_VF_PRIM_TYPE_TRIANGLE_LIST |
RADEON_VF_PRIM_WALK_DATA |
(3 << RADEON_VF_NUM_VERTICES_SHIFT)));
diff --git a/src/radeon_video.h b/src/radeon_video.h
index be3df69..ab0c433 100644
--- a/src/radeon_video.h
+++ b/src/radeon_video.h
@@ -118,6 +118,8 @@ typedef struct {
int drw_x, drw_y;
int src_x, src_y;
int vsync;
+ Bool is_planar;
+ int vtx_count;
struct radeon_bo *src_bo[2];
} RADEONPortPrivRec, *RADEONPortPrivPtr;
More information about the xorg-commit
mailing list