Not sure where to post this but wanted to share, so here it is :-)
While trying to get tear free video on my RS690 I found some problems in
the code for rendering the video as a clipped triangle. The size
limitations are quite strict and scaling the video output window creates
all kinds of weird effects. This patch maximizes the use of this
function and resolves the scaling issues. There could be a problem with
zero target height/width, not sure if this is handled elsewhere.
Christiaan.
diff -u -r xf86-video-ati-6.10.0-ref/src/radeon_textured_videofuncs.c
xf86-video-ati-6.10.0/src/radeon_textured_videofuncs.c
--- xf86-video-ati-6.10.0-ref/src/radeon_textured_videofuncs.c 2009-01-07
01:08:28.000000000 +0100
+++ xf86-video-ati-6.10.0/src/radeon_textured_videofuncs.c 2009-01-10
17:05:02.000000000 +0100
@@ -1529,7 +1529,7 @@
#endif
if (IS_R300_3D || IS_R500_3D) {
- if (IS_R300_3D && ((dstw > 1440) || (dsth > 1440)))
+ if (IS_R300_3D && ((dstw+dsth) > 2880))
use_quad = TRUE;
/*
* Set up the scissor area to that of the output size.
@@ -1634,39 +1634,43 @@
(float)(srcX + srcw) /
info->accel_state->texW[0], (float)srcY / info->accel_state->texH[0],
(float)(srcX + srcw) + 0.5,
(float)srcY + 0.5);
} else {
- VTX_OUT_FILTER((float)dstX,
(float)dstY,
- (float)srcX / info->accel_state->texW[0],
(float)srcY / info->accel_state->texH[0],
- (float)srcX + 0.5,
(float)srcY + 0.5);
- VTX_OUT_FILTER((float)dstX,
(float)(dstY + dsth * 2),
- (float)srcX / info->accel_state->texW[0],
(float)(srcY + srch * 2) / info->accel_state->texH[0],
- (float)srcX + 0.5,
(float)(srcY + srch * 2) + 0.5);
- VTX_OUT_FILTER((float)(dstX + dstw * 2),
(float)dstY,
- (float)(srcX + srcw * 2) /
info->accel_state->texW[0], (float)srcY / info->accel_state->texH[0],
- (float)(srcX + srcw * 2) + 0.5,
(float)srcY + 0.5);
+ VTX_OUT_FILTER((float)dstX,
(float)dstY,
+ (float)srcX / info->accel_state->texW[0],
(float)srcY / info->accel_state->texH[0],
+ (float)srcX + 0.5,
(float)srcY + 0.5);
+ VTX_OUT_FILTER((float)dstX,
(float)(dstY + dstw + dsth),
+ (float)srcX / info->accel_state->texW[0],
((float)srcY + (float)srch * (((float)dstw / (float)dsth) + 1.0)) /
info->accel_state->texH[0],
+ (float)srcX + 0.5,
(float)srcY + (float)srch * (((float)dstw / (float)dsth) + 1.0) + 0.5);
+ VTX_OUT_FILTER((float)(dstX + dstw + dsth),
(float)dstY,
+ ((float)srcX + (float)srcw * (((float)dsth /
(float)dstw) + 1.0)) / info->accel_state->texW[0],
+
(float)srcY / info->accel_state->texH[0],
+ (float)srcX + (float)srcw * (((float)dsth /
(float)dstw) + 1.0) + 0.5,
+
(float)srcY + 0.5);
}
} else {
if (IS_R300_3D || IS_R500_3D) {
if (use_quad) {
- VTX_OUT((float)dstX,
(float)dstY,
- (float)srcX / info->accel_state->texW[0],
(float)srcY / info->accel_state->texH[0]);
- VTX_OUT((float)dstX,
(float)(dstY + dsth),
- (float)srcX / info->accel_state->texW[0],
(float)(srcY + srch) / info->accel_state->texH[0]);
- VTX_OUT((float)(dstX + dstw),
(float)(dstY + dsth),
- (float)(srcX + srcw) / info->accel_state->texW[0],
(float)(srcY + srch) / info->accel_state->texH[0]);
- VTX_OUT((float)(dstX + dstw),
(float)dstY,
- (float)(srcX + srcw) / info->accel_state->texW[0],
(float)srcY / info->accel_state->texH[0]);
+ VTX_OUT((float)dstX,
(float)dstY,
+ (float)srcX / info->accel_state->texW[0],
(float)srcY / info->accel_state->texH[0]);
+ VTX_OUT((float)dstX,
(float)(dstY + dsth),
+ (float)srcX / info->accel_state->texW[0],
(float)(srcY + srch) / info->accel_state->texH[0]);
+ VTX_OUT((float)(dstX + dstw),
(float)(dstY + dsth),
+ (float)(srcX + srcw) / info->accel_state->texW[0],
(float)(srcY + srch) / info->accel_state->texH[0]);
+ VTX_OUT((float)(dstX + dstw),
(float)dstY,
+ (float)(srcX + srcw) / info->accel_state->texW[0],
(float)srcY / info->accel_state->texH[0]);
} else {
/*
* Render a big, scissored triangle. This means
- * doubling the triangle size and adjusting
+ * increasing the triangle size and adjusting
* texture coordinates.
*/
- VTX_OUT((float)dstX,
(float)dstY,
- (float)srcX / info->accel_state->texW[0],
(float)srcY / info->accel_state->texH[0]);
- VTX_OUT((float)dstX,
(float)(dstY + dsth * 2),
- (float)srcX / info->accel_state->texW[0],
(float)(srcY + srch * 2) / info->accel_state->texH[0]);
- VTX_OUT((float)(dstX + dstw * 2),
(float)dstY,
- (float)(srcX + srcw * 2) /
info->accel_state->texW[0], (float)srcY / info->accel_state->texH[0]);
+ VTX_OUT((float)dstX,
(float)dstY,
+ (float)srcX / info->accel_state->texW[0],
(float)srcY / info->accel_state->texH[0]);
+ VTX_OUT((float)dstX,
(float)(dstY + dsth + dstw),
+ (float)srcX / info->accel_state->texW[0],
((float)srcY + (float)srch * (((float)dstw / (float)dsth) + 1.0)) /
info->accel_state->texH[0]);
+
+ VTX_OUT((float)(dstX + dstw + dsth),
(float)dstY,
+ ((float)srcX + (float)srcw * (((float)dsth /
(float)dstw) + 1.0)) / info->accel_state->texW[0],
+
(float)srcY / info->accel_state->texH[0]);
}
} else {
/*
_______________________________________________
xorg-driver-ati mailing list
[email protected]
http://lists.x.org/mailman/listinfo/xorg-driver-ati