nv10,nv20,nv30: color light components renamed from a,b,c to r,g,b
[mesa.git] / src / mesa / drivers / dri / nouveau / nv30_state.c
index bf3338d499b5a5233eeed6d996d6ba0426191f3b..630b84df63ec24a9ad52c53c8daf4e8de1ac6def 100644 (file)
@@ -28,21 +28,24 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "nouveau_object.h"
 #include "nouveau_fifo.h"
 #include "nouveau_reg.h"
+#include "nouveau_state.h"
 
 #include "tnl/t_pipeline.h"
 
 #include "mtypes.h"
 #include "colormac.h"
 
+#define NOUVEAU_CARD_USING_SHADERS (nmesa->screen->card->type >= NV_40)
+
 static void nv30AlphaFunc(GLcontext *ctx, GLenum func, GLfloat ref)
 {
        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
        GLubyte ubRef;
        CLAMPED_FLOAT_TO_UBYTE(ubRef, ref);
 
-       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_ALPHA_FUNC_FUNC, 2);
-       OUT_RING(func);     /* NV30_TCL_PRIMITIVE_3D_ALPHA_FUNC_FUNC */
-       OUT_RING(ubRef);    /* NV30_TCL_PRIMITIVE_3D_ALPHA_FUNC_REF  */
+       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_ALPHA_FUNC_FUNC, 2);
+       OUT_RING_CACHE(func);     /* NV30_TCL_PRIMITIVE_3D_ALPHA_FUNC_FUNC */
+       OUT_RING_CACHE(ubRef);    /* NV30_TCL_PRIMITIVE_3D_ALPHA_FUNC_REF  */
 }
 
 static void nv30BlendColor(GLcontext *ctx, const GLfloat color[4])
@@ -55,15 +58,15 @@ static void nv30BlendColor(GLcontext *ctx, const GLfloat color[4])
        CLAMPED_FLOAT_TO_UBYTE(cf[2], color[2]);
        CLAMPED_FLOAT_TO_UBYTE(cf[3], color[3]);
 
-       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_BLEND_COLOR, 1);
-       OUT_RING(PACK_COLOR_8888(cf[3], cf[1], cf[2], cf[0]));
+       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_BLEND_COLOR, 1);
+       OUT_RING_CACHE(PACK_COLOR_8888(cf[3], cf[1], cf[2], cf[0]));
 }
 
 static void nv30BlendEquationSeparate(GLcontext *ctx, GLenum modeRGB, GLenum modeA)
 {
        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
-       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_BLEND_EQUATION, 1);
-       OUT_RING((modeA<<16) | modeRGB);
+       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_BLEND_EQUATION, 1);
+       OUT_RING_CACHE((modeA<<16) | modeRGB);
 }
 
 
@@ -71,9 +74,9 @@ static void nv30BlendFuncSeparate(GLcontext *ctx, GLenum sfactorRGB, GLenum dfac
                GLenum sfactorA, GLenum dfactorA)
 {
        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
-       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_BLEND_FUNC_SRC, 2);
-       OUT_RING((sfactorA<<16) | sfactorRGB);
-       OUT_RING((dfactorA<<16) | dfactorRGB);
+       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_BLEND_FUNC_SRC, 2);
+       OUT_RING_CACHE((sfactorA<<16) | sfactorRGB);
+       OUT_RING_CACHE((dfactorA<<16) | dfactorRGB);
 }
 
 static void nv30ClearColor(GLcontext *ctx, const GLfloat color[4])
@@ -81,16 +84,16 @@ static void nv30ClearColor(GLcontext *ctx, const GLfloat color[4])
        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
        GLubyte c[4];
        UNCLAMPED_FLOAT_TO_RGBA_CHAN(c,color);
