i965/vs: Fix NULL pointer dereference in pre-Gen6 push constant loading.
[mesa.git] / src / mesa / drivers / dri / nouveau / nv04_state_raster.c
index 5e3788d18545e5fb0015f87a2f2e7bda2f632c28..78d29fc485b5f78ef0390335dab1e8e4df3c8a3b 100644 (file)
@@ -27,7 +27,8 @@
 #include "nouveau_driver.h"
 #include "nouveau_context.h"
 #include "nouveau_util.h"
-#include "nouveau_class.h"
+#include "nv_object.xml.h"
+#include "nv04_3d.xml.h"
 #include "nv04_driver.h"
 
 static unsigned
@@ -61,12 +62,20 @@ get_stencil_op(unsigned op)
        switch (op) {
        case GL_KEEP:
                return 0x1;
+       case GL_ZERO:
+               return 0x2;
+       case GL_REPLACE:
+               return 0x3;
        case GL_INCR:
                return 0x4;
        case GL_DECR:
                return 0x5;
        case GL_INVERT:
                return 0x6;
+       case GL_INCR_WRAP:
+               return 0x7;
+       case GL_DECR_WRAP:
+               return 0x8;
        default:
                assert(0);
        }
@@ -78,8 +87,6 @@ get_texenv_mode(unsigned mode)
        switch (mode) {
        case GL_REPLACE:
                return 0x1;
-       case GL_ADD:
-               return 0x2;
        case GL_DECAL:
                return 0x3;
        case GL_MODULATE:
@@ -121,13 +128,13 @@ get_blend_func(unsigned func)
 }
 
 void
-nv04_defer_control(GLcontext *ctx, int emit)
+nv04_defer_control(struct gl_context *ctx, int emit)
 {
        context_dirty(ctx, CONTROL);
 }
 
 void
-nv04_emit_control(GLcontext *ctx, int emit)
+nv04_emit_control(struct gl_context *ctx, int emit)
 {
        struct nouveau_channel *chan = context_chan(ctx);
        struct nouveau_grobj *fahrenheit = nv04_context_engine(ctx);
@@ -136,7 +143,7 @@ nv04_emit_control(GLcontext *ctx, int emit)
                int cull_mode = ctx->Polygon.CullFaceMode;
                int front_face = ctx->Polygon.FrontFace;
                uint32_t ctrl0 = 1 << 30 |
-                       NV04_MULTITEX_TRIANGLE_CONTROL0_ORIGIN;
+                       NV04_MULTITEX_TRIANGLE_CONTROL0_ORIGIN_CORNER;
                uint32_t ctrl1 = 0, ctrl2 = 0;
 
                /* Color mask. */
@@ -204,7 +211,7 @@ nv04_emit_control(GLcontext *ctx, int emit)
                int cull_mode = ctx->Polygon.CullFaceMode;
                int front_face = ctx->Polygon.FrontFace;
                uint32_t ctrl = 1 << 30 |
-                       NV04_TEXTURED_TRIANGLE_CONTROL_ORIGIN;
+                       NV04_TEXTURED_TRIANGLE_CONTROL_ORIGIN_CORNER;
 
                /* Dithering. */
                if (ctx->Color.DitherFlag)
@@ -241,13 +248,13 @@ nv04_emit_control(GLcontext *ctx, int emit)
 }
 
 void
-nv04_defer_blend(GLcontext *ctx, int emit)
+nv04_defer_blend(struct gl_context *ctx, int emit)
 {
        context_dirty(ctx, BLEND);
 }
 
 void
-nv04_emit_blend(GLcontext *ctx, int emit)
+nv04_emit_blend(struct gl_context *ctx, int emit)
 {
        struct nouveau_channel *chan = context_chan(ctx);
        struct nouveau_grobj *fahrenheit = nv04_context_engine(ctx);
@@ -257,8 +264,8 @@ nv04_emit_blend(GLcontext *ctx, int emit)
                        NV04_MULTITEX_TRIANGLE_BLEND_TEXTURE_PERSPECTIVE_ENABLE;
 
                /* Alpha blending. */
-               blend |= get_blend_func(ctx->Color.BlendDstRGB) << 28 |
-                       get_blend_func(ctx->Color.BlendSrcRGB) << 24;
+               blend |= get_blend_func(ctx->Color.Blend[0].DstRGB) << 28 |
+                       get_blend_func(ctx->Color.Blend[0].SrcRGB) << 24;
 
                if (ctx->Color.BlendEnabled)
                        blend |= NV04_MULTITEX_TRIANGLE_BLEND_BLEND_ENABLE;
@@ -269,6 +276,10 @@ nv04_emit_blend(GLcontext *ctx, int emit)
                else
                        blend |= NV04_MULTITEX_TRIANGLE_BLEND_SHADE_MODE_FLAT;
 
+               /* Secondary color */
+               if (_mesa_need_secondary_color(ctx))
+                       blend |= NV04_MULTITEX_TRIANGLE_BLEND_SPECULAR_ENABLE;
+
                /* Fog. */
                if (ctx->Fog.Enabled)
                        blend |= NV04_MULTITEX_TRIANGLE_BLEND_FOG_ENABLE;
@@ -285,8 +296,8 @@ nv04_emit_blend(GLcontext *ctx, int emit)
                        NV04_TEXTURED_TRIANGLE_BLEND_TEXTURE_PERSPECTIVE_ENABLE;
 
                /* Alpha blending. */
-               blend |= get_blend_func(ctx->Color.BlendDstRGB) << 28 |
-                       get_blend_func(ctx->Color.BlendSrcRGB) << 24;
+               blend |= get_blend_func(ctx->Color.Blend[0].DstRGB) << 28 |
+                       get_blend_func(ctx->Color.Blend[0].SrcRGB) << 24;
 
                if (ctx->Color.BlendEnabled)
                        blend |= NV04_TEXTURED_TRIANGLE_BLEND_BLEND_ENABLE;
@@ -298,7 +309,14 @@ nv04_emit_blend(GLcontext *ctx, int emit)
                        blend |= NV04_TEXTURED_TRIANGLE_BLEND_SHADE_MODE_FLAT;
 
                /* Texture environment. */
-               blend |= get_texenv_mode(ctx->Texture.Unit[0].EnvMode);
+               if (ctx->Texture._EnabledUnits)
+                       blend |= get_texenv_mode(ctx->Texture.Unit[0].EnvMode);
+               else
+                       blend |= get_texenv_mode(GL_MODULATE);
+
+               /* Secondary color */
+               if (_mesa_need_secondary_color(ctx))
+                       blend |= NV04_TEXTURED_TRIANGLE_BLEND_SPECULAR_ENABLE;
 
                /* Fog. */
                if (ctx->Fog.Enabled)