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

Reply via email to