i965/gen7_urb: Re-emit PUSH_CONSTANT_ALLOC on some gen9
[mesa.git] / src / mesa / drivers / dri / nouveau / nouveau_state.c
index bc610451b403d6bae828856d613880106daa623a..a05c8be854ab0e2fdf16af5e8776e0f139586528 100644 (file)
 
 #include "swrast/swrast.h"
 #include "tnl/tnl.h"
+#include "util/bitscan.h"
+#include "main/framebuffer.h"
 
 static void
-nouveau_alpha_func(GLcontext *ctx, GLenum func, GLfloat ref)
+nouveau_alpha_func(struct gl_context *ctx, GLenum func, GLfloat ref)
 {
        context_dirty(ctx, ALPHA_FUNC);
 }
 
 static void
-nouveau_blend_color(GLcontext *ctx, const GLfloat color[4])
+nouveau_blend_color(struct gl_context *ctx, const GLfloat color[4])
 {
        context_dirty(ctx, BLEND_COLOR);
 }
 
 static void
-nouveau_blend_equation_separate(GLcontext *ctx, GLenum modeRGB, GLenum modeA)
+nouveau_blend_equation_separate(struct gl_context *ctx, GLenum modeRGB, GLenum modeA)
 {
        context_dirty(ctx, BLEND_EQUATION);
 }
 
 static void
