draw: corrections to allow for different cliptest cases
[mesa.git] / src / mesa / drivers / dri / nouveau / nouveau_state.c
index 5d593ed4dd0e14429a1d97b0616f87af716c43e1..01bcbc4b3ccb4be6575fef37014157581d59e65e 100644 (file)
@@ -112,15 +112,10 @@ nouveau_depth_range(GLcontext *ctx, GLclampd nearval, GLclampd farval)
        context_dirty(ctx, VIEWPORT);
 }
 
-static void
-nouveau_draw_buffer(GLcontext *ctx, GLenum buffer)
-{
-       context_dirty(ctx, FRAMEBUFFER);
-}
-
 static void
 nouveau_draw_buffers(GLcontext *ctx, GLsizei n, const GLenum *buffers)
 {
+       nouveau_validate_framebuffer(ctx);
        context_dirty(ctx, FRAMEBUFFER);
 }
 
@@ -150,6 +145,7 @@ nouveau_enable(GLcontext *ctx, GLenum cap, GLboolean state)
                break;
        case GL_COLOR_SUM_EXT:
                context_dirty(ctx, FRAG);
+               context_dirty(ctx, LIGHT_MODEL);
                break;
        case GL_CULL_FACE:
                context_dirty(ctx, CULL_FACE);
@@ -188,6 +184,7 @@ nouveau_enable(GLcontext *ctx, GLenum cap, GLboolean state)
        case GL_LIGHTING:
                context_dirty(ctx, FRAG);
                context_dirty(ctx, MODELVIEW);
+               context_dirty(ctx, LIGHT_MODEL);
                context_dirty(ctx, LIGHT_ENABLE);
 
                for (i = 0; i < MAX_LIGHTS; i++) {
@@ -230,9 +227,17 @@ nouveau_enable(GLcontext *ctx, GLenum cap, GLboolean state)
        case GL_TEXTURE_1D:
        case GL_TEXTURE_2D:
        case GL_TEXTURE_3D:
+       case GL_TEXTURE_RECTANGLE:
                context_dirty_i(ctx, TEX_ENV, ctx->Texture.CurrentUnit);
                context_dirty_i(ctx, TEX_OBJ, ctx->Texture.CurrentUnit);
                break;
+       case GL_TEXTURE_GEN_S:
+       case GL_TEXTURE_GEN_T:
+       case GL_TEXTURE_GEN_R:
+       case GL_TEXTURE_GEN_Q:
+               context_dirty_i(ctx, TEX_GEN, ctx->Texture.CurrentUnit);
+               context_dirty(ctx, MODELVIEW);
+               break;
        }
 }
 
@@ -242,12 +247,6 @@ nouveau_fog(GLcontext *ctx, GLenum pname, const GLfloat *params)
        context_dirty(ctx, FOG);
 }
 
-static void
-nouveau_index_mask(GLcontext *ctx, GLuint mask)
-{
-       context_dirty(ctx, INDEX_MASK);
-}
-
 static void
 nouveau_light(GLcontext *ctx, GLenum light, GLenum pname, const GLfloat *params)
 {
@@ -373,7 +372,15 @@ static void
 nouveau_tex_gen(GLcontext *ctx, GLenum coord, GLenum pname,
                const GLfloat *params)
 {
-       context_dirty_i(ctx, TEX_GEN, ctx->Texture.CurrentUnit);
+       switch (pname) {
+       case GL_TEXTURE_GEN_MODE:
+               context_dirty_i(ctx, TEX_GEN, ctx->Texture.CurrentUnit);
+               context_dirty(ctx, MODELVIEW);
+               break;
+       default:
+               context_dirty_i(ctx, TEX_GEN, ctx->Texture.CurrentUnit);
+               break;
+       }
 }
 
 static void
@@ -452,19 +459,24 @@ nouveau_state_emit(GLcontext *ctx)
        }
 
        BITSET_ZERO(nctx->dirty);
-
-       nouveau_bo_state_emit(ctx);
 }
 
 static void
 nouveau_update_state(GLcontext *ctx, GLbitfield new_state)
 {
+       int i;
+
        if (new_state & (_NEW_PROJECTION | _NEW_MODELVIEW))
                context_dirty(ctx, PROJECTION);
 
        if (new_state & _NEW_MODELVIEW)
                context_dirty(ctx, MODELVIEW);
 
+       if (new_state & _NEW_TEXTURE_MATRIX) {
+               for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++)
+                       context_dirty_i(ctx, TEX_MAT, i);
+       }
+
        if (new_state & _NEW_CURRENT_ATTRIB &&
            new_state & _NEW_LIGHT) {
                context_dirty(ctx, MATERIAL_FRONT_AMBIENT);
@@ -500,11 +512,9 @@ nouveau_state_init(GLcontext *ctx)
        ctx->Driver.DepthFunc = nouveau_depth_func;
        ctx->Driver.DepthMask = nouveau_depth_mask;
        ctx->Driver.DepthRange = nouveau_depth_range;
-       ctx->Driver.DrawBuffer = nouveau_draw_buffer;
        ctx->Driver.DrawBuffers = nouveau_draw_buffers;
        ctx->Driver.Enable = nouveau_enable;
        ctx->Driver.Fogfv = nouveau_fog;
-       ctx->Driver.IndexMask = nouveau_index_mask;
        ctx->Driver.Lightfv = nouveau_light;
        ctx->Driver.LightModelfv = nouveau_light_model;
        ctx->Driver.LineStipple = nouveau_line_stipple;