merge from master
[mesa.git] / src / mesa / drivers / dri / r300 / r300_state.c
index 70d42c2ea3be54d2fd1de2cca72c408841e7245b..fff11653de1451faa6f34961c15c17ef148a6840 100644 (file)
@@ -46,7 +46,9 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "api_arrayelt.h"
 #include "swrast/swrast.h"
 #include "swrast_setup/swrast_setup.h"
-#include "array_cache/acache.h"
+#include "shader/prog_parameter.h"
+#include "shader/prog_statevars.h"
+#include "vbo/vbo.h"
 #include "tnl/tnl.h"
 #include "texformat.h"
 
@@ -64,63 +66,19 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 #include "drirenderbuffer.h"
 
-static void r300AlphaFunc(GLcontext * ctx, GLenum func, GLfloat ref)
-{
-       r300ContextPtr rmesa = R300_CONTEXT(ctx);
-       int pp_misc = rmesa->hw.at.cmd[R300_AT_ALPHA_TEST];
-       GLubyte refByte;
-
-       CLAMPED_FLOAT_TO_UBYTE(refByte, ref);
-       
-       R300_STATECHANGE(rmesa, at);
-
-       pp_misc &= ~(R300_ALPHA_TEST_OP_MASK | R300_REF_ALPHA_MASK);
-       pp_misc |= (refByte & R300_REF_ALPHA_MASK);
-
-       switch (func) {
-       case GL_NEVER:
-               pp_misc |= R300_ALPHA_TEST_FAIL;
-               break;
-       case GL_LESS:
-               pp_misc |= R300_ALPHA_TEST_LESS;
-               break;
-       case GL_EQUAL:
-               pp_misc |= R300_ALPHA_TEST_EQUAL;
-               break;
-       case GL_LEQUAL:
-               pp_misc |= R300_ALPHA_TEST_LEQUAL;
-               break;
-       case GL_GREATER:
-               pp_misc |= R300_ALPHA_TEST_GREATER;
-               break;
-       case GL_NOTEQUAL:
-               pp_misc |= R300_ALPHA_TEST_NEQUAL;
-               break;
-       case GL_GEQUAL:
-               pp_misc |= R300_ALPHA_TEST_GEQUAL;
-               break;
-       case GL_ALWAYS:
-               pp_misc |= R300_ALPHA_TEST_PASS;
-               //pp_misc &= ~R300_ALPHA_TEST_ENABLE;
-               break;
-       }
-
-       rmesa->hw.at.cmd[R300_AT_ALPHA_TEST] = pp_misc;
-}
-
 static void r300BlendColor(GLcontext * ctx, const GLfloat cf[4])
 {
        GLubyte color[4];
        r300ContextPtr rmesa = R300_CONTEXT(ctx);
 
-       R300_STATECHANGE(rmesa, unk4E10);
+       R300_STATECHANGE(rmesa, blend_color);
 
        CLAMPED_FLOAT_TO_UBYTE(color[0], cf[0]);
        CLAMPED_FLOAT_TO_UBYTE(color[1], cf[1]);
        CLAMPED_FLOAT_TO_UBYTE(color[2], cf[2]);
        CLAMPED_FLOAT_TO_UBYTE(color[3], cf[3]);
 
-       rmesa->hw.unk4E10.cmd[1] = r300PackColor(4, color[3], color[0],
+       rmesa->hw.blend_color.cmd[1] = r300PackColor(4, color[3], color[0],
                                                 color[1], color[2]);
 }
 
@@ -144,55 +102,54 @@ static int blend_factor(GLenum factor, GLboolean is_src)
 
        switch (factor) {
        case GL_ZERO:
-               func = R200_BLEND_GL_ZERO;
+               func = R300_BLEND_GL_ZERO;
                break;
        case GL_ONE:
-               func = R200_BLEND_GL_ONE;
+               func = R300_BLEND_GL_ONE;
                break;
        case GL_DST_COLOR:
-               func = R200_BLEND_GL_DST_COLOR;
+               func = R300_BLEND_GL_DST_COLOR;
                break;
        case GL_ONE_MINUS_DST_COLOR:
-               func = R200_BLEND_GL_ONE_MINUS_DST_COLOR;
+               func = R300_BLEND_GL_ONE_MINUS_DST_COLOR;
                break;
        case GL_SRC_COLOR:
-               func = R200_BLEND_GL_SRC_COLOR;
+               func = R300_BLEND_GL_SRC_COLOR;
                break;
        case GL_ONE_MINUS_SRC_COLOR:
-               func = R200_BLEND_GL_ONE_MINUS_SRC_COLOR;
+               func = R300_BLEND_GL_ONE_MINUS_SRC_COLOR;
                break;
        case GL_SRC_ALPHA:
-               func = R200_BLEND_GL_SRC_ALPHA;
+               func = R300_BLEND_GL_SRC_ALPHA;
                break;
        case GL_ONE_MINUS_SRC_ALPHA:
-               func = R200_BLEND_GL_ONE_MINUS_SRC_ALPHA;
+               func = R300_BLEND_GL_ONE_MINUS_SRC_ALPHA;
                break;
        case GL_DST_ALPHA:
-               func = R200_BLEND_GL_DST_ALPHA;
+               func = R300_BLEND_GL_DST_ALPHA;
                break;
        case GL_ONE_MINUS_DST_ALPHA:
-               func = R200_BLEND_GL_ONE_MINUS_DST_ALPHA;
+               func = R300_BLEND_GL_ONE_MINUS_DST_ALPHA;
                break;
        case GL_SRC_ALPHA_SATURATE:
-               func =
-                   (is_src) ? R200_BLEND_GL_SRC_ALPHA_SATURATE :
-                   R200_BLEND_GL_ZERO;
+               func = (is_src) ? R300_BLEND_GL_SRC_ALPHA_SATURATE :
+               R300_BLEND_GL_ZERO;
                break;
        case GL_CONSTANT_COLOR:
-               func = R200_BLEND_GL_CONST_COLOR;
+               func = R300_BLEND_GL_CONST_COLOR;
                break;
        case GL_ONE_MINUS_CONSTANT_COLOR:
-               func = R200_BLEND_GL_ONE_MINUS_CONST_COLOR;
+               func = R300_BLEND_GL_ONE_MINUS_CONST_COLOR;
                break;
        case GL_CONSTANT_ALPHA:
-               func = R200_BLEND_GL_CONST_ALPHA;
+               func = R300_BLEND_GL_CONST_ALPHA;
                break;
        case GL_ONE_MINUS_CONSTANT_ALPHA:
-               func = R200_BLEND_GL_ONE_MINUS_CONST_ALPHA;
+               func = R300_BLEND_GL_ONE_MINUS_CONST_ALPHA;
                break;
        default:
                fprintf(stderr, "unknown blend factor %x\n", factor);
-               func = (is_src) ? R200_BLEND_GL_ONE : R200_BLEND_GL_ZERO;
+               func = (is_src) ? R300_BLEND_GL_ONE : R300_BLEND_GL_ZERO;
        }
        return func;
 }
