nv20_context.c revision c944fb5ffe7cf16154d6395001f43a6c965cab1f
1bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez/*
256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez * Copyright (C) 2009-2010 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"
2956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez#include "nouveau_class.h"
3056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez#include "nv04_driver.h"
3156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez#include "nv10_driver.h"
32bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nv20_driver.h"
33bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
34a7b8d105a6efe4056633f7129f80aac1f13cc246Francisco Jerezstatic const struct dri_extension nv20_extensions[] = {
35a7b8d105a6efe4056633f7129f80aac1f13cc246Francisco Jerez	{ "GL_EXT_texture_rectangle",	NULL },
36a7b8d105a6efe4056633f7129f80aac1f13cc246Francisco Jerez	{ NULL,				NULL }
37a7b8d105a6efe4056633f7129f80aac1f13cc246Francisco Jerez};
38a7b8d105a6efe4056633f7129f80aac1f13cc246Francisco Jerez
3956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerezstatic void
4056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jereznv20_hwctx_init(GLcontext *ctx)
4156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez{
4256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	struct nouveau_channel *chan = context_chan(ctx);
4356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	struct nouveau_grobj *kelvin = context_eng3d(ctx);
4456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	struct nouveau_hw_state *hw = &to_nouveau_context(ctx)->hw;
4556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	int i;
4656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
4756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_DMA_NOTIFY, 1);
4856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, hw->ntfy->handle);
4956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_DMA_TEXTURE0, 2);
5056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, chan->vram->handle);
5156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, chan->gart->handle);
5256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_DMA_COLOR, 2);
5356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, chan->vram->handle);
5456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, chan->vram->handle);
5556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_DMA_VTXBUF0, 2);
5656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING(chan, chan->vram->handle);
5756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING(chan, chan->gart->handle);
5856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
5956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_DMA_QUERY, 1);
6056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
6156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
6256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_RT_HORIZ, 2);
6356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
6456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
6556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
6656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_VIEWPORT_CLIP_HORIZ(0), 1);
6756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0xfff << 16 | 0x0);
6856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_VIEWPORT_CLIP_VERT(0), 1);
6956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0xfff << 16 | 0x0);
7056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
7156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	for (i = 1; i < NV20TCL_VIEWPORT_CLIP_HORIZ__SIZE; i++) {
7256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		BEGIN_RING(chan, kelvin, NV20TCL_VIEWPORT_CLIP_HORIZ(i), 1);
7356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		OUT_RING  (chan, 0);
7456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		BEGIN_RING(chan, kelvin, NV20TCL_VIEWPORT_CLIP_VERT(i), 1);
7556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		OUT_RING  (chan, 0);
7656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	}
7756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
7856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_VIEWPORT_CLIP_MODE, 1);
7956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
8056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
8156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, 0x17e0, 3);
8256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf (chan, 0.0);
8356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf (chan, 0.0);
8456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf (chan, 1.0);
8556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
8656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	if (context_chipset(ctx) >= 0x25) {
8756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		BEGIN_RING(chan, kelvin, NV20TCL_TX_RCOMP, 1);
8856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		OUT_RING  (chan, NV20TCL_TX_RCOMP_LEQUAL | 0xdb0);
8956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	} else {
9056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		BEGIN_RING(chan, kelvin, 0x1e68, 1);
9156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		OUT_RING  (chan, 0x4b800000); /* 16777216.000000 */
9256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		BEGIN_RING(chan, kelvin, NV20TCL_TX_RCOMP, 1);
9356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		OUT_RING  (chan, NV20TCL_TX_RCOMP_LEQUAL);
9456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	}
9556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
9656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, 0x290, 1);
9756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0x10 << 16 | 1);
9856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, 0x9fc, 1);
9956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
10056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, 0x1d80, 1);
10156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 1);
10256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, 0x9f8, 1);
10356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 4);
10456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, 0x17ec, 3);
10556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf (chan, 0.0);
10656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf (chan, 1.0);
10756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf (chan, 0.0);
10856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
10956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	if (context_chipset(ctx) >= 0x25) {
11056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		BEGIN_RING(chan, kelvin, 0x1d88, 1);
11156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		OUT_RING  (chan, 3);
11256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
11356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		BEGIN_RING(chan, kelvin, NV25TCL_DMA_IN_MEMORY9, 1);
11456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		OUT_RING  (chan, chan->vram->handle);
11556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		BEGIN_RING(chan, kelvin, NV25TCL_DMA_IN_MEMORY8, 1);
11656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		OUT_RING  (chan, chan->vram->handle);
11756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	}
11856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
11956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_DMA_FENCE, 1);
12056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
12156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
12256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, 0x1e98, 1);
12356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
12456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
12556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_NOTIFY, 1);
12656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
12756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
12856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, 0x120, 3);
12956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
13056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 1);
13156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 2);
13256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
13356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	if (context_chipset(ctx) >= 0x25) {
13456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		BEGIN_RING(chan, kelvin, 0x022c, 2);
13556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		OUT_RING  (chan, 0x280);
13656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		OUT_RING  (chan, 0x07d28000);
13756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
13856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		BEGIN_RING(chan, kelvin, 0x1da4, 1);
13956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		OUT_RING  (chan, 0);
14056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	}
14156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
14256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_RT_HORIZ, 2);
14356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0 << 16 | 0);
14456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0 << 16 | 0);
14556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
14656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_ALPHA_FUNC_ENABLE, 1);
14756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
14856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_ALPHA_FUNC_FUNC, 2);
14956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, NV20TCL_ALPHA_FUNC_FUNC_ALWAYS);
15056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
15156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
15256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	for (i = 0; i < NV20TCL_TX_ENABLE__SIZE; i++) {
15356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		BEGIN_RING(chan, kelvin, NV20TCL_TX_ENABLE(i), 1);
15456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		OUT_RING  (chan, 0);
15556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	}
15656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
15756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_TX_SHADER_OP, 1);
15856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
15956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_TX_SHADER_CULL_MODE, 1);
16056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
16156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
16256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_RC_IN_ALPHA(0), 4);
16356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0x30d410d0);
16456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
16556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
16656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
16756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_RC_OUT_RGB(0), 4);
16856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0x00000c00);
16956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
17056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
17156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
17256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_RC_ENABLE, 1);
17356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0x00011101);
17456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_RC_FINAL0, 2);
17556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0x130e0300);
17656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0x0c091c80);
17756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_RC_OUT_ALPHA(0), 4);
17856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0x00000c00);
17956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
18056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
18156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
18256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_RC_IN_RGB(0), 4);
18356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0x20c400c0);
18456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
18556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
18656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
18756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_RC_COLOR0, 2);
18856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
18956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
19056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_RC_CONSTANT_COLOR0(0), 4);
19156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0x035125a0);
19256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
19356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0x40002000);
19456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
19556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
19656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_MULTISAMPLE_CONTROL, 1);
19756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0xffff0000);
19856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_BLEND_FUNC_ENABLE, 1);
19956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
20056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_DITHER_ENABLE, 1);
20156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
20256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_STENCIL_ENABLE, 1);
20356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
20456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_BLEND_FUNC_SRC, 4);
20556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, NV20TCL_BLEND_FUNC_SRC_ONE);
20656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, NV20TCL_BLEND_FUNC_DST_ZERO);
20756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
20856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, NV20TCL_BLEND_EQUATION_FUNC_ADD);
20956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_STENCIL_MASK, 7);
21056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0xff);
21156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, NV20TCL_STENCIL_FUNC_FUNC_ALWAYS);
21256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
21356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0xff);
21456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, NV20TCL_STENCIL_OP_FAIL_KEEP);
21556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, NV20TCL_STENCIL_OP_ZFAIL_KEEP);
21656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, NV20TCL_STENCIL_OP_ZPASS_KEEP);
21756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
21856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_COLOR_LOGIC_OP_ENABLE, 2);
21956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
22056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, NV20TCL_COLOR_LOGIC_OP_OP_COPY);
22156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, 0x17cc, 1);
22256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
22356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	if (context_chipset(ctx) >= 0x25) {
22456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		BEGIN_RING(chan, kelvin, 0x1d84, 1);
22556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		OUT_RING  (chan, 1);
22656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	}
22756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_LIGHTING_ENABLE, 1);
22856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
22956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_LIGHT_MODEL, 1);
23056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, NV20TCL_LIGHT_MODEL_VIEWER_NONLOCAL);
23156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_SEPARATE_SPECULAR_ENABLE, 1);
23256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
23356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_LIGHT_MODEL_TWO_SIDE_ENABLE, 1);
23456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
23556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_ENABLED_LIGHTS, 1);
23656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
23756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_NORMALIZE_ENABLE, 1);
23856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
23956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_POLYGON_STIPPLE_PATTERN(0),
24056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		   NV20TCL_POLYGON_STIPPLE_PATTERN__SIZE);
24156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	for (i = 0; i < NV20TCL_POLYGON_STIPPLE_PATTERN__SIZE; i++) {
24256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		OUT_RING(chan, 0xffffffff);
24356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	}
24456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
24556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_POLYGON_OFFSET_POINT_ENABLE, 3);
24656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
24756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
24856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
24956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_DEPTH_FUNC, 1);
25056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, NV20TCL_DEPTH_FUNC_LESS);
25156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_DEPTH_WRITE_ENABLE, 1);
25256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
25356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_DEPTH_TEST_ENABLE, 1);
25456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
25556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_POLYGON_OFFSET_FACTOR, 2);
25656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf (chan, 0.0);
25756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf (chan, 0.0);
25856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_DEPTH_UNK17D8, 1);
25956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 1);
26056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	if (context_chipset(ctx) < 0x25) {
26156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		BEGIN_RING(chan, kelvin, 0x1d84, 1);
26256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		OUT_RING  (chan, 3);
26356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	}
26456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_POINT_SIZE, 1);
26556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	if (context_chipset(ctx) >= 0x25)
26656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		OUT_RINGf (chan, 1.0);
26756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	else
26856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		OUT_RING  (chan, 8);
26956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
27056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	if (context_chipset(ctx) >= 0x25) {
27156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		BEGIN_RING(chan, kelvin, NV20TCL_POINT_PARAMETERS_ENABLE, 1);
27256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		OUT_RING  (chan, 0);
27356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		BEGIN_RING(chan, kelvin, 0x0a1c, 1);
27456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		OUT_RING  (chan, 0x800);
27556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	} else {
27656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		BEGIN_RING(chan, kelvin, NV20TCL_POINT_PARAMETERS_ENABLE, 2);
27756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		OUT_RING  (chan, 0);
27856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		OUT_RING  (chan, 0);
27956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	}
28056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
28156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_LINE_WIDTH, 1);
28256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 8);
28356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_LINE_SMOOTH_ENABLE, 1);
28456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
28556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_POLYGON_MODE_FRONT, 2);
28656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, NV20TCL_POLYGON_MODE_FRONT_FILL);
28756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, NV20TCL_POLYGON_MODE_BACK_FILL);
28856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_CULL_FACE, 2);
28956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, NV20TCL_CULL_FACE_BACK);
29056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, NV20TCL_FRONT_FACE_CCW);
29156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_POLYGON_SMOOTH_ENABLE, 1);
29256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
29356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_CULL_FACE_ENABLE, 1);
29456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
29556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_SHADE_MODEL, 1);
29656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, NV20TCL_SHADE_MODEL_SMOOTH);
29756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_POLYGON_STIPPLE_ENABLE, 1);
29856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
29956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
300c944fb5ffe7cf16154d6395001f43a6c965cab1fFrancisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_TX_GEN_MODE_S(0),
301c944fb5ffe7cf16154d6395001f43a6c965cab1fFrancisco Jerez		   4 * NV20TCL_TX_GEN_MODE_S__SIZE);
302c944fb5ffe7cf16154d6395001f43a6c965cab1fFrancisco Jerez	for (i=0; i < 4 * NV20TCL_TX_GEN_MODE_S__SIZE; i++)
30356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		OUT_RING(chan, 0);
30456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
30556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_FOG_EQUATION_CONSTANT, 3);
30656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf (chan, 1.5);
30756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf (chan, -0.090168);
30856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf (chan, 0.0);
30956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_FOG_MODE, 2);
31056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, NV20TCL_FOG_MODE_EXP_SIGNED);
31156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, NV20TCL_FOG_COORD_FOG);
31256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_FOG_ENABLE, 2);
31356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
31456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 0);
31556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
31656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_ENGINE, 1);
31756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, NV20TCL_ENGINE_FIXED);
31856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
31956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	for (i = 0; i < NV20TCL_TX_MATRIX_ENABLE__SIZE; i++) {
32056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		BEGIN_RING(chan, kelvin, NV20TCL_TX_MATRIX_ENABLE(i), 1);
32156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		OUT_RING  (chan, 0);
32256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	}
32356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
32456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_VTX_ATTR_4F_X(1), 4 * 15);
32556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf(chan, 1.0);
32656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf(chan, 0.0);
32756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf(chan, 0.0);
32856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf(chan, 1.0);
32956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf(chan, 0.0);
33056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf(chan, 0.0);
33156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf(chan, 1.0);
33256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf(chan, 1.0);
33356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf(chan, 1.0);
33456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf(chan, 1.0);
33556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf(chan, 1.0);
33656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf(chan, 1.0);
33756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	for (i = 0; i < 12; i++) {
33856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		OUT_RINGf(chan, 0.0);
33956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		OUT_RINGf(chan, 0.0);
34056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		OUT_RINGf(chan, 0.0);
34156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		OUT_RINGf(chan, 1.0);
34256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	}
34356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
34456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_EDGEFLAG_ENABLE, 1);
34556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING  (chan, 1);
34656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_COLOR_MASK, 1);
34756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING (chan, 0x00010101);
34856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_CLEAR_VALUE, 1);
34956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RING (chan, 0);
35056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
35156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_DEPTH_RANGE_NEAR, 2);
35256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf (chan, 0.0);
35356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf (chan, 16777216.0);
35456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
35556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_VIEWPORT_TRANSLATE_X, 4);
35656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf (chan, 0.0);
35756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf (chan, 0.0);
35856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf (chan, 0.0);
35956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf (chan, 16777215.0);
36056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
36156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_VIEWPORT_SCALE_X, 4);
36256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf (chan, 0.0);
36356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf (chan, 0.0);
36456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf (chan, 16777215.0 * 0.5);
36556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	OUT_RINGf (chan, 65535.0);
36656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
36756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	FIRE_RING(chan);
36856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez}
36956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
37056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerezstatic void
37156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jereznv20_context_destroy(GLcontext *ctx)
37256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez{
37356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	struct nouveau_context *nctx = to_nouveau_context(ctx);
37456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
37556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	nv04_surface_takedown(ctx);
37656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	nv20_render_destroy(ctx);
37756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
37856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	nouveau_grobj_free(&nctx->hw.eng3d);
37956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
38056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	nouveau_context_deinit(ctx);
38156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	FREE(ctx);
38256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez}
38356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
38456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerezstatic GLcontext *
385bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jereznv20_context_create(struct nouveau_screen *screen, const GLvisual *visual,
386bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		    GLcontext *share_ctx)
387bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{
388bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	struct nouveau_context *nctx;
389bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	GLcontext *ctx;
39056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	unsigned kelvin_class;
39156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	int ret;
392bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
393bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	nctx = CALLOC_STRUCT(nouveau_context);
394bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	if (!nctx)
395bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return NULL;
396bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
397bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	ctx = &nctx->base;
398bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
39956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	if (!nouveau_context_init(ctx, screen, visual, share_ctx))
40056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		goto fail;
40156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
402a7b8d105a6efe4056633f7129f80aac1f13cc246Francisco Jerez	driInitExtensions(ctx, nv20_extensions, GL_FALSE);
403a7b8d105a6efe4056633f7129f80aac1f13cc246Francisco Jerez
40456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	/* GL constants. */
405bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	ctx->Const.MaxTextureCoordUnits = NV20_TEXTURE_UNITS;
406bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	ctx->Const.MaxTextureImageUnits = NV20_TEXTURE_UNITS;
407bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	ctx->Const.MaxTextureUnits = NV20_TEXTURE_UNITS;
408bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	ctx->Const.MaxTextureMaxAnisotropy = 8;
409bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	ctx->Const.MaxTextureLodBias = 15;
410bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
41156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	/* 2D engine. */
41256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	ret = nv04_surface_init(ctx);
41356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	if (!ret)
41456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		goto fail;
41556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
41656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	/* 3D engine. */
41756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	if (context_chipset(ctx) >= 0x25)
41856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		kelvin_class = NV25TCL;
41956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	else
42056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		kelvin_class = NV20TCL;
42156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
42256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	ret = nouveau_grobj_alloc(context_chan(ctx), 0xbeef0001, kelvin_class,
42356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez				  &nctx->hw.eng3d);
42456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	if (ret)
42556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		goto fail;
42656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
42756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	nv20_hwctx_init(ctx);
428bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	nv20_render_init(ctx);
429bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
430bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	return ctx;
431bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
43256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerezfail:
43356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	nv20_context_destroy(ctx);
43456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	return NULL;
435bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}
43656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
43756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerezconst struct nouveau_driver nv20_driver = {
43856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	.context_create = nv20_context_create,
43956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	.context_destroy = nv20_context_destroy,
44056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	.surface_copy = nv04_surface_copy,
44156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	.surface_fill = nv04_surface_fill,
44256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	.emit = (nouveau_state_func[]) {
44356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_alpha_func,
44456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_blend_color,
44556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_blend_equation,
44656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_blend_func,
44756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_clip_plane,
44856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_clip_plane,
44956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_clip_plane,
45056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_clip_plane,
45156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_clip_plane,
45256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_clip_plane,
45356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_color_mask,
45456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_color_material,
45556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_cull_face,
45656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_front_face,
45756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_depth,
45856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_dither,
4597269a30b86745a29bb575ce3545ab82e6514ce2aFrancisco Jerez		nv20_emit_frag,
46056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_framebuffer,
46156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_fog,
46256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_light_enable,
46356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_light_model,
46456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_light_source,
46556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_light_source,
46656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_light_source,
46756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_light_source,
46856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_light_source,
46956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_light_source,
47056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_light_source,
47156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_light_source,
47256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_line_stipple,
47356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_line_mode,
47456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_logic_opcode,
47556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_material_ambient,
47656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_material_ambient,
47756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_material_diffuse,
47856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_material_diffuse,
47956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_material_specular,
48056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_material_specular,
48156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_material_shininess,
48256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_material_shininess,
48356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_modelview,
48456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_point_mode,
48556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_point_parameter,
48656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_polygon_mode,
48756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_polygon_offset,
48856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_polygon_stipple,
48956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_projection,
49056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_render_mode,
49156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_scissor,
49256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_shade_model,
49356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_stencil_func,
49456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_stencil_mask,
49556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_stencil_op,
4967269a30b86745a29bb575ce3545ab82e6514ce2aFrancisco Jerez		nv20_emit_tex_env,
4977269a30b86745a29bb575ce3545ab82e6514ce2aFrancisco Jerez		nv20_emit_tex_env,
4987269a30b86745a29bb575ce3545ab82e6514ce2aFrancisco Jerez		nv20_emit_tex_env,
4997269a30b86745a29bb575ce3545ab82e6514ce2aFrancisco Jerez		nv20_emit_tex_env,
500c944fb5ffe7cf16154d6395001f43a6c965cab1fFrancisco Jerez		nv20_emit_tex_gen,
501c944fb5ffe7cf16154d6395001f43a6c965cab1fFrancisco Jerez		nv20_emit_tex_gen,
502c944fb5ffe7cf16154d6395001f43a6c965cab1fFrancisco Jerez		nv20_emit_tex_gen,
503c944fb5ffe7cf16154d6395001f43a6c965cab1fFrancisco Jerez		nv20_emit_tex_gen,
5041a812ab57a71d16e45ca44de7ae0570d2bd46674Francisco Jerez		nv20_emit_tex_mat,
5051a812ab57a71d16e45ca44de7ae0570d2bd46674Francisco Jerez		nv20_emit_tex_mat,
5061a812ab57a71d16e45ca44de7ae0570d2bd46674Francisco Jerez		nv20_emit_tex_mat,
5071a812ab57a71d16e45ca44de7ae0570d2bd46674Francisco Jerez		nv20_emit_tex_mat,
50856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_tex_obj,
50956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_tex_obj,
51056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_tex_obj,
51156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_tex_obj,
51256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_viewport,
51356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv20_emit_tex_shader
51456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	},
51556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	.num_emit = NUM_NV20_STATE,
51656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez};
517