nouveau: stop using _DepthBuffer, _StencilBuffer fields
[mesa.git] / src / mesa / drivers / dri / nouveau / nv20_context.c
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 <stdbool.h>
28 #include "nouveau_driver.h"
29 #include "nouveau_context.h"
30 #include "nouveau_fbo.h"
31 #include "nouveau_util.h"
32 #include "nv_object.xml.h"
33 #include "nv20_3d.xml.h"
34 #include "nv04_driver.h"
35 #include "nv10_driver.h"
36 #include "nv20_driver.h"
37
38 static void
39 nv20_clear(struct gl_context *ctx, GLbitfield buffers)
40 {
41 struct nouveau_channel *chan = context_chan(ctx);
42 struct nouveau_grobj *kelvin = context_eng3d(ctx);
43 struct gl_framebuffer *fb = ctx->DrawBuffer;
44 uint32_t clear = 0;
45
46 nouveau_validate_framebuffer(ctx);
47
48 if (buffers & BUFFER_BITS_COLOR) {
49 struct nouveau_surface *s = &to_nouveau_renderbuffer(
50 fb->_ColorDrawBuffers[0])->surface;
51
52 if (ctx->Color.ColorMask[0][RCOMP])
53 clear |= NV20_3D_CLEAR_BUFFERS_COLOR_R;
54 if (ctx->Color.ColorMask[0][GCOMP])
55 clear |= NV20_3D_CLEAR_BUFFERS_COLOR_G;
56 if (ctx->Color.ColorMask[0][BCOMP])
57 clear |= NV20_3D_CLEAR_BUFFERS_COLOR_B;
58 if (ctx->Color.ColorMask[0][ACOMP])
59 clear |= NV20_3D_CLEAR_BUFFERS_COLOR_A;
60
61 BEGIN_RING(chan, kelvin, NV20_3D_CLEAR_VALUE, 1);
62 OUT_RING(chan, pack_rgba_clamp_f(s->format, ctx->Color.ClearColor.f));
63
64 buffers &= ~BUFFER_BITS_COLOR;
65 }
66
67 if (buffers & (BUFFER_BIT_DEPTH | BUFFER_BIT_STENCIL)) {
68 struct nouveau_surface *s = &to_nouveau_renderbuffer(
69 fb->Attachment[BUFFER_DEPTH].Renderbuffer)->surface;
70
71 if (buffers & BUFFER_BIT_DEPTH && ctx->Depth.Mask)
72 clear |= NV20_3D_CLEAR_BUFFERS_DEPTH;
73 if (buffers & BUFFER_BIT_STENCIL && ctx->Stencil.WriteMask[0])
74 clear |= NV20_3D_CLEAR_BUFFERS_STENCIL;
75
76 BEGIN_RING(chan, kelvin, NV20_3D_CLEAR_DEPTH_VALUE, 1);
77 OUT_RING(chan, pack_zs_f(s->format, ctx->Depth.Clear,
78 ctx->Stencil.Clear));
79
80 buffers &= ~(BUFFER_BIT_DEPTH | BUFFER_BIT_STENCIL);
81 }
82
83 BEGIN_RING(chan, kelvin, NV20_3D_CLEAR_BUFFERS, 1);
84 OUT_RING(chan, clear);
85
86 nouveau_clear(ctx, buffers);
87 }
88
89 static void
90 nv20_hwctx_init(struct gl_context *ctx)
91 {
92 struct nouveau_channel *chan = context_chan(ctx);
93 struct nouveau_grobj *kelvin = context_eng3d(ctx);
94 struct nouveau_hw_state *hw = &to_nouveau_context(ctx)->hw;
95 int i;
96
97 BEGIN_RING(chan, kelvin, NV20_3D_DMA_NOTIFY, 1);
98 OUT_RING (chan, hw->ntfy->handle);
99 BEGIN_RING(chan, kelvin, NV20_3D_DMA_TEXTURE0, 2);
100 OUT_RING (chan, chan->vram->handle);
101 OUT_RING (chan, chan->gart->handle);
102 BEGIN_RING(chan, kelvin, NV20_3D_DMA_COLOR, 2);
103 OUT_RING (chan, chan->vram->handle);
104 OUT_RING (chan, chan->vram->handle);
105 BEGIN_RING(chan, kelvin, NV20_3D_DMA_VTXBUF0, 2);
106 OUT_RING(chan, chan->vram->handle);
107 OUT_RING(chan, chan->gart->handle);
108
109 BEGIN_RING(chan, kelvin, NV20_3D_DMA_QUERY, 1);
110 OUT_RING (chan, 0);
111
112 BEGIN_RING(chan, kelvin, NV20_3D_RT_HORIZ, 2);
113 OUT_RING (chan, 0);
114 OUT_RING (chan, 0);
115
116 BEGIN_RING(chan, kelvin, NV20_3D_VIEWPORT_CLIP_HORIZ(0), 1);
117 OUT_RING (chan, 0xfff << 16 | 0x0);
118 BEGIN_RING(chan, kelvin, NV20_3D_VIEWPORT_CLIP_VERT(0), 1);
119 OUT_RING (chan, 0xfff << 16 | 0x0);
120
121 for (i = 1; i < NV20_3D_VIEWPORT_CLIP_HORIZ__LEN; i++) {
122 BEGIN_RING(chan, kelvin, NV20_3D_VIEWPORT_CLIP_HORIZ(i), 1);
123 OUT_RING (chan, 0);
124 BEGIN_RING(chan, kelvin, NV20_3D_VIEWPORT_CLIP_VERT(i), 1);
125 OUT_RING (chan, 0);
126 }
127
128 BEGIN_RING(chan, kelvin, NV20_3D_VIEWPORT_CLIP_MODE, 1);
129 OUT_RING (chan, 0);
130
131 BEGIN_RING(chan, kelvin, 0x17e0, 3);
132 OUT_RINGf (chan, 0.0);
133 OUT_RINGf (chan, 0.0);
134 OUT_RINGf (chan, 1.0);
135
136 if (context_chipset(ctx) >= 0x25) {
137 BEGIN_RING(chan, kelvin, NV20_3D_TEX_RCOMP, 1);
138 OUT_RING (chan, NV20_3D_TEX_RCOMP_LEQUAL | 0xdb0);
139 } else {
140 BEGIN_RING(chan, kelvin, 0x1e68, 1);
141 OUT_RING (chan, 0x4b800000); /* 16777216.000000 */
142 BEGIN_RING(chan, kelvin, NV20_3D_TEX_RCOMP, 1);
143 OUT_RING (chan, NV20_3D_TEX_RCOMP_LEQUAL);
144 }
145
146 BEGIN_RING(chan, kelvin, 0x290, 1);
147 OUT_RING (chan, 0x10 << 16 | 1);
148 BEGIN_RING(chan, kelvin, 0x9fc, 1);
149 OUT_RING (chan, 0);
150 BEGIN_RING(chan, kelvin, 0x1d80, 1);
151 OUT_RING (chan, 1);
152 BEGIN_RING(chan, kelvin, 0x9f8, 1);
153 OUT_RING (chan, 4);
154 BEGIN_RING(chan, kelvin, 0x17ec, 3);
155 OUT_RINGf (chan, 0.0);
156 OUT_RINGf (chan, 1.0);
157 OUT_RINGf (chan, 0.0);
158
159 if (context_chipset(ctx) >= 0x25) {
160 BEGIN_RING(chan, kelvin, 0x1d88, 1);
161 OUT_RING (chan, 3);
162
163 BEGIN_RING(chan, kelvin, NV25_3D_DMA_HIERZ, 1);
164 OUT_RING (chan, chan->vram->handle);
165 BEGIN_RING(chan, kelvin, NV25_3D_UNK01AC, 1);
166 OUT_RING (chan, chan->vram->handle);
167 }
168
169 BEGIN_RING(chan, kelvin, NV20_3D_DMA_FENCE, 1);
170 OUT_RING (chan, 0);
171
172 BEGIN_RING(chan, kelvin, 0x1e98, 1);
173 OUT_RING (chan, 0);
174
175 BEGIN_RING(chan, kelvin, NV01_GRAPH_NOTIFY, 1);
176 OUT_RING (chan, 0);
177
178 BEGIN_RING(chan, kelvin, 0x120, 3);
179 OUT_RING (chan, 0);
180 OUT_RING (chan, 1);
181 OUT_RING (chan, 2);
182
183 if (context_chipset(ctx) >= 0x25) {
184 BEGIN_RING(chan, kelvin, 0x1da4, 1);
185 OUT_RING (chan, 0);
186 }
187
188 BEGIN_RING(chan, kelvin, NV20_3D_RT_HORIZ, 2);
189 OUT_RING (chan, 0 << 16 | 0);
190 OUT_RING (chan, 0 << 16 | 0);
191
192 BEGIN_RING(chan, kelvin, NV20_3D_ALPHA_FUNC_ENABLE, 1);
193 OUT_RING (chan, 0);
194 BEGIN_RING(chan, kelvin, NV20_3D_ALPHA_FUNC_FUNC, 2);
195 OUT_RING (chan, NV20_3D_ALPHA_FUNC_FUNC_ALWAYS);
196 OUT_RING (chan, 0);
197
198 for (i = 0; i < NV20_3D_TEX__LEN; i++) {
199 BEGIN_RING(chan, kelvin, NV20_3D_TEX_ENABLE(i), 1);
200 OUT_RING (chan, 0);
201 }
202
203 BEGIN_RING(chan, kelvin, NV20_3D_TEX_SHADER_OP, 1);
204 OUT_RING (chan, 0);
205 BEGIN_RING(chan, kelvin, NV20_3D_TEX_SHADER_CULL_MODE, 1);
206 OUT_RING (chan, 0);
207
208 BEGIN_RING(chan, kelvin, NV20_3D_RC_IN_ALPHA(0), 4);
209 OUT_RING (chan, 0x30d410d0);
210 OUT_RING (chan, 0);
211 OUT_RING (chan, 0);
212 OUT_RING (chan, 0);
213 BEGIN_RING(chan, kelvin, NV20_3D_RC_OUT_RGB(0), 4);
214 OUT_RING (chan, 0x00000c00);
215 OUT_RING (chan, 0);
216 OUT_RING (chan, 0);
217 OUT_RING (chan, 0);
218 BEGIN_RING(chan, kelvin, NV20_3D_RC_ENABLE, 1);
219 OUT_RING (chan, 0x00011101);
220 BEGIN_RING(chan, kelvin, NV20_3D_RC_FINAL0, 2);
221 OUT_RING (chan, 0x130e0300);
222 OUT_RING (chan, 0x0c091c80);
223 BEGIN_RING(chan, kelvin, NV20_3D_RC_OUT_ALPHA(0), 4);
224 OUT_RING (chan, 0x00000c00);
225 OUT_RING (chan, 0);
226 OUT_RING (chan, 0);
227 OUT_RING (chan, 0);
228 BEGIN_RING(chan, kelvin, NV20_3D_RC_IN_RGB(0), 4);
229 OUT_RING (chan, 0x20c400c0);
230 OUT_RING (chan, 0);
231 OUT_RING (chan, 0);
232 OUT_RING (chan, 0);
233 BEGIN_RING(chan, kelvin, NV20_3D_RC_COLOR0, 2);
234 OUT_RING (chan, 0);
235 OUT_RING (chan, 0);
236 BEGIN_RING(chan, kelvin, NV20_3D_RC_CONSTANT_COLOR0(0), 4);
237 OUT_RING (chan, 0x035125a0);
238 OUT_RING (chan, 0);
239 OUT_RING (chan, 0x40002000);
240 OUT_RING (chan, 0);
241
242 BEGIN_RING(chan, kelvin, NV20_3D_MULTISAMPLE_CONTROL, 1);
243 OUT_RING (chan, 0xffff0000);
244 BEGIN_RING(chan, kelvin, NV20_3D_BLEND_FUNC_ENABLE, 1);
245 OUT_RING (chan, 0);
246 BEGIN_RING(chan, kelvin, NV20_3D_DITHER_ENABLE, 1);
247 OUT_RING (chan, 0);
248 BEGIN_RING(chan, kelvin, NV20_3D_STENCIL_ENABLE, 1);
249 OUT_RING (chan, 0);
250 BEGIN_RING(chan, kelvin, NV20_3D_BLEND_FUNC_SRC, 4);
251 OUT_RING (chan, NV20_3D_BLEND_FUNC_SRC_ONE);
252 OUT_RING (chan, NV20_3D_BLEND_FUNC_DST_ZERO);
253 OUT_RING (chan, 0);
254 OUT_RING (chan, NV20_3D_BLEND_EQUATION_FUNC_ADD);
255 BEGIN_RING(chan, kelvin, NV20_3D_STENCIL_MASK, 7);
256 OUT_RING (chan, 0xff);
257 OUT_RING (chan, NV20_3D_STENCIL_FUNC_FUNC_ALWAYS);
258 OUT_RING (chan, 0);
259 OUT_RING (chan, 0xff);
260 OUT_RING (chan, NV20_3D_STENCIL_OP_FAIL_KEEP);
261 OUT_RING (chan, NV20_3D_STENCIL_OP_ZFAIL_KEEP);
262 OUT_RING (chan, NV20_3D_STENCIL_OP_ZPASS_KEEP);
263
264 BEGIN_RING(chan, kelvin, NV20_3D_COLOR_LOGIC_OP_ENABLE, 2);
265 OUT_RING (chan, 0);
266 OUT_RING (chan, NV20_3D_COLOR_LOGIC_OP_OP_COPY);
267 BEGIN_RING(chan, kelvin, 0x17cc, 1);
268 OUT_RING (chan, 0);
269 if (context_chipset(ctx) >= 0x25) {
270 BEGIN_RING(chan, kelvin, 0x1d84, 1);
271 OUT_RING (chan, 1);
272 }
273 BEGIN_RING(chan, kelvin, NV20_3D_LIGHTING_ENABLE, 1);
274 OUT_RING (chan, 0);
275 BEGIN_RING(chan, kelvin, NV20_3D_LIGHT_MODEL, 1);
276 OUT_RING (chan, NV20_3D_LIGHT_MODEL_VIEWER_NONLOCAL);
277 BEGIN_RING(chan, kelvin, NV20_3D_SEPARATE_SPECULAR_ENABLE, 1);
278 OUT_RING (chan, 0);
279 BEGIN_RING(chan, kelvin, NV20_3D_LIGHT_MODEL_TWO_SIDE_ENABLE, 1);
280 OUT_RING (chan, 0);
281 BEGIN_RING(chan, kelvin, NV20_3D_ENABLED_LIGHTS, 1);
282 OUT_RING (chan, 0);
283 BEGIN_RING(chan, kelvin, NV20_3D_NORMALIZE_ENABLE, 1);
284 OUT_RING (chan, 0);
285 BEGIN_RING(chan, kelvin, NV20_3D_POLYGON_STIPPLE_PATTERN(0),
286 NV20_3D_POLYGON_STIPPLE_PATTERN__LEN);
287 for (i = 0; i < NV20_3D_POLYGON_STIPPLE_PATTERN__LEN; i++) {
288 OUT_RING(chan, 0xffffffff);
289 }
290
291 BEGIN_RING(chan, kelvin, NV20_3D_POLYGON_OFFSET_POINT_ENABLE, 3);
292 OUT_RING (chan, 0);
293 OUT_RING (chan, 0);
294 OUT_RING (chan, 0);
295 BEGIN_RING(chan, kelvin, NV20_3D_DEPTH_FUNC, 1);
296 OUT_RING (chan, NV20_3D_DEPTH_FUNC_LESS);
297 BEGIN_RING(chan, kelvin, NV20_3D_DEPTH_WRITE_ENABLE, 1);
298 OUT_RING (chan, 0);
299 BEGIN_RING(chan, kelvin, NV20_3D_DEPTH_TEST_ENABLE, 1);
300 OUT_RING (chan, 0);
301 BEGIN_RING(chan, kelvin, NV20_3D_POLYGON_OFFSET_FACTOR, 2);
302 OUT_RINGf (chan, 0.0);
303 OUT_RINGf (chan, 0.0);
304 BEGIN_RING(chan, kelvin, NV20_3D_DEPTH_CLAMP, 1);
305 OUT_RING (chan, 1);
306 if (context_chipset(ctx) < 0x25) {
307 BEGIN_RING(chan, kelvin, 0x1d84, 1);
308 OUT_RING (chan, 3);
309 }
310 BEGIN_RING(chan, kelvin, NV20_3D_POINT_SIZE, 1);
311 if (context_chipset(ctx) >= 0x25)
312 OUT_RINGf (chan, 1.0);
313 else
314 OUT_RING (chan, 8);
315
316 if (context_chipset(ctx) >= 0x25) {
317 BEGIN_RING(chan, kelvin, NV20_3D_POINT_PARAMETERS_ENABLE, 1);
318 OUT_RING (chan, 0);
319 BEGIN_RING(chan, kelvin, 0x0a1c, 1);
320 OUT_RING (chan, 0x800);
321 } else {
322 BEGIN_RING(chan, kelvin, NV20_3D_POINT_PARAMETERS_ENABLE, 2);
323 OUT_RING (chan, 0);
324 OUT_RING (chan, 0);
325 }
326
327 BEGIN_RING(chan, kelvin, NV20_3D_LINE_WIDTH, 1);
328 OUT_RING (chan, 8);
329 BEGIN_RING(chan, kelvin, NV20_3D_LINE_SMOOTH_ENABLE, 1);
330 OUT_RING (chan, 0);
331 BEGIN_RING(chan, kelvin, NV20_3D_POLYGON_MODE_FRONT, 2);
332 OUT_RING (chan, NV20_3D_POLYGON_MODE_FRONT_FILL);
333 OUT_RING (chan, NV20_3D_POLYGON_MODE_BACK_FILL);
334 BEGIN_RING(chan, kelvin, NV20_3D_CULL_FACE, 2);
335 OUT_RING (chan, NV20_3D_CULL_FACE_BACK);
336 OUT_RING (chan, NV20_3D_FRONT_FACE_CCW);
337 BEGIN_RING(chan, kelvin, NV20_3D_POLYGON_SMOOTH_ENABLE, 1);
338 OUT_RING (chan, 0);
339 BEGIN_RING(chan, kelvin, NV20_3D_CULL_FACE_ENABLE, 1);
340 OUT_RING (chan, 0);
341 BEGIN_RING(chan, kelvin, NV20_3D_SHADE_MODEL, 1);
342 OUT_RING (chan, NV20_3D_SHADE_MODEL_SMOOTH);
343 BEGIN_RING(chan, kelvin, NV20_3D_POLYGON_STIPPLE_ENABLE, 1);
344 OUT_RING (chan, 0);
345
346 BEGIN_RING(chan, kelvin, NV20_3D_TEX_GEN_MODE(0,0),
347 4 * NV20_3D_TEX_GEN_MODE__ESIZE);
348 for (i=0; i < 4 * NV20_3D_TEX_GEN_MODE__LEN; i++)
349 OUT_RING(chan, 0);
350
351 BEGIN_RING(chan, kelvin, NV20_3D_FOG_COEFF(0), 3);
352 OUT_RINGf (chan, 1.5);
353 OUT_RINGf (chan, -0.090168);
354 OUT_RINGf (chan, 0.0);
355 BEGIN_RING(chan, kelvin, NV20_3D_FOG_MODE, 2);
356 OUT_RING (chan, NV20_3D_FOG_MODE_EXP_SIGNED);
357 OUT_RING (chan, NV20_3D_FOG_COORD_FOG);
358 BEGIN_RING(chan, kelvin, NV20_3D_FOG_ENABLE, 2);
359 OUT_RING (chan, 0);
360 OUT_RING (chan, 0);
361
362 BEGIN_RING(chan, kelvin, NV20_3D_ENGINE, 1);
363 OUT_RING (chan, NV20_3D_ENGINE_FIXED);
364
365 for (i = 0; i < NV20_3D_TEX_MATRIX_ENABLE__LEN; i++) {
366 BEGIN_RING(chan, kelvin, NV20_3D_TEX_MATRIX_ENABLE(i), 1);
367 OUT_RING (chan, 0);
368 }
369
370 BEGIN_RING(chan, kelvin, NV20_3D_VERTEX_ATTR_4F_X(1), 4 * 15);
371 OUT_RINGf(chan, 1.0);
372 OUT_RINGf(chan, 0.0);
373 OUT_RINGf(chan, 0.0);
374 OUT_RINGf(chan, 1.0);
375 OUT_RINGf(chan, 0.0);
376 OUT_RINGf(chan, 0.0);
377 OUT_RINGf(chan, 1.0);
378 OUT_RINGf(chan, 1.0);
379 OUT_RINGf(chan, 1.0);
380 OUT_RINGf(chan, 1.0);
381 OUT_RINGf(chan, 1.0);
382 OUT_RINGf(chan, 1.0);
383 for (i = 0; i < 12; i++) {
384 OUT_RINGf(chan, 0.0);
385 OUT_RINGf(chan, 0.0);
386 OUT_RINGf(chan, 0.0);
387 OUT_RINGf(chan, 1.0);
388 }
389
390 BEGIN_RING(chan, kelvin, NV20_3D_EDGEFLAG_ENABLE, 1);
391 OUT_RING (chan, 1);
392 BEGIN_RING(chan, kelvin, NV20_3D_COLOR_MASK, 1);
393 OUT_RING (chan, 0x00010101);
394 BEGIN_RING(chan, kelvin, NV20_3D_CLEAR_VALUE, 1);
395 OUT_RING (chan, 0);
396
397 BEGIN_RING(chan, kelvin, NV20_3D_DEPTH_RANGE_NEAR, 2);
398 OUT_RINGf (chan, 0.0);
399 OUT_RINGf (chan, 16777216.0);
400
401 BEGIN_RING(chan, kelvin, NV20_3D_VIEWPORT_TRANSLATE_X, 4);
402 OUT_RINGf (chan, 0.0);
403 OUT_RINGf (chan, 0.0);
404 OUT_RINGf (chan, 0.0);
405 OUT_RINGf (chan, 16777215.0);
406
407 BEGIN_RING(chan, kelvin, NV20_3D_VIEWPORT_SCALE_X, 4);
408 OUT_RINGf (chan, 0.0);
409 OUT_RINGf (chan, 0.0);
410 OUT_RINGf (chan, 16777215.0 * 0.5);
411 OUT_RINGf (chan, 65535.0);
412
413 FIRE_RING(chan);
414 }
415
416 static void
417 nv20_context_destroy(struct gl_context *ctx)
418 {
419 struct nouveau_context *nctx = to_nouveau_context(ctx);
420
421 nv04_surface_takedown(ctx);
422 nv20_swtnl_destroy(ctx);
423 nv20_vbo_destroy(ctx);
424
425 nouveau_grobj_free(&nctx->hw.eng3d);
426
427 nouveau_context_deinit(ctx);
428 FREE(ctx);
429 }
430
431 static struct gl_context *
432 nv20_context_create(struct nouveau_screen *screen, const struct gl_config *visual,
433 struct gl_context *share_ctx)
434 {
435 struct nouveau_context *nctx;
436 struct gl_context *ctx;
437 unsigned kelvin_class;
438 int ret;
439
440 nctx = CALLOC_STRUCT(nouveau_context);
441 if (!nctx)
442 return NULL;
443
444 ctx = &nctx->base;
445
446 if (!nouveau_context_init(ctx, screen, visual, share_ctx))
447 goto fail;
448
449 ctx->Extensions.ARB_texture_env_crossbar = true;
450 ctx->Extensions.ARB_texture_env_combine = true;
451 ctx->Extensions.ARB_texture_env_dot3 = true;
452 ctx->Extensions.NV_fog_distance = true;
453 ctx->Extensions.NV_texture_rectangle = true;
454
455 /* GL constants. */
456 ctx->Const.MaxTextureCoordUnits = NV20_TEXTURE_UNITS;
457 ctx->Const.MaxTextureImageUnits = NV20_TEXTURE_UNITS;
458 ctx->Const.MaxTextureUnits = NV20_TEXTURE_UNITS;
459 ctx->Const.MaxTextureMaxAnisotropy = 8;
460 ctx->Const.MaxTextureLodBias = 15;
461 ctx->Driver.Clear = nv20_clear;
462
463 /* 2D engine. */
464 ret = nv04_surface_init(ctx);
465 if (!ret)
466 goto fail;
467
468 /* 3D engine. */
469 if (context_chipset(ctx) >= 0x25)
470 kelvin_class = NV25_3D;
471 else
472 kelvin_class = NV20_3D;
473
474 ret = nouveau_grobj_alloc(context_chan(ctx), 0xbeef0001, kelvin_class,
475 &nctx->hw.eng3d);
476 if (ret)
477 goto fail;
478
479 nv20_hwctx_init(ctx);
480 nv20_vbo_init(ctx);
481 nv20_swtnl_init(ctx);
482
483 return ctx;
484
485 fail:
486 nv20_context_destroy(ctx);
487 return NULL;
488 }
489
490 const struct nouveau_driver nv20_driver = {
491 .context_create = nv20_context_create,
492 .context_destroy = nv20_context_destroy,
493 .surface_copy = nv04_surface_copy,
494 .surface_fill = nv04_surface_fill,
495 .emit = (nouveau_state_func[]) {
496 nv10_emit_alpha_func,
497 nv10_emit_blend_color,
498 nv10_emit_blend_equation,
499 nv10_emit_blend_func,
500 nv20_emit_clip_plane,
501 nv20_emit_clip_plane,
502 nv20_emit_clip_plane,
503 nv20_emit_clip_plane,
504 nv20_emit_clip_plane,
505 nv20_emit_clip_plane,
506 nv10_emit_color_mask,
507 nv20_emit_color_material,
508 nv10_emit_cull_face,
509 nv10_emit_front_face,
510 nv10_emit_depth,
511 nv10_emit_dither,
512 nv20_emit_frag,
513 nv20_emit_framebuffer,
514 nv20_emit_fog,
515 nv10_emit_light_enable,
516 nv20_emit_light_model,
517 nv20_emit_light_source,
518 nv20_emit_light_source,
519 nv20_emit_light_source,
520 nv20_emit_light_source,
521 nv20_emit_light_source,
522 nv20_emit_light_source,
523 nv20_emit_light_source,
524 nv20_emit_light_source,
525 nv10_emit_line_stipple,
526 nv10_emit_line_mode,
527 nv20_emit_logic_opcode,
528 nv20_emit_material_ambient,
529 nv20_emit_material_ambient,
530 nv20_emit_material_diffuse,
531 nv20_emit_material_diffuse,
532 nv20_emit_material_specular,
533 nv20_emit_material_specular,
534 nv20_emit_material_shininess,
535 nv20_emit_material_shininess,
536 nv20_emit_modelview,
537 nv20_emit_point_mode,
538 nv10_emit_point_parameter,
539 nv10_emit_polygon_mode,
540 nv10_emit_polygon_offset,
541 nv10_emit_polygon_stipple,
542 nv20_emit_projection,
543 nv10_emit_render_mode,
544 nv10_emit_scissor,
545 nv10_emit_shade_model,
546 nv10_emit_stencil_func,
547 nv10_emit_stencil_mask,
548 nv10_emit_stencil_op,
549 nv20_emit_tex_env,
550 nv20_emit_tex_env,
551 nv20_emit_tex_env,
552 nv20_emit_tex_env,
553 nv20_emit_tex_gen,
554 nv20_emit_tex_gen,
555 nv20_emit_tex_gen,
556 nv20_emit_tex_gen,
557 nv20_emit_tex_mat,
558 nv20_emit_tex_mat,
559 nv20_emit_tex_mat,
560 nv20_emit_tex_mat,
561 nv20_emit_tex_obj,
562 nv20_emit_tex_obj,
563 nv20_emit_tex_obj,
564 nv20_emit_tex_obj,
565 nv20_emit_viewport,
566 nv20_emit_tex_shader
567 },
568 .num_emit = NUM_NV20_STATE,
569 };