1 #include "draw/draw_context.h"
2 #include "pipe/p_defines.h"
3 #include "pipe/p_winsys.h"
5 #include "nv20_context.h"
6 #include "nv20_screen.h"
9 nv20_flush(struct pipe_context
*pipe
, unsigned flags
,
10 struct pipe_fence_handle
**fence
)
12 struct nv20_context
*nv20
= nv20_context(pipe
);
14 draw_flush(nv20
->draw
);
20 nv20_destroy(struct pipe_context
*pipe
)
22 struct nv20_context
*nv20
= nv20_context(pipe
);
25 draw_destroy(nv20
->draw
);
30 static void nv20_init_hwctx(struct nv20_context
*nv20
)
32 struct nv20_screen
*screen
= nv20
->screen
;
33 struct nouveau_winsys
*nvws
= screen
->nvws
;
35 float projectionmatrix
[16];
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
);
46 BEGIN_RING(kelvin
, NV10TCL_NOP
, 1);
49 BEGIN_RING(kelvin
, NV10TCL_RT_HORIZ
, 2);
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);
59 BEGIN_RING(kelvin
, NV10TCL_VIEWPORT_CLIP_HORIZ(i
), 1);
61 BEGIN_RING(kelvin
, NV10TCL_VIEWPORT_CLIP_VERT(i
), 1);
65 BEGIN_RING(kelvin
, 0x290, 1);
66 OUT_RING ((0x10<<16)|1);
67 BEGIN_RING(kelvin
, 0x3f4, 1);
70 BEGIN_RING(kelvin
, NV10TCL_NOP
, 1);
73 if (nv20
->screen
->kelvin
->grclass
!= NV10TCL
) {
75 BEGIN_RING(kelvin
, 0x120, 3);
80 BEGIN_RING(kelvin
, NV10TCL_NOP
, 1);
84 BEGIN_RING(kelvin
, NV10TCL_NOP
, 1);
88 BEGIN_RING(kelvin
, NV10TCL_FOG_ENABLE
, 1);
90 BEGIN_RING(kelvin
, NV10TCL_ALPHA_FUNC_ENABLE
, 1);
92 BEGIN_RING(kelvin
, NV10TCL_ALPHA_FUNC_FUNC
, 2);
95 BEGIN_RING(kelvin
, NV10TCL_TX_ENABLE(0), 2);
99 BEGIN_RING(kelvin
, NV10TCL_RC_IN_ALPHA(0), 12);
100 OUT_RING (0x30141010);
102 OUT_RING (0x20040000);
106 OUT_RING (0x00000c00);
108 OUT_RING (0x00000c00);
109 OUT_RING (0x18000000);
110 OUT_RING (0x300e0300);
111 OUT_RING (0x0c091c80);
113 BEGIN_RING(kelvin
, NV10TCL_BLEND_FUNC_ENABLE
, 1);
115 BEGIN_RING(kelvin
, NV10TCL_DITHER_ENABLE
, 2);
118 BEGIN_RING(kelvin
, NV10TCL_LINE_SMOOTH_ENABLE
, 1);
120 BEGIN_RING(kelvin
, NV10TCL_VERTEX_WEIGHT_ENABLE
, 2);
123 BEGIN_RING(kelvin
, NV10TCL_BLEND_FUNC_SRC
, 4);
128 BEGIN_RING(kelvin
, NV10TCL_STENCIL_MASK
, 8);
137 BEGIN_RING(kelvin
, NV10TCL_NORMALIZE_ENABLE
, 1);
139 BEGIN_RING(kelvin
, NV10TCL_FOG_ENABLE
, 2);
142 BEGIN_RING(kelvin
, NV10TCL_LIGHT_MODEL
, 1);
144 BEGIN_RING(kelvin
, NV10TCL_COLOR_CONTROL
, 1);
146 BEGIN_RING(kelvin
, NV10TCL_ENABLED_LIGHTS
, 1);
148 BEGIN_RING(kelvin
, NV10TCL_POLYGON_OFFSET_POINT_ENABLE
, 3);
152 BEGIN_RING(kelvin
, NV10TCL_DEPTH_FUNC
, 1);
154 BEGIN_RING(kelvin
, NV10TCL_DEPTH_WRITE_ENABLE
, 1);
156 BEGIN_RING(kelvin
, NV10TCL_DEPTH_TEST_ENABLE
, 1);
158 BEGIN_RING(kelvin
, NV10TCL_POLYGON_OFFSET_FACTOR
, 2);
161 BEGIN_RING(kelvin
, NV10TCL_POINT_SIZE
, 1);
163 BEGIN_RING(kelvin
, NV10TCL_POINT_PARAMETERS_ENABLE
, 2);
166 BEGIN_RING(kelvin
, NV10TCL_LINE_WIDTH
, 1);
168 BEGIN_RING(kelvin
, NV10TCL_LINE_SMOOTH_ENABLE
, 1);
170 BEGIN_RING(kelvin
, NV10TCL_POLYGON_MODE_FRONT
, 2);
173 BEGIN_RING(kelvin
, NV10TCL_CULL_FACE
, 2);
176 BEGIN_RING(kelvin
, NV10TCL_POLYGON_SMOOTH_ENABLE
, 1);
178 BEGIN_RING(kelvin
, NV10TCL_CULL_FACE_ENABLE
, 1);
180 BEGIN_RING(kelvin
, NV10TCL_TX_GEN_S(0), 8);
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 */
189 BEGIN_RING(kelvin
, NV10TCL_NOP
, 1);
192 BEGIN_RING(kelvin
, NV10TCL_FOG_MODE
, 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
198 BEGIN_RING(kelvin
, NV10TCL_VIEW_MATRIX_ENABLE
, 1);
200 BEGIN_RING(kelvin
, NV10TCL_COLOR_MASK
, 1);
201 OUT_RING (0x01010101);
203 /* Set vertex component */
204 BEGIN_RING(kelvin
, NV10TCL_VERTEX_COL_4F_R
, 4);
209 BEGIN_RING(kelvin
, NV10TCL_VERTEX_COL2_3F_R
, 3);
213 BEGIN_RING(kelvin
, NV10TCL_VERTEX_NOR_3F_X
, 3);
217 BEGIN_RING(kelvin
, NV10TCL_VERTEX_TX0_4F_S
, 4);
222 BEGIN_RING(kelvin
, NV10TCL_VERTEX_TX1_4F_S
, 4);
227 BEGIN_RING(kelvin
, NV10TCL_VERTEX_FOG_1F
, 1);
229 BEGIN_RING(kelvin
, NV10TCL_EDGEFLAG_ENABLE
, 1);
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;
239 OUT_RINGf (projectionmatrix
[i
]);
242 BEGIN_RING(kelvin
, NV10TCL_DEPTH_RANGE_NEAR
, 2);
244 OUT_RINGf (16777216.0);
246 BEGIN_RING(kelvin
, NV10TCL_VIEWPORT_SCALE_X
, 4);
249 OUT_RINGf (16777215.0 * 0.5);
256 nv20_set_edgeflags(struct pipe_context
*pipe
, const unsigned *bitfield
)
260 struct pipe_context
*
261 nv20_create(struct pipe_screen
*pscreen
, unsigned pctx_id
)
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
;
268 nv20
= CALLOC(1, sizeof(struct nv20_context
));
271 nv20
->screen
= screen
;
272 nv20
->pctx_id
= pctx_id
;
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
;
285 nv20_init_surface_functions(nv20
);
286 nv20_init_state_functions(nv20
);
288 nv20
->draw
= draw_create();
290 draw_set_rasterize_stage(nv20
->draw
, nv20_draw_vbuf_stage(nv20
));
292 nv20_init_hwctx(nv20
);