-nouveau_blend_func_separate(GLcontext *ctx, GLenum sfactorRGB,
+nouveau_blend_func_separate(struct gl_context *ctx, GLenum sfactorRGB,
                            GLenum dfactorRGB, GLenum sfactorA, GLenum dfactorA)
 {
        context_dirty(ctx, BLEND_FUNC);
 }
 
 static void
-nouveau_clip_plane(GLcontext *ctx, GLenum plane, const GLfloat *equation)
+nouveau_clip_plane(struct gl_context *ctx, GLenum plane, const GLfloat *equation)
 {
        context_dirty_i(ctx, CLIP_PLANE, plane - GL_CLIP_PLANE0);
 }
 
 static void
-nouveau_color_mask(GLcontext *ctx, GLboolean rmask, GLboolean gmask,
+nouveau_color_mask(struct gl_context *ctx, GLboolean rmask, GLboolean gmask,
                   GLboolean bmask, GLboolean amask)
 {
        context_dirty(ctx, COLOR_MASK);
 }
 
 static void
-nouveau_color_material(GLcontext *ctx, GLenum face, GLenum mode)
+nouveau_color_material(struct gl_context *ctx, GLenum face, GLenum mode)
 {
        context_dirty(ctx, COLOR_MATERIAL);
        context_dirty(ctx, MATERIAL_FRONT_AMBIENT);
@@ -83,51 +85,46 @@ nouveau_color_material(GLcontext *ctx, GLenum face, GLenum mode)
 }
 
 static void
-nouveau_cull_face(GLcontext *ctx, GLenum mode)
+nouveau_cull_face(struct gl_context *ctx, GLenum mode)
 {
        context_dirty(ctx, CULL_FACE);
 }
 
 static void
-nouveau_front_face(GLcontext *ctx, GLenum mode)
+nouveau_front_face(struct gl_context *ctx, GLenum mode)
 {
        context_dirty(ctx, FRONT_FACE);
 }
 
 static void
-nouveau_depth_func(GLcontext *ctx, GLenum func)
+nouveau_depth_func(struct gl_context *ctx, GLenum func)
 {
        context_dirty(ctx, DEPTH);
 }
 
 static void
-nouveau_depth_mask(GLcontext *ctx, GLboolean flag)
+nouveau_depth_mask(struct gl_context *ctx, GLboolean flag)
 {
        context_dirty(ctx, DEPTH);
 }
 
 static void
-nouveau_depth_range(GLcontext *ctx, GLclampd nearval, GLclampd farval)
+nouveau_read_buffer(struct gl_context *ctx, GLenum buffer)
 {
-       context_dirty(ctx, VIEWPORT);
+       nouveau_validate_framebuffer(ctx);
 }
 
 static void
-nouveau_draw_buffer(GLcontext *ctx, GLenum buffer)
+nouveau_draw_buffer(struct gl_context *ctx)
 {
+       nouveau_validate_framebuffer(ctx);
        context_dirty(ctx, FRAMEBUFFER);
 }
 
 static void
-nouveau_draw_buffers(GLcontext *ctx, GLsizei n, const GLenum *buffers)
+nouveau_enable(struct gl_context *ctx, GLenum cap, GLboolean state)
 {
-       context_dirty(ctx, FRAMEBUFFER);
-}
-
-static void
-nouveau_enable(GLcontext *ctx, GLenum cap, GLboolean state)
-{
-       int i;
+       GLbitfield mask;
 
        switch (cap) {
        case GL_ALPHA_TEST:
@@ -189,11 +186,13 @@ 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++) {
-                       if (ctx->Light.Light[i].Enabled)
-                               context_dirty_i(ctx, LIGHT_SOURCE, i);
+               mask = ctx->Light._EnabledLights;
+               while (mask) {
+                       const int i = u_bit_scan(&mask);
+                       context_dirty_i(ctx, LIGHT_SOURCE, i);
                }
 
                context_dirty(ctx, MATERIAL_FRONT_AMBIENT);
@@ -231,20 +230,28 @@ 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;
        }
 }
 
 static void
-nouveau_fog(GLcontext *ctx, GLenum pname, const GLfloat *params)
+nouveau_fog(struct gl_context *ctx, GLenum pname, const GLfloat *params)
 {
        context_dirty(ctx, FOG);
 }
 
 static void
-nouveau_light(GLcontext *ctx, GLenum light, GLenum pname, const GLfloat *params)
+nouveau_light(struct gl_context *ctx, GLenum light, GLenum pname, const GLfloat *params)
 {
        switch (pname) {
        case GL_AMBIENT:
@@ -272,107 +279,109 @@ nouveau_light(GLcontext *ctx, GLenum light, GLenum pname, const GLfloat *params)
 }
 
 static void
-nouveau_light_model(GLcontext *ctx, GLenum pname, const GLfloat *params)
+nouveau_light_model(struct gl_context *ctx, GLenum pname, const GLfloat *params)
 {
        context_dirty(ctx, LIGHT_MODEL);
        context_dirty(ctx, MODELVIEW);
 }
 
 static void
-nouveau_line_stipple(GLcontext *ctx, GLint factor, GLushort pattern )
+nouveau_line_stipple(struct gl_context *ctx, GLint factor, GLushort pattern )
 {
        context_dirty(ctx, LINE_STIPPLE);
 }
 
 static void
-nouveau_line_width(GLcontext *ctx, GLfloat width)
+nouveau_line_width(struct gl_context *ctx, GLfloat width)
 {
        context_dirty(ctx, LINE_MODE);
 }
 
 static void
-nouveau_logic_opcode(GLcontext *ctx, GLenum opcode)
+nouveau_logic_opcode(struct gl_context *ctx, UNUSED enum gl_logicop_mode opcode)
 {
        context_dirty(ctx, LOGIC_OPCODE);
 }
 
 static void
-nouveau_point_parameter(GLcontext *ctx, GLenum pname, const GLfloat *params)
+nouveau_point_parameter(struct gl_context *ctx, GLenum pname, const GLfloat *params)
 {
        context_dirty(ctx, POINT_PARAMETER);
 }
 
 static void
-nouveau_point_size(GLcontext *ctx, GLfloat size)
+nouveau_point_size(struct gl_context *ctx, GLfloat size)
 {
        context_dirty(ctx, POINT_MODE);
 }
 
 static void
-nouveau_polygon_mode(GLcontext *ctx, GLenum face, GLenum mode)
+nouveau_polygon_mode(struct gl_context *ctx, GLenum face, GLenum mode)
 {
        context_dirty(ctx, POLYGON_MODE);
 }
 
 static void
-nouveau_polygon_offset(GLcontext *ctx, GLfloat factor, GLfloat units)
+nouveau_polygon_offset(struct gl_context *ctx, GLfloat factor, GLfloat units, GLfloat clamp)
 {
        context_dirty(ctx, POLYGON_OFFSET);
 }
 
 static void
-nouveau_polygon_stipple(GLcontext *ctx, const GLubyte *mask)
+nouveau_polygon_stipple(struct gl_context *ctx, const GLubyte *mask)
 {
        context_dirty(ctx, POLYGON_STIPPLE);
 }
 
 static void
-nouveau_render_mode(GLcontext *ctx, GLenum mode)
+nouveau_render_mode(struct gl_context *ctx, GLenum mode)
 {
        context_dirty(ctx, RENDER_MODE);
 }
 
 static void
-nouveau_scissor(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
-{
-       context_dirty(ctx, SCISSOR);
-}
-
-static void
-nouveau_shade_model(GLcontext *ctx, GLenum mode)
+nouveau_shade_model(struct gl_context *ctx, GLenum mode)
 {
        context_dirty(ctx, SHADE_MODEL);
 }
 
 static void
-nouveau_stencil_func_separate(GLcontext *ctx, GLenum face, GLenum func,
+nouveau_stencil_func_separate(struct gl_context *ctx, GLenum face, GLenum func,
                              GLint ref, GLuint mask)
 {
        context_dirty(ctx, STENCIL_FUNC);
 }
 
 static void
-nouveau_stencil_mask_separate(GLcontext *ctx, GLenum face, GLuint mask)
+nouveau_stencil_mask_separate(struct gl_context *ctx, GLenum face, GLuint mask)
 {
        context_dirty(ctx, STENCIL_MASK);
 }
 
 static void
-nouveau_stencil_op_separate(GLcontext *ctx, GLenum face, GLenum fail,
+nouveau_stencil_op_separate(struct gl_context *ctx, GLenum face, GLenum fail,
                            GLenum zfail, GLenum zpass)
 {
        context_dirty(ctx, STENCIL_OP);
 }
 
 static void
-nouveau_tex_gen(GLcontext *ctx, GLenum coord, GLenum pname,
+nouveau_tex_gen(struct gl_context *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
-nouveau_tex_env(GLcontext *ctx, GLenum target, GLenum pname,
+nouveau_tex_env(struct gl_context *ctx, GLenum target, GLenum pname,
                const GLfloat *param)
 {
        switch (target) {
@@ -386,9 +395,8 @@ nouveau_tex_env(GLcontext *ctx, GLenum target, GLenum pname,
 }
 
 static void
-nouveau_tex_parameter(GLcontext *ctx, GLenum target,
-                     struct gl_texture_object *t, GLenum pname,
-                     const GLfloat *params)
+nouveau_tex_parameter(struct gl_context *ctx,
+                     struct gl_texture_object *t, GLenum pname)
 {
        switch (pname) {
        case GL_TEXTURE_MAG_FILTER:
@@ -411,19 +419,13 @@ nouveau_tex_parameter(GLcontext *ctx, GLenum target,
        }
 }
 
-static void
-nouveau_viewport(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
-{
-       context_dirty(ctx, VIEWPORT);
-}
-
 void
-nouveau_emit_nothing(GLcontext *ctx, int emit)
+nouveau_emit_nothing(struct gl_context *ctx, int emit)
 {
 }
 
 int
-nouveau_next_dirty_state(GLcontext *ctx)
+nouveau_next_dirty_state(struct gl_context *ctx)
 {
        struct nouveau_context *nctx = to_nouveau_context(ctx);
        int i = BITSET_FFS(nctx->dirty) - 1;
@@ -435,7 +437,7 @@ nouveau_next_dirty_state(GLcontext *ctx)
 }
 
 void
-nouveau_state_emit(GLcontext *ctx)
+nouveau_state_emit(struct gl_context *ctx)
 {
        struct nouveau_context *nctx = to_nouveau_context(ctx);
        const struct nouveau_driver *drv = context_drv(ctx);
@@ -447,19 +449,34 @@ nouveau_state_emit(GLcontext *ctx)
        }
 
        BITSET_ZERO(nctx->dirty);
-
-       nouveau_bo_state_emit(ctx);
 }
 
 static void
-nouveau_update_state(GLcontext *ctx, GLbitfield new_state)
+nouveau_update_state(struct gl_context *ctx)
 {
+       GLbitfield new_state = ctx->NewState;
+       int i;
+
+       if (new_state & (_NEW_SCISSOR | _NEW_BUFFERS | _NEW_VIEWPORT))
+               _mesa_update_draw_buffer_bounds(ctx, ctx->DrawBuffer);
+
        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_SCISSOR)
+               context_dirty(ctx, SCISSOR);
+
+       if (new_state & _NEW_VIEWPORT)
+               context_dirty(ctx, VIEWPORT);
+
        if (new_state & _NEW_CURRENT_ATTRIB &&
            new_state & _NEW_LIGHT) {
                context_dirty(ctx, MATERIAL_FRONT_AMBIENT);
@@ -472,6 +489,13 @@ nouveau_update_state(GLcontext *ctx, GLbitfield new_state)
                context_dirty(ctx, MATERIAL_BACK_SHININESS);
        }
 
+       if (new_state & _NEW_TEXTURE) {
+               for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
+                       if (ctx->Texture.Unit[i].Sampler)
+                               context_dirty_i(ctx, TEX_OBJ, i);
+               }
+       }
+
        _swrast_InvalidateState(ctx, new_state);
        _tnl_InvalidateState(ctx, new_state);
 
@@ -479,7 +503,7 @@ nouveau_update_state(GLcontext *ctx, GLbitfield new_state)
 }
 
 void
-nouveau_state_init(GLcontext *ctx)
+nouveau_state_init(struct gl_context *ctx)
 {
        struct nouveau_context *nctx = to_nouveau_context(ctx);
 
@@ -494,9 +518,8 @@ nouveau_state_init(GLcontext *ctx)
        ctx->Driver.FrontFace = nouveau_front_face;
        ctx->Driver.DepthFunc = nouveau_depth_func;
        ctx->Driver.DepthMask = nouveau_depth_mask;
-       ctx->Driver.DepthRange = nouveau_depth_range;
+       ctx->Driver.ReadBuffer = nouveau_read_buffer;
        ctx->Driver.DrawBuffer = nouveau_draw_buffer;
-       ctx->Driver.DrawBuffers = nouveau_draw_buffers;
        ctx->Driver.Enable = nouveau_enable;
        ctx->Driver.Fogfv = nouveau_fog;
        ctx->Driver.Lightfv = nouveau_light;
@@ -510,7 +533,6 @@ nouveau_state_init(GLcontext *ctx)
        ctx->Driver.PolygonOffset = nouveau_polygon_offset;
        ctx->Driver.PolygonStipple = nouveau_polygon_stipple;
        ctx->Driver.RenderMode = nouveau_render_mode;
-       ctx->Driver.Scissor = nouveau_scissor;
        ctx->Driver.ShadeModel = nouveau_shade_model;
        ctx->Driver.StencilFuncSeparate = nouveau_stencil_func_separate;
        ctx->Driver.StencilMaskSeparate = nouveau_stencil_mask_separate;
@@ -518,7 +540,6 @@ nouveau_state_init(GLcontext *ctx)
        ctx->Driver.TexGen = nouveau_tex_gen;
        ctx->Driver.TexEnv = nouveau_tex_env;
        ctx->Driver.TexParameter = nouveau_tex_parameter;
-       ctx->Driver.Viewport = nouveau_viewport;
 
        ctx->Driver.UpdateState = nouveau_update_state;