nv20_render.c revision f9995b30756140724f41daf963fa06167912be7f
1bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez/*
2bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco 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"
29bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_class.h"
30bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nv20_driver.h"
31bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
32bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#define NUM_VERTEX_ATTRS 16
33bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
34bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic void
35f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergnv20_emit_material(struct gl_context *ctx, struct nouveau_array_state *a,
36bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		   const void *v);
37bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
38bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez/* Vertex attribute format. */
39bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic struct nouveau_attr_info nv20_vertex_attrs[VERT_ATTRIB_MAX] = {
40bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	[VERT_ATTRIB_POS] = {
41bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.vbo_index = 0,
42bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.imm_method = NV20TCL_VERTEX_POS_4F_X,
43bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.imm_fields = 4,
44bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	},
45bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	[VERT_ATTRIB_NORMAL] = {
46bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.vbo_index = 2,
47bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.imm_method = NV20TCL_VERTEX_NOR_3F_X,
48bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.imm_fields = 3,
49bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	},
50bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	[VERT_ATTRIB_COLOR0] = {
51bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.vbo_index = 3,
52bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.imm_method = NV20TCL_VERTEX_COL_4F_X,
53bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.imm_fields = 4,
54bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	},
55bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	[VERT_ATTRIB_COLOR1] = {
56bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.vbo_index = 4,
57bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.imm_method = NV20TCL_VERTEX_COL2_3F_X,
58bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.imm_fields = 3,
59bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	},
60bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	[VERT_ATTRIB_FOG] = {
61bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.vbo_index = 5,
62bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.imm_method = NV20TCL_VERTEX_FOG_1F,
63bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.imm_fields = 1,
64bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	},
65bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	[VERT_ATTRIB_TEX0] = {
66bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.vbo_index = 9,
67bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.imm_method = NV20TCL_VERTEX_TX0_4F_S,
68bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.imm_fields = 4,
69bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	},
70bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	[VERT_ATTRIB_TEX1] = {
71bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.vbo_index = 10,
72bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.imm_method = NV20TCL_VERTEX_TX1_4F_S,
73bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.imm_fields = 4,
74bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	},
75bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	[VERT_ATTRIB_TEX2] = {
76bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.vbo_index = 11,
77bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.imm_method = NV20TCL_VERTEX_TX2_4F_S,
78bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.imm_fields = 4,
79bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	},
80bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	[VERT_ATTRIB_TEX3] = {
81bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.vbo_index = 12,
82bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.imm_method = NV20TCL_VERTEX_TX3_4F_S,
83bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.imm_fields = 4,
84bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	},
85bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	[VERT_ATTRIB_GENERIC0] = {
86bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.emit = nv20_emit_material,
87bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	},
88bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	[VERT_ATTRIB_GENERIC1] = {
89bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.emit = nv20_emit_material,
90bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	},
91bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	[VERT_ATTRIB_GENERIC2] = {
92bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.emit = nv20_emit_material,
93bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	},
94bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	[VERT_ATTRIB_GENERIC3] = {
95bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.emit = nv20_emit_material,
96bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	},
97bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	[VERT_ATTRIB_GENERIC4] = {
98bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.emit = nv20_emit_material,
99bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	},
100bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	[VERT_ATTRIB_GENERIC5] = {
101bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.emit = nv20_emit_material,
102bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	},
103bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	[VERT_ATTRIB_GENERIC6] = {
104bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.emit = nv20_emit_material,
105bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	},
106bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	[VERT_ATTRIB_GENERIC7] = {
107bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.emit = nv20_emit_material,
108bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	},
109bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	[VERT_ATTRIB_GENERIC8] = {
110bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.emit = nv20_emit_material,
111bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	},
112bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	[VERT_ATTRIB_GENERIC9] = {
113bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		.emit = nv20_emit_material,
114bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	},
115bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez};
116bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
117bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic int
118bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezget_hw_format(int type)
119bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{
120bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	switch (type) {
121bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case GL_FLOAT:
122bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return NV20TCL_VTXFMT_TYPE_FLOAT;
123bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case GL_UNSIGNED_SHORT:
124bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return NV20TCL_VTXFMT_TYPE_USHORT;
125bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	case GL_UNSIGNED_BYTE:
126bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		return NV20TCL_VTXFMT_TYPE_UBYTE;
127bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	default:
128bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		assert(0);
129bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	}
130bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}
131bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
132bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic void
133f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergnv20_render_set_format(struct gl_context *ctx)
134bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{
135bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	struct nouveau_render_state *render = to_render_state(ctx);
136bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	struct nouveau_channel *chan = context_chan(ctx);
137bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	struct nouveau_grobj *kelvin = context_eng3d(ctx);
138bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	int i, hw_format;
139bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
140bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	for (i = 0; i < NUM_VERTEX_ATTRS; i++) {
141bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		int attr = render->map[i];
142bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
143bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		if (attr >= 0) {
144bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez			struct nouveau_array_state *a = &render->attrs[attr];
145bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
146bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez			hw_format = a->stride << 8 |
147bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez				a->fields << 4 |
148bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez				get_hw_format(a->type);
149bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
150bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		} else {
151bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez			/* Unused attribute. */
152bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez			hw_format = NV10TCL_VTXFMT_TYPE_FLOAT;
153bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		}
154bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
155bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		BEGIN_RING(chan, kelvin, NV20TCL_VTXFMT(i), 1);
156bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		OUT_RING(chan, hw_format);
157bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	}
158bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}
159bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
160bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerezstatic void
161f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergnv20_render_bind_vertices(struct gl_context *ctx)
162bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez{
163bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	struct nouveau_render_state *render = to_render_state(ctx);
164bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	struct nouveau_bo_context *bctx = context_bctx(ctx, VERTEX);
165bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	struct nouveau_channel *chan = context_chan(ctx);
166bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	struct nouveau_grobj *kelvin = context_eng3d(ctx);
167bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	int i;
168bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
169bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	for (i = 0; i < NUM_VERTEX_ATTRS; i++) {
170bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		int attr = render->map[i];
171bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
172bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		if (attr >= 0) {
173bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez			struct nouveau_array_state *a = &render->attrs[attr];
174bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
175bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez			nouveau_bo_mark(bctx, kelvin,
176bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez					NV20TCL_VTXBUF_ADDRESS(i),
177bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez					a->bo, a->offset, 0,
178bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez					0, NV20TCL_VTXBUF_ADDRESS_DMA1,
179bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez					NOUVEAU_BO_LOW | NOUVEAU_BO_OR |
180bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez					NOUVEAU_BO_GART | NOUVEAU_BO_RD);
181bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez		}
182bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	}
183bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
184bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_VTX_CACHE_INVALIDATE, 1);
185bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	OUT_RING(chan, 0);
186bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez}
187bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
188bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez/* Vertex array rendering defs. */
189bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#define RENDER_LOCALS(ctx)					\
190bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	struct nouveau_grobj *kelvin = context_eng3d(ctx)
191bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
192bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#define BATCH_BEGIN(prim)					\
193bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_VERTEX_BEGIN_END, 1);	\
19435a1893fd1993932a428f5f83051383d51c8135eFrancisco Jerez	OUT_RING(chan, prim)
195bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#define BATCH_END()						\
196bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez	BEGIN_RING(chan, kelvin, NV20TCL_VERTEX_BEGIN_END, 1);	\
19735a1893fd1993932a428f5f83051383d51c8135eFrancisco Jerez	OUT_RING(chan, 0)
198bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
199bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#define MAX_PACKET 0x400
200bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
201bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#define MAX_OUT_L 0x100
202bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#define BATCH_PACKET_L(n)						\
20335a1893fd1993932a428f5f83051383d51c8135eFrancisco Jerez	BEGIN_RING_NI(chan, kelvin, NV20TCL_VB_VERTEX_BATCH, n)
204bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#define BATCH_OUT_L(i, n)			\
20535a1893fd1993932a428f5f83051383d51c8135eFrancisco Jerez	OUT_RING(chan, ((n) - 1) << 24 | (i))
206bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
207bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#define MAX_OUT_I16 0x2
208bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#define BATCH_PACKET_I16(n)					\
20935a1893fd1993932a428f5f83051383d51c8135eFrancisco Jerez	BEGIN_RING_NI(chan, kelvin, NV20TCL_VB_ELEMENT_U16, n)
210bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#define BATCH_OUT_I16(i0, i1)			\
21135a1893fd1993932a428f5f83051383d51c8135eFrancisco Jerez	OUT_RING(chan, (i1) << 16 | (i0))
212bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
213bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#define MAX_OUT_I32 0x1
214bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#define BATCH_PACKET_I32(n)					\
21535a1893fd1993932a428f5f83051383d51c8135eFrancisco Jerez	BEGIN_RING_NI(chan, kelvin, NV20TCL_VB_ELEMENT_U32, n)
216bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#define BATCH_OUT_I32(i)			\
21735a1893fd1993932a428f5f83051383d51c8135eFrancisco Jerez	OUT_RING(chan, i)
218bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
219bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#define IMM_PACKET(m, n)			\
22035a1893fd1993932a428f5f83051383d51c8135eFrancisco Jerez	BEGIN_RING(chan, kelvin, m, n)
221bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#define IMM_OUT(x)				\
22235a1893fd1993932a428f5f83051383d51c8135eFrancisco Jerez	OUT_RINGf(chan, x)
223bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez
224bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#define TAG(x) nv20_##x
225bfb5dc68fcc9f5dee71f66d9499b8bdcde9627eaFrancisco Jerez#include "nouveau_render_t.c"
226