• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 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 "nouveau_driver.h"
28 #include "nouveau_context.h"
29 #include "nouveau_texture.h"
30 #include "nouveau_util.h"
31 
32 #include "swrast/swrast.h"
33 #include "tnl/tnl.h"
34 #include "util/bitscan.h"
35 
36 static void
nouveau_alpha_func(struct gl_context * ctx,GLenum func,GLfloat ref)37 nouveau_alpha_func(struct gl_context *ctx, GLenum func, GLfloat ref)
38 {
39 	context_dirty(ctx, ALPHA_FUNC);
40 }
41 
42 static void
nouveau_blend_color(struct gl_context * ctx,const GLfloat color[4])43 nouveau_blend_color(struct gl_context *ctx, const GLfloat color[4])
44 {
45 	context_dirty(ctx, BLEND_COLOR);
46 }
47 
48 static void
nouveau_blend_equation_separate(struct gl_context * ctx,GLenum modeRGB,GLenum modeA)49 nouveau_blend_equation_separate(struct gl_context *ctx, GLenum modeRGB, GLenum modeA)
50 {
51 	context_dirty(ctx, BLEND_EQUATION);
52 }
53 
54 static void
nouveau_blend_func_separate(struct gl_context * ctx,GLenum sfactorRGB,GLenum dfactorRGB,GLenum sfactorA,GLenum dfactorA)55 nouveau_blend_func_separate(struct gl_context *ctx, GLenum sfactorRGB,
56 			    GLenum dfactorRGB, GLenum sfactorA, GLenum dfactorA)
57 {
58 	context_dirty(ctx, BLEND_FUNC);
59 }
60 
61 static void
nouveau_clip_plane(struct gl_context * ctx,GLenum plane,const GLfloat * equation)62 nouveau_clip_plane(struct gl_context *ctx, GLenum plane, const GLfloat *equation)
63 {
64 	context_dirty_i(ctx, CLIP_PLANE, plane - GL_CLIP_PLANE0);
65 }
66 
67 static void
nouveau_color_mask(struct gl_context * ctx,GLboolean rmask,GLboolean gmask,GLboolean bmask,GLboolean amask)68 nouveau_color_mask(struct gl_context *ctx, GLboolean rmask, GLboolean gmask,
69 		   GLboolean bmask, GLboolean amask)
70 {
71 	context_dirty(ctx, COLOR_MASK);
72 }
73 
74 static void
nouveau_color_material(struct gl_context * ctx,GLenum face,GLenum mode)75 nouveau_color_material(struct gl_context *ctx, GLenum face, GLenum mode)
76 {
77 	context_dirty(ctx, COLOR_MATERIAL);
78 	context_dirty(ctx, MATERIAL_FRONT_AMBIENT);
79 	context_dirty(ctx, MATERIAL_BACK_AMBIENT);
80 	context_dirty(ctx, MATERIAL_FRONT_DIFFUSE);
81 	context_dirty(ctx, MATERIAL_BACK_DIFFUSE);
82 	context_dirty(ctx, MATERIAL_FRONT_SPECULAR);
83 	context_dirty(ctx, MATERIAL_BACK_SPECULAR);
84 }
85 
86 static void
nouveau_cull_face(struct gl_context * ctx,GLenum mode)87 nouveau_cull_face(struct gl_context *ctx, GLenum mode)
88 {
89 	context_dirty(ctx, CULL_FACE);
90 }
91 
92 static void
nouveau_front_face(struct gl_context * ctx,GLenum mode)93 nouveau_front_face(struct gl_context *ctx, GLenum mode)
94 {
95 	context_dirty(ctx, FRONT_FACE);
96 }
97 
98 static void
nouveau_depth_func(struct gl_context * ctx,GLenum func)99 nouveau_depth_func(struct gl_context *ctx, GLenum func)
100 {
101 	context_dirty(ctx, DEPTH);
102 }
103 
104 static void
nouveau_depth_mask(struct gl_context * ctx,GLboolean flag)105 nouveau_depth_mask(struct gl_context *ctx, GLboolean flag)
106 {
107 	context_dirty(ctx, DEPTH);
108 }
109 
110 static void
nouveau_read_buffer(struct gl_context * ctx,GLenum buffer)111 nouveau_read_buffer(struct gl_context *ctx, GLenum buffer)
112 {
113 	nouveau_validate_framebuffer(ctx);
114 }
115 
116 static void
nouveau_draw_buffers(struct gl_context * ctx,GLsizei n,const GLenum * buffers)117 nouveau_draw_buffers(struct gl_context *ctx, GLsizei n, const GLenum *buffers)
118 {
119 	nouveau_validate_framebuffer(ctx);
120 	context_dirty(ctx, FRAMEBUFFER);
121 }
122 
123 static void
nouveau_enable(struct gl_context * ctx,GLenum cap,GLboolean state)124 nouveau_enable(struct gl_context *ctx, GLenum cap, GLboolean state)
125 {
126 	GLbitfield mask;
127 
128 	switch (cap) {
129 	case GL_ALPHA_TEST:
130 		context_dirty(ctx, ALPHA_FUNC);
131 		break;
132 	case GL_BLEND:
133 		context_dirty(ctx, BLEND_EQUATION);
134 		break;
135 	case GL_COLOR_LOGIC_OP:
136 		context_dirty(ctx, LOGIC_OPCODE);
137 		break;
138 	case GL_COLOR_MATERIAL:
139 		context_dirty(ctx, COLOR_MATERIAL);
140 		context_dirty(ctx, MATERIAL_FRONT_AMBIENT);
141 		context_dirty(ctx, MATERIAL_BACK_AMBIENT);
142 		context_dirty(ctx, MATERIAL_FRONT_DIFFUSE);
143 		context_dirty(ctx, MATERIAL_BACK_DIFFUSE);
144 		context_dirty(ctx, MATERIAL_FRONT_SPECULAR);
145 		context_dirty(ctx, MATERIAL_BACK_SPECULAR);
146 		break;
147 	case GL_COLOR_SUM_EXT:
148 		context_dirty(ctx, FRAG);
149 		context_dirty(ctx, LIGHT_MODEL);
150 		break;
151 	case GL_CULL_FACE:
152 		context_dirty(ctx, CULL_FACE);
153 		break;
154 	case GL_DEPTH_TEST:
155 		context_dirty(ctx, DEPTH);
156 		break;
157 	case GL_DITHER:
158 		context_dirty(ctx, DITHER);
159 		break;
160 	case GL_FOG:
161 		context_dirty(ctx, FOG);
162 		context_dirty(ctx, FRAG);
163 		context_dirty(ctx, MODELVIEW);
164 		break;
165 	case GL_LIGHT0:
166 	case GL_LIGHT1:
167 	case GL_LIGHT2:
168 	case GL_LIGHT3:
169 	case GL_LIGHT4:
170 	case GL_LIGHT5:
171 	case GL_LIGHT6:
172 	case GL_LIGHT7:
173 		context_dirty(ctx, MODELVIEW);
174 		context_dirty(ctx, LIGHT_ENABLE);
175 		context_dirty_i(ctx, LIGHT_SOURCE, cap - GL_LIGHT0);
176 		context_dirty(ctx, MATERIAL_FRONT_AMBIENT);
177 		context_dirty(ctx, MATERIAL_BACK_AMBIENT);
178 		context_dirty(ctx, MATERIAL_FRONT_DIFFUSE);
179 		context_dirty(ctx, MATERIAL_BACK_DIFFUSE);
180 		context_dirty(ctx, MATERIAL_FRONT_SPECULAR);
181 		context_dirty(ctx, MATERIAL_BACK_SPECULAR);
182 		context_dirty(ctx, MATERIAL_FRONT_SHININESS);
183 		context_dirty(ctx, MATERIAL_BACK_SHININESS);
184 		break;
185 	case GL_LIGHTING:
186 		context_dirty(ctx, FRAG);
187 		context_dirty(ctx, MODELVIEW);
188 		context_dirty(ctx, LIGHT_MODEL);
189 		context_dirty(ctx, LIGHT_ENABLE);
190 
191 		mask = ctx->Light._EnabledLights;
192 		while (mask) {
193 			const int i = u_bit_scan(&mask);
194 			context_dirty_i(ctx, LIGHT_SOURCE, i);
195 		}
196 
197 		context_dirty(ctx, MATERIAL_FRONT_AMBIENT);
198 		context_dirty(ctx, MATERIAL_BACK_AMBIENT);
199 		context_dirty(ctx, MATERIAL_FRONT_DIFFUSE);
200 		context_dirty(ctx, MATERIAL_BACK_DIFFUSE);
201 		context_dirty(ctx, MATERIAL_FRONT_SPECULAR);
202 		context_dirty(ctx, MATERIAL_BACK_SPECULAR);
203 		context_dirty(ctx, MATERIAL_FRONT_SHININESS);
204 		context_dirty(ctx, MATERIAL_BACK_SHININESS);
205 		break;
206 	case GL_LINE_SMOOTH:
207 		context_dirty(ctx, LINE_MODE);
208 		break;
209 	case GL_NORMALIZE:
210 		context_dirty(ctx, LIGHT_ENABLE);
211 		break;
212 	case GL_POINT_SMOOTH:
213 		context_dirty(ctx, POINT_MODE);
214 		break;
215 	case GL_POLYGON_OFFSET_POINT:
216 	case GL_POLYGON_OFFSET_LINE:
217 	case GL_POLYGON_OFFSET_FILL:
218 		context_dirty(ctx, POLYGON_OFFSET);
219 		break;
220 	case GL_POLYGON_SMOOTH:
221 		context_dirty(ctx, POLYGON_MODE);
222 		break;
223 	case GL_SCISSOR_TEST:
224 		context_dirty(ctx, SCISSOR);
225 		break;
226 	case GL_STENCIL_TEST:
227 		context_dirty(ctx, STENCIL_FUNC);
228 		break;
229 	case GL_TEXTURE_1D:
230 	case GL_TEXTURE_2D:
231 	case GL_TEXTURE_3D:
232 	case GL_TEXTURE_RECTANGLE:
233 		context_dirty_i(ctx, TEX_ENV, ctx->Texture.CurrentUnit);
234 		context_dirty_i(ctx, TEX_OBJ, ctx->Texture.CurrentUnit);
235 		break;
236 	case GL_TEXTURE_GEN_S:
237 	case GL_TEXTURE_GEN_T:
238 	case GL_TEXTURE_GEN_R:
239 	case GL_TEXTURE_GEN_Q:
240 		context_dirty_i(ctx, TEX_GEN, ctx->Texture.CurrentUnit);
241 		context_dirty(ctx, MODELVIEW);
242 		break;
243 	}
244 }
245 
246 static void
nouveau_fog(struct gl_context * ctx,GLenum pname,const GLfloat * params)247 nouveau_fog(struct gl_context *ctx, GLenum pname, const GLfloat *params)
248 {
249 	context_dirty(ctx, FOG);
250 }
251 
252 static void
nouveau_light(struct gl_context * ctx,GLenum light,GLenum pname,const GLfloat * params)253 nouveau_light(struct gl_context *ctx, GLenum light, GLenum pname, const GLfloat *params)
254 {
255 	switch (pname) {
256 	case GL_AMBIENT:
257 		context_dirty(ctx, MATERIAL_FRONT_AMBIENT);
258 		context_dirty(ctx, MATERIAL_BACK_AMBIENT);
259 		break;
260 	case GL_DIFFUSE:
261 		context_dirty(ctx, MATERIAL_FRONT_DIFFUSE);
262 		context_dirty(ctx, MATERIAL_BACK_DIFFUSE);
263 		break;
264 	case GL_SPECULAR:
265 		context_dirty(ctx, MATERIAL_FRONT_SPECULAR);
266 		context_dirty(ctx, MATERIAL_BACK_SPECULAR);
267 		break;
268 	case GL_SPOT_CUTOFF:
269 	case GL_POSITION:
270 		context_dirty(ctx, MODELVIEW);
271 		context_dirty(ctx, LIGHT_ENABLE);
272 		context_dirty_i(ctx, LIGHT_SOURCE, light - GL_LIGHT0);
273 		break;
274 	default:
275 		context_dirty_i(ctx, LIGHT_SOURCE, light - GL_LIGHT0);
276 		break;
277 	}
278 }
279 
280 static void
nouveau_light_model(struct gl_context * ctx,GLenum pname,const GLfloat * params)281 nouveau_light_model(struct gl_context *ctx, GLenum pname, const GLfloat *params)
282 {
283 	context_dirty(ctx, LIGHT_MODEL);
284 	context_dirty(ctx, MODELVIEW);
285 }
286 
287 static void
nouveau_line_stipple(struct gl_context * ctx,GLint factor,GLushort pattern)288 nouveau_line_stipple(struct gl_context *ctx, GLint factor, GLushort pattern )
289 {
290 	context_dirty(ctx, LINE_STIPPLE);
291 }
292 
293 static void
nouveau_line_width(struct gl_context * ctx,GLfloat width)294 nouveau_line_width(struct gl_context *ctx, GLfloat width)
295 {
296 	context_dirty(ctx, LINE_MODE);
297 }
298 
299 static void
nouveau_logic_opcode(struct gl_context * ctx,GLenum opcode)300 nouveau_logic_opcode(struct gl_context *ctx, GLenum opcode)
301 {
302 	context_dirty(ctx, LOGIC_OPCODE);
303 }
304 
305 static void
nouveau_point_parameter(struct gl_context * ctx,GLenum pname,const GLfloat * params)306 nouveau_point_parameter(struct gl_context *ctx, GLenum pname, const GLfloat *params)
307 {
308 	context_dirty(ctx, POINT_PARAMETER);
309 }
310 
311 static void
nouveau_point_size(struct gl_context * ctx,GLfloat size)312 nouveau_point_size(struct gl_context *ctx, GLfloat size)
313 {
314 	context_dirty(ctx, POINT_MODE);
315 }
316 
317 static void
nouveau_polygon_mode(struct gl_context * ctx,GLenum face,GLenum mode)318 nouveau_polygon_mode(struct gl_context *ctx, GLenum face, GLenum mode)
319 {
320 	context_dirty(ctx, POLYGON_MODE);
321 }
322 
323 static void
nouveau_polygon_offset(struct gl_context * ctx,GLfloat factor,GLfloat units,GLfloat clamp)324 nouveau_polygon_offset(struct gl_context *ctx, GLfloat factor, GLfloat units, GLfloat clamp)
325 {
326 	context_dirty(ctx, POLYGON_OFFSET);
327 }
328 
329 static void
nouveau_polygon_stipple(struct gl_context * ctx,const GLubyte * mask)330 nouveau_polygon_stipple(struct gl_context *ctx, const GLubyte *mask)
331 {
332 	context_dirty(ctx, POLYGON_STIPPLE);
333 }
334 
335 static void
nouveau_render_mode(struct gl_context * ctx,GLenum mode)336 nouveau_render_mode(struct gl_context *ctx, GLenum mode)
337 {
338 	context_dirty(ctx, RENDER_MODE);
339 }
340 
341 static void
nouveau_shade_model(struct gl_context * ctx,GLenum mode)342 nouveau_shade_model(struct gl_context *ctx, GLenum mode)
343 {
344 	context_dirty(ctx, SHADE_MODEL);
345 }
346 
347 static void
nouveau_stencil_func_separate(struct gl_context * ctx,GLenum face,GLenum func,GLint ref,GLuint mask)348 nouveau_stencil_func_separate(struct gl_context *ctx, GLenum face, GLenum func,
349 			      GLint ref, GLuint mask)
350 {
351 	context_dirty(ctx, STENCIL_FUNC);
352 }
353 
354 static void
nouveau_stencil_mask_separate(struct gl_context * ctx,GLenum face,GLuint mask)355 nouveau_stencil_mask_separate(struct gl_context *ctx, GLenum face, GLuint mask)
356 {
357 	context_dirty(ctx, STENCIL_MASK);
358 }
359 
360 static void
nouveau_stencil_op_separate(struct gl_context * ctx,GLenum face,GLenum fail,GLenum zfail,GLenum zpass)361 nouveau_stencil_op_separate(struct gl_context *ctx, GLenum face, GLenum fail,
362 			    GLenum zfail, GLenum zpass)
363 {
364 	context_dirty(ctx, STENCIL_OP);
365 }
366 
367 static void
nouveau_tex_gen(struct gl_context * ctx,GLenum coord,GLenum pname,const GLfloat * params)368 nouveau_tex_gen(struct gl_context *ctx, GLenum coord, GLenum pname,
369 		const GLfloat *params)
370 {
371 	switch (pname) {
372 	case GL_TEXTURE_GEN_MODE:
373 		context_dirty_i(ctx, TEX_GEN, ctx->Texture.CurrentUnit);
374 		context_dirty(ctx, MODELVIEW);
375 		break;
376 	default:
377 		context_dirty_i(ctx, TEX_GEN, ctx->Texture.CurrentUnit);
378 		break;
379 	}
380 }
381 
382 static void
nouveau_tex_env(struct gl_context * ctx,GLenum target,GLenum pname,const GLfloat * param)383 nouveau_tex_env(struct gl_context *ctx, GLenum target, GLenum pname,
384 		const GLfloat *param)
385 {
386 	switch (target) {
387 	case GL_TEXTURE_FILTER_CONTROL_EXT:
388 		context_dirty_i(ctx, TEX_OBJ, ctx->Texture.CurrentUnit);
389 		break;
390 	default:
391 		context_dirty_i(ctx, TEX_ENV, ctx->Texture.CurrentUnit);
392 		break;
393 	}
394 }
395 
396 static void
nouveau_tex_parameter(struct gl_context * ctx,struct gl_texture_object * t,GLenum pname)397 nouveau_tex_parameter(struct gl_context *ctx,
398 		      struct gl_texture_object *t, GLenum pname)
399 {
400 	switch (pname) {
401 	case GL_TEXTURE_MAG_FILTER:
402 	case GL_TEXTURE_WRAP_S:
403 	case GL_TEXTURE_WRAP_T:
404 	case GL_TEXTURE_WRAP_R:
405 	case GL_TEXTURE_MIN_LOD:
406 	case GL_TEXTURE_MAX_LOD:
407 	case GL_TEXTURE_MAX_ANISOTROPY_EXT:
408 	case GL_TEXTURE_LOD_BIAS:
409 		context_dirty_i(ctx, TEX_OBJ, ctx->Texture.CurrentUnit);
410 		break;
411 
412 	case GL_TEXTURE_MIN_FILTER:
413 	case GL_TEXTURE_BASE_LEVEL:
414 	case GL_TEXTURE_MAX_LEVEL:
415 		nouveau_texture_reallocate(ctx, t);
416 		context_dirty_i(ctx, TEX_OBJ, ctx->Texture.CurrentUnit);
417 		break;
418 	}
419 }
420 
421 void
nouveau_emit_nothing(struct gl_context * ctx,int emit)422 nouveau_emit_nothing(struct gl_context *ctx, int emit)
423 {
424 }
425 
426 int
nouveau_next_dirty_state(struct gl_context * ctx)427 nouveau_next_dirty_state(struct gl_context *ctx)
428 {
429 	struct nouveau_context *nctx = to_nouveau_context(ctx);
430 	int i = BITSET_FFS(nctx->dirty) - 1;
431 
432 	if (i < 0 || i >= context_drv(ctx)->num_emit)
433 		return -1;
434 
435 	return i;
436 }
437 
438 void
nouveau_state_emit(struct gl_context * ctx)439 nouveau_state_emit(struct gl_context *ctx)
440 {
441 	struct nouveau_context *nctx = to_nouveau_context(ctx);
442 	const struct nouveau_driver *drv = context_drv(ctx);
443 	int i;
444 
445 	while ((i = nouveau_next_dirty_state(ctx)) >= 0) {
446 		BITSET_CLEAR(nctx->dirty, i);
447 		drv->emit[i](ctx, i);
448 	}
449 
450 	BITSET_ZERO(nctx->dirty);
451 }
452 
453 static void
nouveau_update_state(struct gl_context * ctx,GLbitfield new_state)454 nouveau_update_state(struct gl_context *ctx, GLbitfield new_state)
455 {
456 	int i;
457 
458 	if (new_state & (_NEW_PROJECTION | _NEW_MODELVIEW))
459 		context_dirty(ctx, PROJECTION);
460 
461 	if (new_state & _NEW_MODELVIEW)
462 		context_dirty(ctx, MODELVIEW);
463 
464 	if (new_state & _NEW_TEXTURE_MATRIX) {
465 		for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++)
466 			context_dirty_i(ctx, TEX_MAT, i);
467 	}
468 
469 	if (new_state & _NEW_SCISSOR)
470 		context_dirty(ctx, SCISSOR);
471 
472 	if (new_state & _NEW_VIEWPORT)
473 		context_dirty(ctx, VIEWPORT);
474 
475 	if (new_state & _NEW_CURRENT_ATTRIB &&
476 	    new_state & _NEW_LIGHT) {
477 		context_dirty(ctx, MATERIAL_FRONT_AMBIENT);
478 		context_dirty(ctx, MATERIAL_BACK_AMBIENT);
479 		context_dirty(ctx, MATERIAL_FRONT_DIFFUSE);
480 		context_dirty(ctx, MATERIAL_BACK_DIFFUSE);
481 		context_dirty(ctx, MATERIAL_FRONT_SPECULAR);
482 		context_dirty(ctx, MATERIAL_BACK_SPECULAR);
483 		context_dirty(ctx, MATERIAL_FRONT_SHININESS);
484 		context_dirty(ctx, MATERIAL_BACK_SHININESS);
485 	}
486 
487 	if (new_state & _NEW_TEXTURE) {
488 		for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
489 			if (ctx->Texture.Unit[i].Sampler)
490 				context_dirty_i(ctx, TEX_OBJ, i);
491 		}
492 	}
493 
494 	_swrast_InvalidateState(ctx, new_state);
495 	_tnl_InvalidateState(ctx, new_state);
496 	_vbo_InvalidateState(ctx, new_state);
497 
498 	nouveau_state_emit(ctx);
499 }
500 
501 void
nouveau_state_init(struct gl_context * ctx)502 nouveau_state_init(struct gl_context *ctx)
503 {
504 	struct nouveau_context *nctx = to_nouveau_context(ctx);
505 
506 	ctx->Driver.AlphaFunc = nouveau_alpha_func;
507 	ctx->Driver.BlendColor = nouveau_blend_color;
508 	ctx->Driver.BlendEquationSeparate = nouveau_blend_equation_separate;
509 	ctx->Driver.BlendFuncSeparate = nouveau_blend_func_separate;
510 	ctx->Driver.ClipPlane = nouveau_clip_plane;
511 	ctx->Driver.ColorMask = nouveau_color_mask;
512 	ctx->Driver.ColorMaterial = nouveau_color_material;
513 	ctx->Driver.CullFace = nouveau_cull_face;
514 	ctx->Driver.FrontFace = nouveau_front_face;
515 	ctx->Driver.DepthFunc = nouveau_depth_func;
516 	ctx->Driver.DepthMask = nouveau_depth_mask;
517 	ctx->Driver.ReadBuffer = nouveau_read_buffer;
518 	ctx->Driver.DrawBuffers = nouveau_draw_buffers;
519 	ctx->Driver.Enable = nouveau_enable;
520 	ctx->Driver.Fogfv = nouveau_fog;
521 	ctx->Driver.Lightfv = nouveau_light;
522 	ctx->Driver.LightModelfv = nouveau_light_model;
523 	ctx->Driver.LineStipple = nouveau_line_stipple;
524 	ctx->Driver.LineWidth = nouveau_line_width;
525 	ctx->Driver.LogicOpcode = nouveau_logic_opcode;
526 	ctx->Driver.PointParameterfv = nouveau_point_parameter;
527 	ctx->Driver.PointSize = nouveau_point_size;
528 	ctx->Driver.PolygonMode = nouveau_polygon_mode;
529 	ctx->Driver.PolygonOffset = nouveau_polygon_offset;
530 	ctx->Driver.PolygonStipple = nouveau_polygon_stipple;
531 	ctx->Driver.RenderMode = nouveau_render_mode;
532 	ctx->Driver.ShadeModel = nouveau_shade_model;
533 	ctx->Driver.StencilFuncSeparate = nouveau_stencil_func_separate;
534 	ctx->Driver.StencilMaskSeparate = nouveau_stencil_mask_separate;
535 	ctx->Driver.StencilOpSeparate = nouveau_stencil_op_separate;
536 	ctx->Driver.TexGen = nouveau_tex_gen;
537 	ctx->Driver.TexEnv = nouveau_tex_env;
538 	ctx->Driver.TexParameter = nouveau_tex_parameter;
539 
540 	ctx->Driver.UpdateState = nouveau_update_state;
541 
542 	BITSET_ONES(nctx->dirty);
543 }
544