-       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_CLEAR_VALUE_ARGB, 1);
-       OUT_RING(PACK_COLOR_8888(c[3],c[0],c[1],c[2]));
+       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_CLEAR_VALUE_ARGB, 1);
+       OUT_RING_CACHE(PACK_COLOR_8888(c[3],c[0],c[1],c[2]));
 }
 
 static void nv30ClearDepth(GLcontext *ctx, GLclampd d)
 {
        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
        nmesa->clear_value=((nmesa->clear_value&0x000000FF)|(((uint32_t)(d*0xFFFFFF))<<8));
-       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_CLEAR_VALUE_DEPTH, 1);
-       OUT_RING(nmesa->clear_value);
+       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_CLEAR_VALUE_DEPTH, 1);
+       OUT_RING_CACHE(nmesa->clear_value);
 }
 
 /* we're don't support indexed buffers
@@ -101,26 +104,26 @@ static void nv30ClearStencil(GLcontext *ctx, GLint s)
 {
        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
        nmesa->clear_value=((nmesa->clear_value&0xFFFFFF00)|(s&0x000000FF));
-       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_CLEAR_VALUE_DEPTH, 1);
-       OUT_RING(nmesa->clear_value);
+       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_CLEAR_VALUE_DEPTH, 1);
+       OUT_RING_CACHE(nmesa->clear_value);
 }
 
 static void nv30ClipPlane(GLcontext *ctx, GLenum plane, const GLfloat *equation)
 {
        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
-       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_CLIP_PLANE_A(plane), 4);
-       OUT_RINGf(equation[0]);
-       OUT_RINGf(equation[1]);
-       OUT_RINGf(equation[2]);
-       OUT_RINGf(equation[3]);
+       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_CLIP_PLANE_A(plane), 4);
+       OUT_RING_CACHEf(equation[0]);
+       OUT_RING_CACHEf(equation[1]);
+       OUT_RING_CACHEf(equation[2]);
+       OUT_RING_CACHEf(equation[3]);
 }
 
 static void nv30ColorMask(GLcontext *ctx, GLboolean rmask, GLboolean gmask,
                GLboolean bmask, GLboolean amask )
 {
        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
-       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_COLOR_MASK, 1);
-       OUT_RING(((amask && 0x01) << 24) | ((rmask && 0x01) << 16) | ((gmask && 0x01)<< 8) | ((bmask && 0x01) << 0));
+       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_COLOR_MASK, 1);
+       OUT_RING_CACHE(((amask && 0x01) << 24) | ((rmask && 0x01) << 16) | ((gmask && 0x01)<< 8) | ((bmask && 0x01) << 0));
 }
 
 static void nv30ColorMaterial(GLcontext *ctx, GLenum face, GLenum mode)
@@ -131,37 +134,37 @@ static void nv30ColorMaterial(GLcontext *ctx, GLenum face, GLenum mode)
 static void nv30CullFace(GLcontext *ctx, GLenum mode)
 {
        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
-       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_CULL_FACE, 1);
-       OUT_RING(mode);
+       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_CULL_FACE, 1);
+       OUT_RING_CACHE(mode);
 }
 
 static void nv30FrontFace(GLcontext *ctx, GLenum mode)
 {
        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
-       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_FRONT_FACE, 1);
-       OUT_RING(mode);
+       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_FRONT_FACE, 1);
+       OUT_RING_CACHE(mode);
 }
 
 static void nv30DepthFunc(GLcontext *ctx, GLenum func)
 {
        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
-       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_DEPTH_FUNC, 1);
-       OUT_RING(func);
+       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_DEPTH_FUNC, 1);
+       OUT_RING_CACHE(func);
 }
 
 static void nv30DepthMask(GLcontext *ctx, GLboolean flag)
 {
        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
-       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_DEPTH_WRITE_ENABLE, 1);
-       OUT_RING(flag);
+       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_DEPTH_WRITE_ENABLE, 1);
+       OUT_RING_CACHE(flag);
 }
 
 static void nv30DepthRange(GLcontext *ctx, GLclampd nearval, GLclampd farval)
 {
        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
-       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_DEPTH_RANGE_NEAR, 2);
-       OUT_RINGf(nearval);
-       OUT_RINGf(farval);
+       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_DEPTH_RANGE_NEAR, 2);
+       OUT_RING_CACHEf(nearval);
+       OUT_RING_CACHEf(farval);
 }
 
 /** Specify the current buffer for writing */
