Hi,

The attached patch adds dithering options to the r128 driver. Would
anyone like to test it before I commit?

Best regards,
  Felix

------------    __\|/__    ___     ___       -------------------------
 Felix       ___\_e -_/___/ __\___/ __\_____   You can do anything,
   Kühling  (_____\Ä/____/ /_____/ /________)  just not everything
 [EMAIL PROTECTED]       \___/   \___/   U        at the same time.
--- ./r128_state.c.~1.32.~      2003-08-27 21:10:48.000000000 +0200
+++ ./r128_state.c      2003-11-11 15:32:37.000000000 +0100
@@ -51,6 +51,8 @@
 
 #include "tnl/t_pipeline.h"
 
+#include "xmlpool.h"
+
 
 /* =============================================================
  * Alpha blending
@@ -808,16 +810,21 @@
 
    case GL_DITHER:
       do {
+        GLuint s = rmesa->setup.scale_3d_cntl;
         GLuint t = rmesa->setup.tex_cntl_c;
         FLUSH_BATCH( rmesa );
 
         if ( ctx->Color.DitherFlag ) {
+           s &= ~rmesa->roundEnable;
            t |=  R128_DITHER_ENABLE;
         } else {
+           s |=  rmesa->roundEnable;
            t &= ~R128_DITHER_ENABLE;
         }
 
-        if ( rmesa->setup.tex_cntl_c != t ) {
+        if ( rmesa->setup.scale_3d_cntl != s ||
+             rmesa->setup.tex_cntl_c != t ) {
+           rmesa->setup.scale_3d_cntl = s;
            rmesa->setup.tex_cntl_c = t;
            rmesa->dirty |= R128_UPLOAD_CONTEXT;
         }
@@ -1114,7 +1121,6 @@
 
    rmesa->setup.tex_cntl_c = (R128_Z_WRITE_ENABLE |
                              R128_SHADE_ENABLE |
-                             R128_DITHER_ENABLE |
                              R128_ALPHA_IN_TEX_COMPLETE_A |
                              R128_LIGHT_DIS |
                              R128_ALPHA_LIGHT_DIS |
@@ -1164,9 +1170,7 @@
 
    rmesa->setup.window_xy_offset = 0x00000000;
 
-   rmesa->setup.scale_3d_cntl = (R128_SCALE_DITHER_TABLE |
-                                R128_TEX_CACHE_SIZE_FULL |
-                                R128_DITHER_INIT_RESET |
+   rmesa->setup.scale_3d_cntl = (R128_TEX_CACHE_SIZE_FULL |
                                 R128_SCALE_3D_TEXMAP_SHADE |
                                 R128_SCALE_PIX_REPLICATE |
                                 R128_ALPHA_COMB_ADD_CLAMP |
@@ -1178,6 +1182,30 @@
                                 R128_TEX_MAP_ALPHA_IN_TEXTURE |
                                 R128_TEX_CACHE_LINE_SIZE_4QW);
 
+   switch ( driQueryOptioni( &rmesa->optionCache, "dither_mode" ) ) {
+   case DRI_CONF_DITHER_XERRORDIFF:
+      rmesa->setup.scale_3d_cntl |= (R128_SCALE_DITHER_ERR_DIFF |
+                                    R128_DITHER_INIT_CURR);
+      break;
+   case DRI_CONF_DITHER_XERRORDIFFRESET:
+      rmesa->setup.scale_3d_cntl |= (R128_SCALE_DITHER_ERR_DIFF |
+                                    R128_DITHER_INIT_RESET);
+      break;
+   case DRI_CONF_DITHER_ORDERED:
+      rmesa->setup.scale_3d_cntl |= R128_SCALE_DITHER_TABLE;
+      break;
+   }
+   if ( driQueryOptioni( &rmesa->optionCache, "round_mode" ) ==
+       DRI_CONF_ROUND_ROUND )
+      rmesa->roundEnable = R128_ROUND_24BIT;
+   else
+      rmesa->roundEnable = 0;
+   if ( driQueryOptioni (&rmesa->optionCache, "color_reduction" ) ==
+       DRI_CONF_COLOR_REDUCTION_DITHER )
+      rmesa->setup.tex_cntl_c |= R128_DITHER_ENABLE;
+   else
+      rmesa->setup.scale_3d_cntl |= rmesa->roundEnable;
+
    rmesa->new_state = R128_NEW_ALL;
 }
 
--- ./r128_context.c.~1.29.~    2003-10-25 17:38:51.000000000 +0200
+++ ./r128_context.c    2003-11-11 15:02:43.000000000 +0100
@@ -71,6 +71,9 @@
     DRI_CONF_SECTION_END
     DRI_CONF_SECTION_QUALITY
         DRI_CONF_TEXTURE_DEPTH(DRI_CONF_TEXTURE_DEPTH_FB)
+        DRI_CONF_COLOR_REDUCTION(DRI_CONF_COLOR_REDUCTION_DITHER)
+        DRI_CONF_ROUND_MODE(DRI_CONF_ROUND_TRUNC)
+        DRI_CONF_DITHER_MODE(DRI_CONF_DITHER_XERRORDIFF)
     DRI_CONF_SECTION_END
 #if ENABLE_PERF_BOXES
     DRI_CONF_SECTION_DEBUG
@@ -79,9 +82,9 @@
 #endif
 DRI_CONF_END;
 #if ENABLE_PERF_BOXES
-const GLuint __driNConfigOptions = 3;
+const GLuint __driNConfigOptions = 6;
 #else
-const GLuint __driNConfigOptions = 2;
+const GLuint __driNConfigOptions = 5;
 #endif
 
 #ifndef R128_DEBUG
--- ./r128_context.h.~1.38.~    2003-10-25 17:37:47.000000000 +0200
+++ ./r128_context.h    2003-11-11 15:02:12.000000000 +0100
@@ -191,6 +191,10 @@
    GLuint scissor;
    XF86DRIClipRectRec ScissorRect;     /* Current software scissor */
 
+   /* round or truncate
+    */
+   int roundEnable;
+
    /* Mirrors of some DRI state
     */
    __DRIcontextPrivate *driContext;    /* DRI context */

Reply via email to