- struct nouveau_channel *chan = context_chan(ctx);
- struct nouveau_grobj *fahrenheit = nv04_context_engine(ctx);
-
- if (nv04_mtex_engine(fahrenheit)) {
- int cull_mode = ctx->Polygon.CullFaceMode;
- int front_face = ctx->Polygon.FrontFace;
- uint32_t ctrl0 = 1 << 30 |
- NV04_MULTITEX_TRIANGLE_CONTROL0_ORIGIN;
- uint32_t ctrl1 = 0, ctrl2 = 0;
-
- /* Color mask. */
- if (ctx->Color.ColorMask[0][RCOMP])
- ctrl0 |= NV04_MULTITEX_TRIANGLE_CONTROL0_RED_WRITE;
- if (ctx->Color.ColorMask[0][GCOMP])
- ctrl0 |= NV04_MULTITEX_TRIANGLE_CONTROL0_GREEN_WRITE;
- if (ctx->Color.ColorMask[0][BCOMP])
- ctrl0 |= NV04_MULTITEX_TRIANGLE_CONTROL0_BLUE_WRITE;
- if (ctx->Color.ColorMask[0][ACOMP])
- ctrl0 |= NV04_MULTITEX_TRIANGLE_CONTROL0_ALPHA_WRITE;
-
- /* Dithering. */
- if (ctx->Color.DitherFlag)
- ctrl0 |= NV04_MULTITEX_TRIANGLE_CONTROL0_DITHER_ENABLE;
-
- /* Cull mode. */
- if (!ctx->Polygon.CullFlag)
- ctrl0 |= NV04_MULTITEX_TRIANGLE_CONTROL0_CULL_MODE_NONE;
- else if (cull_mode == GL_FRONT_AND_BACK)
- ctrl0 |= NV04_MULTITEX_TRIANGLE_CONTROL0_CULL_MODE_BOTH;
- else
- ctrl0 |= (cull_mode == GL_FRONT) ^ (front_face == GL_CCW) ?
- NV04_MULTITEX_TRIANGLE_CONTROL0_CULL_MODE_CW :
- NV04_MULTITEX_TRIANGLE_CONTROL0_CULL_MODE_CCW;
-
- /* Depth test. */
- if (ctx->Depth.Test)
- ctrl0 |= NV04_MULTITEX_TRIANGLE_CONTROL0_Z_ENABLE;
-
- if (ctx->Depth.Mask)
- ctrl0 |= NV04_MULTITEX_TRIANGLE_CONTROL0_Z_WRITE;
-
- ctrl0 |= get_comparison_op(ctx->Depth.Func) << 16;
-
- /* Alpha test. */
- if (ctx->Color.AlphaEnabled)
- ctrl0 |= NV04_MULTITEX_TRIANGLE_CONTROL0_ALPHA_ENABLE;
-
- ctrl0 |= get_comparison_op(ctx->Color.AlphaFunc) << 8 |
- FLOAT_TO_UBYTE(ctx->Color.AlphaRef);
-
- /* Stencil test. */
- if (ctx->Stencil.WriteMask[0])
- ctrl0 |= NV04_MULTITEX_TRIANGLE_CONTROL0_STENCIL_WRITE;
-
- if (ctx->Stencil.Enabled)
- ctrl1 |= NV04_MULTITEX_TRIANGLE_CONTROL1_STENCIL_ENABLE;
-
- ctrl1 |= get_comparison_op(ctx->Stencil.Function[0]) << 4 |
- ctx->Stencil.Ref[0] << 8 |
- ctx->Stencil.ValueMask[0] << 16 |
- ctx->Stencil.WriteMask[0] << 24;
-
- ctrl2 |= get_stencil_op(ctx->Stencil.ZPassFunc[0]) << 8 |
- get_stencil_op(ctx->Stencil.ZFailFunc[0]) << 4 |
- get_stencil_op(ctx->Stencil.FailFunc[0]);
-
- BEGIN_RING(chan, fahrenheit, NV04_MULTITEX_TRIANGLE_CONTROL0, 3);
- OUT_RING(chan, ctrl0);
- OUT_RING(chan, ctrl1);
- OUT_RING(chan, ctrl2);
-
- } else {
- int cull_mode = ctx->Polygon.CullFaceMode;
- int front_face = ctx->Polygon.FrontFace;
- uint32_t ctrl = 1 << 30 |
- NV04_TEXTURED_TRIANGLE_CONTROL_ORIGIN;
-
- /* Dithering. */
- if (ctx->Color.DitherFlag)
- ctrl |= NV04_TEXTURED_TRIANGLE_CONTROL_DITHER_ENABLE;
-
- /* Cull mode. */
- if (!ctx->Polygon.CullFlag)
- ctrl |= NV04_TEXTURED_TRIANGLE_CONTROL_CULL_MODE_NONE;
- else if (cull_mode == GL_FRONT_AND_BACK)
- ctrl |= NV04_TEXTURED_TRIANGLE_CONTROL_CULL_MODE_BOTH;
- else
- ctrl |= (cull_mode == GL_FRONT) ^ (front_face == GL_CCW) ?
- NV04_TEXTURED_TRIANGLE_CONTROL_CULL_MODE_CW :
- NV04_TEXTURED_TRIANGLE_CONTROL_CULL_MODE_CCW;
-
- /* Depth test. */
- if (ctx->Depth.Test)
- ctrl |= NV04_TEXTURED_TRIANGLE_CONTROL_Z_ENABLE;
- if (ctx->Depth.Mask)
- ctrl |= NV04_TEXTURED_TRIANGLE_CONTROL_Z_WRITE;
-
- ctrl |= get_comparison_op(ctx->Depth.Func) << 16;
-
- /* Alpha test. */
- if (ctx->Color.AlphaEnabled)
- ctrl |= NV04_TEXTURED_TRIANGLE_CONTROL_ALPHA_ENABLE;
-
- ctrl |= get_comparison_op(ctx->Color.AlphaFunc) << 8 |
- FLOAT_TO_UBYTE(ctx->Color.AlphaRef);
-
- BEGIN_RING(chan, fahrenheit, NV04_TEXTURED_TRIANGLE_CONTROL, 1);
- OUT_RING(chan, ctrl);
- }
+ struct nv04_context *nv04 = to_nv04_context(ctx);
+ struct gl_framebuffer *fb = ctx->DrawBuffer;
+ int cull = ctx->Polygon.CullFaceMode;
+ int front = ctx->Polygon.FrontFace;
+
+ nv04->ctrl[0] = NV04_TEXTURED_TRIANGLE_CONTROL_Z_FORMAT_FIXED |
+ NV04_TEXTURED_TRIANGLE_CONTROL_ORIGIN_CORNER;
+ nv04->ctrl[1] = 0;
+ nv04->ctrl[2] = 0;
+
+ /* Dithering. */
+ if (ctx->Color.DitherFlag)
+ nv04->ctrl[0] |= NV04_TEXTURED_TRIANGLE_CONTROL_DITHER_ENABLE;
+
+ /* Cull mode. */
+ if (!ctx->Polygon.CullFlag)
+ nv04->ctrl[0] |= NV04_TEXTURED_TRIANGLE_CONTROL_CULL_MODE_NONE;
+ else if (cull == GL_FRONT_AND_BACK)
+ nv04->ctrl[0] |= NV04_TEXTURED_TRIANGLE_CONTROL_CULL_MODE_BOTH;
+ else
+ nv04->ctrl[0] |= (cull == GL_FRONT) ^ (front == GL_CCW) ?
+ NV04_TEXTURED_TRIANGLE_CONTROL_CULL_MODE_CW :
+ NV04_TEXTURED_TRIANGLE_CONTROL_CULL_MODE_CCW;
+
+ /* Depth test. */
+ if (ctx->Depth.Test && fb->Visual.depthBits > 0)
+ nv04->ctrl[0] |= NV04_TEXTURED_TRIANGLE_CONTROL_Z_ENABLE;
+ if (ctx->Depth.Mask && fb->Visual.depthBits > 0)
+ nv04->ctrl[0] |= NV04_TEXTURED_TRIANGLE_CONTROL_Z_WRITE;
+
+ nv04->ctrl[0] |= get_comparison_op(ctx->Depth.Func) << 16;
+
+ /* Alpha test. */
+ if (ctx->Color.AlphaEnabled)
+ nv04->ctrl[0] |= NV04_TEXTURED_TRIANGLE_CONTROL_ALPHA_ENABLE;
+
+ nv04->ctrl[0] |= get_comparison_op(ctx->Color.AlphaFunc) << 8 |
+ FLOAT_TO_UBYTE(ctx->Color.AlphaRef);
+
+ /* Color mask. */
+ if (ctx->Color.ColorMask[0][RCOMP])
+ nv04->ctrl[0] |= NV04_MULTITEX_TRIANGLE_CONTROL0_RED_WRITE;
+ if (ctx->Color.ColorMask[0][GCOMP])
+ nv04->ctrl[0] |= NV04_MULTITEX_TRIANGLE_CONTROL0_GREEN_WRITE;
+ if (ctx->Color.ColorMask[0][BCOMP])
+ nv04->ctrl[0] |= NV04_MULTITEX_TRIANGLE_CONTROL0_BLUE_WRITE;
+ if (ctx->Color.ColorMask[0][ACOMP])
+ nv04->ctrl[0] |= NV04_MULTITEX_TRIANGLE_CONTROL0_ALPHA_WRITE;
+
+ /* Stencil test. */
+ if (ctx->Stencil.WriteMask[0])
+ nv04->ctrl[0] |= NV04_MULTITEX_TRIANGLE_CONTROL0_STENCIL_WRITE;
+
+ if (_mesa_stencil_is_enabled(ctx))
+ nv04->ctrl[1] |= NV04_MULTITEX_TRIANGLE_CONTROL1_STENCIL_ENABLE;
+
+ nv04->ctrl[1] |= get_comparison_op(ctx->Stencil.Function[0]) << 4 |
+ _mesa_get_stencil_ref(ctx, 0) << 8 |
+ ctx->Stencil.ValueMask[0] << 16 |
+ ctx->Stencil.WriteMask[0] << 24;
+
+ nv04->ctrl[2] |= get_stencil_op(ctx->Stencil.ZPassFunc[0]) << 8 |
+ get_stencil_op(ctx->Stencil.ZFailFunc[0]) << 4 |
+ get_stencil_op(ctx->Stencil.FailFunc[0]);