@@ -175,13 +178,13 @@ static void nv30Enable(GLcontext *ctx, GLenum cap, GLboolean state)
        switch(cap)
        {
                case GL_ALPHA_TEST:
-                       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_ALPHA_FUNC_ENABLE, 1);
-                       OUT_RING(state);
+                       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_ALPHA_FUNC_ENABLE, 1);
+                       OUT_RING_CACHE(state);
                        break;
 //             case GL_AUTO_NORMAL:
                case GL_BLEND:
-                       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_BLEND_FUNC_ENABLE, 1);
-                       OUT_RING(state);
+                       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_BLEND_FUNC_ENABLE, 1);
+                       OUT_RING_CACHE(state);
                        break;
                case GL_CLIP_PLANE0:
                case GL_CLIP_PLANE1:
@@ -189,12 +192,12 @@ static void nv30Enable(GLcontext *ctx, GLenum cap, GLboolean state)
                case GL_CLIP_PLANE3:
                case GL_CLIP_PLANE4:
                case GL_CLIP_PLANE5:
-                       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_CLIP_PLANE_ENABLE(cap-GL_CLIP_PLANE0), 1);
-                       OUT_RING(state);
+                       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_CLIP_PLANE_ENABLE(cap-GL_CLIP_PLANE0), 1);
+                       OUT_RING_CACHE(state);
                        break;
                case GL_COLOR_LOGIC_OP:
-                       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_COLOR_LOGIC_OP_ENABLE, 1);
-                       OUT_RING(state);
+                       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_COLOR_LOGIC_OP_ENABLE, 1);
+                       OUT_RING_CACHE(state);
                        break;
 //             case GL_COLOR_MATERIAL:
 //             case GL_COLOR_SUM_EXT:
@@ -202,20 +205,20 @@ static void nv30Enable(GLcontext *ctx, GLenum cap, GLboolean state)
 //             case GL_CONVOLUTION_1D:
 //             case GL_CONVOLUTION_2D:
                case GL_CULL_FACE:
-                       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_CULL_FACE_ENABLE, 1);
-                       OUT_RING(state);
+                       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_CULL_FACE_ENABLE, 1);
+                       OUT_RING_CACHE(state);
                        break;
                case GL_DEPTH_TEST:
-                       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_DEPTH_TEST_ENABLE, 1);
-                       OUT_RING(state);
+                       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_DEPTH_TEST_ENABLE, 1);
+                       OUT_RING_CACHE(state);
                        break;
                case GL_DITHER:
-                       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_DITHER_ENABLE, 1);
-                       OUT_RING(state);
+                       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_DITHER_ENABLE, 1);
+                       OUT_RING_CACHE(state);
                        break;
                case GL_FOG:
-                       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_FOG_ENABLE, 1);
-                       OUT_RING(state);
+                       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_FOG_ENABLE, 1);
+                       OUT_RING_CACHE(state);
                        break;
 //             case GL_HISTOGRAM:
 //             case GL_INDEX_LOGIC_OP:
@@ -229,21 +232,28 @@ static void nv30Enable(GLcontext *ctx, GLenum cap, GLboolean state)
                case GL_LIGHT7:
                        {
                        uint32_t mask=0x11<<(2*(cap-GL_LIGHT0));
+
+                       if (NOUVEAU_CARD_USING_SHADERS)
+                               break;
+
                        nmesa->enabled_lights=((nmesa->enabled_lights&mask)|(mask*state));
                        if (nmesa->lighting_enabled)
                        {
-                               BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_ENABLED_LIGHTS, 1);
-                               OUT_RING(nmesa->enabled_lights);
+                               BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_ENABLED_LIGHTS, 1);
+                               OUT_RING_CACHE(nmesa->enabled_lights);
                        }
                        break;
                        }
                case GL_LIGHTING:
+                       if (NOUVEAU_CARD_USING_SHADERS)
+                               break;
+
                        nmesa->lighting_enabled=state;
-                       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_ENABLED_LIGHTS, 1);
+                       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_ENABLED_LIGHTS, 1);
                        if (nmesa->lighting_enabled)
-                               OUT_RING(nmesa->enabled_lights);
+                               OUT_RING_CACHE(nmesa->enabled_lights);
                        else
-                               OUT_RING(0x0);
+                               OUT_RING_CACHE(0x0);
                        break;
 //             case GL_LINE_SMOOTH:
 //             case GL_LINE_STIPPLE:
@@ -267,29 +277,29 @@ static void nv30Enable(GLcontext *ctx, GLenum cap, GLboolean state)
 //             case GL_MAP2_VERTEX_4:
 //             case GL_MINMAX:
                case GL_NORMALIZE:
-                       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_NORMALIZE_ENABLE, 1);
-                       OUT_RING(state);
+                       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_NORMALIZE_ENABLE, 1);
+                       OUT_RING_CACHE(state);
                        break;
 //             case GL_POINT_SMOOTH:
                case GL_POLYGON_OFFSET_POINT:
-                       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_POLYGON_OFFSET_POINT_ENABLE, 1);
-                       OUT_RING(state);
+                       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_POLYGON_OFFSET_POINT_ENABLE, 1);
+                       OUT_RING_CACHE(state);
                        break;
                case GL_POLYGON_OFFSET_LINE:
-                       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_POLYGON_OFFSET_LINE_ENABLE, 1);
-                       OUT_RING(state);
+                       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_POLYGON_OFFSET_LINE_ENABLE, 1);
+                       OUT_RING_CACHE(state);
                        break;
                case GL_POLYGON_OFFSET_FILL:
-                       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_POLYGON_OFFSET_FILL_ENABLE, 1);
-                       OUT_RING(state);
+                       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_POLYGON_OFFSET_FILL_ENABLE, 1);
+                       OUT_RING_CACHE(state);
                        break;
                case GL_POLYGON_SMOOTH:
-                       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_POLYGON_SMOOTH_ENABLE, 1);
-                       OUT_RING(state);
+                       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_POLYGON_SMOOTH_ENABLE, 1);
+                       OUT_RING_CACHE(state);
                        break;
                case GL_POLYGON_STIPPLE:
-                       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_POLYGON_STIPPLE_ENABLE, 1);
-                       OUT_RING(state);
+                       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_POLYGON_STIPPLE_ENABLE, 1);
+                       OUT_RING_CACHE(state);
                        break;
 //             case GL_POST_COLOR_MATRIX_COLOR_TABLE:
 //             case GL_POST_CONVOLUTION_COLOR_TABLE:
@@ -298,8 +308,8 @@ static void nv30Enable(GLcontext *ctx, GLenum cap, GLboolean state)
 //             case GL_SEPARABLE_2D:
                case GL_STENCIL_TEST:
                        // TODO BACK and FRONT ?
-                       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_STENCIL_BACK_ENABLE, 1);
-                       OUT_RING(state);
+                       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_STENCIL_BACK_ENABLE, 1);
+                       OUT_RING_CACHE(state);
                        break;
 //             case GL_TEXTURE_GEN_Q:
 //             case GL_TEXTURE_GEN_R:
@@ -317,8 +327,8 @@ static void nv30Fogfv(GLcontext *ctx, GLenum pname, const GLfloat *params)
     switch(pname)
     {
         case GL_FOG_MODE:
-            BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_FOG_MODE, 1);
-            //OUT_RING (params);
+            BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_FOG_MODE, 1);
+            //OUT_RING_CACHE (params);
             break;
             /* TODO: unsure about the rest.*/
         default:
@@ -337,63 +347,67 @@ static void nv30Hint(GLcontext *ctx, GLenum target, GLenum mode)
 static void nv30Lightfv(GLcontext *ctx, GLenum light, GLenum pname, const GLfloat *params )
 {
        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+
+       if (NOUVEAU_CARD_USING_SHADERS)
+          return;
+
        /* not sure where the fourth param value goes...*/
        switch(pname)
        {
                case GL_AMBIENT:
-                       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_FRONT_SIDE_PRODUCT_AMBIENT_A(light), 3);
-                       OUT_RINGf(params[0]);
-                       OUT_RINGf(params[1]);
-                       OUT_RINGf(params[2]);
+                       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_FRONT_SIDE_PRODUCT_AMBIENT_R(light), 3);
+                       OUT_RING_CACHEf(params[0]);
+                       OUT_RING_CACHEf(params[1]);
+                       OUT_RING_CACHEf(params[2]);
                        break;
                case GL_DIFFUSE:
-                       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_FRONT_SIDE_PRODUCT_DIFFUSE_A(light), 3);
-                       OUT_RINGf(params[0]);
-                       OUT_RINGf(params[1]);
-                       OUT_RINGf(params[2]);
+                       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_FRONT_SIDE_PRODUCT_DIFFUSE_R(light), 3);
+                       OUT_RING_CACHEf(params[0]);
+                       OUT_RING_CACHEf(params[1]);
+                       OUT_RING_CACHEf(params[2]);
                        break;
                case GL_SPECULAR:
-                       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_FRONT_SIDE_PRODUCT_SPECULAR_A(light), 3);
-                       OUT_RINGf(params[0]);
-                       OUT_RINGf(params[1]);
-                       OUT_RINGf(params[2]);
+                       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_FRONT_SIDE_PRODUCT_SPECULAR_R(light), 3);
+                       OUT_RING_CACHEf(params[0]);
+                       OUT_RING_CACHEf(params[1]);
+                       OUT_RING_CACHEf(params[2]);
                        break;
                case GL_SPOT_DIRECTION:
-                       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_SPOT_DIR_X(light), 3);
-                       OUT_RINGf(params[0]);
-                       OUT_RINGf(params[1]);
-                       OUT_RINGf(params[2]);
+                       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_SPOT_DIR_X(light), 3);
+                       OUT_RING_CACHEf(params[0]);
+                       OUT_RING_CACHEf(params[1]);
+                       OUT_RING_CACHEf(params[2]);
                        break;
                case GL_POSITION:
-                       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_POSITION_X(light), 3);
-                       OUT_RINGf(params[0]);
-                       OUT_RINGf(params[1]);
-                       OUT_RINGf(params[2]);
+                       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_POSITION_X(light), 3);
+                       OUT_RING_CACHEf(params[0]);
+                       OUT_RING_CACHEf(params[1]);
+                       OUT_RING_CACHEf(params[2]);
                        break;
                case GL_SPOT_EXPONENT:
-                       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_SPOT_EXPONENT(light), 1);
-                       OUT_RINGf(*params);
+                       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_SPOT_EXPONENT(light), 1);
+                       OUT_RING_CACHEf(*params);
                        break;
                case GL_SPOT_CUTOFF:
                        /* you can't factor these */
-                       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_SPOT_CUTOFF_A(light), 1);
-                       OUT_RINGf(params[0]);
-                       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_SPOT_CUTOFF_B(light), 1);
-                       OUT_RINGf(params[1]);
-                       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_SPOT_CUTOFF_C(light), 1);
-                       OUT_RINGf(params[2]);
+                       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_SPOT_CUTOFF_A(light), 1);
+                       OUT_RING_CACHEf(params[0]);
+                       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_SPOT_CUTOFF_B(light), 1);
+                       OUT_RING_CACHEf(params[1]);
+                       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_SPOT_CUTOFF_C(light), 1);
+                       OUT_RING_CACHEf(params[2]);
                        break;
                case GL_CONSTANT_ATTENUATION:
-                       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_CONSTANT_ATTENUATION(light), 1);
-                       OUT_RINGf(*params);
+                       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_CONSTANT_ATTENUATION(light), 1);
+                       OUT_RING_CACHEf(*params);
                        break;
                case GL_LINEAR_ATTENUATION:
-                       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_LINEAR_ATTENUATION(light), 1);
-                       OUT_RINGf(*params);
+                       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_LINEAR_ATTENUATION(light), 1);
+                       OUT_RING_CACHEf(*params);
                        break;
                case GL_QUADRATIC_ATTENUATION:
-                       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_QUADRATIC_ATTENUATION(light), 1);
-                       OUT_RINGf(*params);
+                       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LIGHT_QUADRATIC_ATTENUATION(light), 1);
+                       OUT_RING_CACHEf(*params);
                        break;
                default:
                        break;
@@ -401,14 +415,14 @@ static void nv30Lightfv(GLcontext *ctx, GLenum light, GLenum pname, const GLfloa
 }
 
 /** Set the lighting model parameters */
-static void (*LightModelfv)(GLcontext *ctx, GLenum pname, const GLfloat *params);
+void (*LightModelfv)(GLcontext *ctx, GLenum pname, const GLfloat *params);
 
 
 static void nv30LineStipple(GLcontext *ctx, GLint factor, GLushort pattern )
 {
        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
-       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LINE_STIPPLE_PATTERN, 1);
-       OUT_RING((pattern << 16) | factor);
+       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LINE_STIPPLE_PATTERN, 1);
+       OUT_RING_CACHE((pattern << 16) | factor);
 }
 
 static void nv30LineWidth(GLcontext *ctx, GLfloat width)
@@ -418,15 +432,15 @@ static void nv30LineWidth(GLcontext *ctx, GLfloat width)
 
        CLAMPED_FLOAT_TO_UBYTE(ubWidth, width);
 
-       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LINE_WIDTH_SMOOTH, 1);
-       OUT_RING(ubWidth);
+       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_LINE_WIDTH_SMOOTH, 1);
+       OUT_RING_CACHE(ubWidth);
 }
 
 static void nv30LogicOpcode(GLcontext *ctx, GLenum opcode)
 {
        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
-       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_COLOR_LOGIC_OP_OP, 1);
-       OUT_RING(opcode);
+       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_COLOR_LOGIC_OP_OP, 1);
+       OUT_RING_CACHE(opcode);
 }
 
 static void nv30PointParameterfv(GLcontext *ctx, GLenum pname, const GLfloat *params)
@@ -440,8 +454,8 @@ static void nv30PointParameterfv(GLcontext *ctx, GLenum pname, const GLfloat *pa
 static void nv30PointSize(GLcontext *ctx, GLfloat size)
 {
        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
-       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_POINT_SIZE, 1);
-       OUT_RINGf(size);
+       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_POINT_SIZE, 1);
+       OUT_RING_CACHEf(size);
 }
 
 /** Select a polygon rasterization mode */
@@ -450,32 +464,55 @@ static void nv30PolygonMode(GLcontext *ctx, GLenum face, GLenum mode)
        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
 
        if (face == GL_FRONT || face == GL_FRONT_AND_BACK) {
-               BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_POLYGON_MODE_FRONT, 1);
-               OUT_RING(mode);
+               BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_POLYGON_MODE_FRONT, 1);
+               OUT_RING_CACHE(mode);
        }
        if (face == GL_BACK || face == GL_FRONT_AND_BACK) {
-               BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_POLYGON_MODE_BACK, 1);
-               OUT_RING(mode);
+               BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_POLYGON_MODE_BACK, 1);
+               OUT_RING_CACHE(mode);
        }
 }
 
 /** Set the scale and units used to calculate depth values */
