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
);
14 draw_flush(nv10
->draw
);
20 nv10_destroy(struct pipe_context
*pipe
)
22 struct nv10_context
*nv10
= nv10_context(pipe
);
25 draw_destroy(nv10
->draw
);
30 static void nv10_init_hwctx(struct nv10_context
*nv10
)
32 struct nv10_screen
*screen
= nv10
->screen
;
33 struct nouveau_winsys
*nvws
= screen
->nvws
;
35 float projectionmatrix
[16];
37 BEGIN_RING(celsius
, NV10TCL_DMA_NOTIFY
, 1);
38 OUT_RING (screen
->sync
->handle
);
39 BEGIN_RING(celsius
, NV10TCL_DMA_IN_MEMORY0
, 2);
40 OUT_RING (nvws
->channel
->vram
->handle
);
41 OUT_RING (nvws
->channel
->gart
->handle
);
42 BEGIN_RING(celsius
, NV10TCL_DMA_IN_MEMORY2
, 2);
43 OUT_RING (nvws
->channel
->vram
->handle
);
44 OUT_RING (nvws
->channel
->vram
->handle
);
46 BEGIN_RING(celsius
, NV10TCL_NOP
, 1);
49 BEGIN_RING(celsius
, NV10TCL_RT_HORIZ
, 2);
53 BEGIN_RING(celsius
, NV10TCL_VIEWPORT_CLIP_HORIZ(0), 1);
54 OUT_RING ((0x7ff<<16)|0x800);
55 BEGIN_RING(celsius
, NV10TCL_VIEWPORT_CLIP_VERT(0), 1);
56 OUT_RING ((0x7ff<<16)|0x800);
59 BEGIN_RING(celsius
, NV10TCL_VIEWPORT_CLIP_HORIZ(i
), 1);
61 BEGIN_RING(celsius
, NV10TCL_VIEWPORT_CLIP_VERT(i
), 1);
65 BEGIN_RING(celsius
, 0x290, 1);
66 OUT_RING ((0x10<<16)|1);
67 BEGIN_RING(celsius
, 0x3f4, 1);
70 BEGIN_RING(celsius
, NV10TCL_NOP
, 1);
73 if (nv10
->screen
->celsius
->grclass
!= NV10TCL
) {
75 BEGIN_RING(celsius
, 0x120, 3);
80 BEGIN_RING(celsius
, NV10TCL_NOP
, 1);
84 BEGIN_RING(celsius
, NV10TCL_NOP
, 1);
88 BEGIN_RING(celsius
, NV10TCL_FOG_ENABLE
, 1);
90 BEGIN_RING(celsius
, NV10TCL_ALPHA_FUNC_ENABLE
, 1);
92 BEGIN_RING(celsius
, NV10TCL_ALPHA_FUNC_FUNC
, 2);
95 BEGIN_RING(celsius
, NV10TCL_TX_ENABLE(0), 2);
99 BEGIN_RING(celsius
, 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(celsius
, NV10TCL_BLEND_FUNC_ENABLE
, 1);
115 BEGIN_RING(celsius
, NV10TCL_DITHER_ENABLE
, 2);
118 BEGIN_RING(celsius
, NV10TCL_LINE_SMOOTH_ENABLE
, 1);
120 BEGIN_RING(celsius
, NV10TCL_VERTEX_WEIGHT_ENABLE
, 2);
123 BEGIN_RING(celsius
, NV10TCL_BLEND_FUNC_SRC
, 4);
128 BEGIN_RING(celsius
, NV10TCL_STENCIL_MASK
, 8);
137 BEGIN_RING(celsius
, NV10TCL_NORMALIZE_ENABLE
, 1);
139 BEGIN_RING(celsius
, NV10TCL_FOG_ENABLE
, 2);
142 BEGIN_RING(celsius
, NV10TCL_LIGHT_MODEL
, 1);
144 BEGIN_RING(celsius
, NV10TCL_COLOR_CONTROL
, 1);
146 BEGIN_RING(celsius
, NV10TCL_ENABLED_LIGHTS
, 1);
148 BEGIN_RING(celsius
, NV10TCL_POLYGON_OFFSET_POINT_ENABLE
, 3);
152 BEGIN_RING(celsius
, NV10TCL_DEPTH_FUNC
, 1);
154 BEGIN_RING(celsius
, NV10TCL_DEPTH_WRITE_ENABLE
, 1);
156 BEGIN_RING(celsius
, NV10TCL_DEPTH_TEST_ENABLE
, 1);
158 BEGIN_RING(celsius
, NV10TCL_POLYGON_OFFSET_FACTOR
, 2);
161 BEGIN_RING(celsius
, NV10TCL_POINT_SIZE
, 1);
163 BEGIN_RING(celsius
, NV10TCL_POINT_PARAMETERS_ENABLE
, 2);
166 BEGIN_RING(celsius
, NV10TCL_LINE_WIDTH
, 1);
168 BEGIN_RING(celsius
, NV10TCL_LINE_SMOOTH_ENABLE
, 1);
170 BEGIN_RING(celsius
, NV10TCL_POLYGON_MODE_FRONT
, 2);
173 BEGIN_RING(celsius
, NV10TCL_CULL_FACE
, 2);
176 BEGIN_RING(celsius
, NV10TCL_POLYGON_SMOOTH_ENABLE
, 1);
178 BEGIN_RING(celsius
, NV10TCL_CULL_FACE_ENABLE
, 1);
180 BEGIN_RING(celsius
, NV10TCL_TX_GEN_S(0), 8);
184 BEGIN_RING(celsius
, 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(celsius
, NV10TCL_NOP
, 1);
192 BEGIN_RING(celsius
, 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(celsius
, NV10TCL_VIEW_MATRIX_ENABLE
, 1);
200 BEGIN_RING(celsius
, NV10TCL_COLOR_MASK
, 1);
201 OUT_RING (0x01010101);
203 /* Set vertex component */
204 BEGIN_RING(celsius
, NV10TCL_VERTEX_COL_4F_R
, 4);
209 BEGIN_RING(celsius
, NV10TCL_VERTEX_COL2_3F_R
, 3);
213 BEGIN_RING(celsius
, NV10TCL_VERTEX_NOR_3F_X
, 3);
217 BEGIN_RING(celsius
, NV10TCL_VERTEX_TX0_4F_S
, 4);
222 BEGIN_RING(celsius
, NV10TCL_VERTEX_TX1_4F_S
, 4);
227 BEGIN_RING(celsius
, NV10TCL_VERTEX_FOG_1F
, 1);
229 BEGIN_RING(celsius
, NV10TCL_EDGEFLAG_ENABLE
, 1);
232 memset(projectionmatrix
, 0, sizeof(projectionmatrix
));
233 BEGIN_RING(celsius
, 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(celsius
, NV10TCL_DEPTH_RANGE_NEAR
, 2);
244 OUT_RINGf (16777216.0);
246 BEGIN_RING(celsius
, NV10TCL_VIEWPORT_SCALE_X
, 4);
249 OUT_RINGf (16777215.0 * 0.5);
256 nv10_set_edgeflags(struct pipe_context
*pipe
, const unsigned *bitfield
)
261 nv10_is_texture_referenced( struct pipe_context
*pipe
,
262 struct pipe_texture
*texture
,
263 unsigned face
, unsigned level
)
269 return PIPE_REFERENCED_FOR_READ
| PIPE_REFERENCED_FOR_WRITE
;
273 nv10_is_buffer_referenced( struct pipe_context
*pipe
,
274 struct pipe_buffer
*buf
)
280 return PIPE_REFERENCED_FOR_READ
| PIPE_REFERENCED_FOR_WRITE
;
283 struct pipe_context
*
284 nv10_create(struct pipe_screen
*pscreen
, unsigned pctx_id
)
286 struct nv10_screen
*screen
= nv10_screen(pscreen
);
287 struct pipe_winsys
*ws
= pscreen
->winsys
;
288 struct nv10_context
*nv10
;
289 struct nouveau_winsys
*nvws
= screen
->nvws
;
291 nv10
= CALLOC(1, sizeof(struct nv10_context
));
294 nv10
->screen
= screen
;
295 nv10
->pctx_id
= pctx_id
;
299 nv10
->pipe
.winsys
= ws
;
300 nv10
->pipe
.screen
= pscreen
;
301 nv10
->pipe
.destroy
= nv10_destroy
;
302 nv10
->pipe
.set_edgeflags
= nv10_set_edgeflags
;
303 nv10
->pipe
.draw_arrays
= nv10_draw_arrays
;
304 nv10
->pipe
.draw_elements
= nv10_draw_elements
;
305 nv10
->pipe
.clear
= nv10_clear
;
306 nv10
->pipe
.flush
= nv10_flush
;
308 nv10
->pipe
.is_texture_referenced
= nv10_is_texture_referenced
;
309 nv10
->pipe
.is_buffer_referenced
= nv10_is_buffer_referenced
;
311 nv10_init_surface_functions(nv10
);
312 nv10_init_state_functions(nv10
);
314 nv10
->draw
= draw_create();
316 draw_set_rasterize_stage(nv10
->draw
, nv10_draw_vbuf_stage(nv10
));
318 nv10_init_hwctx(nv10
);