Hi,

I attached a patch that adds color dithering and rounding options to the
radeon and r200 drivers. I'd like to hear some comments about the
semantics of the options I chose before I commit anything and I'm not
sure I added the roundEnable flag in the right place. It is needed
because a set ROUND_ENABLE bit overrides dithering.

As a side note, the X error diffusion with reset at start of lines looks
broken on my Radeon 7500. It produces very noticable vertical patterns.
Does it work better on other cards?

Regards,
  Felix

------------    __\|/__    ___     ___       -------------------------
 Felix       ___\_e -_/___/ __\___/ __\_____   You can do anything,
   Kühling  (_____\Ä/____/ /_____/ /________)  just not everything
 [EMAIL PROTECTED]       \___/   \___/   U        at the same time.
Index: common/xmlpool.h
===================================================================
RCS file: /cvs/dri/xc/xc/lib/GL/mesa/src/drv/common/xmlpool.h,v
retrieving revision 1.3
diff -u -r1.3 xmlpool.h
--- common/xmlpool.h    19 Oct 2003 14:31:05 -0000      1.3
+++ common/xmlpool.h    20 Oct 2003 21:40:08 -0000
@@ -137,6 +137,51 @@
         DRI_CONF_DESC_END \
 DRI_CONF_OPT_END
 