-void (*PolygonOffset)(GLcontext *ctx, GLfloat factor, GLfloat units);
+static void nv30PolygonOffset(GLcontext *ctx, GLfloat factor, GLfloat units)
+{
+        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+        BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_POLYGON_OFFSET_FACTOR, 2);
+        OUT_RING_CACHEf(factor);
+
+        /* Looks like we always multiply units by 2.0... according to the dumps.*/
+        OUT_RING_CACHEf(units * 2.0);
+}
+
 /** Set the polygon stippling pattern */
-void (*PolygonStipple)(GLcontext *ctx, const GLubyte *mask );
+static void nv30PolygonStipple(GLcontext *ctx, const GLubyte *mask )
+{
+        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+        BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_POLYGON_STIPPLE_PATTERN(0), 32);
+        OUT_RING_CACHEp(mask, 32);
+}
+
 /* Specifies the current buffer for reading */
 void (*ReadBuffer)( GLcontext *ctx, GLenum buffer );
 /** Set rasterization mode */
 void (*RenderMode)(GLcontext *ctx, GLenum mode );
+
 /** Define the scissor box */
-void (*Scissor)(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h);
+static void nv30Scissor(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
+{
+        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+        BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_SCISSOR_WIDTH_XPOS, 2);
+        OUT_RING_CACHE((w << 16) | x);
+        OUT_RING_CACHE((y << 16) | y);
+}
+
 /** Select flat or smooth shading */
-void nv30ShadeModel(GLcontext *ctx, GLenum mode)
+static void nv30ShadeModel(GLcontext *ctx, GLenum mode)
 {
        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
 
-       BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_SHADE_MODEL, 1);
-       OUT_RING(mode);
+       BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_SHADE_MODEL, 1);
+       OUT_RING_CACHE(mode);
 }
 
 /** OpenGL 2.0 two-sided StencilFunc */
@@ -485,16 +522,16 @@ static void nv30StencilFuncSeparate(GLcontext *ctx, GLenum face, GLenum func,
        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
 
        if (face == GL_FRONT || face == GL_FRONT_AND_BACK) {
-               BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_STENCIL_FRONT_FUNC_FUNC, 3);
-               OUT_RING(func);
-               OUT_RING(ref);
-               OUT_RING(mask);
+               BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_STENCIL_FRONT_FUNC_FUNC, 3);
+               OUT_RING_CACHE(func);
+               OUT_RING_CACHE(ref);
+               OUT_RING_CACHE(mask);
        }
        if (face == GL_BACK || face == GL_FRONT_AND_BACK) {
-               BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_STENCIL_BACK_FUNC_FUNC, 3);
-               OUT_RING(func);
-               OUT_RING(ref);
-               OUT_RING(mask);
+               BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_STENCIL_BACK_FUNC_FUNC, 3);
+               OUT_RING_CACHE(func);
+               OUT_RING_CACHE(ref);
+               OUT_RING_CACHE(mask);
        }
 }
 
@@ -504,12 +541,12 @@ static void nv30StencilMaskSeparate(GLcontext *ctx, GLenum face, GLuint mask)
        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
 
        if (face == GL_FRONT || face == GL_FRONT_AND_BACK) {
-               BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_STENCIL_FRONT_MASK, 1);
-               OUT_RING(mask);
+               BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_STENCIL_FRONT_MASK, 1);
+               OUT_RING_CACHE(mask);
        }
        if (face == GL_BACK || face == GL_FRONT_AND_BACK) {
-               BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_STENCIL_BACK_MASK, 1);
-               OUT_RING(mask);
+               BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_STENCIL_BACK_MASK, 1);
+               OUT_RING_CACHE(mask);
        }
 }
 