@@ -202,10 +159,10 @@ static int blend_factor(GLenum factor, GLboolean is_src)
  * This is done in a single
  * function because some blend equations (i.e., \c GL_MIN and \c GL_MAX)
  * change the interpretation of the blend function.
- * Also, make sure that blend function and blend equation are set to their default
- * value if color blending is not enabled, since at least blend equations GL_MIN
- * and GL_FUNC_REVERSE_SUBTRACT will cause wrong results otherwise for
- * unknown reasons.
+ * Also, make sure that blend function and blend equation are set to their
+ * default value if color blending is not enabled, since at least blend
+ * equations GL_MIN and GL_FUNC_REVERSE_SUBTRACT will cause wrong results
+ * otherwise for unknown reasons.
  */
 
 /* helper function */
@@ -244,22 +201,22 @@ static void r300_set_blend_cntl(r300ContextPtr r300, int func, int eqn, int cbit
 static void r300_set_blend_state(GLcontext * ctx)
 {
        r300ContextPtr r300 = R300_CONTEXT(ctx);
-       int func = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
-           (R200_BLEND_GL_ZERO << R200_DST_BLEND_SHIFT);
-       int eqn = R200_COMB_FCN_ADD_CLAMP;
-       int funcA = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
-           (R200_BLEND_GL_ZERO << R200_DST_BLEND_SHIFT);
-       int eqnA = R200_COMB_FCN_ADD_CLAMP;
-
-       if (ctx->Color._LogicOpEnabled || !ctx->Color.BlendEnabled) {
+       int func = (R300_BLEND_GL_ONE << R300_SRC_BLEND_SHIFT) |
+           (R300_BLEND_GL_ZERO << R300_DST_BLEND_SHIFT);
+       int eqn = R300_COMB_FCN_ADD_CLAMP;
+       int funcA = (R300_BLEND_GL_ONE << R300_SRC_BLEND_SHIFT) |
+           (R300_BLEND_GL_ZERO << R300_DST_BLEND_SHIFT);
+       int eqnA = R300_COMB_FCN_ADD_CLAMP;
+
+       if (RGBA_LOGICOP_ENABLED(ctx) || !ctx->Color.BlendEnabled) {
                r300_set_blend_cntl(r300,
                        func, eqn, 0,
                        func, eqn);
                return;
        }
 
-       func = (blend_factor(ctx->Color.BlendSrcRGB, GL_TRUE) << R200_SRC_BLEND_SHIFT) |
-               (blend_factor(ctx->Color.BlendDstRGB, GL_FALSE) << R200_DST_BLEND_SHIFT);
+       func = (blend_factor(ctx->Color.BlendSrcRGB, GL_TRUE) << R300_SRC_BLEND_SHIFT) |
+               (blend_factor(ctx->Color.BlendDstRGB, GL_FALSE) << R300_DST_BLEND_SHIFT);
 
        switch (ctx->Color.BlendEquationRGB) {
        case GL_FUNC_ADD:
@@ -271,19 +228,19 @@ static void r300_set_blend_state(GLcontext * ctx)
                break;
 
        case GL_FUNC_REVERSE_SUBTRACT:
-               eqn = R200_COMB_FCN_RSUB_CLAMP;
+               eqn = R300_COMB_FCN_RSUB_CLAMP;
                break;
 
        case GL_MIN:
-               eqn = R200_COMB_FCN_MIN;
-               func = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
-                   (R200_BLEND_GL_ONE << R200_DST_BLEND_SHIFT);
+               eqn = R300_COMB_FCN_MIN;
+               func = (R300_BLEND_GL_ONE << R300_SRC_BLEND_SHIFT) |
+                   (R300_BLEND_GL_ONE << R300_DST_BLEND_SHIFT);
                break;
 
        case GL_MAX:
-               eqn = R200_COMB_FCN_MAX;
-               func = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
-                   (R200_BLEND_GL_ONE << R200_DST_BLEND_SHIFT);
+               eqn = R300_COMB_FCN_MAX;
+               func = (R300_BLEND_GL_ONE << R300_SRC_BLEND_SHIFT) |
+                   (R300_BLEND_GL_ONE << R300_DST_BLEND_SHIFT);
                break;
 
        default:
@@ -294,8 +251,8 @@ static void r300_set_blend_state(GLcontext * ctx)
        }
 
 
-       funcA = (blend_factor(ctx->Color.BlendSrcA, GL_TRUE) << R200_SRC_BLEND_SHIFT) |
-               (blend_factor(ctx->Color.BlendDstA, GL_FALSE) << R200_DST_BLEND_SHIFT);
+       funcA = (blend_factor(ctx->Color.BlendSrcA, GL_TRUE) << R300_SRC_BLEND_SHIFT) |
+               (blend_factor(ctx->Color.BlendDstA, GL_FALSE) << R300_DST_BLEND_SHIFT);
 
        switch (ctx->Color.BlendEquationA) {
        case GL_FUNC_ADD:
@@ -307,19 +264,19 @@ static void r300_set_blend_state(GLcontext * ctx)
                break;
 
        case GL_FUNC_REVERSE_SUBTRACT:
-               eqnA = R200_COMB_FCN_RSUB_CLAMP;
+               eqnA = R300_COMB_FCN_RSUB_CLAMP;
                break;
 
        case GL_MIN:
-               eqnA = R200_COMB_FCN_MIN;
-               funcA = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
-                   (R200_BLEND_GL_ONE << R200_DST_BLEND_SHIFT);
+               eqnA = R300_COMB_FCN_MIN;
+               funcA = (R300_BLEND_GL_ONE << R300_SRC_BLEND_SHIFT) |
+                   (R300_BLEND_GL_ONE << R300_DST_BLEND_SHIFT);
                break;
 
        case GL_MAX:
-               eqnA = R200_COMB_FCN_MAX;
-               funcA = (R200_BLEND_GL_ONE << R200_SRC_BLEND_SHIFT) |
-                   (R200_BLEND_GL_ONE << R200_DST_BLEND_SHIFT);
+               eqnA = R300_COMB_FCN_MAX;
+               funcA = (R300_BLEND_GL_ONE << R300_SRC_BLEND_SHIFT) |
+                   (R300_BLEND_GL_ONE << R300_DST_BLEND_SHIFT);
                break;
 
        default:
@@ -371,27 +328,130 @@ static void r300UpdateCulling(GLcontext* ctx)
        r300->hw.cul.cmd[R300_CUL_CULL] = val;
 }
 
-static void update_early_z(GLcontextctx)
+static void update_early_z(GLcontext *ctx)
 {
-       /* updates register 0x4f14 
-          if depth test is not enabled it should be 0x00000000
-          if depth is enabled and alpha not it should be 0x00000001
-          if depth and alpha is enabled it should be 0x00000000
+       /* updates register R300_RB3D_EARLY_Z (0x4F14)
+          if depth test is not enabled it should be R300_EARLY_Z_DISABLE
+          if depth is enabled and alpha not it should be R300_EARLY_Z_ENABLE
+          if depth and alpha is enabled it should be R300_EARLY_Z_DISABLE
        */
        r300ContextPtr r300 = R300_CONTEXT(ctx);
 
-       R300_STATECHANGE(r300, unk4F10);
-       if (ctx->Color.AlphaEnabled)
+       R300_STATECHANGE(r300, zstencil_format);
+       if (ctx->Color.AlphaEnabled && ctx->Color.AlphaFunc != GL_ALWAYS)
                /* disable early Z */
-               r300->hw.unk4F10.cmd[2] = 0x00000000;
+               r300->hw.zstencil_format.cmd[2] = R300_EARLY_Z_DISABLE;
        else {
-               if (ctx->Depth.Test)
+               if (ctx->Depth.Test && ctx->Depth.Func != GL_NEVER)
                        /* enable early Z */
-                       r300->hw.unk4F10.cmd[2] = 0x00000001;
+                       r300->hw.zstencil_format.cmd[2] = R300_EARLY_Z_ENABLE;
                else
                        /* disable early Z */
-                       r300->hw.unk4F10.cmd[2] = 0x00000000;
+                       r300->hw.zstencil_format.cmd[2] = R300_EARLY_Z_DISABLE;
+       }
+}
+
+static void update_alpha(GLcontext *ctx)
+{
+       r300ContextPtr r300 = R300_CONTEXT(ctx);
+       GLubyte refByte;
+       uint32_t pp_misc = 0x0;
+       GLboolean really_enabled = ctx->Color.AlphaEnabled;
+
+       CLAMPED_FLOAT_TO_UBYTE(refByte, ctx->Color.AlphaRef);
+       
+       switch (ctx->Color.AlphaFunc) {
+       case GL_NEVER:
+               pp_misc |= R300_ALPHA_TEST_FAIL;
+               break;
+       case GL_LESS:
+               pp_misc |= R300_ALPHA_TEST_LESS;
+               break;
+       case GL_EQUAL:
+               pp_misc |= R300_ALPHA_TEST_EQUAL;
+               break;
+       case GL_LEQUAL:
+               pp_misc |= R300_ALPHA_TEST_LEQUAL;
+               break;
+       case GL_GREATER:
+               pp_misc |= R300_ALPHA_TEST_GREATER;
+               break;
+       case GL_NOTEQUAL:
+               pp_misc |= R300_ALPHA_TEST_NEQUAL;
+               break;
+       case GL_GEQUAL:
+               pp_misc |= R300_ALPHA_TEST_GEQUAL;
+               break;
+       case GL_ALWAYS:
+               /*pp_misc |= R300_ALPHA_TEST_PASS;*/
+               really_enabled = GL_FALSE;
+               break;
        }
+       
+       if (really_enabled) {
+               pp_misc |= R300_ALPHA_TEST_ENABLE;
+               pp_misc |= (refByte & R300_REF_ALPHA_MASK);
+       } else {
+               pp_misc = 0x0;
+       }
+       
+       
+       R300_STATECHANGE(r300, at);
+       r300->hw.at.cmd[R300_AT_ALPHA_TEST] = pp_misc;
+       update_early_z(ctx);
+}
+
+static void r300AlphaFunc(GLcontext * ctx, GLenum func, GLfloat ref)
+{
+       (void) func;
+       (void) ref;
+       update_alpha(ctx);
+}
+
+static int translate_func(int func)
+{
+       switch (func) {
+       case GL_NEVER:
+               return R300_ZS_NEVER;
+       case GL_LESS:
+               return R300_ZS_LESS;
+       case GL_EQUAL:
+               return R300_ZS_EQUAL;
+       case GL_LEQUAL:
+               return R300_ZS_LEQUAL;
+       case GL_GREATER:
+               return R300_ZS_GREATER;
+       case GL_NOTEQUAL:
+               return R300_ZS_NOTEQUAL;
+       case GL_GEQUAL:
+               return R300_ZS_GEQUAL;
+       case GL_ALWAYS:
+               return R300_ZS_ALWAYS;
+       }
+       return 0;
+}
+
+static void update_depth(GLcontext* ctx)
+{
+       r300ContextPtr r300 = R300_CONTEXT(ctx);
+
+       R300_STATECHANGE(r300, zs);
+       r300->hw.zs.cmd[R300_ZS_CNTL_0] &= R300_RB3D_STENCIL_ENABLE;
+       r300->hw.zs.cmd[R300_ZS_CNTL_1] &= ~(R300_ZS_MASK << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT);
+       
+       if (ctx->Depth.Test && ctx->Depth.Func != GL_NEVER) {
+               if (ctx->Depth.Mask)
+                       r300->hw.zs.cmd[R300_ZS_CNTL_0] |= R300_RB3D_Z_TEST_AND_WRITE;
+               else
+                       r300->hw.zs.cmd[R300_ZS_CNTL_0] |= R300_RB3D_Z_TEST;
+               
+               r300->hw.zs.cmd[R300_ZS_CNTL_1] |= translate_func(ctx->Depth.Func) << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT;
+       } else {
+               r300->hw.zs.cmd[R300_ZS_CNTL_0] |= R300_RB3D_Z_DISABLED_1;
+               r300->hw.zs.cmd[R300_ZS_CNTL_1] |= translate_func(GL_NEVER) << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT;
+       }
+       
+       update_early_z(ctx);
 }
 
 /**
@@ -402,7 +462,6 @@ static void update_early_z(GLcontext* ctx)
 static void r300Enable(GLcontext* ctx, GLenum cap, GLboolean state)
 {
        r300ContextPtr r300 = R300_CONTEXT(ctx);
-       uint32_t newval;
 
        if (RADEON_DEBUG & DEBUG_STATE)
                fprintf(stderr, "%s( %s = %s )\n", __FUNCTION__,
@@ -436,15 +495,7 @@ static void r300Enable(GLcontext* ctx, GLenum cap, GLboolean state)
                break;
 
        case GL_ALPHA_TEST:
-               R300_STATECHANGE(r300, at);
-               if (state) {
-                       r300->hw.at.cmd[R300_AT_ALPHA_TEST] |=
-                           R300_ALPHA_TEST_ENABLE;
-               } else {
-                       r300->hw.at.cmd[R300_AT_ALPHA_TEST] &=
-                           ~R300_ALPHA_TEST_ENABLE;
-               }
-               update_early_z(ctx);
+               update_alpha(ctx);
                break;
 
        case GL_BLEND:
@@ -453,26 +504,13 @@ static void r300Enable(GLcontext* ctx, GLenum cap, GLboolean state)
                break;
 
        case GL_DEPTH_TEST:
-               R300_STATECHANGE(r300, zs);
-
-               if (state) {
-                       if (ctx->Depth.Mask)
-                               newval = R300_RB3D_Z_TEST_AND_WRITE;
-                       else
-                               newval = R300_RB3D_Z_TEST;
-               } else
-                       newval = R300_RB3D_Z_DISABLED_1;
-
-               r300->hw.zs.cmd[R300_ZS_CNTL_0] &= R300_RB3D_STENCIL_ENABLE;
-               r300->hw.zs.cmd[R300_ZS_CNTL_0] |= newval;
-               update_early_z(ctx);
+               update_depth(ctx);
                break;
 
        case GL_STENCIL_TEST:
                if (r300->state.stencil.hw_stencil) {
                        R300_STATECHANGE(r300, zs);
                        if (state) {
-                               WARN_ONCE("TODO - double side stencil !\n");
                                r300->hw.zs.cmd[R300_ZS_CNTL_0] |=
                                    R300_RB3D_STENCIL_ENABLE;
                        } else {
@@ -495,11 +533,11 @@ static void r300Enable(GLcontext* ctx, GLenum cap, GLboolean state)
                break;
 
        case GL_POLYGON_OFFSET_FILL:
-               R300_STATECHANGE(r300, unk42B4);
+               R300_STATECHANGE(r300, occlusion_cntl);
                if(state){
-                       r300->hw.unk42B4.cmd[1] |= (3<<0);
+                       r300->hw.occlusion_cntl.cmd[1] |= (3<<0);
                } else {
-                       r300->hw.unk42B4.cmd[1] &= ~(3<<0);
+                       r300->hw.occlusion_cntl.cmd[1] &= ~(3<<0);
                }
                break;
        default:
@@ -553,9 +591,9 @@ static void r300UpdatePolygonMode(GLcontext *ctx)
                }
        }
 
-       if (r300->hw.unk4288.cmd[1] != hw_mode) {
-               R300_STATECHANGE(r300, unk4288);
-               r300->hw.unk4288.cmd[1] = hw_mode;
+       if (r300->hw.polygon_mode.cmd[1] != hw_mode) {
+               R300_STATECHANGE(r300, polygon_mode);
+               r300->hw.polygon_mode.cmd[1] = hw_mode;
        }
 }
 
@@ -593,38 +631,8 @@ static void r300FrontFace(GLcontext* ctx, GLenum mode)
  */
 static void r300DepthFunc(GLcontext* ctx, GLenum func)
 {
-       r300ContextPtr r300 = R300_CONTEXT(ctx);
-
-       R300_STATECHANGE(r300, zs);
-
-       r300->hw.zs.cmd[R300_ZS_CNTL_1] &= ~(R300_ZS_MASK << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT);
-
-       switch(func) {
-       case GL_NEVER:
-               r300->hw.zs.cmd[R300_ZS_CNTL_1] |= R300_ZS_NEVER << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT;
-               break;
-       case GL_LESS:
-               r300->hw.zs.cmd[R300_ZS_CNTL_1] |= R300_ZS_LESS << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT;
-               break;
-       case GL_EQUAL:
-               r300->hw.zs.cmd[R300_ZS_CNTL_1] |= R300_ZS_EQUAL << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT;
-               break;
-       case GL_LEQUAL:
-               r300->hw.zs.cmd[R300_ZS_CNTL_1] |= R300_ZS_LEQUAL << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT;
-               break;
-       case GL_GREATER:
-               r300->hw.zs.cmd[R300_ZS_CNTL_1] |= R300_ZS_GREATER << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT;
-               break;
-       case GL_NOTEQUAL:
-               r300->hw.zs.cmd[R300_ZS_CNTL_1] |= R300_ZS_NOTEQUAL << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT;
-               break;
-       case GL_GEQUAL:
-               r300->hw.zs.cmd[R300_ZS_CNTL_1] |= R300_ZS_GEQUAL << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT;
-               break;
-       case GL_ALWAYS:
-               r300->hw.zs.cmd[R300_ZS_CNTL_1] |= R300_ZS_ALWAYS << R300_RB3D_ZS1_DEPTH_FUNC_SHIFT;
-               break;
-       }
+       (void) func;
+       update_depth(ctx);
 }
 
 
@@ -635,7 +643,8 @@ static void r300DepthFunc(GLcontext* ctx, GLenum func)
  */
 static void r300DepthMask(GLcontext* ctx, GLboolean mask)
 {
-       r300Enable(ctx, GL_DEPTH_TEST, ctx->Depth.Test);
+       (void) mask;
+       update_depth(ctx);
 }
 
 
@@ -793,29 +802,6 @@ static void r300PolygonMode(GLcontext *ctx, GLenum face, GLenum mode)
  * Stencil
  */
 
-static int translate_stencil_func(int func)
-{
-       switch (func) {
-       case GL_NEVER:
-               return R300_ZS_NEVER;
-       case GL_LESS:
-               return R300_ZS_LESS;
-       case GL_EQUAL:
-               return R300_ZS_EQUAL;
-       case GL_LEQUAL:
-               return R300_ZS_LEQUAL;
-       case GL_GREATER:
-               return R300_ZS_GREATER;
-       case GL_NOTEQUAL:
-               return R300_ZS_NOTEQUAL;
-       case GL_GEQUAL:
-               return R300_ZS_GEQUAL;
-       case GL_ALWAYS:
-               return R300_ZS_ALWAYS;
-       }
-       return 0;
-}
-
 static int translate_stencil_op(int op)
 {
        switch (op) {
@@ -846,13 +832,13 @@ static void r300ShadeModel(GLcontext * ctx, GLenum mode)
 {
        r300ContextPtr rmesa = R300_CONTEXT(ctx);
        
-       R300_STATECHANGE(rmesa, unk4274);
+       R300_STATECHANGE(rmesa, shade);
        switch (mode) {
        case GL_FLAT:
-               rmesa->hw.unk4274.cmd[2] = R300_RE_SHADE_MODEL_FLAT;
+               rmesa->hw.shade.cmd[2] = R300_RE_SHADE_MODEL_FLAT;
                break;
        case GL_SMOOTH:
-               rmesa->hw.unk4274.cmd[2] = R300_RE_SHADE_MODEL_SMOOTH;
+               rmesa->hw.shade.cmd[2] = R300_RE_SHADE_MODEL_SMOOTH;
                break;
        default:
                return;
@@ -877,10 +863,13 @@ static void r300StencilFuncSeparate(GLcontext * ctx, GLenum face,
        rmesa->hw.zs.cmd[R300_ZS_CNTL_2] &=  ~((R300_RB3D_ZS2_STENCIL_MASK << R300_RB3D_ZS2_STENCIL_REF_SHIFT) |
                                                (R300_RB3D_ZS2_STENCIL_MASK << R300_RB3D_ZS2_STENCIL_MASK_SHIFT));
        
-       flag = translate_stencil_func(ctx->Stencil.Function[0]);
-
-       rmesa->hw.zs.cmd[R300_ZS_CNTL_1] |= (flag << R300_RB3D_ZS1_FRONT_FUNC_SHIFT)
-                                         | (flag << R300_RB3D_ZS1_BACK_FUNC_SHIFT);
+       flag = translate_func(ctx->Stencil.Function[0]);
+       rmesa->hw.zs.cmd[R300_ZS_CNTL_1] |= (flag << R300_RB3D_ZS1_FRONT_FUNC_SHIFT);
+       
+       if (ctx->Stencil._TestTwoSide)
+               flag = translate_func(ctx->Stencil.Function[1]);
+       
+       rmesa->hw.zs.cmd[R300_ZS_CNTL_1] |= (flag << R300_RB3D_ZS1_BACK_FUNC_SHIFT);
        rmesa->hw.zs.cmd[R300_ZS_CNTL_2] |= refmask;
 }
 
@@ -909,10 +898,19 @@ static void r300StencilOpSeparate(GLcontext * ctx, GLenum face, GLenum fail,
        rmesa->hw.zs.cmd[R300_ZS_CNTL_1] |=
                 (translate_stencil_op(ctx->Stencil.FailFunc[0]) << R300_RB3D_ZS1_FRONT_FAIL_OP_SHIFT)
                |(translate_stencil_op(ctx->Stencil.ZFailFunc[0]) << R300_RB3D_ZS1_FRONT_ZFAIL_OP_SHIFT)
-               |(translate_stencil_op(ctx->Stencil.ZPassFunc[0]) << R300_RB3D_ZS1_FRONT_ZPASS_OP_SHIFT)
-               |(translate_stencil_op(ctx->Stencil.FailFunc[0]) << R300_RB3D_ZS1_BACK_FAIL_OP_SHIFT)
-               |(translate_stencil_op(ctx->Stencil.ZFailFunc[0]) << R300_RB3D_ZS1_BACK_ZFAIL_OP_SHIFT)
-               |(translate_stencil_op(ctx->Stencil.ZPassFunc[0]) << R300_RB3D_ZS1_BACK_ZPASS_OP_SHIFT);
+               |(translate_stencil_op(ctx->Stencil.ZPassFunc[0]) << R300_RB3D_ZS1_FRONT_ZPASS_OP_SHIFT);
+       
+       if (ctx->Stencil._TestTwoSide) {
+               rmesa->hw.zs.cmd[R300_ZS_CNTL_1] |=
+                        (translate_stencil_op(ctx->Stencil.FailFunc[1]) << R300_RB3D_ZS1_BACK_FAIL_OP_SHIFT)
+                       |(translate_stencil_op(ctx->Stencil.ZFailFunc[1]) << R300_RB3D_ZS1_BACK_ZFAIL_OP_SHIFT)
+                       |(translate_stencil_op(ctx->Stencil.ZPassFunc[1]) << R300_RB3D_ZS1_BACK_ZPASS_OP_SHIFT);
+       } else {
+               rmesa->hw.zs.cmd[R300_ZS_CNTL_1] |=
+                        (translate_stencil_op(ctx->Stencil.FailFunc[0]) << R300_RB3D_ZS1_BACK_FAIL_OP_SHIFT)
+                       |(translate_stencil_op(ctx->Stencil.ZFailFunc[0]) << R300_RB3D_ZS1_BACK_ZFAIL_OP_SHIFT)
+                       |(translate_stencil_op(ctx->Stencil.ZPassFunc[0]) << R300_RB3D_ZS1_BACK_ZPASS_OP_SHIFT);
+       }
 }
 
 static void r300ClearStencil(GLcontext * ctx, GLint s)
@@ -987,15 +985,15 @@ void r300UpdateViewportOffset( GLcontext *ctx )
        GLfloat tx = v[MAT_TX] + xoffset + SUBPIXEL_X;
        GLfloat ty = (- v[MAT_TY]) + yoffset + SUBPIXEL_Y;
 
-       if ( rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] != r300PackFloat32(tx) ||
-               rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] != r300PackFloat32(ty))
+       if ( rmesa->hw.vpt.cmd[R300_VPT_XOFFSET] != r300PackFloat32(tx) ||
+               rmesa->hw.vpt.cmd[R300_VPT_YOFFSET] != r300PackFloat32(ty))
        {
        /* Note: this should also modify whatever data the context reset
         * code uses...
         */
        R300_STATECHANGE( rmesa, vpt );
-       rmesa->hw.vpt.cmd[VPT_SE_VPORT_XOFFSET] = r300PackFloat32(tx);
-       rmesa->hw.vpt.cmd[VPT_SE_VPORT_YOFFSET] = r300PackFloat32(ty);
+       rmesa->hw.vpt.cmd[R300_VPT_XOFFSET] = r300PackFloat32(tx);
+       rmesa->hw.vpt.cmd[R300_VPT_YOFFSET] = r300PackFloat32(ty);
       
        }
 
@@ -1059,6 +1057,61 @@ r300UpdateDrawBuffer(GLcontext *ctx)
 #endif
 }
 
+static void
+r300FetchStateParameter(GLcontext *ctx,
+                        const gl_state_index state[STATE_LENGTH],
+                        GLfloat *value)
+{
+    r300ContextPtr r300 = R300_CONTEXT(ctx);
+
+    switch(state[0])
+    {
+    case STATE_INTERNAL:
+       switch(state[1])
+       {
+       case STATE_R300_WINDOW_DIMENSION:
+           value[0] = r300->radeon.dri.drawable->w*0.5f;/* width*0.5 */
+           value[1] = r300->radeon.dri.drawable->h*0.5f;/* height*0.5 */
+           value[2] = 0.5F;                            /* for moving range [-1 1] -> [0 1] */
+           value[3] = 1.0F;                            /* not used */
+           break;
+       default:;
+       }
+    default:;
+    }
+}
+
+/**
+ * Update R300's own internal state parameters.
+ * For now just STATE_R300_WINDOW_DIMENSION
+ */
+void r300UpdateStateParameters(GLcontext * ctx, GLuint new_state)
+{
+       struct r300_fragment_program *fp;
+       struct gl_program_parameter_list *paramList;
+       GLuint i;
+
+       if(!(new_state & (_NEW_BUFFERS|_NEW_PROGRAM)))
+           return;
+
+       fp = (struct r300_fragment_program *)ctx->FragmentProgram._Current;
+       if (!fp)
+           return;
+
+       paramList = fp->mesa_program.Base.Parameters;
+
+       if (!paramList)
+           return;
+
+       for (i = 0; i < paramList->NumParameters; i++) {
+               if (paramList->Parameters[i].Type == PROGRAM_STATE_VAR){
+                       r300FetchStateParameter(ctx,
+                                   paramList->Parameters[i].StateIndexes,
+                                   paramList->ParameterValues[i]);
+               }
+       }
+}
+
 /* =============================================================
  * Polygon state
  */
@@ -1168,12 +1221,12 @@ void r300_setup_textures(GLcontext *ctx)
 
        R300_STATECHANGE(r300, txe);
        R300_STATECHANGE(r300, tex.filter);
-       R300_STATECHANGE(r300, tex.unknown1);
+       R300_STATECHANGE(r300, tex.filter_1);
        R300_STATECHANGE(r300, tex.size);
        R300_STATECHANGE(r300, tex.format);
        R300_STATECHANGE(r300, tex.pitch);
        R300_STATECHANGE(r300, tex.offset);
-       R300_STATECHANGE(r300, tex.unknown4);
+       R300_STATECHANGE(r300, tex.chroma_key);
        R300_STATECHANGE(r300, tex.border_color);
        
        r300->hw.txe.cmd[R300_TXE_ENABLE]=0x0;
@@ -1210,7 +1263,7 @@ void r300_setup_textures(GLcontext *ctx)
                        
                        r300->hw.tex.filter.cmd[R300_TEX_VALUE_0 + hw_tmu] = gen_fixed_filter(t->filter) | (hw_tmu << 28);
                        /* Currently disabled! */
-                       r300->hw.tex.unknown1.cmd[R300_TEX_VALUE_0 + hw_tmu] = 0x0; //0x20501f80;
+                       r300->hw.tex.filter_1.cmd[R300_TEX_VALUE_0 + hw_tmu] = 0x0; //0x20501f80;
                        r300->hw.tex.size.cmd[R300_TEX_VALUE_0 + hw_tmu] = t->size;
                        r300->hw.tex.format.cmd[R300_TEX_VALUE_0 + hw_tmu] = t->format;
                        r300->hw.tex.pitch.cmd[R300_TEX_VALUE_0 + hw_tmu] = t->pitch_reg;
@@ -1224,7 +1277,7 @@ void r300_setup_textures(GLcontext *ctx)
                                WARN_ONCE("micro tiling enabled!\n");
                        }
                        
-                       r300->hw.tex.unknown4.cmd[R300_TEX_VALUE_0 + hw_tmu] = 0x0;
+                       r300->hw.tex.chroma_key.cmd[R300_TEX_VALUE_0 + hw_tmu] = 0x0;
                        r300->hw.tex.border_color.cmd[R300_TEX_VALUE_0 + hw_tmu] = t->pp_border_color;
                        
                        last_hw_tmu = hw_tmu;
@@ -1234,12 +1287,12 @@ void r300_setup_textures(GLcontext *ctx)
        }
        
        r300->hw.tex.filter.cmd[R300_TEX_CMD_0] = cmdpacket0(R300_TX_FILTER_0, last_hw_tmu + 1);
-       r300->hw.tex.unknown1.cmd[R300_TEX_CMD_0] = cmdpacket0(R300_TX_FILTER1_0, last_hw_tmu + 1);
+       r300->hw.tex.filter_1.cmd[R300_TEX_CMD_0] = cmdpacket0(R300_TX_FILTER1_0, last_hw_tmu + 1);
        r300->hw.tex.size.cmd[R300_TEX_CMD_0] = cmdpacket0(R300_TX_SIZE_0, last_hw_tmu + 1);
        r300->hw.tex.format.cmd[R300_TEX_CMD_0] = cmdpacket0(R300_TX_FORMAT_0, last_hw_tmu + 1);
        r300->hw.tex.pitch.cmd[R300_TEX_CMD_0] = cmdpacket0(R300_TX_PITCH_0, last_hw_tmu + 1);
        r300->hw.tex.offset.cmd[R300_TEX_CMD_0] = cmdpacket0(R300_TX_OFFSET_0, last_hw_tmu + 1);
-       r300->hw.tex.unknown4.cmd[R300_TEX_CMD_0] = cmdpacket0(R300_TX_CHROMA_KEY_0, last_hw_tmu + 1);
+       r300->hw.tex.chroma_key.cmd[R300_TEX_CMD_0] = cmdpacket0(R300_TX_CHROMA_KEY_0, last_hw_tmu + 1);
        r300->hw.tex.border_color.cmd[R300_TEX_CMD_0] = cmdpacket0(R300_TX_BORDER_COLOR_0, last_hw_tmu + 1);
        
        
@@ -1300,7 +1353,7 @@ void r300_setup_rs_unit(GLcontext *ctx)
        int i;
 
        if(hw_tcl_on)
-               OutputsWritten.vp_outputs = CURRENT_VERTEX_SHADER(ctx)->Base.OutputsWritten;
+               OutputsWritten.vp_outputs = CURRENT_VERTEX_SHADER(ctx)->key.OutputsWritten;
        else
                RENDERINPUTS_COPY( OutputsWritten.index_bitset, r300->state.render_inputs_bitset );
 
@@ -1316,19 +1369,34 @@ void r300_setup_rs_unit(GLcontext *ctx)
        R300_STATECHANGE(r300, rr);
        
        fp_reg = in_texcoords = col_interp_nr = high_rr = 0;
-       r300->hw.rr.cmd[R300_RR_ROUTE_0] = 0;
+
        r300->hw.rr.cmd[R300_RR_ROUTE_1] = 0;
+       
+       if (InputsRead & FRAG_BIT_WPOS){
+               for (i = 0; i < ctx->Const.MaxTextureUnits; i++)
+                       if (!(InputsRead & (FRAG_BIT_TEX0 << i)))
+                               break;
+
+               if(i == ctx->Const.MaxTextureUnits){
+                       fprintf(stderr, "\tno free texcoord found...\n");
+                       exit(0);
+               }
 
+               InputsRead |= (FRAG_BIT_TEX0 << i);
+               InputsRead &= ~FRAG_BIT_WPOS;
+       }
+       
        for (i=0;i<ctx->Const.MaxTextureUnits;i++) {
                r300->hw.ri.cmd[R300_RI_INTERP_0+i] = 0
                                | R300_RS_INTERP_USED
                                | (in_texcoords << R300_RS_INTERP_SRC_SHIFT)
                                | interp_magic[i];
 
+               r300->hw.rr.cmd[R300_RR_ROUTE_0 + fp_reg] = 0;
                if (InputsRead & (FRAG_BIT_TEX0<<i)) {
                        //assert(r300->state.texture.tc_count != 0);
-                       r300->hw.rr.cmd[R300_RR_ROUTE_0 + fp_reg] = 0
-                                       | R300_RS_ROUTE_ENABLE
+                       r300->hw.rr.cmd[R300_RR_ROUTE_0 + fp_reg] |=
+                                         R300_RS_ROUTE_ENABLE
                                        | i /* source INTERP */
                                        | (fp_reg << R300_RS_ROUTE_DEST_SHIFT);
                        high_rr = fp_reg;
@@ -1525,26 +1593,16 @@ static void r300GenerateSimpleVertexShader(r300ContextPtr r300)
                )
        o_reg += 2;
        
-       if (RENDERINPUTS_TEST( r300->state.render_inputs_bitset, _TNL_ATTRIB_COLOR1 )) {
-               WRITE_OP(
-                       EASY_VSF_OP(MUL, o_reg++, ALL, RESULT),
-                       VSF_REG(r300->state.vap_reg.i_color[1]),
-                       VSF_ATTR_UNITY(r300->state.vap_reg.i_color[1]),
-                       VSF_UNITY(r300->state.vap_reg.i_color[1])
-               )
-       }
-       
-       /* Pass through texture coordinates, if any */
-       for(i=0;i < r300->radeon.glCtx->Const.MaxTextureUnits;i++)
-               if (RENDERINPUTS_TEST( r300->state.render_inputs_bitset, _TNL_ATTRIB_TEX(i) )){
-                       // fprintf(stderr, "i_tex[%d]=%d\n", i, r300->state.vap_reg.i_tex[i]);
+       for (i = VERT_ATTRIB_COLOR1; i < VERT_ATTRIB_MAX; i++)
+               if (r300->state.sw_tcl_inputs[i] != -1) {
                        WRITE_OP(
                                EASY_VSF_OP(MUL, o_reg++ /* 2+i */, ALL, RESULT),
-                               VSF_REG(r300->state.vap_reg.i_tex[i]),
-                               VSF_ATTR_UNITY(r300->state.vap_reg.i_tex[i]),
-                               VSF_UNITY(r300->state.vap_reg.i_tex[i])
+                               VSF_REG(r300->state.sw_tcl_inputs[i]),
+                               VSF_ATTR_UNITY(r300->state.sw_tcl_inputs[i]),
+                               VSF_UNITY(r300->state.sw_tcl_inputs[i])
                                )
-                       }
+               
+               }
        
        r300->state.vertex_shader.program_end--; /* r300 wants program length to be one more - no idea why */
        r300->state.vertex_shader.program.length=(r300->state.vertex_shader.program_end+1)*4;
@@ -1634,7 +1692,7 @@ void r300SetupVertexProgram(r300ContextPtr rmesa)
 
        ((drm_r300_cmd_header_t*)rmesa->hw.vpp.cmd)->vpu.count = 0;
        R300_STATECHANGE(rmesa, vpp);
-       param_count = r300VertexProgUpdateParams(ctx, prog, (float *)&rmesa->hw.vpp.cmd[R300_VPP_PARAM_0]);
+       param_count = r300VertexProgUpdateParams(ctx, (struct r300_vertex_program_cont *)ctx->VertexProgram._Current/*prog*/, (float *)&rmesa->hw.vpp.cmd[R300_VPP_PARAM_0]);
        bump_vpu_count(rmesa->hw.vpp.cmd, param_count);
        param_count /= 4;
        
@@ -1675,21 +1733,28 @@ void r300UpdateShaders(r300ContextPtr rmesa)
 {
        GLcontext *ctx;
        struct r300_vertex_program *vp;
+       int i;
        
        ctx = rmesa->radeon.glCtx;
        
-       /* Disable tnl programs when doing software vertex programs.
-          I can only hope this actually disables it at the right time. */
-       ctx->_MaintainTnlProgram = hw_tcl_on;
-       
        if (rmesa->NewGLState && hw_tcl_on) {
                rmesa->NewGLState = 0;
                
+               for (i = _TNL_FIRST_MAT; i <= _TNL_LAST_MAT; i++) {
+                       rmesa->temp_attrib[i] = TNL_CONTEXT(ctx)->vb.AttribPtr[i];
+                       TNL_CONTEXT(ctx)->vb.AttribPtr[i] = &rmesa->dummy_attrib[i];
+               }
+               
                _tnl_UpdateFixedFunctionProgram(ctx);
        
+               for (i = _TNL_FIRST_MAT; i <= _TNL_LAST_MAT; i++) {
+                       TNL_CONTEXT(ctx)->vb.AttribPtr[i] = rmesa->temp_attrib[i];
+               }
+               
+               r300_select_vertex_shader(rmesa);
                vp = (struct r300_vertex_program *)CURRENT_VERTEX_SHADER(ctx);
-               if (vp->translated == GL_FALSE)
-                       r300_translate_vertex_shader(vp);
+               /*if (vp->translated == GL_FALSE)
+                       r300_translate_vertex_shader(vp);*/
                if (vp->translated == GL_FALSE) {
                        fprintf(stderr, "Failing back to sw-tcl\n");
                        hw_tcl_on = future_hw_tcl_on = 0;
@@ -1697,6 +1762,7 @@ void r300UpdateShaders(r300ContextPtr rmesa)
 
                        return ;
                }
+               r300UpdateStateParameters(ctx, _NEW_PROGRAM);
        }
        
 }
@@ -1706,9 +1772,7 @@ void r300UpdateShaderStates(r300ContextPtr rmesa)
        GLcontext *ctx;
        ctx = rmesa->radeon.glCtx;
        
-#ifdef CB_DPATH
        r300UpdateTextureState(ctx);
-#endif
 
        r300SetupPixelShader(rmesa);
        r300_setup_textures(ctx);
@@ -1758,10 +1822,10 @@ void r300SetupPixelShader(r300ContextPtr rmesa)
        if (!rp)        /* should only happenen once, just after context is created */
                return;
        
-       r300_translate_fragment_shader(rp);
+       r300_translate_fragment_shader(rmesa, rp);
        if (!rp->translated) {
                fprintf(stderr, "%s: No valid fragment shader, exiting\n", __func__);
-               exit(-1);
+               return;
        }
        
 #define OUTPUT_FIELD(st, reg, field)  \
@@ -1823,17 +1887,16 @@ static void r300InvalidateState(GLcontext * ctx, GLuint new_state)
        
        _swrast_InvalidateState(ctx, new_state);
        _swsetup_InvalidateState(ctx, new_state);
-       _ac_InvalidateState(ctx, new_state);
+       _vbo_InvalidateState(ctx, new_state);
        _tnl_InvalidateState(ctx, new_state);
        _ae_invalidate_state(ctx, new_state);
 
        if (new_state & (_NEW_BUFFERS | _NEW_COLOR | _NEW_PIXEL)) {
                r300UpdateDrawBuffer(ctx);
        }
-#ifndef CB_DPATH
-       /* Go inefficiency! */
-       r300ResetHwState(r300);
-#endif
+
+       r300UpdateStateParameters(ctx, new_state);
+
 #ifdef HW_VBOS
        if(new_state & _NEW_ARRAY)
                r300->state.VB.lock_uptodate = GL_FALSE;
@@ -1914,7 +1977,7 @@ void r300ResetHwState(r300ContextPtr r300)
                /* Initialize magic registers
                 TODO : learn what they really do, or get rid of
                 those we don't have to touch */
-       r300->hw.unk2080.cmd[1] = 0x0030045A; //0x0030065a /* Dangerous */
+       r300->hw.vap_cntl.cmd[1] = 0x0030045A; //0x0030065a /* Dangerous */
 
        r300->hw.vte.cmd[1] = R300_VPORT_X_SCALE_ENA
                                | R300_VPORT_X_OFFSET_ENA
@@ -1927,11 +1990,10 @@ void r300ResetHwState(r300ContextPtr r300)
 
        r300->hw.unk2134.cmd[1] = 0x00FFFFFF;
        r300->hw.unk2134.cmd[2] = 0x00000000;
-#ifdef MESA_BIG_ENDIAN
-       r300->hw.unk2140.cmd[1] = 0x00000002;
-#else
-       r300->hw.unk2140.cmd[1] = 0x00000000;
-#endif
+       if (_mesa_little_endian())
+               r300->hw.vap_cntl_status.cmd[1] = 0x00000000;
+       else
+               r300->hw.vap_cntl_status.cmd[1] = 0x00000002;
 
 #if 0 /* Done in setup routing */
        ((drm_r300_cmd_header_t*)r300->hw.vir[0].cmd)->packet0.count = 1;
@@ -2022,16 +2084,16 @@ void r300ResetHwState(r300ContextPtr r300)
        r300->hw.unk4260.cmd[2] = r300PackFloat32(0.0);
        r300->hw.unk4260.cmd[3] = r300PackFloat32(1.0);
 
-       r300->hw.unk4274.cmd[1] = 0x00000002;
+       r300->hw.shade.cmd[1] = 0x00000002;
        r300ShadeModel(ctx, ctx->Light.ShadeModel);
-       r300->hw.unk4274.cmd[3] = 0x00000000;
-       r300->hw.unk4274.cmd[4] = 0x00000000;
+       r300->hw.shade.cmd[3] = 0x00000000;
+       r300->hw.shade.cmd[4] = 0x00000000;
 
        r300PolygonMode(ctx, GL_FRONT, ctx->Polygon.FrontMode);
        r300PolygonMode(ctx, GL_BACK, ctx->Polygon.BackMode);
-       r300->hw.unk4288.cmd[2] = 0x00000001;
-       r300->hw.unk4288.cmd[3] = 0x00000000;
-       r300->hw.unk42A0.cmd[1] = 0x00000000;
+       r300->hw.polygon_mode.cmd[2] = 0x00000001;
+       r300->hw.polygon_mode.cmd[3] = 0x00000000;
+       r300->hw.zbias_cntl.cmd[1] = 0x00000000;
 
        r300PolygonOffset(ctx, ctx->Polygon.OffsetFactor, ctx->Polygon.OffsetUnits);
        r300Enable(ctx, GL_POLYGON_OFFSET_FILL, ctx->Polygon.OffsetFill);
@@ -2089,8 +2151,8 @@ void r300ResetHwState(r300ContextPtr r300)
 #endif
 
        r300BlendColor(ctx, ctx->Color.BlendColor);
-       r300->hw.unk4E10.cmd[2] = 0;
-       r300->hw.unk4E10.cmd[3] = 0;
+       r300->hw.blend_color.cmd[2] = 0;
+       r300->hw.blend_color.cmd[3] = 0;
        
        /* Again, r300ClearBuffer uses this */
        r300->hw.cb.cmd[R300_CB_OFFSET] = r300->radeon.state.color.drawOffset +
@@ -2122,10 +2184,10 @@ void r300ResetHwState(r300ContextPtr r300)
 
        switch (ctx->Visual.depthBits) {
        case 16:
-               r300->hw.unk4F10.cmd[1] = R300_DEPTH_FORMAT_16BIT_INT_Z;
+               r300->hw.zstencil_format.cmd[1] = R300_DEPTH_FORMAT_16BIT_INT_Z;
        break;
        case 24:
-               r300->hw.unk4F10.cmd[1] = R300_DEPTH_FORMAT_24BIT_INT_Z;
+               r300->hw.zstencil_format.cmd[1] = R300_DEPTH_FORMAT_24BIT_INT_Z;
        break;
        default:
                fprintf(stderr, "Error: Unsupported depth %d... exiting\n",
@@ -2134,10 +2196,10 @@ void r300ResetHwState(r300ContextPtr r300)
                        
        }
        /* z compress? */
-       //r300->hw.unk4F10.cmd[1] |= R300_DEPTH_FORMAT_UNK32;
+       //r300->hw.zstencil_format.cmd[1] |= R300_DEPTH_FORMAT_UNK32;
        
-       r300->hw.unk4F10.cmd[3] = 0x00000003;
-       r300->hw.unk4F10.cmd[4] = 0x00000000;
+       r300->hw.zstencil_format.cmd[3] = 0x00000003;
+       r300->hw.zstencil_format.cmd[4] = 0x00000000;
 
        r300->hw.zb.cmd[R300_ZB_OFFSET] =
                r300->radeon.radeonScreen->depthOffset +
@@ -2202,12 +2264,12 @@ void r300InitState(r300ContextPtr r300)
        switch (ctx->Visual.depthBits) {
        case 16:
                r300->state.depth.scale = 1.0 / (GLfloat) 0xffff;
-               depth_fmt = R200_DEPTH_FORMAT_16BIT_INT_Z;
+               depth_fmt = R300_DEPTH_FORMAT_16BIT_INT_Z;
                r300->state.stencil.clear = 0x00000000;
                break;
        case 24:
                r300->state.depth.scale = 1.0 / (GLfloat) 0xffffff;
-               depth_fmt = R200_DEPTH_FORMAT_24BIT_INT_Z;
+               depth_fmt = R300_DEPTH_FORMAT_24BIT_INT_Z;
                r300->state.stencil.clear = 0x00ff0000;
                break;
        default: