Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4358 Serge 1
/*
2
 * Copyright (C) 2009-2010 Francisco Jerez.
3
 * All Rights Reserved.
4
 *
5
 * Permission is hereby granted, free of charge, to any person obtaining
6
 * a copy of this software and associated documentation files (the
7
 * "Software"), to deal in the Software without restriction, including
8
 * without limitation the rights to use, copy, modify, merge, publish,
9
 * distribute, sublicense, and/or sell copies of the Software, and to
10
 * permit persons to whom the Software is furnished to do so, subject to
11
 * the following conditions:
12
 *
13
 * The above copyright notice and this permission notice (including the
14
 * next paragraph) shall be included in all copies or substantial
15
 * portions of the Software.
16
 *
17
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20
 * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
21
 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22
 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23
 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
 *
25
 */
26
 
27
#include 
28
#include "main/state.h"
29
#include "nouveau_driver.h"
30
#include "nouveau_context.h"
31
#include "nouveau_fbo.h"
32
#include "nouveau_util.h"
33
#include "nv_object.xml.h"
34
#include "nv10_3d.xml.h"
35
#include "nv04_driver.h"
36
#include "nv10_driver.h"
37
 
38
static GLboolean
39
use_fast_zclear(struct gl_context *ctx, GLbitfield buffers)
40
{
41
	struct nouveau_context *nctx = to_nouveau_context(ctx);
42
	struct gl_framebuffer *fb = ctx->DrawBuffer;
43
 
44
	if (buffers & BUFFER_BIT_STENCIL) {
45
		/*
46
		 * The stencil test is bypassed when fast Z clears are
47
		 * enabled.
48
		 */
49
		nctx->hierz.clear_blocked = GL_TRUE;
50
		context_dirty(ctx, ZCLEAR);
51
		return GL_FALSE;
52
	}
53
 
54
	return !nctx->hierz.clear_blocked &&
55
		fb->_Xmax == fb->Width && fb->_Xmin == 0 &&
56
		fb->_Ymax == fb->Height && fb->_Ymin == 0;
57
}
58
 
59
GLboolean
60
nv10_use_viewport_zclear(struct gl_context *ctx)
61
{
62
	struct nouveau_context *nctx = to_nouveau_context(ctx);
63
	struct gl_framebuffer *fb = ctx->DrawBuffer;
64
	struct gl_renderbuffer *depthRb = fb->Attachment[BUFFER_DEPTH].Renderbuffer;
65
 
66
	return context_chipset(ctx) < 0x17 &&
67
		!nctx->hierz.clear_blocked && depthRb &&
68
		(_mesa_get_format_bits(depthRb->Format,
69
				       GL_DEPTH_BITS) >= 24);
70
}
71
 
72
float
73
nv10_transform_depth(struct gl_context *ctx, float z)
74
{
75
	struct nouveau_context *nctx = to_nouveau_context(ctx);
76
 
77
	if (nv10_use_viewport_zclear(ctx))
78
		return 2097152.0 * (z + (nctx->hierz.clear_seq & 7));
79
	else
80
		return ctx->DrawBuffer->_DepthMaxF * z;
81
}
82
 
83
static void
84
nv10_zclear(struct gl_context *ctx, GLbitfield *buffers)
85
{
86
	/*
87
	 * Pre-nv17 cards don't have native support for fast Z clears,
88
	 * but in some cases we can still "clear" the Z buffer without
89
	 * actually blitting to it if we're willing to sacrifice a few
90
	 * bits of depth precision.
91
	 *
92
	 * Each time a clear is requested we modify the viewport
93
	 * transform in such a way that the old contents of the depth
94
	 * buffer are clamped to the requested clear value when
95
	 * they're read by the GPU.
96
	 */
97
	struct nouveau_context *nctx = to_nouveau_context(ctx);
98
	struct gl_framebuffer *fb = ctx->DrawBuffer;
99
	struct nouveau_framebuffer *nfb = to_nouveau_framebuffer(fb);
100
	struct nouveau_surface *s = &to_nouveau_renderbuffer(
101
		fb->Attachment[BUFFER_DEPTH].Renderbuffer)->surface;
102
 
103
	if (nv10_use_viewport_zclear(ctx)) {
104
		int x, y, w, h;
105
		float z = ctx->Depth.Clear;
106
		uint32_t value = pack_zs_f(s->format, z, 0);
107
 
108
		get_scissors(fb, &x, &y, &w, &h);
109
		*buffers &= ~BUFFER_BIT_DEPTH;
110
 
111
		if (use_fast_zclear(ctx, *buffers)) {
112
			if (nfb->hierz.clear_value != value) {
113
				/* Don't fast clear if we're changing
114
				 * the depth value. */
115
				nfb->hierz.clear_value = value;
116
 
117
			} else if (z == 0.0) {
118
				nctx->hierz.clear_seq++;
119
				context_dirty(ctx, ZCLEAR);
120
 
121
				if ((nctx->hierz.clear_seq & 7) != 0 &&
122
				    nctx->hierz.clear_seq != 1)
123
					/* We didn't wrap around -- no need to
124
					 * clear the depth buffer for real. */
125
					return;
126
 
127
			} else if (z == 1.0) {
128
				nctx->hierz.clear_seq--;
129
				context_dirty(ctx, ZCLEAR);
130
 
131
				if ((nctx->hierz.clear_seq & 7) != 7)
132
					/* No wrap around */
133
					return;
134
			}
135
		}
136
 
137
		value = pack_zs_f(s->format,
138
				  (z + (nctx->hierz.clear_seq & 7)) / 8, 0);
139
		context_drv(ctx)->surface_fill(ctx, s, ~0, value, x, y, w, h);
140
	}
141
}
142
 
143
static void
144
nv17_zclear(struct gl_context *ctx, GLbitfield *buffers)
145
{
146
	struct nouveau_context *nctx = to_nouveau_context(ctx);
147
	struct nouveau_pushbuf *push = context_push(ctx);
148
	struct nouveau_framebuffer *nfb = to_nouveau_framebuffer(
149
		ctx->DrawBuffer);
150
	struct nouveau_surface *s = &to_nouveau_renderbuffer(
151
		nfb->base.Attachment[BUFFER_DEPTH].Renderbuffer)->surface;
152
 
153
	/* Clear the hierarchical depth buffer */
154
	BEGIN_NV04(push, NV17_3D(HIERZ_FILL_VALUE), 1);
155
	PUSH_DATA (push, pack_zs_f(s->format, ctx->Depth.Clear, 0));
156
	BEGIN_NV04(push, NV17_3D(HIERZ_BUFFER_CLEAR), 1);
157
	PUSH_DATA (push, 1);
158
 
159
	/* Mark the depth buffer as cleared */
160
	if (use_fast_zclear(ctx, *buffers)) {
161
		if (nctx->hierz.clear_seq)
162
			*buffers &= ~BUFFER_BIT_DEPTH;
163
 
164
		nfb->hierz.clear_value =
165
			pack_zs_f(s->format, ctx->Depth.Clear, 0);
166
		nctx->hierz.clear_seq++;
167
 
168
		context_dirty(ctx, ZCLEAR);
169
	}
170
}
171
 
172
static void
173
nv10_clear(struct gl_context *ctx, GLbitfield buffers)
174
{
175
	struct nouveau_context *nctx = to_nouveau_context(ctx);
176
	struct nouveau_pushbuf *push = context_push(ctx);
177
 
178
	nouveau_validate_framebuffer(ctx);
179
 
180
	nouveau_pushbuf_bufctx(push, nctx->hw.bufctx);
181
	if (nouveau_pushbuf_validate(push)) {
182
		nouveau_pushbuf_bufctx(push, NULL);
183
		return;
184
	}
185
 
186
	if ((buffers & BUFFER_BIT_DEPTH) && ctx->Depth.Mask) {
187
		if (context_chipset(ctx) >= 0x17)
188
			nv17_zclear(ctx, &buffers);
189
		else
190
			nv10_zclear(ctx, &buffers);
191
 
192
		/* Emit the zclear state if it's dirty */
193
		_mesa_update_state(ctx);
194
	}
195
 
196
	nouveau_pushbuf_bufctx(push, NULL);
197
	nouveau_clear(ctx, buffers);
198
}
199
 
200
static void
201
nv10_hwctx_init(struct gl_context *ctx)
202
{
203
	struct nouveau_pushbuf *push = context_push(ctx);
204
	struct nouveau_hw_state *hw = &to_nouveau_context(ctx)->hw;
205
	struct nv04_fifo *fifo = hw->chan->data;
206
	int i;
207
 
208
	BEGIN_NV04(push, NV01_SUBC(3D, OBJECT), 1);
209
	PUSH_DATA (push, hw->eng3d->handle);
210
	BEGIN_NV04(push, NV10_3D(DMA_NOTIFY), 1);
211
	PUSH_DATA (push, hw->ntfy->handle);
212
 
213
	BEGIN_NV04(push, NV10_3D(DMA_TEXTURE0), 3);
214
	PUSH_DATA (push, fifo->vram);
215
	PUSH_DATA (push, fifo->gart);
216
	PUSH_DATA (push, fifo->gart);
217
	BEGIN_NV04(push, NV10_3D(DMA_COLOR), 2);
218
	PUSH_DATA (push, fifo->vram);
219
	PUSH_DATA (push, fifo->vram);
220
 
221
	BEGIN_NV04(push, NV04_GRAPH(3D, NOP), 1);
222
	PUSH_DATA (push, 0);
223
 
224
	BEGIN_NV04(push, NV10_3D(RT_HORIZ), 2);
225
	PUSH_DATA (push, 0);
226
	PUSH_DATA (push, 0);
227
 
228
	BEGIN_NV04(push, NV10_3D(VIEWPORT_CLIP_HORIZ(0)), 1);
229
	PUSH_DATA (push, 0x7ff << 16 | 0x800);
230
	BEGIN_NV04(push, NV10_3D(VIEWPORT_CLIP_VERT(0)), 1);
231
	PUSH_DATA (push, 0x7ff << 16 | 0x800);
232
 
233
	for (i = 1; i < 8; i++) {
234
		BEGIN_NV04(push, NV10_3D(VIEWPORT_CLIP_HORIZ(i)), 1);
235
		PUSH_DATA (push, 0);
236
		BEGIN_NV04(push, NV10_3D(VIEWPORT_CLIP_VERT(i)), 1);
237
		PUSH_DATA (push, 0);
238
	}
239
 
240
	BEGIN_NV04(push, SUBC_3D(0x290), 1);
241
	PUSH_DATA (push, 0x10 << 16 | 1);
242
	BEGIN_NV04(push, SUBC_3D(0x3f4), 1);
243
	PUSH_DATA (push, 0);
244
 
245
	BEGIN_NV04(push, NV04_GRAPH(3D, NOP), 1);
246
	PUSH_DATA (push, 0);
247
 
248
	if (context_chipset(ctx) >= 0x17) {
249
		BEGIN_NV04(push, NV17_3D(UNK01AC), 2);
250
		PUSH_DATA (push, fifo->vram);
251
		PUSH_DATA (push, fifo->vram);
252
 
253
		BEGIN_NV04(push, SUBC_3D(0xd84), 1);
254
		PUSH_DATA (push, 0x3);
255
 
256
		BEGIN_NV04(push, NV17_3D(COLOR_MASK_ENABLE), 1);
257
		PUSH_DATA (push, 1);
258
	}
259
 
260
	if (context_chipset(ctx) >= 0x11) {
261
		BEGIN_NV04(push, SUBC_3D(0x120), 3);
262
		PUSH_DATA (push, 0);
263
		PUSH_DATA (push, 1);
264
		PUSH_DATA (push, 2);
265
 
266
		BEGIN_NV04(push, NV04_GRAPH(3D, NOP), 1);
267
		PUSH_DATA (push, 0);
268
	}
269
 
270
	BEGIN_NV04(push, NV04_GRAPH(3D, NOP), 1);
271
	PUSH_DATA (push, 0);
272
 
273
	/* Set state */
274
	BEGIN_NV04(push, NV10_3D(FOG_ENABLE), 1);
275
	PUSH_DATA (push, 0);
276
	BEGIN_NV04(push, NV10_3D(ALPHA_FUNC_ENABLE), 1);
277
	PUSH_DATA (push, 0);
278
	BEGIN_NV04(push, NV10_3D(ALPHA_FUNC_FUNC), 2);
279
	PUSH_DATA (push, 0x207);
280
	PUSH_DATA (push, 0);
281
	BEGIN_NV04(push, NV10_3D(TEX_ENABLE(0)), 2);
282
	PUSH_DATA (push, 0);
283
	PUSH_DATA (push, 0);
284
 
285
	BEGIN_NV04(push, NV10_3D(BLEND_FUNC_ENABLE), 1);
286
	PUSH_DATA (push, 0);
287
	BEGIN_NV04(push, NV10_3D(DITHER_ENABLE), 2);
288
	PUSH_DATA (push, 1);
289
	PUSH_DATA (push, 0);
290
	BEGIN_NV04(push, NV10_3D(LINE_SMOOTH_ENABLE), 1);
291
	PUSH_DATA (push, 0);
292
	BEGIN_NV04(push, NV10_3D(VERTEX_WEIGHT_ENABLE), 2);
293
	PUSH_DATA (push, 0);
294
	PUSH_DATA (push, 0);
295
	BEGIN_NV04(push, NV10_3D(BLEND_FUNC_SRC), 4);
296
	PUSH_DATA (push, 1);
297
	PUSH_DATA (push, 0);
298
	PUSH_DATA (push, 0);
299
	PUSH_DATA (push, 0x8006);
300
	BEGIN_NV04(push, NV10_3D(STENCIL_MASK), 8);
301
	PUSH_DATA (push, 0xff);
302
	PUSH_DATA (push, 0x207);
303
	PUSH_DATA (push, 0);
304
	PUSH_DATA (push, 0xff);
305
	PUSH_DATA (push, 0x1e00);
306
	PUSH_DATA (push, 0x1e00);
307
	PUSH_DATA (push, 0x1e00);
308
	PUSH_DATA (push, 0x1d01);
309
	BEGIN_NV04(push, NV10_3D(NORMALIZE_ENABLE), 1);
310
	PUSH_DATA (push, 0);
311
	BEGIN_NV04(push, NV10_3D(FOG_ENABLE), 2);
312
	PUSH_DATA (push, 0);
313
	PUSH_DATA (push, 0);
314
	BEGIN_NV04(push, NV10_3D(LIGHT_MODEL), 1);
315
	PUSH_DATA (push, 0);
316
	BEGIN_NV04(push, NV10_3D(SEPARATE_SPECULAR_ENABLE), 1);
317
	PUSH_DATA (push, 0);
318
	BEGIN_NV04(push, NV10_3D(ENABLED_LIGHTS), 1);
319
	PUSH_DATA (push, 0);
320
	BEGIN_NV04(push, NV10_3D(POLYGON_OFFSET_POINT_ENABLE), 3);
321
	PUSH_DATA (push, 0);
322
	PUSH_DATA (push, 0);
323
	PUSH_DATA (push, 0);
324
	BEGIN_NV04(push, NV10_3D(DEPTH_FUNC), 1);
325
	PUSH_DATA (push, 0x201);
326
	BEGIN_NV04(push, NV10_3D(DEPTH_WRITE_ENABLE), 1);
327
	PUSH_DATA (push, 0);
328
	BEGIN_NV04(push, NV10_3D(DEPTH_TEST_ENABLE), 1);
329
	PUSH_DATA (push, 0);
330
	BEGIN_NV04(push, NV10_3D(POLYGON_OFFSET_FACTOR), 2);
331
	PUSH_DATA (push, 0);
332
	PUSH_DATA (push, 0);
333
	BEGIN_NV04(push, NV10_3D(POINT_SIZE), 1);
334
	PUSH_DATA (push, 8);
335
	BEGIN_NV04(push, NV10_3D(POINT_PARAMETERS_ENABLE), 2);
336
	PUSH_DATA (push, 0);
337
	PUSH_DATA (push, 0);
338
	BEGIN_NV04(push, NV10_3D(LINE_WIDTH), 1);
339
	PUSH_DATA (push, 8);
340
	BEGIN_NV04(push, NV10_3D(LINE_SMOOTH_ENABLE), 1);
341
	PUSH_DATA (push, 0);
342
	BEGIN_NV04(push, NV10_3D(POLYGON_MODE_FRONT), 2);
343
	PUSH_DATA (push, 0x1b02);
344
	PUSH_DATA (push, 0x1b02);
345
	BEGIN_NV04(push, NV10_3D(CULL_FACE), 2);
346
	PUSH_DATA (push, 0x405);
347
	PUSH_DATA (push, 0x901);
348
	BEGIN_NV04(push, NV10_3D(POLYGON_SMOOTH_ENABLE), 1);
349
	PUSH_DATA (push, 0);
350
	BEGIN_NV04(push, NV10_3D(CULL_FACE_ENABLE), 1);
351
	PUSH_DATA (push, 0);
352
	BEGIN_NV04(push, NV10_3D(TEX_GEN_MODE(0, 0)), 8);
353
	for (i = 0; i < 8; i++)
354
		PUSH_DATA (push, 0);
355
 
356
	BEGIN_NV04(push, NV10_3D(TEX_MATRIX_ENABLE(0)), 2);
357
	PUSH_DATA (push, 0);
358
	PUSH_DATA (push, 0);
359
	BEGIN_NV04(push, NV10_3D(FOG_COEFF(0)), 3);
360
	PUSH_DATA (push, 0x3fc00000);	/* -1.50 */
361
	PUSH_DATA (push, 0xbdb8aa0a);	/* -0.09 */
362
	PUSH_DATA (push, 0);		/*  0.00 */
363
 
364
	BEGIN_NV04(push, NV04_GRAPH(3D, NOP), 1);
365
	PUSH_DATA (push, 0);
366
 
367
	BEGIN_NV04(push, NV10_3D(FOG_MODE), 2);
368
	PUSH_DATA (push, 0x802);
369
	PUSH_DATA (push, 2);
370
	/* for some reason VIEW_MATRIX_ENABLE need to be 6 instead of 4 when
371
	 * using texturing, except when using the texture matrix
372
	 */
373
	BEGIN_NV04(push, NV10_3D(VIEW_MATRIX_ENABLE), 1);
374
	PUSH_DATA (push, 6);
375
	BEGIN_NV04(push, NV10_3D(COLOR_MASK), 1);
376
	PUSH_DATA (push, 0x01010101);
377
 
378
	/* Set vertex component */
379
	BEGIN_NV04(push, NV10_3D(VERTEX_COL_4F_R), 4);
380
	PUSH_DATAf(push, 1.0);
381
	PUSH_DATAf(push, 0.0);
382
	PUSH_DATAf(push, 0.0);
383
	PUSH_DATAf(push, 1.0);
384
	BEGIN_NV04(push, NV10_3D(VERTEX_COL2_3F_R), 3);
385
	PUSH_DATA (push, 0);
386
	PUSH_DATA (push, 0);
387
	PUSH_DATA (push, 0);
388
	BEGIN_NV04(push, NV10_3D(VERTEX_NOR_3F_X), 3);
389
	PUSH_DATA (push, 0);
390
	PUSH_DATA (push, 0);
391
	PUSH_DATAf(push, 1.0);
392
	BEGIN_NV04(push, NV10_3D(VERTEX_TX0_4F_S), 4);
393
	PUSH_DATAf(push, 0.0);
394
	PUSH_DATAf(push, 0.0);
395
	PUSH_DATAf(push, 0.0);
396
	PUSH_DATAf(push, 1.0);
397
	BEGIN_NV04(push, NV10_3D(VERTEX_TX1_4F_S), 4);
398
	PUSH_DATAf(push, 0.0);
399
	PUSH_DATAf(push, 0.0);
400
	PUSH_DATAf(push, 0.0);
401
	PUSH_DATAf(push, 1.0);
402
	BEGIN_NV04(push, NV10_3D(VERTEX_FOG_1F), 1);
403
	PUSH_DATAf(push, 0.0);
404
	BEGIN_NV04(push, NV10_3D(EDGEFLAG_ENABLE), 1);
405
	PUSH_DATA (push, 1);
406
 
407
	BEGIN_NV04(push, NV10_3D(DEPTH_RANGE_NEAR), 2);
408
	PUSH_DATAf(push, 0.0);
409
	PUSH_DATAf(push, 16777216.0);
410
 
411
	PUSH_KICK (push);
412
}
413
 
414
static void
415
nv10_context_destroy(struct gl_context *ctx)
416
{
417
	struct nouveau_context *nctx = to_nouveau_context(ctx);
418
 
419
	nv04_surface_takedown(ctx);
420
	nv10_swtnl_destroy(ctx);
421
	nv10_vbo_destroy(ctx);
422
 
423
	nouveau_object_del(&nctx->hw.eng3d);
424
 
425
	nouveau_context_deinit(ctx);
426
	free(ctx);
427
}
428
 
429
static struct gl_context *
430
nv10_context_create(struct nouveau_screen *screen, const struct gl_config *visual,
431
		    struct gl_context *share_ctx)
432
{
433
	struct nouveau_context *nctx;
434
	struct gl_context *ctx;
435
	unsigned celsius_class;
436
	int ret;
437
 
438
	nctx = CALLOC_STRUCT(nouveau_context);
439
	if (!nctx)
440
		return NULL;
441
 
442
	ctx = &nctx->base;
443
 
444
	if (!nouveau_context_init(ctx, screen, visual, share_ctx))
445
		goto fail;
446
 
447
	ctx->Extensions.ARB_texture_env_crossbar = true;
448
	ctx->Extensions.ARB_texture_env_combine = true;
449
	ctx->Extensions.ARB_texture_env_dot3 = true;
450
	ctx->Extensions.NV_fog_distance = true;
451
	ctx->Extensions.NV_texture_rectangle = true;
452
	if (ctx->Mesa_DXTn) {
453
		ctx->Extensions.EXT_texture_compression_s3tc = true;
454
		ctx->Extensions.ANGLE_texture_compression_dxt = true;
455
	}
456
 
457
	/* GL constants. */
458
	ctx->Const.MaxTextureLevels = 12;
459
	ctx->Const.MaxTextureCoordUnits = NV10_TEXTURE_UNITS;
460
	ctx->Const.FragmentProgram.MaxTextureImageUnits = NV10_TEXTURE_UNITS;
461
	ctx->Const.MaxTextureUnits = NV10_TEXTURE_UNITS;
462
	ctx->Const.MaxTextureMaxAnisotropy = 2;
463
	ctx->Const.MaxTextureLodBias = 15;
464
	ctx->Driver.Clear = nv10_clear;
465
 
466
	/* 2D engine. */
467
	ret = nv04_surface_init(ctx);
468
	if (!ret)
469
		goto fail;
470
 
471
	/* 3D engine. */
472
	if (context_chipset(ctx) >= 0x17 && context_chipset(ctx) != 0x1a)
473
		celsius_class = NV17_3D_CLASS;
474
	else if (context_chipset(ctx) >= 0x11)
475
		celsius_class = NV15_3D_CLASS;
476
	else
477
		celsius_class = NV10_3D_CLASS;
478
 
479
	ret = nouveau_object_new(context_chan(ctx), 0xbeef0001, celsius_class,
480
				 NULL, 0, &nctx->hw.eng3d);
481
	if (ret)
482
		goto fail;
483
 
484
	nv10_hwctx_init(ctx);
485
	nv10_vbo_init(ctx);
486
	nv10_swtnl_init(ctx);
487
 
488
	return ctx;
489
 
490
fail:
491
	nv10_context_destroy(ctx);
492
	return NULL;
493
}
494
 