+#define DRI_CONF_COLOR_REDUCTION_ROUND 0
+#define DRI_CONF_COLOR_REDUCTION_DITHER 1
+#define DRI_CONF_COLOR_REDUCTION(def) \
+DRI_CONF_OPT_BEGIN_V(color_reduction,enum,def,"0:1") \
+        DRI_CONF_DESC_BEGIN(en,"Default color reduction method") \
+                DRI_CONF_ENUM(0,"Round or truncate") \
+                DRI_CONF_ENUM(1,"Dither") \
+        DRI_CONF_DESC_END \
+        DRI_CONF_DESC_BEGIN(de,"Standardmethode zur Farbreduktion") \
+                DRI_CONF_ENUM(0,"Runden oder Abschneiden") \
+                DRI_CONF_ENUM(1,"Rastern") \
+        DRI_CONF_DESC_END \
+DRI_CONF_OPT_END
+
+#define DRI_CONF_ROUND_TRUNC 0
+#define DRI_CONF_ROUND_ROUND 1
+#define DRI_CONF_ROUND_MODE(def) \
+DRI_CONF_OPT_BEGIN_V(round_mode,enum,def,"0:1") \
+       DRI_CONF_DESC_BEGIN(en,"Round or truncate colors") \
+                DRI_CONF_ENUM(0,"Truncate") \
+                DRI_CONF_ENUM(1,"Round") \
+        DRI_CONF_DESC_END \
+       DRI_CONF_DESC_BEGIN(de,"Farben runden oder abschneiden") \
+                DRI_CONF_ENUM(0,"Abschneiden") \
+                DRI_CONF_ENUM(1,"Runden") \
+        DRI_CONF_DESC_END \
+DRI_CONF_OPT_END
+
+#define DRI_CONF_DITHER_XERRORDIFF 0
+#define DRI_CONF_DITHER_XERRORDIFFRESET 1
+#define DRI_CONF_DITHER_ORDERED 2
+#define DRI_CONF_DITHER_MODE(def) \
+DRI_CONF_OPT_BEGIN_V(dither_mode,enum,def,"0:2") \
+       DRI_CONF_DESC_BEGIN(en,"Color dithering") \
+                DRI_CONF_ENUM(0,"Horizontal error diffusion") \
+                DRI_CONF_ENUM(1,"Horizontal error diffusion, reset error at line 
start") \
+                DRI_CONF_ENUM(2,"Ordered 2D dithering") \
+        DRI_CONF_DESC_END \
+       DRI_CONF_DESC_BEGIN(de,"Farben rastern") \
+                DRI_CONF_ENUM(0,"Horizontale Fehlerstreuung") \
+                DRI_CONF_ENUM(1,"Horizontale Fehlerstreuung, Fehler am Zeilenanfang 
zurücksetzen") \
+                DRI_CONF_ENUM(2,"Geordnete 2D Farbrasterung") \
+        DRI_CONF_DESC_END \
+DRI_CONF_OPT_END
+
 /** \brief Performance-related options */
 #define DRI_CONF_SECTION_PERFORMANCE \
 DRI_CONF_SECTION_BEGIN \
Index: radeon/radeon_context.c
===================================================================
RCS file: /cvs/dri/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_context.c,v
retrieving revision 1.48
diff -u -r1.48 radeon_context.c
--- radeon/radeon_context.c     19 Oct 2003 14:38:03 -0000      1.48
+++ radeon/radeon_context.c     20 Oct 2003 21:40:09 -0000
@@ -82,12 +82,15 @@
     DRI_CONF_SECTION_END
     DRI_CONF_SECTION_QUALITY
         DRI_CONF_PREFERRED_BPT(0,"0,16,32")
+        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
     DRI_CONF_SECTION_DEBUG
         DRI_CONF_NO_RAST(false)
     DRI_CONF_SECTION_END
 DRI_CONF_END;
-const GLuint __driNConfigOptions = 5;
+const GLuint __driNConfigOptions = 8;
 
 /* Return the width and height of the given buffer.
  */
Index: radeon/radeon_context.h
===================================================================
RCS file: /cvs/dri/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_context.h,v
retrieving revision 1.35
diff -u -r1.35 radeon_context.h
--- radeon/radeon_context.h     19 Oct 2003 14:38:03 -0000      1.35
+++ radeon/radeon_context.h     20 Oct 2003 21:40:11 -0000
@@ -95,6 +95,7 @@
 struct radeon_colorbuffer_state {
    GLuint clear;
    GLint drawOffset, drawPitch;
+   int roundEnable;
 };
 
 
Index: radeon/radeon_state.c
===================================================================
RCS file: /cvs/dri/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_state.c,v
retrieving revision 1.33
diff -u -r1.33 radeon_state.c
--- radeon/radeon_state.c       19 Aug 2003 01:04:57 -0000      1.33
+++ radeon/radeon_state.c       20 Oct 2003 21:40:23 -0000
@@ -1725,8 +1725,10 @@
       RADEON_STATECHANGE(rmesa, ctx );
       if ( state ) {
         rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_DITHER_ENABLE;
+        rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~rmesa->state.color.roundEnable;
       } else {
         rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~RADEON_DITHER_ENABLE;
+        rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  rmesa->state.color.roundEnable;
       }
       break;
 
Index: radeon/radeon_state_init.c
===================================================================
RCS file: /cvs/dri/xc/xc/lib/GL/mesa/src/drv/radeon/radeon_state_init.c,v
retrieving revision 1.13
diff -u -r1.13 radeon_state_init.c
--- radeon/radeon_state_init.c  16 Sep 2003 20:45:11 -0000      1.13
+++ radeon/radeon_state_init.c  20 Oct 2003 21:40:23 -0000
@@ -46,6 +46,8 @@
 #include "radeon_swtcl.h"
 #include "radeon_vtxfmt.h"
 
+#include "xmlpool.h"
+
 /* =============================================================
  * State initialization
  */
@@ -344,7 +346,24 @@
                                       color_fmt |
                                       (1<<15));
 
-   rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  RADEON_DITHER_ENABLE;
+   switch ( driQueryOptioni( &rmesa->optionCache, "dither_mode" ) ) {
+   case DRI_CONF_DITHER_XERRORDIFFRESET:
+      rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= RADEON_DITHER_INIT;
+      break;
+   case DRI_CONF_DITHER_ORDERED:
+      rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= RADEON_SCALE_DITHER_ENABLE;
+      break;
+   }
+   if ( driQueryOptioni( &rmesa->optionCache, "round_mode" ) ==
+       DRI_CONF_ROUND_ROUND )
+      rmesa->state.color.roundEnable = RADEON_ROUND_ENABLE;
+   else
+      rmesa->state.color.roundEnable = 0;
+   if ( driQueryOptioni (&rmesa->optionCache, "color_reduction" ) ==
+       DRI_CONF_COLOR_REDUCTION_DITHER )
+      rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= RADEON_DITHER_ENABLE;
+   else
+      rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= rmesa->state.color.roundEnable;
 
    rmesa->hw.ctx.cmd[CTX_RB3D_COLOROFFSET] = (rmesa->state.color.drawOffset &
                                              RADEON_COLOROFFSET_MASK);
Index: r200/r200_context.c
===================================================================
RCS file: /cvs/dri/xc/xc/lib/GL/mesa/src/drv/r200/r200_context.c,v
retrieving revision 1.33
diff -u -r1.33 r200_context.c
--- r200/r200_context.c 19 Oct 2003 14:38:03 -0000      1.33
+++ r200/r200_context.c 20 Oct 2003 21:40:24 -0000
@@ -82,12 +82,15 @@
     DRI_CONF_SECTION_END
     DRI_CONF_SECTION_QUALITY
         DRI_CONF_PREFERRED_BPT(0,"0,16,32")
+        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
     DRI_CONF_SECTION_DEBUG
         DRI_CONF_NO_RAST(false)
     DRI_CONF_SECTION_END
 DRI_CONF_END;
-const GLuint __driNConfigOptions = 5;
+const GLuint __driNConfigOptions = 8;
 
 
 /* Return the width and height of the given buffer.
Index: r200/r200_context.h
===================================================================
RCS file: /cvs/dri/xc/xc/lib/GL/mesa/src/drv/r200/r200_context.h,v
retrieving revision 1.25
diff -u -r1.25 r200_context.h
--- r200/r200_context.h 19 Oct 2003 14:38:03 -0000      1.25
+++ r200/r200_context.h 20 Oct 2003 21:40:30 -0000
@@ -96,6 +96,7 @@
 struct r200_colorbuffer_state {
    GLuint clear;
    GLint drawOffset, drawPitch;
+   int roundEnable;
 };
 
 
Index: r200/r200_state.c
===================================================================
RCS file: /cvs/dri/xc/xc/lib/GL/mesa/src/drv/r200/r200_state.c,v
retrieving revision 1.17
diff -u -r1.17 r200_state.c
--- r200/r200_state.c   16 Sep 2003 20:45:08 -0000      1.17
+++ r200/r200_state.c   20 Oct 2003 21:40:31 -0000
@@ -1742,8 +1742,10 @@
       R200_STATECHANGE(rmesa, ctx );
       if ( state ) {
         rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  R200_DITHER_ENABLE;
+        rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~rmesa->state.color.roundEnable;
       } else {
         rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] &= ~R200_DITHER_ENABLE;
+        rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  rmesa->state.color.roundEnable;
       }
       break;
 
Index: r200/r200_state_init.c
===================================================================
RCS file: /cvs/dri/xc/xc/lib/GL/mesa/src/drv/r200/r200_state_init.c,v
retrieving revision 1.12
diff -u -r1.12 r200_state_init.c
--- r200/r200_state_init.c      16 Sep 2003 20:45:08 -0000      1.12
+++ r200/r200_state_init.c      20 Oct 2003 21:40:34 -0000
@@ -52,6 +52,8 @@
 #include "r200_swtcl.h"
 #include "r200_vtxfmt.h"
 
+#include "xmlpool.h"
+
 /* =============================================================
  * State initialization
  */
@@ -382,7 +384,24 @@
                                     | R200_TEX_BLEND_0_ENABLE);
 
    rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] = color_fmt;
-   rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |=  R200_DITHER_ENABLE;
+   switch ( driQueryOptioni( &rmesa->optionCache, "dither_mode" ) ) {
+   case DRI_CONF_DITHER_XERRORDIFFRESET:
+      rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= R200_DITHER_INIT;
+      break;
+   case DRI_CONF_DITHER_ORDERED:
+      rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= R200_SCALE_DITHER_ENABLE;
+      break;
+   }
+   if ( driQueryOptioni( &rmesa->optionCache, "round_mode" ) ==
+       DRI_CONF_ROUND_ROUND )
+      rmesa->state.color.roundEnable = R200_ROUND_ENABLE;
+   else
+      rmesa->state.color.roundEnable = 0;
+   if ( driQueryOptioni (&rmesa->optionCache, "color_reduction" ) ==
+       DRI_CONF_COLOR_REDUCTION_DITHER )
+      rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= R200_DITHER_ENABLE;
+   else
+      rmesa->hw.ctx.cmd[CTX_RB3D_CNTL] |= rmesa->state.color.roundEnable;
 
    rmesa->hw.ctx.cmd[CTX_RB3D_COLOROFFSET] = (rmesa->state.color.drawOffset &
                                              R200_COLOROFFSET_MASK);

Reply via email to