@@ -520,16 +557,16 @@ static void nv30StencilOpSeparate(GLcontext *ctx, GLenum face, GLenum fail,
        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
 
        if (face == GL_FRONT || face == GL_FRONT_AND_BACK) {
-               BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_STENCIL_FRONT_OP_FAIL, 3);
-               OUT_RING(fail);
-               OUT_RING(zfail);
-               OUT_RING(zpass);
+               BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_STENCIL_FRONT_OP_FAIL, 3);
+               OUT_RING_CACHE(fail);
+               OUT_RING_CACHE(zfail);
+               OUT_RING_CACHE(zpass);
        }
        if (face == GL_BACK || face == GL_FRONT_AND_BACK) {
-               BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_STENCIL_BACK_OP_FAIL, 3);
-               OUT_RING(fail);
-               OUT_RING(zfail);
-               OUT_RING(zpass);
+               BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_STENCIL_BACK_OP_FAIL, 3);
+               OUT_RING_CACHE(fail);
+               OUT_RING_CACHE(zfail);
+               OUT_RING_CACHE(zpass);
        }
 }
 
@@ -543,16 +580,23 @@ void (*TexEnv)(GLcontext *ctx, GLenum target, GLenum pname,
 void (*TexParameter)(GLcontext *ctx, GLenum target,
                struct gl_texture_object *texObj,
                GLenum pname, const GLfloat *params);
-void (*TextureMatrix)(GLcontext *ctx, GLuint unit, const GLmatrix *mat);
+
+static void nv30TextureMatrix(GLcontext *ctx, GLuint unit, const GLmatrix *mat)
+{
+        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+        BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_TX_MATRIX(unit, 0), 16);
+        /*XXX: This SHOULD work.*/
+        OUT_RING_CACHEp(mat->m, 16);
+}
 
 /** Set the viewport */
 static void nv30Viewport(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
 {
-    /* TODO: Where do the VIEWPORT_XFRM_* regs come in? */
-    nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
-    BEGIN_RING_SIZE(NvSub3D, NV30_TCL_PRIMITIVE_3D_VIEWPORT_DIMS_0, 2);
-    OUT_RING((w << 16) | x);
-    OUT_RING((h << 16) | y);
+        /* TODO: Where do the VIEWPORT_XFRM_* regs come in? */
+        nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
+        BEGIN_RING_CACHE(NvSub3D, NV30_TCL_PRIMITIVE_3D_VIEWPORT_DIMS_0, 2);
+        OUT_RING_CACHE((w << 16) | x);
+        OUT_RING_CACHE((h << 16) | y);
 }
 
 void nv30InitStateFuncs(struct dd_function_table *func)
@@ -583,13 +627,13 @@ void nv30InitStateFuncs(struct dd_function_table *func)
        func->PointParameterfv          = nv30PointParameterfv;
        func->PointSize                 = nv30PointSize;
        func->PolygonMode               = nv30PolygonMode;
-#if 0
        func->PolygonOffset             = nv30PolygonOffset;
        func->PolygonStipple            = nv30PolygonStipple;
+#if 0
        func->ReadBuffer                = nv30ReadBuffer;
        func->RenderMode                = nv30RenderMode;
-       func->Scissor                   = nv30Scissor;
 #endif
+       func->Scissor                   = nv30Scissor;
        func->ShadeModel                = nv30ShadeModel;
        func->StencilFuncSeparate       = nv30StencilFuncSeparate;
        func->StencilMaskSeparate       = nv30StencilMaskSeparate;
@@ -597,8 +641,8 @@ void nv30InitStateFuncs(struct dd_function_table *func)
 #if 0
        func->TexGen                    = nv30TexGen;
        func->TexParameter              = nv30TexParameter;
-       func->TextureMatrix             = nv30TextureMatrix;
 #endif
+       func->TextureMatrix             = nv30TextureMatrix;
        func->Viewport                  = nv30Viewport;
 }