Nouveau: name replace for nv20.
[mesa.git] / src / gallium / drivers / nv20 / nv20_context.c
1 #include "draw/draw_context.h"
2 #include "pipe/p_defines.h"
3 #include "pipe/p_winsys.h"
4
5 #include "nv20_context.h"
6 #include "nv20_screen.h"
7
8 static void
9 nv20_flush(struct pipe_context *pipe, unsigned flags,
10 struct pipe_fence_handle **fence)
11 {
12 struct nv20_context *nv20 = nv20_context(pipe);
13
14 draw_flush(nv20->draw);
15
16 FIRE_RING(fence);
17 }
18
19 static void
20 nv20_destroy(struct pipe_context *pipe)
21 {
22 struct nv20_context *nv20 = nv20_context(pipe);
23
24 if (nv20->draw)
25 draw_destroy(nv20->draw);
26
27 FREE(nv20);
28 }
29
30 static void nv20_init_hwctx(struct nv20_context *nv20)
31 {
32 struct nv20_screen *screen = nv20->screen;
33 struct nouveau_winsys *nvws = screen->nvws;
34 int i;
35 float projectionmatrix[16];
36
37 BEGIN_RING(kelvin, NV10TCL_DMA_NOTIFY, 1);
38 OUT_RING (screen->sync->handle);
39 BEGIN_RING(kelvin, NV10TCL_DMA_IN_MEMORY0, 2);
40 OUT_RING (nvws->channel->vram->handle);
41 OUT_RING (nvws->channel->gart->handle);
42 BEGIN_RING(kelvin, NV10TCL_DMA_IN_MEMORY2, 2);
43 OUT_RING (nvws->channel->vram->handle);
44 OUT_RING (nvws->channel->vram->handle);
45
46 BEGIN_RING(kelvin, NV10TCL_NOP, 1);
47 OUT_RING (0);
48
49 BEGIN_RING(kelvin, NV10TCL_RT_HORIZ, 2);
50 OUT_RING (0);
51 OUT_RING (0);
52
53 BEGIN_RING(kelvin, NV10TCL_VIEWPORT_CLIP_HORIZ(0), 1);
54 OUT_RING ((0x7ff<<16)|0x800);
55 BEGIN_RING(kelvin, NV10TCL_VIEWPORT_CLIP_VERT(0), 1);
56 OUT_RING ((0x7ff<<16)|0x800);
57
58 for (i=1;i<8;i++) {
59 BEGIN_RING(kelvin, NV10TCL_VIEWPORT_CLIP_HORIZ(i), 1);
60 OUT_RING (0);
61 BEGIN_RING(kelvin, NV10TCL_VIEWPORT_CLIP_VERT(i), 1);
62 OUT_RING (0);
63 }
64
65 BEGIN_RING(kelvin, 0x290, 1);
66 OUT_RING ((0x10<<16)|1);
67 BEGIN_RING(kelvin, 0x3f4, 1);
68 OUT_RING (0);
69
70 BEGIN_RING(kelvin, NV10TCL_NOP, 1);
71 OUT_RING (0);
72
73 if (nv20->screen->kelvin->grclass != NV10TCL) {
74 /* For nv11, nv17 */
75 BEGIN_RING(kelvin, 0x120, 3);
76 OUT_RING (0);
77 OUT_RING (1);
78 OUT_RING (2);
79
80 BEGIN_RING(kelvin, NV10TCL_NOP, 1);
81 OUT_RING (0);
82 }
83
84 BEGIN_RING(kelvin, NV10TCL_NOP, 1);
85 OUT_RING (0);
86
87 /* Set state */
88 BEGIN_RING(kelvin, NV10TCL_FOG_ENABLE, 1);
89 OUT_RING (0);
90 BEGIN_RING(kelvin, NV10TCL_ALPHA_FUNC_ENABLE, 1);
91 OUT_RING (0);
92 BEGIN_RING(kelvin, NV10TCL_ALPHA_FUNC_FUNC, 2);
93 OUT_RING (0x207);
94 OUT_RING (0);
95 BEGIN_RING(kelvin, NV10TCL_TX_ENABLE(0), 2);
96 OUT_RING (0);
97 OUT_RING (0);
98
99 BEGIN_RING(kelvin, NV10TCL_RC_IN_ALPHA(0), 12);
100 OUT_RING (0x30141010);
101 OUT_RING (0);
102 OUT_RING (0x20040000);
103 OUT_RING (0);
104 OUT_RING (0);
105 OUT_RING (0);
106 OUT_RING (0x00000c00);
107 OUT_RING (0);
108 OUT_RING (0x00000c00);
109 OUT_RING (0x18000000);
110 OUT_RING (0x300e0300);
111 OUT_RING (0x0c091c80);
112
113 BEGIN_RING(kelvin, NV10TCL_BLEND_FUNC_ENABLE, 1);
114 OUT_RING (0);
115 BEGIN_RING(kelvin, NV10TCL_DITHER_ENABLE, 2);
116 OUT_RING (1);
117 OUT_RING (0);
118 BEGIN_RING(kelvin, NV10TCL_LINE_SMOOTH_ENABLE, 1);
119 OUT_RING (0);
120 BEGIN_RING(kelvin, NV10TCL_VERTEX_WEIGHT_ENABLE, 2);
121 OUT_RING (0);
122 OUT_RING (0);
123 BEGIN_RING(kelvin, NV10TCL_BLEND_FUNC_SRC, 4);
124 OUT_RING (1);
125 OUT_RING (0);
126 OUT_RING (0);
127 OUT_RING (0x8006);
128 BEGIN_RING(kelvin, NV10TCL_STENCIL_MASK, 8);
129 OUT_RING (0xff);
130 OUT_RING (0x207);
131 OUT_RING (0);
132 OUT_RING (0xff);
133 OUT_RING (0x1e00);
134 OUT_RING (0x1e00);
135 OUT_RING (0x1e00);
136 OUT_RING (0x1d01);
137 BEGIN_RING(kelvin, NV10TCL_NORMALIZE_ENABLE, 1);
138 OUT_RING (0);
139 BEGIN_RING(kelvin, NV10TCL_FOG_ENABLE, 2);
140 OUT_RING (0);
141 OUT_RING (0);
142 BEGIN_RING(kelvin, NV10TCL_LIGHT_MODEL, 1);
143 OUT_RING (0);
144 BEGIN_RING(kelvin, NV10TCL_COLOR_CONTROL, 1);
145 OUT_RING (0);
146 BEGIN_RING(kelvin, NV10TCL_ENABLED_LIGHTS, 1);
147 OUT_RING (0);
148 BEGIN_RING(kelvin, NV10TCL_POLYGON_OFFSET_POINT_ENABLE, 3);
149 OUT_RING (0);
150 OUT_RING (0);
151 OUT_RING (0);
152 BEGIN_RING(kelvin, NV10TCL_DEPTH_FUNC, 1);
153 OUT_RING (0x201);
154 BEGIN_RING(kelvin, NV10TCL_DEPTH_WRITE_ENABLE, 1);
155 OUT_RING (0);
156 BEGIN_RING(kelvin, NV10TCL_DEPTH_TEST_ENABLE, 1);
157 OUT_RING (0);
158 BEGIN_RING(kelvin, NV10TCL_POLYGON_OFFSET_FACTOR, 2);
159 OUT_RING (0);
160 OUT_RING (0);
161 BEGIN_RING(kelvin, NV10TCL_POINT_SIZE, 1);
162 OUT_RING (8);
163 BEGIN_RING(kelvin, NV10TCL_POINT_PARAMETERS_ENABLE, 2);
164 OUT_RING (0);
165 OUT_RING (0);
166 BEGIN_RING(kelvin, NV10TCL_LINE_WIDTH, 1);
167 OUT_RING (8);
168 BEGIN_RING(kelvin, NV10TCL_LINE_SMOOTH_ENABLE, 1);
169 OUT_RING (0);
170 BEGIN_RING(kelvin, NV10TCL_POLYGON_MODE_FRONT, 2);
171 OUT_RING (0x1b02);
172 OUT_RING (0x1b02);
173 BEGIN_RING(kelvin, NV10TCL_CULL_FACE, 2);
174 OUT_RING (0x405);
175 OUT_RING (0x901);
176 BEGIN_RING(kelvin, NV10TCL_POLYGON_SMOOTH_ENABLE, 1);
177 OUT_RING (0);
178 BEGIN_RING(kelvin, NV10TCL_CULL_FACE_ENABLE, 1);
179 OUT_RING (0);
180 BEGIN_RING(kelvin, NV10TCL_CLIP_PLANE_ENABLE(0), 8);
181 for (i=0;i<8;i++) {
182 OUT_RING (0);
183 }
184 BEGIN_RING(kelvin, NV10TCL_FOG_EQUATION_CONSTANT, 3);
185 OUT_RING (0x3fc00000); /* -1.50 */
186 OUT_RING (0xbdb8aa0a); /* -0.09 */
187 OUT_RING (0); /* 0.00 */
188
189 BEGIN_RING(kelvin, NV10TCL_NOP, 1);
190 OUT_RING (0);
191
192 BEGIN_RING(kelvin, NV10TCL_FOG_MODE, 2);
193 OUT_RING (0x802);
194 OUT_RING (2);
195 /* for some reason VIEW_MATRIX_ENABLE need to be 6 instead of 4 when
196 * using texturing, except when using the texture matrix
197 */
198 BEGIN_RING(kelvin, NV10TCL_VIEW_MATRIX_ENABLE, 1);
199 OUT_RING (6);
200 BEGIN_RING(kelvin, NV10TCL_COLOR_MASK, 1);
201 OUT_RING (0x01010101);
202
203 /* Set vertex component */
204 BEGIN_RING(kelvin, NV10TCL_VERTEX_COL_4F_R, 4);
205 OUT_RINGf (1.0);
206 OUT_RINGf (1.0);
207 OUT_RINGf (1.0);
208 OUT_RINGf (1.0);
209 BEGIN_RING(kelvin, NV10TCL_VERTEX_COL2_3F_R, 3);
210 OUT_RING (0);
211 OUT_RING (0);
212 OUT_RING (0);
213 BEGIN_RING(kelvin, NV10TCL_VERTEX_NOR_3F_X, 3);
214 OUT_RING (0);
215 OUT_RING (0);
216 OUT_RINGf (1.0);
217 BEGIN_RING(kelvin, NV10TCL_VERTEX_TX0_4F_S, 4);
218 OUT_RINGf (0.0);
219 OUT_RINGf (0.0);
220 OUT_RINGf (0.0);
221 OUT_RINGf (1.0);
222 BEGIN_RING(kelvin, NV10TCL_VERTEX_TX1_4F_S, 4);
223 OUT_RINGf (0.0);
224 OUT_RINGf (0.0);
225 OUT_RINGf (0.0);
226 OUT_RINGf (1.0);
227 BEGIN_RING(kelvin, NV10TCL_VERTEX_FOG_1F, 1);
228 OUT_RINGf (0.0);
229 BEGIN_RING(kelvin, NV10TCL_EDGEFLAG_ENABLE, 1);
230 OUT_RING (1);
231
232 memset(projectionmatrix, 0, sizeof(projectionmatrix));
233 BEGIN_RING(kelvin, NV10TCL_PROJECTION_MATRIX(0), 16);
234 projectionmatrix[0*4+0] = 1.0;
235 projectionmatrix[1*4+1] = 1.0;
236 projectionmatrix[2*4+2] = 1.0;
237 projectionmatrix[3*4+3] = 1.0;
238 for (i=0;i<16;i++) {
239 OUT_RINGf (projectionmatrix[i]);
240 }
241
242 BEGIN_RING(kelvin, NV10TCL_DEPTH_RANGE_NEAR, 2);
243 OUT_RING (0.0);
244 OUT_RINGf (16777216.0);
245
246 BEGIN_RING(kelvin, NV10TCL_VIEWPORT_SCALE_X, 4);
247 OUT_RINGf (-2048.0);
248 OUT_RINGf (-2048.0);
249 OUT_RINGf (16777215.0 * 0.5);
250 OUT_RING (0);
251
252 FIRE_RING (NULL);
253 }
254
255 static void
256 nv20_set_edgeflags(struct pipe_context *pipe, const unsigned *bitfield)
257 {
258 }
259
260 struct pipe_context *
261 nv20_create(struct pipe_screen *pscreen, unsigned pctx_id)
262 {
263 struct nv20_screen *screen = nv20_screen(pscreen);
264 struct pipe_winsys *ws = pscreen->winsys;
265 struct nv20_context *nv20;
266 struct nouveau_winsys *nvws = screen->nvws;
267
268 nv20 = CALLOC(1, sizeof(struct nv20_context));
269 if (!nv20)
270 return NULL;
271 nv20->screen = screen;
272 nv20->pctx_id = pctx_id;
273
274 nv20->nvws = nvws;
275
276 nv20->pipe.winsys = ws;
277 nv20->pipe.screen = pscreen;
278 nv20->pipe.destroy = nv20_destroy;
279 nv20->pipe.set_edgeflags = nv20_set_edgeflags;
280 nv20->pipe.draw_arrays = nv20_draw_arrays;
281 nv20->pipe.draw_elements = nv20_draw_elements;
282 nv20->pipe.clear = nv20_clear;
283 nv20->pipe.flush = nv20_flush;
284
285 nv20_init_surface_functions(nv20);
286 nv20_init_state_functions(nv20);
287
288 nv20->draw = draw_create();
289 assert(nv20->draw);
290 draw_set_rasterize_stage(nv20->draw, nv20_draw_vbuf_stage(nv20));
291
292 nv20_init_hwctx(nv20);
293
294 return &nv20->pipe;
295 }
296