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