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 */