1bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez/*
2bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * Copyright (C) 2009 Francisco Jerez.
3bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * All Rights Reserved.
4bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez *
5bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * Permission is hereby granted, free of charge, to any person obtaining
6bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * a copy of this software and associated documentation files (the
7bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * "Software"), to deal in the Software without restriction, including
8bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * without limitation the rights to use, copy, modify, merge, publish,
9bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * distribute, sublicense, and/or sell copies of the Software, and to
10bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * permit persons to whom the Software is furnished to do so, subject to
11bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * the following conditions:
12bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez *
13bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * The above copyright notice and this permission notice (including the
14bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * next paragraph) shall be included in all copies or substantial
15bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * portions of the Software.
16bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez *
17bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
21bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez *
25bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez */
26bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
27bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_driver.h"
28bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_context.h"
29bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_util.h"
308983855012301c8ebc023edf42ddf5e423189585Viktor Novotný#include "nv_object.xml.h"
318983855012301c8ebc023edf42ddf5e423189585Viktor Novotný#include "nv04_3d.xml.h"
32bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nv04_driver.h"
33bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
34bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic unsigned
35bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezget_comparison_op(unsigned op)
36bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{
37bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	switch (op) {
38bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case GL_NEVER:
39bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return 0x1;
40bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case GL_LESS:
41bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return 0x2;
42bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case GL_EQUAL:
43bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return 0x3;
44bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case GL_LEQUAL:
45bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return 0x4;
46bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case GL_GREATER:
47bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return 0x5;
48bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case GL_NOTEQUAL:
49bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return 0x6;
50bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case GL_GEQUAL:
51bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return 0x7;
52bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case GL_ALWAYS:
53bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return 0x8;
54bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	default:
55bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		assert(0);
56bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	}
57bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}
58bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
59bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic unsigned
60bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezget_stencil_op(unsigned op)
61bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{
62bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	switch (op) {
63bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case GL_KEEP:
64bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return 0x1;
65394672659ddc1175747bae29fbf9957365d61e4cAndrew Randrianasulu	case GL_ZERO:
66394672659ddc1175747bae29fbf9957365d61e4cAndrew Randrianasulu		return 0x2;
67394672659ddc1175747bae29fbf9957365d61e4cAndrew Randrianasulu	case GL_REPLACE:
68394672659ddc1175747bae29fbf9957365d61e4cAndrew Randrianasulu		return 0x3;
69bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case GL_INCR:
70bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return 0x4;
71bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case GL_DECR:
72bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return 0x5;
73bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case GL_INVERT:
74bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return 0x6;
75210bcf6d156aba5994f25f1bd9c50586ebc3badaAndrew Randrianasulu	case GL_INCR_WRAP:
76210bcf6d156aba5994f25f1bd9c50586ebc3badaAndrew Randrianasulu		return 0x7;
77210bcf6d156aba5994f25f1bd9c50586ebc3badaAndrew Randrianasulu	case GL_DECR_WRAP:
78210bcf6d156aba5994f25f1bd9c50586ebc3badaAndrew Randrianasulu		return 0x8;
79bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	default:
80bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		assert(0);
81bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	}
82bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}
83bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
84bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic unsigned
85bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezget_blend_func(unsigned func)
86bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{
87bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	switch (func) {
88bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case GL_ZERO:
89bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return 0x1;
90bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case GL_ONE:
91bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return 0x2;
92bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case GL_SRC_COLOR:
93bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return 0x3;
94bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case GL_ONE_MINUS_SRC_COLOR:
95bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return 0x4;
96bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case GL_SRC_ALPHA:
97bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return 0x5;
98bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case GL_ONE_MINUS_SRC_ALPHA:
99bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return 0x6;
100bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case GL_DST_ALPHA:
101bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return 0x7;
102bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case GL_ONE_MINUS_DST_ALPHA:
103bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return 0x8;
104bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case GL_DST_COLOR:
105bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return 0x9;
106bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case GL_ONE_MINUS_DST_COLOR:
107bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return 0xa;
108bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case GL_SRC_ALPHA_SATURATE:
109bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return 0xb;
110bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	default:
111bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		assert(0);
112bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	}
113bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}
114bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
115bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezvoid
116f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergnv04_defer_control(struct gl_context *ctx, int emit)
117bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{
118bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	context_dirty(ctx, CONTROL);
119bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}
120bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
121bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezvoid
122f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergnv04_emit_control(struct gl_context *ctx, int emit)
123bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{
124f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	struct nv04_context *nv04 = to_nv04_context(ctx);
125f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	int cull = ctx->Polygon.CullFaceMode;
126f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	int front = ctx->Polygon.FrontFace;
127bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
128f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	nv04->ctrl[0] = NV04_TEXTURED_TRIANGLE_CONTROL_Z_FORMAT_FIXED |
1298983855012301c8ebc023edf42ddf5e423189585Viktor Novotný			NV04_TEXTURED_TRIANGLE_CONTROL_ORIGIN_CORNER;
130f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	nv04->ctrl[1] = 0;
131f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	nv04->ctrl[2] = 0;
132f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs
133f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	/* Dithering. */
134f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	if (ctx->Color.DitherFlag)
135f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs		nv04->ctrl[0] |= NV04_TEXTURED_TRIANGLE_CONTROL_DITHER_ENABLE;
136f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs
137f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	/* Cull mode. */
138f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	if (!ctx->Polygon.CullFlag)
139f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs		nv04->ctrl[0] |= NV04_TEXTURED_TRIANGLE_CONTROL_CULL_MODE_NONE;
140f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	else if (cull == GL_FRONT_AND_BACK)
141f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs		nv04->ctrl[0] |= NV04_TEXTURED_TRIANGLE_CONTROL_CULL_MODE_BOTH;
142f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	else
143f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs		nv04->ctrl[0] |= (cull == GL_FRONT) ^ (front == GL_CCW) ?
144f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs				 NV04_TEXTURED_TRIANGLE_CONTROL_CULL_MODE_CW :
145f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs				 NV04_TEXTURED_TRIANGLE_CONTROL_CULL_MODE_CCW;
146f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs
147f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	/* Depth test. */
148f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	if (ctx->Depth.Test)
149f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs		nv04->ctrl[0] |= NV04_TEXTURED_TRIANGLE_CONTROL_Z_ENABLE;
150f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	if (ctx->Depth.Mask)
151f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs		nv04->ctrl[0] |= NV04_TEXTURED_TRIANGLE_CONTROL_Z_WRITE;
152f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs
153f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	nv04->ctrl[0] |= get_comparison_op(ctx->Depth.Func) << 16;
154f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs
155f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	/* Alpha test. */
156f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	if (ctx->Color.AlphaEnabled)
157f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs		nv04->ctrl[0] |= NV04_TEXTURED_TRIANGLE_CONTROL_ALPHA_ENABLE;
158f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs
159f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	nv04->ctrl[0] |= get_comparison_op(ctx->Color.AlphaFunc) << 8 |
160f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs			 FLOAT_TO_UBYTE(ctx->Color.AlphaRef);
161f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs
162f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	/* Color mask. */
163f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	if (ctx->Color.ColorMask[0][RCOMP])
164f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs		nv04->ctrl[0] |= NV04_MULTITEX_TRIANGLE_CONTROL0_RED_WRITE;
165f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	if (ctx->Color.ColorMask[0][GCOMP])
166f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs		nv04->ctrl[0] |= NV04_MULTITEX_TRIANGLE_CONTROL0_GREEN_WRITE;
167f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	if (ctx->Color.ColorMask[0][BCOMP])
168f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs		nv04->ctrl[0] |= NV04_MULTITEX_TRIANGLE_CONTROL0_BLUE_WRITE;
169f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	if (ctx->Color.ColorMask[0][ACOMP])
170f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs		nv04->ctrl[0] |= NV04_MULTITEX_TRIANGLE_CONTROL0_ALPHA_WRITE;
171f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs
172f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	/* Stencil test. */
173f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	if (ctx->Stencil.WriteMask[0])
174f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs		nv04->ctrl[0] |= NV04_MULTITEX_TRIANGLE_CONTROL0_STENCIL_WRITE;
175f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs
176f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	if (ctx->Stencil.Enabled)
177f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs		nv04->ctrl[1] |= NV04_MULTITEX_TRIANGLE_CONTROL1_STENCIL_ENABLE;
178f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs
179f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	nv04->ctrl[1] |= get_comparison_op(ctx->Stencil.Function[0]) << 4 |
180f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs			 ctx->Stencil.Ref[0] << 8 |
181f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs			 ctx->Stencil.ValueMask[0] << 16 |
182f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs			 ctx->Stencil.WriteMask[0] << 24;
183f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs
184f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	nv04->ctrl[2] |= get_stencil_op(ctx->Stencil.ZPassFunc[0]) << 8 |
185f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs			 get_stencil_op(ctx->Stencil.ZFailFunc[0]) << 4 |
186f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs			 get_stencil_op(ctx->Stencil.FailFunc[0]);
187bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}
188bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
189bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezvoid
190f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergnv04_defer_blend(struct gl_context *ctx, int emit)
191bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{
192bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	context_dirty(ctx, BLEND);
193bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}
194bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
195bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezvoid
196f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergnv04_emit_blend(struct gl_context *ctx, int emit)
197bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{
198f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	struct nv04_context *nv04 = to_nv04_context(ctx);
199bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
200f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	nv04->blend &= NV04_TEXTURED_TRIANGLE_BLEND_TEXTURE_MAP__MASK;
201f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	nv04->blend |= NV04_TEXTURED_TRIANGLE_BLEND_MASK_BIT_MSB |
202f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs		       NV04_TEXTURED_TRIANGLE_BLEND_TEXTURE_PERSPECTIVE_ENABLE;
203bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
204f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	/* Alpha blending. */
205f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	nv04->blend |= get_blend_func(ctx->Color.Blend[0].DstRGB) << 28 |
206f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs		       get_blend_func(ctx->Color.Blend[0].SrcRGB) << 24;
207bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
208f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	if (ctx->Color.BlendEnabled)
209f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs		nv04->blend |= NV04_TEXTURED_TRIANGLE_BLEND_BLEND_ENABLE;
2106a15edfed326a06f08ac63020dc9472e45d8a9e1Andrew Randrianasulu
211f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	/* Shade model. */
212f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	if (ctx->Light.ShadeModel == GL_SMOOTH)
213f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs		nv04->blend |= NV04_TEXTURED_TRIANGLE_BLEND_SHADE_MODE_GOURAUD;
214f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	else
215f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs		nv04->blend |= NV04_TEXTURED_TRIANGLE_BLEND_SHADE_MODE_FLAT;
216bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
217f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	/* Secondary color */
218f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	if (_mesa_need_secondary_color(ctx))
219f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs		nv04->blend |= NV04_TEXTURED_TRIANGLE_BLEND_SPECULAR_ENABLE;
220bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
221f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	/* Fog. */
222f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs	if (ctx->Fog.Enabled) {
223f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs		nv04->blend |= NV04_TEXTURED_TRIANGLE_BLEND_FOG_ENABLE;
224f3d8bd3f7b9f5c6387cd5e629a82db9ad9a1e652Ben Skeggs		nv04->fog = pack_rgba_f(MESA_FORMAT_ARGB8888, ctx->Fog.Color);
225bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	}
226bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}
227