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
278a99ec8e05ef541c586c2f8b427220d036589870Ian Romanick#include <stdbool.h>
28f102c5220c8b671d92c04dce803b9c1f474f7253Francisco Jerez#include "main/state.h"
29bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_driver.h"
30bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_context.h"
31bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_fbo.h"
32bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_util.h"
33f4efc256fd90beaff86321e4c6ce00f9be55092dViktor Novotný#include "nv_object.xml.h"
34f4efc256fd90beaff86321e4c6ce00f9be55092dViktor Novotný#include "nv10_3d.xml.h"
3556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez#include "nv04_driver.h"
36bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nv10_driver.h"
37bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
38065163bcd2df12494ca523538736282fc847fa6bFrancisco Jerezstatic GLboolean
39f9995b30756140724f41daf963fa06167912be7fKristian Høgsberguse_fast_zclear(struct gl_context *ctx, GLbitfield buffers)
40065163bcd2df12494ca523538736282fc847fa6bFrancisco Jerez{
41065163bcd2df12494ca523538736282fc847fa6bFrancisco Jerez	struct nouveau_context *nctx = to_nouveau_context(ctx);
42065163bcd2df12494ca523538736282fc847fa6bFrancisco Jerez	struct gl_framebuffer *fb = ctx->DrawBuffer;
43065163bcd2df12494ca523538736282fc847fa6bFrancisco Jerez
44065163bcd2df12494ca523538736282fc847fa6bFrancisco Jerez	if (buffers & BUFFER_BIT_STENCIL) {
45065163bcd2df12494ca523538736282fc847fa6bFrancisco Jerez		/*
46065163bcd2df12494ca523538736282fc847fa6bFrancisco Jerez		 * The stencil test is bypassed when fast Z clears are
47065163bcd2df12494ca523538736282fc847fa6bFrancisco Jerez		 * enabled.
48065163bcd2df12494ca523538736282fc847fa6bFrancisco Jerez		 */
49065163bcd2df12494ca523538736282fc847fa6bFrancisco Jerez		nctx->hierz.clear_blocked = GL_TRUE;
50065163bcd2df12494ca523538736282fc847fa6bFrancisco Jerez		context_dirty(ctx, ZCLEAR);
51065163bcd2df12494ca523538736282fc847fa6bFrancisco Jerez		return GL_FALSE;
52065163bcd2df12494ca523538736282fc847fa6bFrancisco Jerez	}
53065163bcd2df12494ca523538736282fc847fa6bFrancisco Jerez
54065163bcd2df12494ca523538736282fc847fa6bFrancisco Jerez	return !nctx->hierz.clear_blocked &&
55065163bcd2df12494ca523538736282fc847fa6bFrancisco Jerez		fb->_Xmax == fb->Width && fb->_Xmin == 0 &&
56065163bcd2df12494ca523538736282fc847fa6bFrancisco Jerez		fb->_Ymax == fb->Height && fb->_Ymin == 0;
57065163bcd2df12494ca523538736282fc847fa6bFrancisco Jerez}
58065163bcd2df12494ca523538736282fc847fa6bFrancisco Jerez
59e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco JerezGLboolean
60f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergnv10_use_viewport_zclear(struct gl_context *ctx)
61e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez{
62e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	struct nouveau_context *nctx = to_nouveau_context(ctx);
63e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	struct gl_framebuffer *fb = ctx->DrawBuffer;
64a782db5570a45008f153396070eae153305a7953Brian Paul	struct gl_renderbuffer *depthRb = fb->Attachment[BUFFER_DEPTH].Renderbuffer;
65e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez
66e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	return context_chipset(ctx) < 0x17 &&
67a782db5570a45008f153396070eae153305a7953Brian Paul		!nctx->hierz.clear_blocked && depthRb &&
68a782db5570a45008f153396070eae153305a7953Brian Paul		(_mesa_get_format_bits(depthRb->Format,
69e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez				       GL_DEPTH_BITS) >= 24);
70e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez}
71e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez
72e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerezfloat
73f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergnv10_transform_depth(struct gl_context *ctx, float z)
74e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez{
75e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	struct nouveau_context *nctx = to_nouveau_context(ctx);
76e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez
77e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	if (nv10_use_viewport_zclear(ctx))
78e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez		return 2097152.0 * (z + (nctx->hierz.clear_seq & 7));
79e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	else
80e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez		return ctx->DrawBuffer->_DepthMaxF * z;
81e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez}
82e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez
83bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic void
84f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergnv10_zclear(struct gl_context *ctx, GLbitfield *buffers)
85e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez{
86e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	/*
87e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	 * Pre-nv17 cards don't have native support for fast Z clears,
88e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	 * but in some cases we can still "clear" the Z buffer without
89e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	 * actually blitting to it if we're willing to sacrifice a few
90e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	 * bits of depth precision.
91e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	 *
92e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	 * Each time a clear is requested we modify the viewport
93e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	 * transform in such a way that the old contents of the depth
94e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	 * buffer are clamped to the requested clear value when
95e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	 * they're read by the GPU.
96e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	 */
97e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	struct nouveau_context *nctx = to_nouveau_context(ctx);
98e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	struct gl_framebuffer *fb = ctx->DrawBuffer;
99e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	struct nouveau_framebuffer *nfb = to_nouveau_framebuffer(fb);
100e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	struct nouveau_surface *s = &to_nouveau_renderbuffer(
101a782db5570a45008f153396070eae153305a7953Brian Paul		fb->Attachment[BUFFER_DEPTH].Renderbuffer)->surface;
102e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez
103e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	if (nv10_use_viewport_zclear(ctx)) {
104e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez		int x, y, w, h;
105e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez		float z = ctx->Depth.Clear;
106e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez		uint32_t value = pack_zs_f(s->format, z, 0);
107e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez
108e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez		get_scissors(fb, &x, &y, &w, &h);
109e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez		*buffers &= ~BUFFER_BIT_DEPTH;
110e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez
111e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez		if (use_fast_zclear(ctx, *buffers)) {
112e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez			if (nfb->hierz.clear_value != value) {
113e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez				/* Don't fast clear if we're changing
114e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez				 * the depth value. */
115e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez				nfb->hierz.clear_value = value;
116e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez
117e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez			} else if (z == 0.0) {
118e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez				nctx->hierz.clear_seq++;
119e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez				context_dirty(ctx, ZCLEAR);
120e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez
121e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez				if ((nctx->hierz.clear_seq & 7) != 0 &&
122e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez				    nctx->hierz.clear_seq != 1)
123e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez					/* We didn't wrap around -- no need to
124e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez					 * clear the depth buffer for real. */
125e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez					return;
126e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez
127e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez			} else if (z == 1.0) {
128e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez				nctx->hierz.clear_seq--;
129e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez				context_dirty(ctx, ZCLEAR);
130e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez
131e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez				if ((nctx->hierz.clear_seq & 7) != 7)
132e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez					/* No wrap around */
133e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez					return;
134e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez			}
135e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez		}
136e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez
137e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez		value = pack_zs_f(s->format,
138e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez				  (z + (nctx->hierz.clear_seq & 7)) / 8, 0);
139e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez		context_drv(ctx)->surface_fill(ctx, s, ~0, value, x, y, w, h);
140e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	}
141e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez}
142e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez
143e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerezstatic void
144f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergnv17_zclear(struct gl_context *ctx, GLbitfield *buffers)
145bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{
146065163bcd2df12494ca523538736282fc847fa6bFrancisco Jerez	struct nouveau_context *nctx = to_nouveau_context(ctx);
1472e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	struct nouveau_pushbuf *push = context_push(ctx);
148bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	struct nouveau_framebuffer *nfb = to_nouveau_framebuffer(
149bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		ctx->DrawBuffer);
150e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	struct nouveau_surface *s = &to_nouveau_renderbuffer(
151a782db5570a45008f153396070eae153305a7953Brian Paul		nfb->base.Attachment[BUFFER_DEPTH].Renderbuffer)->surface;
152bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
153e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	/* Clear the hierarchical depth buffer */
1542e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV17_3D(HIERZ_FILL_VALUE), 1);
1552e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, pack_zs_f(s->format, ctx->Depth.Clear, 0));
1562e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV17_3D(HIERZ_BUFFER_CLEAR), 1);
1572e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 1);
158bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
159e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	/* Mark the depth buffer as cleared */
160e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	if (use_fast_zclear(ctx, *buffers)) {
161e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez		if (nctx->hierz.clear_seq)
162e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez			*buffers &= ~BUFFER_BIT_DEPTH;
163bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
164e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez		nfb->hierz.clear_value =
165e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez			pack_zs_f(s->format, ctx->Depth.Clear, 0);
166e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez		nctx->hierz.clear_seq++;
167065163bcd2df12494ca523538736282fc847fa6bFrancisco Jerez
168e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez		context_dirty(ctx, ZCLEAR);
169e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	}
170e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez}
171065163bcd2df12494ca523538736282fc847fa6bFrancisco Jerez
172e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerezstatic void
173f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergnv10_clear(struct gl_context *ctx, GLbitfield buffers)
174e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez{
1752e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	struct nouveau_context *nctx = to_nouveau_context(ctx);
1762e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	struct nouveau_pushbuf *push = context_push(ctx);
1772e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs
178e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	nouveau_validate_framebuffer(ctx);
179065163bcd2df12494ca523538736282fc847fa6bFrancisco Jerez
1802e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	nouveau_pushbuf_bufctx(push, nctx->hw.bufctx);
1812e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	if (nouveau_pushbuf_validate(push)) {
1822e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs		nouveau_pushbuf_bufctx(push, NULL);
1832e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs		return;
1842e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	}
1852e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs
186e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez	if ((buffers & BUFFER_BIT_DEPTH) && ctx->Depth.Mask) {
187e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez		if (context_chipset(ctx) >= 0x17)
188e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez			nv17_zclear(ctx, &buffers);
189e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez		else
190e2acc7be2683fd3c295480724b02f5a497309cfdFrancisco Jerez			nv10_zclear(ctx, &buffers);
191f102c5220c8b671d92c04dce803b9c1f474f7253Francisco Jerez
192f102c5220c8b671d92c04dce803b9c1f474f7253Francisco Jerez		/* Emit the zclear state if it's dirty */
193f102c5220c8b671d92c04dce803b9c1f474f7253Francisco Jerez		_mesa_update_state(ctx);
194bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	}
195bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
1962e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	nouveau_pushbuf_bufctx(push, NULL);
197bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	nouveau_clear(ctx, buffers);
198bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}
199bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
20056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerezstatic void
201f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergnv10_hwctx_init(struct gl_context *ctx)
20256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez{
2032e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	struct nouveau_pushbuf *push = context_push(ctx);
20456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	struct nouveau_hw_state *hw = &to_nouveau_context(ctx)->hw;
2052e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	struct nv04_fifo *fifo = hw->chan->data;
20656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	int i;
20756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
2082e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV01_SUBC(3D, OBJECT), 1);
2092e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, hw->eng3d->handle);
2102e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(DMA_NOTIFY), 1);
2112e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, hw->ntfy->handle);
21256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
2132e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(DMA_TEXTURE0), 3);
2142e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, fifo->vram);
2152e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, fifo->gart);
2162e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, fifo->gart);
2172e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(DMA_COLOR), 2);
2182e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, fifo->vram);
2192e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, fifo->vram);
22056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
2212e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV04_GRAPH(3D, NOP), 1);
2222e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
22356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
2242e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(RT_HORIZ), 2);
2252e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
2262e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
22756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
2282e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(VIEWPORT_CLIP_HORIZ(0)), 1);
2292e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0x7ff << 16 | 0x800);
2302e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(VIEWPORT_CLIP_VERT(0)), 1);
2312e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0x7ff << 16 | 0x800);
23256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
23356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	for (i = 1; i < 8; i++) {
2342e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs		BEGIN_NV04(push, NV10_3D(VIEWPORT_CLIP_HORIZ(i)), 1);
2352e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs		PUSH_DATA (push, 0);
2362e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs		BEGIN_NV04(push, NV10_3D(VIEWPORT_CLIP_VERT(i)), 1);
2372e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs		PUSH_DATA (push, 0);
23856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	}
23956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
2402e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, SUBC_3D(0x290), 1);
2412e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0x10 << 16 | 1);
2422e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, SUBC_3D(0x3f4), 1);
2432e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
24456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
2452e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV04_GRAPH(3D, NOP), 1);
2462e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
24756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
24856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	if (context_chipset(ctx) >= 0x17) {
2492e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs		BEGIN_NV04(push, NV17_3D(UNK01AC), 2);
2502e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs		PUSH_DATA (push, fifo->vram);
2512e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs		PUSH_DATA (push, fifo->vram);
25256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
2532e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs		BEGIN_NV04(push, SUBC_3D(0xd84), 1);
2542e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs		PUSH_DATA (push, 0x3);
25556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
2562e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs		BEGIN_NV04(push, NV17_3D(COLOR_MASK_ENABLE), 1);
2572e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs		PUSH_DATA (push, 1);
25856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	}
25956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
26056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	if (context_chipset(ctx) >= 0x11) {
2612e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs		BEGIN_NV04(push, SUBC_3D(0x120), 3);
2622e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs		PUSH_DATA (push, 0);
2632e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs		PUSH_DATA (push, 1);
2642e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs		PUSH_DATA (push, 2);
26556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
2662e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs		BEGIN_NV04(push, NV04_GRAPH(3D, NOP), 1);
2672e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs		PUSH_DATA (push, 0);
26856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	}
26956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
2702e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV04_GRAPH(3D, NOP), 1);
2712e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
27256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
27356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	/* Set state */
2742e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(FOG_ENABLE), 1);
2752e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
2762e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(ALPHA_FUNC_ENABLE), 1);
2772e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
2782e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(ALPHA_FUNC_FUNC), 2);
2792e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0x207);
2802e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
2812e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(TEX_ENABLE(0)), 2);
2822e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
2832e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
2842e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs
2852e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(BLEND_FUNC_ENABLE), 1);
2862e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
2872e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(DITHER_ENABLE), 2);
2882e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 1);
2892e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
2902e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(LINE_SMOOTH_ENABLE), 1);
2912e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
2922e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(VERTEX_WEIGHT_ENABLE), 2);
2932e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
2942e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
2952e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(BLEND_FUNC_SRC), 4);
2962e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 1);
2972e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
2982e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
2992e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0x8006);
3002e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(STENCIL_MASK), 8);
3012e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0xff);
3022e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0x207);
3032e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
3042e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0xff);
3052e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0x1e00);
3062e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0x1e00);
3072e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0x1e00);
3082e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0x1d01);
3092e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(NORMALIZE_ENABLE), 1);
3102e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
3112e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(FOG_ENABLE), 2);
3122e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
3132e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
3142e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(LIGHT_MODEL), 1);
3152e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
3162e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(SEPARATE_SPECULAR_ENABLE), 1);
3172e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
3182e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(ENABLED_LIGHTS), 1);
3192e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
3202e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(POLYGON_OFFSET_POINT_ENABLE), 3);
3212e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
3222e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
3232e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
3242e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(DEPTH_FUNC), 1);
3252e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0x201);
3262e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(DEPTH_WRITE_ENABLE), 1);
3272e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
3282e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(DEPTH_TEST_ENABLE), 1);
3292e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
3302e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(POLYGON_OFFSET_FACTOR), 2);
3312e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
3322e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
3332e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(POINT_SIZE), 1);
3342e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 8);
3352e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(POINT_PARAMETERS_ENABLE), 2);
3362e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
3372e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
3382e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(LINE_WIDTH), 1);
3392e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 8);
3402e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(LINE_SMOOTH_ENABLE), 1);
3412e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
3422e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(POLYGON_MODE_FRONT), 2);
3432e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0x1b02);
3442e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0x1b02);
3452e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(CULL_FACE), 2);
3462e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0x405);
3472e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0x901);
3482e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(POLYGON_SMOOTH_ENABLE), 1);
3492e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
3502e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(CULL_FACE_ENABLE), 1);
3512e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
3522e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(TEX_GEN_MODE(0, 0)), 8);
35356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	for (i = 0; i < 8; i++)
3542e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs		PUSH_DATA (push, 0);
3552e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs
3562e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(TEX_MATRIX_ENABLE(0)), 2);
3572e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
3582e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
3592e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(FOG_COEFF(0)), 3);
3602e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0x3fc00000);	/* -1.50 */
3612e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0xbdb8aa0a);	/* -0.09 */
3622e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);		/*  0.00 */
3632e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs
3642e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV04_GRAPH(3D, NOP), 1);
3652e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
3662e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs
3672e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(FOG_MODE), 2);
3682e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0x802);
3692e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 2);
37056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	/* for some reason VIEW_MATRIX_ENABLE need to be 6 instead of 4 when
37156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	 * using texturing, except when using the texture matrix
37256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	 */
3732e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(VIEW_MATRIX_ENABLE), 1);
3742e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 6);
3752e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(COLOR_MASK), 1);
3762e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0x01010101);
37756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
37856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	/* Set vertex component */
3792e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(VERTEX_COL_4F_R), 4);
3802e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATAf(push, 1.0);
3812e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATAf(push, 0.0);
3822e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATAf(push, 0.0);
3832e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATAf(push, 1.0);
3842e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(VERTEX_COL2_3F_R), 3);
3852e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
3862e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
3872e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
3882e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(VERTEX_NOR_3F_X), 3);
3892e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
3902e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 0);
3912e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATAf(push, 1.0);
3922e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(VERTEX_TX0_4F_S), 4);
3932e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATAf(push, 0.0);
3942e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATAf(push, 0.0);
3952e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATAf(push, 0.0);
3962e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATAf(push, 1.0);
3972e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(VERTEX_TX1_4F_S), 4);
3982e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATAf(push, 0.0);
3992e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATAf(push, 0.0);
4002e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATAf(push, 0.0);
4012e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATAf(push, 1.0);
4022e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(VERTEX_FOG_1F), 1);
4032e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATAf(push, 0.0);
4042e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(EDGEFLAG_ENABLE), 1);
4052e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATA (push, 1);
4062e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs
4072e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	BEGIN_NV04(push, NV10_3D(DEPTH_RANGE_NEAR), 2);
4082e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATAf(push, 0.0);
4092e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_DATAf(push, 16777216.0);
4102e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs
4112e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	PUSH_KICK (push);
41256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez}
41356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
41456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerezstatic void
415f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergnv10_context_destroy(struct gl_context *ctx)
41656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez{
41756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	struct nouveau_context *nctx = to_nouveau_context(ctx);
41856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
41956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	nv04_surface_takedown(ctx);
420cdb38b5d3d1b93a90a91ad06c0f03efdfde6b525Francisco Jerez	nv10_swtnl_destroy(ctx);
421cdb38b5d3d1b93a90a91ad06c0f03efdfde6b525Francisco Jerez	nv10_vbo_destroy(ctx);
42256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
4232e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	nouveau_object_del(&nctx->hw.eng3d);
42456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
42556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	nouveau_context_deinit(ctx);
42656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	FREE(ctx);
42756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez}
42856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
429f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergstatic struct gl_context *
430d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsbergnv10_context_create(struct nouveau_screen *screen, const struct gl_config *visual,
431f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg		    struct gl_context *share_ctx)
432bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{
433bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	struct nouveau_context *nctx;
434f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg	struct gl_context *ctx;
43556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	unsigned celsius_class;
43656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	int ret;
437bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
438bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	nctx = CALLOC_STRUCT(nouveau_context);
439bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	if (!nctx)
440bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return NULL;
441bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
442bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	ctx = &nctx->base;
443bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
44456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	if (!nouveau_context_init(ctx, screen, visual, share_ctx))
44556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		goto fail;
44656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
4478a99ec8e05ef541c586c2f8b427220d036589870Ian Romanick	ctx->Extensions.ARB_texture_env_crossbar = true;
4488a99ec8e05ef541c586c2f8b427220d036589870Ian Romanick	ctx->Extensions.ARB_texture_env_combine = true;
4498a99ec8e05ef541c586c2f8b427220d036589870Ian Romanick	ctx->Extensions.ARB_texture_env_dot3 = true;
45066389bb99d86c8d96c2a7dbd83a5227c0e13e767Nicholas Miell	ctx->Extensions.NV_fog_distance = true;
4518a99ec8e05ef541c586c2f8b427220d036589870Ian Romanick	ctx->Extensions.NV_texture_rectangle = true;
45283a02427e576a5126a618c13bc3e12ff2b4a3e0aViktor Novotný	if (ctx->Mesa_DXTn) {
45383a02427e576a5126a618c13bc3e12ff2b4a3e0aViktor Novotný		ctx->Extensions.EXT_texture_compression_s3tc = true;
45483a02427e576a5126a618c13bc3e12ff2b4a3e0aViktor Novotný		ctx->Extensions.S3_s3tc = true;
45583a02427e576a5126a618c13bc3e12ff2b4a3e0aViktor Novotný	}
456a7b8d105a6efe4056633f7129f80aac1f13cc246Francisco Jerez
45756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	/* GL constants. */
458bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	ctx->Const.MaxTextureLevels = 12;
459bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	ctx->Const.MaxTextureCoordUnits = NV10_TEXTURE_UNITS;
460bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	ctx->Const.MaxTextureImageUnits = NV10_TEXTURE_UNITS;
461bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	ctx->Const.MaxTextureUnits = NV10_TEXTURE_UNITS;
462bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	ctx->Const.MaxTextureMaxAnisotropy = 2;
463bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	ctx->Const.MaxTextureLodBias = 15;
464bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	ctx->Driver.Clear = nv10_clear;
465bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
46656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	/* 2D engine. */
46756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	ret = nv04_surface_init(ctx);
46856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	if (!ret)
46956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		goto fail;
47056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
47156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	/* 3D engine. */
47256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	if (context_chipset(ctx) >= 0x17)
4732e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs		celsius_class = NV17_3D_CLASS;
47456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	else if (context_chipset(ctx) >= 0x11)
4752e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs		celsius_class = NV15_3D_CLASS;
47656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	else
4772e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs		celsius_class = NV10_3D_CLASS;
47856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
4792e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs	ret = nouveau_object_new(context_chan(ctx), 0xbeef0001, celsius_class,
4802e47d01c9e5325906cf3bb979279599991c6328eBen Skeggs				 NULL, 0, &nctx->hw.eng3d);
48156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	if (ret)
48256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		goto fail;
48356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
48456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	nv10_hwctx_init(ctx);
485cdb38b5d3d1b93a90a91ad06c0f03efdfde6b525Francisco Jerez	nv10_vbo_init(ctx);
486cdb38b5d3d1b93a90a91ad06c0f03efdfde6b525Francisco Jerez	nv10_swtnl_init(ctx);
487bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
488bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	return ctx;
489bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
49056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerezfail:
49156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	nv10_context_destroy(ctx);
49256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	return NULL;
493bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}
49456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez
49556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerezconst struct nouveau_driver nv10_driver = {
49656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	.context_create = nv10_context_create,
49756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	.context_destroy = nv10_context_destroy,
49856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	.surface_copy = nv04_surface_copy,
49956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	.surface_fill = nv04_surface_fill,
50056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	.emit = (nouveau_state_func[]) {
50156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_alpha_func,
50256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_blend_color,
50356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_blend_equation,
50456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_blend_func,
50556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_clip_plane,
50656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_clip_plane,
50756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_clip_plane,
50856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_clip_plane,
50956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_clip_plane,
51056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_clip_plane,
51156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_color_mask,
51256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_color_material,
51356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_cull_face,
51456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_front_face,
51556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_depth,
51656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_dither,
51756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_frag,
51856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_framebuffer,
51956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_fog,
52056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_light_enable,
52156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_light_model,
52256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_light_source,
52356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_light_source,
52456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_light_source,
52556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_light_source,
52656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_light_source,
52756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_light_source,
52856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_light_source,
52956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_light_source,
53056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_line_stipple,
53156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_line_mode,
53256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_logic_opcode,
53356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_material_ambient,
53456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nouveau_emit_nothing,
53556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_material_diffuse,
53656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nouveau_emit_nothing,
53756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_material_specular,
53856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nouveau_emit_nothing,
53956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_material_shininess,
54056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nouveau_emit_nothing,
54156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_modelview,
54256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_point_mode,
54356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_point_parameter,
54456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_polygon_mode,
54556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_polygon_offset,
54656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_polygon_stipple,
54756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_projection,
54856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_render_mode,
54956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_scissor,
55056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_shade_model,
55156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_stencil_func,
55256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_stencil_mask,
55356dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_stencil_op,
55456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_tex_env,
55556dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_tex_env,
55656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nouveau_emit_nothing,
55756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nouveau_emit_nothing,
55856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_tex_gen,
55956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_tex_gen,
56056dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nouveau_emit_nothing,
56156dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nouveau_emit_nothing,
5621a812ab57a71d16e45ca44de7ae0570d2bd46674Francisco Jerez		nv10_emit_tex_mat,
5631a812ab57a71d16e45ca44de7ae0570d2bd46674Francisco Jerez		nv10_emit_tex_mat,
5641a812ab57a71d16e45ca44de7ae0570d2bd46674Francisco Jerez		nouveau_emit_nothing,
5651a812ab57a71d16e45ca44de7ae0570d2bd46674Francisco Jerez		nouveau_emit_nothing,
56656dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_tex_obj,
56756dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nv10_emit_tex_obj,
56856dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nouveau_emit_nothing,
56956dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez		nouveau_emit_nothing,
570065163bcd2df12494ca523538736282fc847fa6bFrancisco Jerez		nv10_emit_viewport,
571065163bcd2df12494ca523538736282fc847fa6bFrancisco Jerez		nv10_emit_zclear
57256dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez	},
573065163bcd2df12494ca523538736282fc847fa6bFrancisco Jerez	.num_emit = NUM_NV10_STATE,
57456dcd011b5ec33190f268cf546a4c68f81f5ebd0Francisco Jerez};
575