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