1 #include "draw/draw_context.h"
2 #include "pipe/p_defines.h"
3 #include "pipe/internal/p_winsys_screen.h"
5 #include "nv10_context.h"
6 #include "nv10_screen.h"
9 nv10_flush(struct pipe_context
*pipe
, unsigned flags
,
10 struct pipe_fence_handle
**fence
)
12 struct nv10_context
*nv10
= nv10_context(pipe
);
13 struct nv10_screen
*screen
= nv10
->screen
;
14 struct nouveau_channel
*chan
= screen
->base
.channel
;
16 draw_flush(nv10
->draw
);
24 nv10_destroy(struct pipe_context
*pipe
)
26 struct nv10_context
*nv10
= nv10_context(pipe
);
29 draw_destroy(nv10
->draw
);
34 static void nv10_init_hwctx(struct nv10_context
*nv10
)
36 struct nv10_screen
*screen
= nv10
->screen
;
37 struct nouveau_channel
*chan
= screen
->base
.channel
;
38 struct nouveau_grobj
*celsius
= screen
->celsius
;
40 float projectionmatrix
[16];
42 BEGIN_RING(chan
, celsius
, NV10TCL_DMA_NOTIFY
, 1);
43 OUT_RING (chan
, screen
->sync
->handle
);
44 BEGIN_RING(chan
, celsius
, NV10TCL_DMA_IN_MEMORY0
, 2);
45 OUT_RING (chan
, chan
->vram
->handle
);
46 OUT_RING (chan
, chan
->gart
->handle
);
47 BEGIN_RING(chan
, celsius
, NV10TCL_DMA_IN_MEMORY2
, 2);
48 OUT_RING (chan
, chan
->vram
->handle
);
49 OUT_RING (chan
, chan
->vram
->handle
);
51 BEGIN_RING(chan
, celsius
, NV10TCL_NOP
, 1);
54 BEGIN_RING(chan
, celsius
, NV10TCL_RT_HORIZ
, 2);
58 BEGIN_RING(chan
, celsius
, NV10TCL_VIEWPORT_CLIP_HORIZ(0), 1);
59 OUT_RING (chan
, (0x7ff<<16)|0x800);
60 BEGIN_RING(chan
, celsius
, NV10TCL_VIEWPORT_CLIP_VERT(0), 1);
61 OUT_RING (chan
, (0x7ff<<16)|0x800);
64 BEGIN_RING(chan
, celsius
, NV10TCL_VIEWPORT_CLIP_HORIZ(i
), 1);
66 BEGIN_RING(chan
, celsius
, NV10TCL_VIEWPORT_CLIP_VERT(i
), 1);
70 BEGIN_RING(chan
, celsius
, 0x290, 1);
71 OUT_RING (chan
, (0x10<<16)|1);
72 BEGIN_RING(chan
, celsius
, 0x3f4, 1);
75 BEGIN_RING(chan
, celsius
, NV10TCL_NOP
, 1);
78 if (nv10
->screen
->celsius
->grclass
!= NV10TCL
) {
80 BEGIN_RING(chan
, celsius
, 0x120, 3);
85 BEGIN_RING(chan
, celsius
, NV10TCL_NOP
, 1);
89 BEGIN_RING(chan
, celsius
, NV10TCL_NOP
, 1);
93 BEGIN_RING(chan
, celsius
, NV10TCL_FOG_ENABLE
, 1);
95 BEGIN_RING(chan
, celsius
, NV10TCL_ALPHA_FUNC_ENABLE
, 1);
97 BEGIN_RING(chan
, celsius
, NV10TCL_ALPHA_FUNC_FUNC
, 2);
98 OUT_RING (chan
, 0x207);
100 BEGIN_RING(chan
, celsius
, NV10TCL_TX_ENABLE(0), 2);
104 BEGIN_RING(chan
, celsius
, NV10TCL_RC_IN_ALPHA(0), 12);
105 OUT_RING (chan
, 0x30141010);
107 OUT_RING (chan
, 0x20040000);
111 OUT_RING (chan
, 0x00000c00);
113 OUT_RING (chan
, 0x00000c00);
114 OUT_RING (chan
, 0x18000000);
115 OUT_RING (chan
, 0x300e0300);
116 OUT_RING (chan
, 0x0c091c80);
118 BEGIN_RING(chan
, celsius
, NV10TCL_BLEND_FUNC_ENABLE
, 1);
120 BEGIN_RING(chan
, celsius
, NV10TCL_DITHER_ENABLE
, 2);
123 BEGIN_RING(chan
, celsius
, NV10TCL_LINE_SMOOTH_ENABLE
, 1);
125 BEGIN_RING(chan
, celsius
, NV10TCL_VERTEX_WEIGHT_ENABLE
, 2);
128 BEGIN_RING(chan
, celsius
, NV10TCL_BLEND_FUNC_SRC
, 4);
132 OUT_RING (chan
, 0x8006);
133 BEGIN_RING(chan
, celsius
, NV10TCL_STENCIL_MASK
, 8);
134 OUT_RING (chan
, 0xff);
135 OUT_RING (chan
, 0x207);
137 OUT_RING (chan
, 0xff);
138 OUT_RING (chan
, 0x1e00);
139 OUT_RING (chan
, 0x1e00);
140 OUT_RING (chan
, 0x1e00);
141 OUT_RING (chan
, 0x1d01);
142 BEGIN_RING(chan
, celsius
, NV10TCL_NORMALIZE_ENABLE
, 1);
144 BEGIN_RING(chan
, celsius
, NV10TCL_FOG_ENABLE
, 2);
147 BEGIN_RING(chan
, celsius
, NV10TCL_LIGHT_MODEL
, 1);
149 BEGIN_RING(chan
, celsius
, NV10TCL_COLOR_CONTROL
, 1);
151 BEGIN_RING(chan
, celsius
, NV10TCL_ENABLED_LIGHTS
, 1);
153 BEGIN_RING(chan
, celsius
, NV10TCL_POLYGON_OFFSET_POINT_ENABLE
, 3);
157 BEGIN_RING(chan
, celsius
, NV10TCL_DEPTH_FUNC
, 1);
158 OUT_RING (chan
, 0x201);
159 BEGIN_RING(chan
, celsius
, NV10TCL_DEPTH_WRITE_ENABLE
, 1);
161 BEGIN_RING(chan
, celsius
, NV10TCL_DEPTH_TEST_ENABLE
, 1);
163 BEGIN_RING(chan
, celsius
, NV10TCL_POLYGON_OFFSET_FACTOR
, 2);
166 BEGIN_RING(chan
, celsius
, NV10TCL_POINT_SIZE
, 1);
168 BEGIN_RING(chan
, celsius
, NV10TCL_POINT_PARAMETERS_ENABLE
, 2);
171 BEGIN_RING(chan
, celsius
, NV10TCL_LINE_WIDTH
, 1);
173 BEGIN_RING(chan
, celsius
, NV10TCL_LINE_SMOOTH_ENABLE
, 1);
175 BEGIN_RING(chan
, celsius
, NV10TCL_POLYGON_MODE_FRONT
, 2);
176 OUT_RING (chan
, 0x1b02);
177 OUT_RING (chan
, 0x1b02);
178 BEGIN_RING(chan
, celsius
, NV10TCL_CULL_FACE
, 2);
179 OUT_RING (chan
, 0x405);
180 OUT_RING (chan
, 0x901);
181 BEGIN_RING(chan
, celsius
, NV10TCL_POLYGON_SMOOTH_ENABLE
, 1);
183 BEGIN_RING(chan
, celsius
, NV10TCL_CULL_FACE_ENABLE
, 1);
185 BEGIN_RING(chan
, celsius
, NV10TCL_TX_GEN_S(0), 8);
189 BEGIN_RING(chan
, celsius
, NV10TCL_FOG_EQUATION_CONSTANT
, 3);
190 OUT_RING (chan
, 0x3fc00000); /* -1.50 */
191 OUT_RING (chan
, 0xbdb8aa0a); /* -0.09 */
192 OUT_RING (chan
, 0); /* 0.00 */
194 BEGIN_RING(chan
, celsius
, NV10TCL_NOP
, 1);
197 BEGIN_RING(chan
, celsius
, NV10TCL_FOG_MODE
, 2);
198 OUT_RING (chan
, 0x802);
200 /* for some reason VIEW_MATRIX_ENABLE need to be 6 instead of 4 when
201 * using texturing, except when using the texture matrix
203 BEGIN_RING(chan
, celsius
, NV10TCL_VIEW_MATRIX_ENABLE
, 1);
205 BEGIN_RING(chan
, celsius
, NV10TCL_COLOR_MASK
, 1);
206 OUT_RING (chan
, 0x01010101);
208 /* Set vertex component */
209 BEGIN_RING(chan
, celsius
, NV10TCL_VERTEX_COL_4F_R
, 4);
210 OUT_RINGf (chan
, 1.0);
211 OUT_RINGf (chan
, 1.0);
212 OUT_RINGf (chan
, 1.0);
213 OUT_RINGf (chan
, 1.0);
214 BEGIN_RING(chan
, celsius
, NV10TCL_VERTEX_COL2_3F_R
, 3);
218 BEGIN_RING(chan
, celsius
, NV10TCL_VERTEX_NOR_3F_X
, 3);
221 OUT_RINGf (chan
, 1.0);
222 BEGIN_RING(chan
, celsius
, NV10TCL_VERTEX_TX0_4F_S
, 4);
223 OUT_RINGf (chan
, 0.0);
224 OUT_RINGf (chan
, 0.0);
225 OUT_RINGf (chan
, 0.0);
226 OUT_RINGf (chan
, 1.0);
227 BEGIN_RING(chan
, celsius
, NV10TCL_VERTEX_TX1_4F_S
, 4);
228 OUT_RINGf (chan
, 0.0);
229 OUT_RINGf (chan
, 0.0);
230 OUT_RINGf (chan
, 0.0);
231 OUT_RINGf (chan
, 1.0);
232 BEGIN_RING(chan
, celsius
, NV10TCL_VERTEX_FOG_1F
, 1);
233 OUT_RINGf (chan
, 0.0);
234 BEGIN_RING(chan
, celsius
, NV10TCL_EDGEFLAG_ENABLE
, 1);
237 memset(projectionmatrix
, 0, sizeof(projectionmatrix
));
238 BEGIN_RING(chan
, celsius
, NV10TCL_PROJECTION_MATRIX(0), 16);
239 projectionmatrix
[0*4+0] = 1.0;
240 projectionmatrix
[1*4+1] = 1.0;
241 projectionmatrix
[2*4+2] = 1.0;
242 projectionmatrix
[3*4+3] = 1.0;
244 OUT_RINGf (chan
, projectionmatrix
[i
]);
247 BEGIN_RING(chan
, celsius
, NV10TCL_DEPTH_RANGE_NEAR
, 2);
248 OUT_RING (chan
, 0.0);
249 OUT_RINGf (chan
, 16777216.0);
251 BEGIN_RING(chan
, celsius
, NV10TCL_VIEWPORT_TRANSLATE_X
, 4);
252 OUT_RINGf (chan
, -2048.0);
253 OUT_RINGf (chan
, -2048.0);
254 OUT_RINGf (chan
, 16777215.0 * 0.5);
260 struct pipe_context
*
261 nv10_create(struct pipe_screen
*pscreen
, unsigned pctx_id
)
263 struct nv10_screen
*screen
= nv10_screen(pscreen
);
264 struct pipe_winsys
*ws
= pscreen
->winsys
;
265 struct nv10_context
*nv10
;
266 struct nouveau_winsys
*nvws
= screen
->nvws
;
268 nv10
= CALLOC(1, sizeof(struct nv10_context
));
271 nv10
->screen
= screen
;
272 nv10
->pctx_id
= pctx_id
;
276 nv10
->pipe
.winsys
= ws
;
277 nv10
->pipe
.screen
= pscreen
;
278 nv10
->pipe
.destroy
= nv10_destroy
;
279 nv10
->pipe
.draw_arrays
= nv10_draw_arrays
;
280 nv10
->pipe
.draw_elements
= nv10_draw_elements
;
281 nv10
->pipe
.clear
= nv10_clear
;
282 nv10
->pipe
.flush
= nv10_flush
;
284 nv10
->pipe
.is_texture_referenced
= nouveau_is_texture_referenced
;
285 nv10
->pipe
.is_buffer_referenced
= nouveau_is_buffer_referenced
;
287 nv10_init_surface_functions(nv10
);
288 nv10_init_state_functions(nv10
);
290 nv10
->draw
= draw_create();
292 draw_set_rasterize_stage(nv10
->draw
, nv10_draw_vbuf_stage(nv10
));
294 nv10_init_hwctx(nv10
);