Home | History | Annotate | Download | only in nouveau
      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 "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_eng3d(ctx)->oclass < NV17_3D_CLASS &&
     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_eng3d(ctx)->oclass >= NV17_3D_CLASS)
    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_eng3d(ctx)->oclass >= NV17_3D_CLASS) {
    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_eng3d(ctx)->oclass >= NV15_3D_CLASS) {
    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, gl_api api,
    431 		    const struct gl_config *visual,
    432 		    struct gl_context *share_ctx)
    433 {
    434 	struct nouveau_context *nctx;
    435 	struct gl_context *ctx;
    436 	unsigned celsius_class;
    437 	int ret;
    438 
    439 	nctx = CALLOC_STRUCT(nouveau_context);
    440 	if (!nctx)
    441 		return NULL;
    442 
    443 	ctx = &nctx->base;
    444 
    445 	if (!nouveau_context_init(ctx, api, screen, visual, share_ctx))
    446 		goto fail;
    447 
    448 	ctx->Extensions.ARB_texture_env_crossbar = true;
    449 	ctx->Extensions.ARB_texture_env_combine = true;
    450 	ctx->Extensions.ARB_texture_env_dot3 = true;
    451 	ctx->Extensions.EXT_texture_env_dot3 = true;
    452 	ctx->Extensions.NV_fog_distance = true;
    453 	ctx->Extensions.NV_texture_rectangle = true;
    454 	if (ctx->Mesa_DXTn) {
    455 		ctx->Extensions.EXT_texture_compression_s3tc = true;
    456 		ctx->Extensions.ANGLE_texture_compression_dxt = true;
    457 	}
    458 
    459 	/* GL constants. */
    460 	ctx->Const.MaxTextureLevels = 12;
    461 	ctx->Const.MaxTextureCoordUnits = NV10_TEXTURE_UNITS;
    462 	ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits = NV10_TEXTURE_UNITS;
    463 	ctx->Const.MaxTextureUnits = NV10_TEXTURE_UNITS;
    464 	ctx->Const.MaxTextureMaxAnisotropy = 2;
    465 	ctx->Const.MaxTextureLodBias = 15;
    466 	ctx->Driver.Clear = nv10_clear;
    467 
    468 	/* 2D engine. */
    469 	ret = nv04_surface_init(ctx);
    470 	if (!ret)
    471 		goto fail;
    472 
    473 	/* 3D engine. */
    474 	if (context_chipset(ctx) >= 0x17 && context_chipset(ctx) != 0x1a)
    475 		celsius_class = NV17_3D_CLASS;
    476 	else if (context_chipset(ctx) >= 0x11)
    477 		celsius_class = NV15_3D_CLASS;
    478 	else
    479 		celsius_class = NV10_3D_CLASS;
    480 
    481 	ret = nouveau_object_new(context_chan(ctx), 0xbeef0001, celsius_class,
    482 				 NULL, 0, &nctx->hw.eng3d);
    483 	if (ret)
    484 		goto fail;
    485 
    486 	nv10_hwctx_init(ctx);
    487 	nv10_vbo_init(ctx);
    488 	nv10_swtnl_init(ctx);
    489 
    490 	return ctx;
    491 
    492 fail:
    493 	nv10_context_destroy(ctx);
    494 	return NULL;
    495 }
    496 
    497 const struct nouveau_driver nv10_driver = {
    498 	.context_create = nv10_context_create,
    499 	.context_destroy = nv10_context_destroy,
    500 	.surface_copy = nv04_surface_copy,
    501 	.surface_fill = nv04_surface_fill,
    502 	.emit = (nouveau_state_func[]) {
    503 		nv10_emit_alpha_func,
    504 		nv10_emit_blend_color,
    505 		nv10_emit_blend_equation,
    506 		nv10_emit_blend_func,
    507 		nv10_emit_clip_plane,
    508 		nv10_emit_clip_plane,
    509 		nv10_emit_clip_plane,
    510 		nv10_emit_clip_plane,
    511 		nv10_emit_clip_plane,
    512 		nv10_emit_clip_plane,
    513 		nv10_emit_color_mask,
    514 		nv10_emit_color_material,
    515 		nv10_emit_cull_face,
    516 		nv10_emit_front_face,
    517 		nv10_emit_depth,
    518 		nv10_emit_dither,
    519 		nv10_emit_frag,
    520 		nv10_emit_framebuffer,
    521 		nv10_emit_fog,
    522 		nv10_emit_light_enable,
    523 		nv10_emit_light_model,
    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_light_source,
    531 		nv10_emit_light_source,
    532 		nv10_emit_line_stipple,
    533 		nv10_emit_line_mode,
    534 		nv10_emit_logic_opcode,
    535 		nv10_emit_material_ambient,
    536 		nouveau_emit_nothing,
    537 		nv10_emit_material_diffuse,
    538 		nouveau_emit_nothing,
    539 		nv10_emit_material_specular,
    540 		nouveau_emit_nothing,
    541 		nv10_emit_material_shininess,
    542 		nouveau_emit_nothing,
    543 		nv10_emit_modelview,
    544 		nv10_emit_point_mode,
    545 		nv10_emit_point_parameter,
    546 		nv10_emit_polygon_mode,
    547 		nv10_emit_polygon_offset,
    548 		nv10_emit_polygon_stipple,
    549 		nv10_emit_projection,
    550 		nv10_emit_render_mode,
    551 		nv10_emit_scissor,
    552 		nv10_emit_shade_model,
    553 		nv10_emit_stencil_func,
    554 		nv10_emit_stencil_mask,
    555 		nv10_emit_stencil_op,
    556 		nv10_emit_tex_env,
    557 		nv10_emit_tex_env,
    558 		nouveau_emit_nothing,
    559 		nouveau_emit_nothing,
    560 		nv10_emit_tex_gen,
    561 		nv10_emit_tex_gen,
    562 		nouveau_emit_nothing,
    563 		nouveau_emit_nothing,
    564 		nv10_emit_tex_mat,
    565 		nv10_emit_tex_mat,
    566 		nouveau_emit_nothing,
    567 		nouveau_emit_nothing,
    568 		nv10_emit_tex_obj,
    569 		nv10_emit_tex_obj,
    570 		nouveau_emit_nothing,
    571 		nouveau_emit_nothing,
    572 		nv10_emit_viewport,
    573 		nv10_emit_zclear
    574 	},
    575 	.num_emit = NUM_NV10_STATE,
    576 };
    577