495
const struct nouveau_driver nv10_driver = {
496
	.context_create = nv10_context_create,
497
	.context_destroy = nv10_context_destroy,
498
	.surface_copy = nv04_surface_copy,
499
	.surface_fill = nv04_surface_fill,
500
	.emit = (nouveau_state_func[]) {
501
		nv10_emit_alpha_func,
502
		nv10_emit_blend_color,
503
		nv10_emit_blend_equation,
504
		nv10_emit_blend_func,
505
		nv10_emit_clip_plane,
506
		nv10_emit_clip_plane,
507
		nv10_emit_clip_plane,
508
		nv10_emit_clip_plane,
509
		nv10_emit_clip_plane,
510
		nv10_emit_clip_plane,
511
		nv10_emit_color_mask,
512
		nv10_emit_color_material,
513
		nv10_emit_cull_face,
514
		nv10_emit_front_face,
515
		nv10_emit_depth,
516
		nv10_emit_dither,
517
		nv10_emit_frag,
518
		nv10_emit_framebuffer,
519
		nv10_emit_fog,
520
		nv10_emit_light_enable,
521
		nv10_emit_light_model,
522
		nv10_emit_light_source,
523
		nv10_emit_light_source,
524
		nv10_emit_light_source,
525
		nv10_emit_light_source,
526
		nv10_emit_light_source,
527
		nv10_emit_light_source,
528
		nv10_emit_light_source,
529
		nv10_emit_light_source,
530
		nv10_emit_line_stipple,
531
		nv10_emit_line_mode,
532
		nv10_emit_logic_opcode,
533
		nv10_emit_material_ambient,
534
		nouveau_emit_nothing,
535
		nv10_emit_material_diffuse,
536
		nouveau_emit_nothing,
537
		nv10_emit_material_specular,
538
		nouveau_emit_nothing,
539
		nv10_emit_material_shininess,
540
		nouveau_emit_nothing,
541
		nv10_emit_modelview,
542
		nv10_emit_point_mode,
543
		nv10_emit_point_parameter,
544
		nv10_emit_polygon_mode,
545
		nv10_emit_polygon_offset,
546
		nv10_emit_polygon_stipple,
547
		nv10_emit_projection,
548
		nv10_emit_render_mode,
549
		nv10_emit_scissor,
550
		nv10_emit_shade_model,
551
		nv10_emit_stencil_func,
552
		nv10_emit_stencil_mask,
553
		nv10_emit_stencil_op,
554
		nv10_emit_tex_env,
555
		nv10_emit_tex_env,
556
		nouveau_emit_nothing,
557
		nouveau_emit_nothing,
558
		nv10_emit_tex_gen,
559
		nv10_emit_tex_gen,
560
		nouveau_emit_nothing,
561
		nouveau_emit_nothing,
562
		nv10_emit_tex_mat,
563
		nv10_emit_tex_mat,
564
		nouveau_emit_nothing,
565
		nouveau_emit_nothing,
566
		nv10_emit_tex_obj,
567
		nv10_emit_tex_obj,
568
		nouveau_emit_nothing,
569
		nouveau_emit_nothing,
570
		nv10_emit_viewport,
571
		nv10_emit_zclear
572
	},
573
	.num_emit = NUM_NV10_STATE,
574
};