1 #include "draw/draw_context.h"
2 #include "pipe/p_defines.h"
3 #include "pipe/p_winsys.h"
4 #include "pipe/p_util.h"
6 #include "nv10_context.h"
7 #include "nv10_screen.h"
10 nv10_flush(struct pipe_context
*pipe
, unsigned flags
)
12 struct nv10_context
*nv10
= nv10_context(pipe
);
13 struct nouveau_winsys
*nvws
= nv10
->nvws
;
15 if (flags
& PIPE_FLUSH_TEXTURE_CACHE
) {
16 BEGIN_RING(celsius
, 0x1fd8, 1);
18 BEGIN_RING(celsius
, 0x1fd8, 1);
22 if (flags
& PIPE_FLUSH_WAIT
) {
23 nvws
->notifier_reset(nv10
->sync
, 0);
24 BEGIN_RING(celsius
, 0x104, 1);
26 BEGIN_RING(celsius
, 0x100, 1);
32 if (flags
& PIPE_FLUSH_WAIT
)
33 nvws
->notifier_wait(nv10
->sync
, 0, 0, 2000);
37 nv10_destroy(struct pipe_context
*pipe
)
39 struct nv10_context
*nv10
= nv10_context(pipe
);
40 struct nouveau_winsys
*nvws
= nv10
->nvws
;
43 draw_destroy(nv10
->draw
);
45 nvws
->res_free(&nv10
->vertprog
.exec_heap
);
46 nvws
->res_free(&nv10
->vertprog
.data_heap
);
48 nvws
->notifier_free(&nv10
->sync
);
50 nvws
->grobj_free(&nv10
->celsius
);
56 nv10_init_hwctx(struct nv10_context
*nv10
, int celsius_class
)
58 struct nouveau_winsys
*nvws
= nv10
->nvws
;
62 ret
= nvws
->grobj_alloc(nvws
, celsius_class
, &nv10
->celsius
);
64 NOUVEAU_ERR("Error creating 3D object: %d\n", ret
);
68 BEGIN_RING(celsius
, NV10TCL_DMA_NOTIFY
, 1);
69 OUT_RING (nv10
->sync
->handle
);
70 BEGIN_RING(celsius
, NV10TCL_DMA_IN_MEMORY0
, 2);
71 OUT_RING (nvws
->channel
->vram
->handle
);
72 OUT_RING (nvws
->channel
->gart
->handle
);
73 BEGIN_RING(celsius
, NV10TCL_DMA_IN_MEMORY2
, 2);
74 OUT_RING (nvws
->channel
->vram
->handle
);
75 OUT_RING (nvws
->channel
->vram
->handle
);
77 BEGIN_RING(celsius
, NV10TCL_NOP
, 1);
80 BEGIN_RING(celsius
, NV10TCL_RT_HORIZ
, 2);
84 BEGIN_RING(celsius
, NV10TCL_VIEWPORT_CLIP_HORIZ(0), 1);
85 OUT_RING ((0x7ff<<16)|0x800);
86 BEGIN_RING(celsius
, NV10TCL_VIEWPORT_CLIP_VERT(0), 1);
87 OUT_RING ((0x7ff<<16)|0x800);
90 BEGIN_RING(celsius
, NV10TCL_VIEWPORT_CLIP_HORIZ(i
), 1);
92 BEGIN_RING(celsius
, NV10TCL_VIEWPORT_CLIP_VERT(i
), 1);
96 BEGIN_RING(celsius
, 0x290, 1);
97 OUT_RING ((0x10<<16)|1);
98 BEGIN_RING(celsius
, 0x3f4, 1);
101 BEGIN_RING(celsius
, NV10TCL_NOP
, 1);
104 if (celsius_class
!= NV10TCL
) {
106 BEGIN_RING(celsius
, 0x120, 3);
111 BEGIN_RING(celsius
, NV10TCL_NOP
, 1);
115 BEGIN_RING(celsius
, NV10TCL_NOP
, 1);
119 BEGIN_RING(celsius
, NV10TCL_FOG_ENABLE
, 1);
121 BEGIN_RING(celsius
, NV10TCL_ALPHA_FUNC_ENABLE
, 1);
123 BEGIN_RING(celsius
, NV10TCL_ALPHA_FUNC_FUNC
, 2);
126 BEGIN_RING(celsius
, NV10TCL_TX_ENABLE(0), 2);
129 BEGIN_RING(celsius
, NV10TCL_RC_OUT_ALPHA(0), 6);
130 OUT_RING (0x00000c00);
132 OUT_RING (0x00000c00);
133 OUT_RING (0x18000000);
134 OUT_RING (0x300c0000);
135 OUT_RING (0x00001c80);
136 BEGIN_RING(celsius
, NV10TCL_BLEND_FUNC_ENABLE
, 1);
138 BEGIN_RING(celsius
, NV10TCL_DITHER_ENABLE
, 2);
141 BEGIN_RING(celsius
, NV10TCL_LINE_SMOOTH_ENABLE
, 1);
143 BEGIN_RING(celsius
, NV10TCL_VERTEX_WEIGHT_ENABLE
, 2);
146 BEGIN_RING(celsius
, NV10TCL_BLEND_FUNC_SRC
, 4);
151 BEGIN_RING(celsius
, NV10TCL_STENCIL_MASK
, 8);
160 BEGIN_RING(celsius
, NV10TCL_NORMALIZE_ENABLE
, 1);
162 BEGIN_RING(celsius
, NV10TCL_FOG_ENABLE
, 2);
165 BEGIN_RING(celsius
, NV10TCL_LIGHT_MODEL
, 1);
167 BEGIN_RING(celsius
, NV10TCL_COLOR_CONTROL
, 1);
169 BEGIN_RING(celsius
, NV10TCL_ENABLED_LIGHTS
, 1);
171 BEGIN_RING(celsius
, NV10TCL_POLYGON_OFFSET_POINT_ENABLE
, 3);
175 BEGIN_RING(celsius
, NV10TCL_DEPTH_FUNC
, 1);
177 BEGIN_RING(celsius
, NV10TCL_DEPTH_WRITE_ENABLE
, 1);
179 BEGIN_RING(celsius
, NV10TCL_DEPTH_TEST_ENABLE
, 1);
181 BEGIN_RING(celsius
, NV10TCL_POLYGON_OFFSET_FACTOR
, 2);
184 BEGIN_RING(celsius
, NV10TCL_POINT_SIZE
, 1);
186 BEGIN_RING(celsius
, NV10TCL_POINT_PARAMETERS_ENABLE
, 2);
189 BEGIN_RING(celsius
, NV10TCL_LINE_WIDTH
, 1);
191 BEGIN_RING(celsius
, NV10TCL_LINE_SMOOTH_ENABLE
, 1);
193 BEGIN_RING(celsius
, NV10TCL_POLYGON_MODE_FRONT
, 2);
196 BEGIN_RING(celsius
, NV10TCL_CULL_FACE
, 2);
199 BEGIN_RING(celsius
, NV10TCL_POLYGON_SMOOTH_ENABLE
, 1);
201 BEGIN_RING(celsius
, NV10TCL_CULL_FACE_ENABLE
, 1);
203 BEGIN_RING(celsius
, NV10TCL_CLIP_PLANE_ENABLE(0), 8);
207 BEGIN_RING(celsius
, NV10TCL_FOG_EQUATION_CONSTANT
, 3);
208 OUT_RING (0x3fc00000); /* -1.50 */
209 OUT_RING (0xbdb8aa0a); /* -0.09 */
210 OUT_RING (0); /* 0.00 */
212 BEGIN_RING(celsius
, NV10TCL_NOP
, 1);
215 BEGIN_RING(celsius
, NV10TCL_FOG_MODE
, 2);
218 /* for some reason VIEW_MATRIX_ENABLE need to be 6 instead of 4 when
219 * using texturing, except when using the texture matrix
221 BEGIN_RING(celsius
, NV10TCL_VIEW_MATRIX_ENABLE
, 1);
223 BEGIN_RING(celsius
, NV10TCL_COLOR_MASK
, 1);
224 OUT_RING (0x01010101);
226 /* Set vertex component */
227 BEGIN_RING(celsius
, NV10TCL_VERTEX_COL_4F_R
, 4);
232 BEGIN_RING(celsius
, NV10TCL_VERTEX_COL2_3F_R
, 3);
236 BEGIN_RING(celsius
, NV10TCL_VERTEX_NOR_3F_X
, 3);
240 BEGIN_RING(celsius
, NV10TCL_VERTEX_TX0_4F_S
, 4);
245 BEGIN_RING(celsius
, NV10TCL_VERTEX_TX1_4F_S
, 4);
250 BEGIN_RING(celsius
, NV10TCL_VERTEX_FOG_1F
, 1);
252 BEGIN_RING(celsius
, NV10TCL_EDGEFLAG_ENABLE
, 1);
260 struct pipe_context
*
261 nv10_create(struct pipe_screen
*screen
, unsigned pctx_id
)
263 struct pipe_winsys
*pipe_winsys
= screen
->winsys
;
264 struct nouveau_winsys
*nvws
= nv10_screen(screen
)->nvws
;
265 unsigned chipset
= nv10_screen(screen
)->chipset
;
266 struct nv10_context
*nv10
;
267 int celsius_class
= 0, ret
;
270 celsius_class
=NV11TCL
;
271 else if (chipset
>=0x17)
272 celsius_class
=NV17TCL
;
273 else if (chipset
>=0x11)
274 celsius_class
=NV11TCL
;
276 celsius_class
=NV10TCL
;
278 nv10
= CALLOC_STRUCT(nv10_context
);
281 nv10
->chipset
= chipset
;
284 /* Notifier for sync purposes */
285 ret
= nvws
->notifier_alloc(nvws
, 1, &nv10
->sync
);
287 NOUVEAU_ERR("Error creating notifier object: %d\n", ret
);
288 nv10_destroy(&nv10
->pipe
);
292 /* Vtxprog resources */
293 if (nvws
->res_init(&nv10
->vertprog
.exec_heap
, 0, 512) ||
294 nvws
->res_init(&nv10
->vertprog
.data_heap
, 0, 256)) {
295 nv10_destroy(&nv10
->pipe
);
299 /* Static celsius initialisation */
300 if (!nv10_init_hwctx(nv10
, celsius_class
)) {
301 nv10_destroy(&nv10
->pipe
);
305 /* Pipe context setup */
306 nv10
->pipe
.winsys
= pipe_winsys
;
308 nv10
->pipe
.destroy
= nv10_destroy
;
310 nv10
->pipe
.draw_arrays
= nv10_draw_arrays
;
311 nv10
->pipe
.draw_elements
= nv10_draw_elements
;
312 nv10
->pipe
.clear
= nv10_clear
;
314 nv10
->pipe
.flush
= nv10_flush
;
316 nv10_init_surface_functions(nv10
);
317 nv10_init_state_functions(nv10
);
319 nv10
->draw
= draw_create();
321 draw_set_rasterize_stage(nv10
->draw
, nv10_draw_vbuf_stage(nv10
));