1 #include "nv_include.h"
4 NVAccelInitNullObject(ScrnInfoPtr pScrn)
6 NVPtr pNv = NVPTR(pScrn);
7 static int have_object = FALSE;
10 if (!NVDmaCreateContextObject(pNv, NvNullObject,
20 NVAccelInitNull3D(ScrnInfoPtr pScrn)
22 NVPtr pNv = NVPTR(pScrn);
23 static int have_object = FALSE;
26 if (!NVDmaCreateContextObject(pNv, Nv3D, 0x30))
35 NVAccelGetPixmapOffset(PixmapPtr pPix)
37 ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum];
38 NVPtr pNv = NVPTR(pScrn);
41 if (pPix->drawable.type == DRAWABLE_WINDOW) {
42 offset = pNv->FB->offset;
44 offset = (uint32_t)((unsigned long)pPix->devPrivate.ptr -
45 (unsigned long)pNv->FB->map);
46 offset += pNv->FB->offset;
53 NVAccelInitDmaNotifier0(ScrnInfoPtr pScrn)
55 NVPtr pNv = NVPTR(pScrn);
56 static int have_object = FALSE;
59 pNv->Notifier0 = NVNotifierAlloc(pScrn, NvDmaNotifier0);
68 /* FLAGS_ROP_AND, DmaFB, DmaFB, 0 */
70 NVAccelInitContextSurfaces(ScrnInfoPtr pScrn)
72 NVPtr pNv = NVPTR(pScrn);
73 static int have_object = FALSE;
76 class = (pNv->Architecture >= NV_10) ? NV10_CONTEXT_SURFACES_2D :
80 if (!NVDmaCreateContextObject(pNv, NvContextSurfaces, class))
85 NVDmaSetObjectOnSubchannel(pNv, NvSubContextSurfaces,
87 NVDmaStart(pNv, NvSubContextSurfaces, NV04_SURFACE_DMA_NOTIFY, 1);
88 NVDmaNext (pNv, NvNullObject);
89 NVDmaStart(pNv, NvSubContextSurfaces, NV04_SURFACE_DMA_IMAGE_SOURCE, 2);
90 NVDmaNext (pNv, NvDmaFB);
91 NVDmaNext (pNv, NvDmaFB);
97 NVAccelGetCtxSurf2DFormatFromPixmap(PixmapPtr pPix, int *fmt_ret)
99 switch (pPix->drawable.bitsPerPixel) {
101 *fmt_ret = SURFACE_FORMAT_A8R8G8B8;
104 *fmt_ret = SURFACE_FORMAT_X8R8G8B8;
107 *fmt_ret = SURFACE_FORMAT_R5G6B5;
110 *fmt_ret = SURFACE_FORMAT_Y8;
120 NVAccelGetCtxSurf2DFormatFromPicture(PicturePtr pPict, int *fmt_ret)
122 switch (pPict->format) {
124 *fmt_ret = SURFACE_FORMAT_A8R8G8B8;
127 *fmt_ret = SURFACE_FORMAT_X8R8G8B8;
130 *fmt_ret = SURFACE_FORMAT_R5G6B5;
133 *fmt_ret = SURFACE_FORMAT_Y8;
143 NVAccelSetCtxSurf2D(PixmapPtr psPix, PixmapPtr pdPix, int format)
145 ScrnInfoPtr pScrn = xf86Screens[psPix->drawable.pScreen->myNum];
146 NVPtr pNv = NVPTR(pScrn);
148 NVDmaStart(pNv, NvSubContextSurfaces, SURFACE_FORMAT, 4);
149 NVDmaNext (pNv, format);
150 NVDmaNext (pNv, ((uint32_t)exaGetPixmapPitch(pdPix) << 16) |
151 (uint32_t)exaGetPixmapPitch(psPix));
152 NVDmaNext (pNv, NVAccelGetPixmapOffset(psPix));
153 NVDmaNext (pNv, NVAccelGetPixmapOffset(pdPix));
158 /* FLAGS_ROP_AND|FLAGS_MONO, 0, 0, 0 */
160 NVAccelInitImagePattern(ScrnInfoPtr pScrn)
162 NVPtr pNv = NVPTR(pScrn);
163 static int have_object = FALSE;
166 class = NV04_IMAGE_PATTERN;
169 if (!NVDmaCreateContextObject(pNv, NvImagePattern, class))
174 NVDmaSetObjectOnSubchannel(pNv, NvSubImagePattern,
176 NVDmaStart(pNv, NvSubImagePattern,
177 0x180, /*NV04_IMAGE_PATTERN_SET_DMA_NOTIFY*/ 1);
178 NVDmaNext (pNv, NvNullObject);
179 NVDmaStart(pNv, NvSubImagePattern, NV04_IMAGE_PATTERN_MONO_FORMAT, 3);
180 #if X_BYTE_ORDER == X_BIG_ENDIAN
181 NVDmaNext (pNv, 2 /* NV04_IMAGE_PATTERN_BIGENDIAN/LE_M1 */);
183 NVDmaNext (pNv, 1 /* NV04_IMAGE_PATTERN_LOWENDIAN/CGA6_M1 */);
185 NVDmaNext (pNv, 0 /* NV04_IMAGE_PATTERN_MONOCHROME_SHAPE_8X8 */);
186 NVDmaNext (pNv, 1 /* NV04_IMAGE_PATTERN_SELECT_MONOCHROME */);
191 /* FLAGS_ROP_AND, 0, 0, 0 */
193 NVAccelInitRasterOp(ScrnInfoPtr pScrn)
195 NVPtr pNv = NVPTR(pScrn);
196 static int have_object = FALSE;
199 class = NV03_PRIMITIVE_RASTER_OP;
202 if (!NVDmaCreateContextObject(pNv, NvRop, class))
207 NVDmaSetObjectOnSubchannel(pNv, NvSubRop, NvRop);
208 NVDmaStart(pNv, NvSubRop, NV03_PRIMITIVE_RASTER_OP_DMA_NOTIFY, 1);
209 NVDmaNext (pNv, NvNullObject);
214 /* FLAGS_ROP_AND | FLAGS_MONO, 0, 0, 0 */
216 NVAccelInitRectangle(ScrnInfoPtr pScrn)
218 NVPtr pNv = NVPTR(pScrn);
219 static int have_object = FALSE;
222 class = NV04_GDI_RECTANGLE_TEXT;
225 if (!NVDmaCreateContextObject(pNv, NvRectangle, class))
230 NVDmaSetObjectOnSubchannel(pNv, NvSubRectangle, NvRectangle);
231 NVDmaStart(pNv, NvSubRectangle,
232 NV04_GDI_RECTANGLE_TEXT_SET_DMA_NOTIFY, 1);
233 NVDmaNext (pNv, NvDmaNotifier0);
234 NVDmaStart(pNv, NvSubRectangle,
235 0x184 /*NV04_GDI_RECTANGLE_TEXT_SET_DMA_FONTS*/, 1);
236 NVDmaNext (pNv, NvNullObject);
237 NVDmaStart(pNv, NvSubRectangle, NV04_GDI_RECTANGLE_TEXT_SURFACE, 1);
238 NVDmaNext (pNv, NvContextSurfaces);
239 NVDmaStart(pNv, NvSubRectangle, NV04_GDI_RECTANGLE_TEXT_ROP5, 1);
240 NVDmaNext (pNv, NvRop);
241 NVDmaStart(pNv, NvSubRectangle, NV04_GDI_RECTANGLE_TEXT_PATTERN, 1);
242 NVDmaNext (pNv, NvImagePattern);
243 NVDmaStart(pNv, NvSubRectangle, NV04_GDI_RECTANGLE_TEXT_OPERATION, 1);
244 NVDmaNext (pNv, 1 /* ROP_AND */);
249 /* FLAGS_ROP_AND, DmaFB, DmaFB, 0 */
251 NVAccelInitImageBlit(ScrnInfoPtr pScrn)
253 NVPtr pNv = NVPTR(pScrn);
254 static int have_object = FALSE;
257 class = (pNv->WaitVSyncPossible) ? NV10_IMAGE_BLIT : NV_IMAGE_BLIT;
260 if (!NVDmaCreateContextObject(pNv, NvImageBlit, class))
265 NVDmaSetObjectOnSubchannel(pNv, NvSubImageBlit, NvImageBlit);
266 NVDmaStart(pNv, NvSubImageBlit, NV_IMAGE_BLIT_DMA_NOTIFY, 1);
267 NVDmaNext (pNv, NvDmaNotifier0);
268 NVDmaStart(pNv, NvSubImageBlit, NV_IMAGE_BLIT_COLOR_KEY, 1);
269 NVDmaNext (pNv, NvNullObject);
270 NVDmaStart(pNv, NvSubImageBlit, NV_IMAGE_BLIT_SURFACE, 1);
271 NVDmaNext (pNv, NvContextSurfaces);
272 NVDmaStart(pNv, NvSubImageBlit, NV_IMAGE_BLIT_CLIP_RECTANGLE, 3);
273 NVDmaNext (pNv, NvNullObject);
274 NVDmaNext (pNv, NvImagePattern);
275 NVDmaNext (pNv, NvRop);
276 NVDmaStart(pNv, NvSubImageBlit, NV_IMAGE_BLIT_OPERATION, 1);
277 NVDmaNext (pNv, 1 /* NV_IMAGE_BLIT_OPERATION_ROP_AND */);
282 /* FLAGS_SRCCOPY, DmaFB, DmaFB, 0 */
284 NVAccelInitScaledImage(ScrnInfoPtr pScrn)
286 NVPtr pNv = NVPTR(pScrn);
287 static int have_object = FALSE;
290 switch (pNv->Architecture) {
292 class = NV04_SCALED_IMAGE_FROM_MEMORY;
297 class = NV10_SCALED_IMAGE_FROM_MEMORY;
301 class = NV10_SCALED_IMAGE_FROM_MEMORY | 0x3000;
306 if (!NVDmaCreateContextObject(pNv, NvScaledImage, class))
311 NVDmaSetObjectOnSubchannel(pNv, NvSubScaledImage, NvScaledImage);
312 NVDmaStart(pNv, NvSubScaledImage,
313 NV04_SCALED_IMAGE_FROM_MEMORY_DMA_NOTIFY, 1);
314 NVDmaNext (pNv, NvDmaNotifier0);
315 NVDmaStart(pNv, NvSubScaledImage,
316 NV04_SCALED_IMAGE_FROM_MEMORY_DMA_IMAGE, 1);
317 NVDmaNext (pNv, NvDmaFB); /* source object */
318 NVDmaStart(pNv, NvSubScaledImage,
319 NV04_SCALED_IMAGE_FROM_MEMORY_SURFACE, 1);
320 NVDmaNext (pNv, NvContextSurfaces);
321 NVDmaStart(pNv, NvSubScaledImage, 0x188, 1); /* PATTERN */
322 NVDmaNext (pNv, NvNullObject);
323 NVDmaStart(pNv, NvSubScaledImage, 0x18c, 1); /* ROP */
324 NVDmaNext (pNv, NvNullObject);
325 NVDmaStart(pNv, NvSubScaledImage, 0x190, 1); /* BETA1 */
326 NVDmaNext (pNv, NvNullObject);
327 NVDmaStart(pNv, NvSubScaledImage, 0x194, 1); /* BETA4 */
328 NVDmaNext (pNv, NvNullObject);
329 NVDmaStart(pNv, NvSubScaledImage,
330 NV04_SCALED_IMAGE_FROM_MEMORY_OPERATION, 1);
331 NVDmaNext (pNv, 3 /* SRCCOPY */);
336 /* FLAGS_NONE, 0, 0, 0 */
338 NVAccelInitClipRectangle(ScrnInfoPtr pScrn)
340 NVPtr pNv = NVPTR(pScrn);
341 static int have_object = FALSE;
342 int class = NV01_CONTEXT_CLIP_RECTANGLE;
345 if (!NVDmaCreateContextObject(pNv, NvClipRectangle, class))
350 NVDmaSetObjectOnSubchannel(pNv, NvSubClipRectangle, NvClipRectangle);
351 NVDmaStart(pNv, NvSubClipRectangle, 0x180, 1); /* DMA_NOTIFY */
352 NVDmaNext (pNv, NvNullObject);
357 /* FLAGS_ROP_AND | FLAGS_CLIP_ENABLE, 0, 0, 0 */
359 NVAccelInitSolidLine(ScrnInfoPtr pScrn)
361 NVPtr pNv = NVPTR(pScrn);
362 static int have_object = FALSE;
363 int class = NV04_SOLID_LINE;
366 if (!NVDmaCreateContextObject(pNv, NvSolidLine, class))
371 NVDmaSetObjectOnSubchannel(pNv, NvSubSolidLine, NvSolidLine);
372 NVDmaStart(pNv, NvSubSolidLine, NV04_SOLID_LINE_CLIP_RECTANGLE, 3);
373 NVDmaNext (pNv, NvClipRectangle);
374 NVDmaNext (pNv, NvImagePattern);
375 NVDmaNext (pNv, NvRop);
376 NVDmaStart(pNv, NvSubSolidLine, NV04_SOLID_LINE_SURFACE, 1);
377 NVDmaNext (pNv, NvContextSurfaces);
378 NVDmaStart(pNv, NvSubSolidLine, NV04_SOLID_LINE_OPERATION, 1);
379 NVDmaNext (pNv, 1); /* ROP_AND */
384 /* FLAGS_NONE, NvDmaFB, NvDmaAGP, NvDmaNotifier0 */
386 NVAccelInitMemFormat(ScrnInfoPtr pScrn)
388 NVPtr pNv = NVPTR(pScrn);
389 static int have_object = FALSE;
392 if (pNv->Architecture < NV_ARCH_50)
393 class = NV_MEMORY_TO_MEMORY_FORMAT;
395 class = NV_MEMORY_TO_MEMORY_FORMAT | 0x5000;
398 if (!NVDmaCreateContextObject(pNv, NvMemFormat, class))
403 NVDmaSetObjectOnSubchannel(pNv, NvSubMemFormat, NvMemFormat);
404 NVDmaStart(pNv, NvSubMemFormat,
405 NV_MEMORY_TO_MEMORY_FORMAT_DMA_NOTIFY, 1);
406 NVDmaNext (pNv, NvDmaNotifier0);
407 NVDmaStart(pNv, NvSubMemFormat,
408 NV_MEMORY_TO_MEMORY_FORMAT_OBJECT_IN, 2);
409 NVDmaNext (pNv, NvDmaFB);
410 NVDmaNext (pNv, NvDmaFB);
412 pNv->M2MFDirection = -1;
417 NVAccelInit2D_NV50(ScrnInfoPtr pScrn)
419 NVPtr pNv = NVPTR(pScrn);
420 static int have_object = FALSE;
423 if (!NVDmaCreateContextObject(pNv, Nv2D, 0x502d))
428 NVDmaSetObjectOnSubchannel(pNv, NvSub2D, Nv2D);
430 NVDmaStart(pNv, NvSub2D, 0x180, 3);
431 NVDmaNext (pNv, NvDmaNotifier0);
432 NVDmaNext (pNv, NvDmaFB);
433 NVDmaNext (pNv, NvDmaFB);
435 /* Magics from nv, no clue what they do, but at least some
436 * of them are needed to avoid crashes.
438 NVDmaStart(pNv, NvSub2D, 0x260, 1);
440 NVDmaStart(pNv, NvSub2D, 0x290, 1);
442 NVDmaStart(pNv, NvSub2D, 0x29c, 1);
444 NVDmaStart(pNv, NvSub2D, 0x58c, 1);
445 NVDmaNext (pNv, 0x111);
447 pNv->currentRop = 0xfffffffa;
451 #define INIT_CONTEXT_OBJECT(name) do { \
452 ret = NVAccelInit##name(pScrn); \
454 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \
455 "Failed to initialise context object: "#name \
462 NVAccelCommonInit(ScrnInfoPtr pScrn)
464 NVPtr pNv = NVPTR(pScrn);
467 INIT_CONTEXT_OBJECT(NullObject);
468 INIT_CONTEXT_OBJECT(DmaNotifier0);
471 if (pNv->Architecture < NV_ARCH_50) {
472 INIT_CONTEXT_OBJECT(ContextSurfaces);
473 INIT_CONTEXT_OBJECT(ImagePattern);
474 INIT_CONTEXT_OBJECT(RasterOp);
475 INIT_CONTEXT_OBJECT(Rectangle);
476 INIT_CONTEXT_OBJECT(ImageBlit);
477 INIT_CONTEXT_OBJECT(ScaledImage);
478 INIT_CONTEXT_OBJECT(ClipRectangle);
479 INIT_CONTEXT_OBJECT(SolidLine);
481 INIT_CONTEXT_OBJECT(2D_NV50);
483 INIT_CONTEXT_OBJECT(MemFormat);
486 switch (pNv->Architecture) {
488 INIT_CONTEXT_OBJECT(NV40TCL);
491 INIT_CONTEXT_OBJECT(Null3D);