1 #include "pipe/draw/draw_context.h"
2 #include "pipe/p_defines.h"
3 #include "pipe/p_winsys.h"
4 #include "pipe/p_util.h"
6 #include "nv30_context.h"
9 nv30_get_name(struct pipe_context
*pipe
)
11 struct nv30_context
*nv30
= nv30_context(pipe
);
12 static char buffer
[128];
14 snprintf(buffer
, sizeof(buffer
), "NV%02X", nv30
->chipset
);
19 nv30_get_vendor(struct pipe_context
*pipe
)
25 nv30_get_param(struct pipe_context
*pipe
, int param
)
28 case PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS
:
30 case PIPE_CAP_NPOT_TEXTURES
:
32 case PIPE_CAP_TWO_SIDED_STENCIL
:
38 case PIPE_CAP_ANISOTROPIC_FILTER
:
40 case PIPE_CAP_POINT_SPRITE
:
42 case PIPE_CAP_MAX_RENDER_TARGETS
:
44 case PIPE_CAP_OCCLUSION_QUERY
:
46 case PIPE_CAP_TEXTURE_SHADOW_MAP
:
48 case PIPE_CAP_MAX_TEXTURE_2D_LEVELS
:
50 case PIPE_CAP_MAX_TEXTURE_3D_LEVELS
:
52 case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS
:
55 NOUVEAU_ERR("Unknown PIPE_CAP %d\n", param
);
61 nv30_get_paramf(struct pipe_context
*pipe
, int param
)
64 case PIPE_CAP_MAX_LINE_WIDTH
:
65 case PIPE_CAP_MAX_LINE_WIDTH_AA
:
67 case PIPE_CAP_MAX_POINT_WIDTH
:
68 case PIPE_CAP_MAX_POINT_WIDTH_AA
:
70 case PIPE_CAP_MAX_TEXTURE_ANISOTROPY
:
72 case PIPE_CAP_MAX_TEXTURE_LOD_BIAS
:
74 case PIPE_CAP_BITMAP_TEXCOORD_BIAS
:
77 NOUVEAU_ERR("Unknown PIPE_CAP %d\n", param
);
83 nv30_flush(struct pipe_context
*pipe
, unsigned flags
)
85 struct nv30_context
*nv30
= nv30_context(pipe
);
86 struct nouveau_winsys
*nvws
= nv30
->nvws
;
88 if (flags
& PIPE_FLUSH_TEXTURE_CACHE
) {
89 BEGIN_RING(rankine
, 0x1fd8, 1);
91 BEGIN_RING(rankine
, 0x1fd8, 1);
95 if (flags
& PIPE_FLUSH_WAIT
) {
96 nvws
->notifier_reset(nv30
->sync
, 0);
97 BEGIN_RING(rankine
, 0x104, 1);
99 BEGIN_RING(rankine
, 0x100, 1);
105 if (flags
& PIPE_FLUSH_WAIT
)
106 nvws
->notifier_wait(nv30
->sync
, 0, 0, 2000);
110 nv30_destroy(struct pipe_context
*pipe
)
112 struct nv30_context
*nv30
= nv30_context(pipe
);
113 struct nouveau_winsys
*nvws
= nv30
->nvws
;
116 draw_destroy(nv30
->draw
);
118 nvws
->res_free(&nv30
->vertprog
.exec_heap
);
119 nvws
->res_free(&nv30
->vertprog
.data_heap
);
121 nvws
->res_free(&nv30
->query_heap
);
122 nvws
->notifier_free(&nv30
->query
);
124 nvws
->notifier_free(&nv30
->sync
);
126 nvws
->grobj_free(&nv30
->rankine
);
132 nv30_init_hwctx(struct nv30_context
*nv30
, int rankine_class
)
134 struct nouveau_winsys
*nvws
= nv30
->nvws
;
138 ret
= nvws
->grobj_alloc(nvws
, rankine_class
, &nv30
->rankine
);
140 NOUVEAU_ERR("Error creating 3D object: %d\n", ret
);
144 BEGIN_RING(rankine
, NV34TCL_DMA_NOTIFY
, 1);
145 OUT_RING (nv30
->sync
->handle
);
146 BEGIN_RING(rankine
, NV34TCL_DMA_TEXTURE0
, 2);
147 OUT_RING (nvws
->channel
->vram
->handle
);
148 OUT_RING (nvws
->channel
->gart
->handle
);
149 BEGIN_RING(rankine
, NV34TCL_DMA_COLOR1
, 1);
150 OUT_RING (nvws
->channel
->vram
->handle
);
151 BEGIN_RING(rankine
, NV34TCL_DMA_COLOR0
, 2);
152 OUT_RING (nvws
->channel
->vram
->handle
);
153 OUT_RING (nvws
->channel
->vram
->handle
);
154 BEGIN_RING(rankine
, NV34TCL_DMA_VTXBUF0
, 2);
155 OUT_RING (nvws
->channel
->vram
->handle
);
156 OUT_RING (nvws
->channel
->gart
->handle
);
157 /* BEGIN_RING(rankine, NV34TCL_DMA_FENCE, 2);
159 OUT_RING (nv30->query->handle);*/
160 BEGIN_RING(rankine
, NV34TCL_DMA_IN_MEMORY7
, 1);
161 OUT_RING (nvws
->channel
->vram
->handle
);
162 BEGIN_RING(rankine
, NV34TCL_DMA_IN_MEMORY8
, 1);
163 OUT_RING (nvws
->channel
->vram
->handle
);
165 for (i
=1; i
<8; i
++) {
166 BEGIN_RING(rankine
, NV34TCL_VIEWPORT_CLIP_HORIZ(i
), 1);
168 BEGIN_RING(rankine
, NV34TCL_VIEWPORT_CLIP_VERT(i
), 1);
172 BEGIN_RING(rankine
, 0x220, 1);
175 BEGIN_RING(rankine
, 0x03b0, 1);
176 OUT_RING (0x00100000);
177 BEGIN_RING(rankine
, 0x1454, 1);
179 BEGIN_RING(rankine
, 0x1d80, 1);
181 BEGIN_RING(rankine
, 0x1450, 1);
182 OUT_RING (0x00030004);
185 BEGIN_RING(rankine
, 0x1e98, 1);
187 BEGIN_RING(rankine
, 0x17e0, 3);
190 OUT_RING (0x3f800000);
191 BEGIN_RING(rankine
, 0x1f80, 16);
192 OUT_RING (0); OUT_RING (0); OUT_RING (0); OUT_RING (0);
193 OUT_RING (0); OUT_RING (0); OUT_RING (0); OUT_RING (0);
194 OUT_RING (0x0000ffff);
195 OUT_RING (0); OUT_RING (0); OUT_RING (0); OUT_RING (0);
196 OUT_RING (0); OUT_RING (0); OUT_RING (0);
198 BEGIN_RING(rankine
, 0x120, 3);
203 BEGIN_RING(rankine
, 0x1d88, 1);
204 OUT_RING (0x00001200);
206 BEGIN_RING(rankine
, NV34TCL_RC_ENABLE
, 1);
209 /* Attempt to setup a known state.. Probably missing a heap of
212 BEGIN_RING(rankine
, NV34TCL_STENCIL_FRONT_ENABLE
, 1);
214 BEGIN_RING(rankine
, NV34TCL_STENCIL_BACK_ENABLE
, 1);
216 BEGIN_RING(rankine
, NV34TCL_ALPHA_FUNC_ENABLE
, 1);
218 BEGIN_RING(rankine
, NV34TCL_DEPTH_WRITE_ENABLE
, 2);
219 OUT_RING (0); /* wr disable */
220 OUT_RING (0); /* test disable */
221 BEGIN_RING(rankine
, NV34TCL_COLOR_MASK
, 1);
222 OUT_RING (0x01010101); /* TR,TR,TR,TR */
223 BEGIN_RING(rankine
, NV34TCL_CULL_FACE_ENABLE
, 1);
225 BEGIN_RING(rankine
, NV34TCL_BLEND_FUNC_ENABLE
, 5);
226 OUT_RING (0); /* Blend enable */
227 OUT_RING (0); /* Blend src */
228 OUT_RING (0); /* Blend dst */
229 OUT_RING (0x00000000); /* Blend colour */
230 OUT_RING (0x8006); /* FUNC_ADD */
231 BEGIN_RING(rankine
, NV34TCL_COLOR_LOGIC_OP_ENABLE
, 2);
233 OUT_RING (0x1503 /*GL_COPY*/);
234 BEGIN_RING(rankine
, NV34TCL_DITHER_ENABLE
, 1);
236 BEGIN_RING(rankine
, NV34TCL_SHADE_MODEL
, 1);
237 OUT_RING (0x1d01 /*GL_SMOOTH*/);
238 BEGIN_RING(rankine
, NV34TCL_POLYGON_OFFSET_FACTOR
,2);
241 BEGIN_RING(rankine
, NV34TCL_POLYGON_MODE_FRONT
, 2);
242 OUT_RING (0x1b02 /*GL_FILL*/);
243 OUT_RING (0x1b02 /*GL_FILL*/);
244 /* - Disable texture units
245 * - Set fragprog to MOVR result.color, fragment.color */
248 NV34TCL_TX_ENABLE(i
), 1);
251 /* Polygon stipple */
253 NV34TCL_POLYGON_STIPPLE_PATTERN(0), 0x20);
255 OUT_RING (0xFFFFFFFF);
260 BEGIN_RING(rankine
, NV34TCL_RT_HORIZ
, 5);
263 OUT_RING (0x148); /* format */
264 OUT_RING (pitch
<< 16 | pitch
);
266 BEGIN_RING(rankine
, 0x0a00, 2);
267 OUT_RING ((w
<<16) | 0);
268 OUT_RING ((h
<<16) | 0);
269 BEGIN_RING(rankine
, NV34TCL_VIEWPORT_CLIP_HORIZ(0), 2);
270 OUT_RING ((w
-1)<<16);
271 OUT_RING ((h
-1)<<16);
272 BEGIN_RING(rankine
, NV34TCL_SCISSOR_HORIZ
, 2);
275 BEGIN_RING(rankine
, NV34TCL_VIEWPORT_HORIZ
, 2);
279 BEGIN_RING(rankine
, NV34TCL_VIEWPORT_TRANSLATE_X
, 8);
289 BEGIN_RING(rankine
, NV34TCL_MODELVIEW_MATRIX(0), 16);
307 BEGIN_RING(rankine
, NV34TCL_PROJECTION_MATRIX(0), 16);
325 BEGIN_RING(rankine
, NV34TCL_SCISSOR_HORIZ
, 2);
329 BEGIN_RING(rankine
, NV34TCL_MULTISAMPLE_CONTROL
, 1);
330 OUT_RING (0xffff0000);
336 #define NV30TCL_CHIPSET_3X_MASK 0x00000003
337 #define NV34TCL_CHIPSET_3X_MASK 0x00000010
338 #define NV35TCL_CHIPSET_3X_MASK 0x000001e0
340 struct pipe_context
*
341 nv30_create(struct pipe_winsys
*pipe_winsys
, struct nouveau_winsys
*nvws
,
344 struct nv30_context
*nv30
;
345 int rankine_class
= 0, ret
;
347 if ((chipset
& 0xf0) != 0x30) {
348 NOUVEAU_ERR("Not a NV3X chipset\n");
352 if (NV30TCL_CHIPSET_3X_MASK
& (1 << (chipset
& 0x0f))) {
353 rankine_class
= 0x0397;
354 } else if (NV34TCL_CHIPSET_3X_MASK
& (1 << (chipset
& 0x0f))) {
355 rankine_class
= 0x0697;
356 } else if (NV35TCL_CHIPSET_3X_MASK
& (1 << (chipset
& 0x0f))) {
357 rankine_class
= 0x0497;
359 NOUVEAU_ERR("Unknown NV3X chipset: NV%02x\n", chipset
);
363 nv30
= CALLOC_STRUCT(nv30_context
);
366 nv30
->chipset
= chipset
;
369 /* Notifier for sync purposes */
370 ret
= nvws
->notifier_alloc(nvws
, 1, &nv30
->sync
);
372 NOUVEAU_ERR("Error creating notifier object: %d\n", ret
);
373 nv30_destroy(&nv30
->pipe
);
378 ret
= nvws
->notifier_alloc(nvws
, 32, &nv30
->query
);
380 NOUVEAU_ERR("Error initialising query objects: %d\n", ret
);
381 nv30_destroy(&nv30
->pipe
);
385 ret
= nvws
->res_init(&nv30
->query_heap
, 0, 32);
387 NOUVEAU_ERR("Error initialising query object heap: %d\n", ret
);
388 nv30_destroy(&nv30
->pipe
);
392 /* Vtxprog resources */
393 if (nvws
->res_init(&nv30
->vertprog
.exec_heap
, 0, 512) ||
394 nvws
->res_init(&nv30
->vertprog
.data_heap
, 0, 256)) {
395 nv30_destroy(&nv30
->pipe
);
399 /* Static rankine initialisation */
400 if (!nv30_init_hwctx(nv30
, rankine_class
)) {
401 nv30_destroy(&nv30
->pipe
);
405 /* Pipe context setup */
406 nv30
->pipe
.winsys
= pipe_winsys
;
408 nv30
->pipe
.destroy
= nv30_destroy
;
409 nv30
->pipe
.get_name
= nv30_get_name
;
410 nv30
->pipe
.get_vendor
= nv30_get_vendor
;
411 nv30
->pipe
.get_param
= nv30_get_param
;
412 nv30
->pipe
.get_paramf
= nv30_get_paramf
;
414 nv30
->pipe
.draw_arrays
= nv30_draw_arrays
;
415 nv30
->pipe
.draw_elements
= nv30_draw_elements
;
416 nv30
->pipe
.clear
= nv30_clear
;
418 nv30
->pipe
.flush
= nv30_flush
;
420 nv30_init_query_functions(nv30
);
421 nv30_init_surface_functions(nv30
);
422 nv30_init_state_functions(nv30
);
423 nv30_init_miptree_functions(nv30
);
425 nv30
->draw
= draw_create();
427 draw_set_rasterize_stage(nv30
->draw
, nv30_draw_render_stage(nv30
));