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 NVAccelGetPixmapOffset(PixmapPtr pPix)
22 ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum];
23 NVPtr pNv = NVPTR(pScrn);
26 offset = exaGetPixmapOffset(pPix);
27 if (offset >= pNv->FB->size) {
28 xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
29 "AII, passed bad pixmap: offset 0x%lx\n",
31 return pNv->FB->offset;
33 offset += pNv->FB->offset;
39 NVAccelInitDmaNotifier0(ScrnInfoPtr pScrn)
41 NVPtr pNv = NVPTR(pScrn);
42 static int have_object = FALSE;
45 pNv->Notifier0 = NVNotifierAlloc(pScrn, NvDmaNotifier0);
54 /* FLAGS_ROP_AND, DmaFB, DmaFB, 0 */
56 NVAccelInitContextSurfaces(ScrnInfoPtr pScrn)
58 NVPtr pNv = NVPTR(pScrn);
59 static int have_object = FALSE;
62 class = (pNv->Architecture >= NV_10) ? NV10_CONTEXT_SURFACES_2D :
63 NV04_CONTEXT_SURFACES_2D;
66 if (!NVDmaCreateContextObject(pNv, NvContextSurfaces, class))
71 NVDmaStart(pNv, NvContextSurfaces, NV04_CONTEXT_SURFACES_2D_SET_DMA_NOTIFY, 1);
72 NVDmaNext (pNv, NvNullObject);
73 NVDmaStart(pNv, NvContextSurfaces, NV04_CONTEXT_SURFACES_2D_SET_DMA_IMAGE_SRC, 2);
74 NVDmaNext (pNv, NvDmaFB);
75 NVDmaNext (pNv, NvDmaFB);
80 /* FLAGS_ROP_AND, DmaFB, DmaFB, 0 */
82 NVAccelInitContextBeta1(ScrnInfoPtr pScrn)
84 NVPtr pNv = NVPTR(pScrn);
85 static int have_object = FALSE;
91 if (!NVDmaCreateContextObject(pNv, NvContextBeta1, class))
96 NVDmaStart(pNv, NvContextBeta1, 0x300, 1); /*alpha factor*/
97 NVDmaNext (pNv, 0xff << 23);
104 NVAccelInitContextBeta4(ScrnInfoPtr pScrn)
106 NVPtr pNv = NVPTR(pScrn);
107 static int have_object = FALSE;
113 if (!NVDmaCreateContextObject(pNv, NvContextBeta4, class))
118 NVDmaStart(pNv, NvContextBeta4, 0x300, 1); /*RGBA factor*/
119 NVDmaNext (pNv, 0xffff0000);
124 NVAccelGetCtxSurf2DFormatFromPixmap(PixmapPtr pPix, int *fmt_ret)
126 switch (pPix->drawable.bitsPerPixel) {
128 *fmt_ret = SURFACE_FORMAT_A8R8G8B8;
131 *fmt_ret = SURFACE_FORMAT_X8R8G8B8;
134 *fmt_ret = SURFACE_FORMAT_R5G6B5;
137 *fmt_ret = SURFACE_FORMAT_Y8;
147 NVAccelGetCtxSurf2DFormatFromPicture(PicturePtr pPict, int *fmt_ret)
149 switch (pPict->format) {
151 *fmt_ret = SURFACE_FORMAT_A8R8G8B8;
154 *fmt_ret = SURFACE_FORMAT_X8R8G8B8;
157 *fmt_ret = SURFACE_FORMAT_R5G6B5;
160 *fmt_ret = SURFACE_FORMAT_Y8;
170 NVAccelSetCtxSurf2D(PixmapPtr psPix, PixmapPtr pdPix, int format)
172 ScrnInfoPtr pScrn = xf86Screens[psPix->drawable.pScreen->myNum];
173 NVPtr pNv = NVPTR(pScrn);
175 NVDmaStart(pNv, NvContextSurfaces, SURFACE_FORMAT, 4);
176 NVDmaNext (pNv, format);
177 NVDmaNext (pNv, ((uint32_t)exaGetPixmapPitch(pdPix) << 16) |
178 (uint32_t)exaGetPixmapPitch(psPix));
179 NVDmaNext (pNv, NVAccelGetPixmapOffset(psPix));
180 NVDmaNext (pNv, NVAccelGetPixmapOffset(pdPix));
185 /* FLAGS_ROP_AND|FLAGS_MONO, 0, 0, 0 */
187 NVAccelInitImagePattern(ScrnInfoPtr pScrn)
189 NVPtr pNv = NVPTR(pScrn);
190 static int have_object = FALSE;
193 class = NV04_IMAGE_PATTERN;
196 if (!NVDmaCreateContextObject(pNv, NvImagePattern, class))
201 NVDmaStart(pNv, NvImagePattern,
202 0x180, /*NV04_IMAGE_PATTERN_SET_DMA_NOTIFY*/ 1);
203 NVDmaNext (pNv, NvNullObject);
204 NVDmaStart(pNv, NvImagePattern, NV04_IMAGE_PATTERN_MONO_FORMAT, 3);
205 #if X_BYTE_ORDER == X_BIG_ENDIAN
206 NVDmaNext (pNv, 2 /* NV04_IMAGE_PATTERN_BIGENDIAN/LE_M1 */);
208 NVDmaNext (pNv, 1 /* NV04_IMAGE_PATTERN_LOWENDIAN/CGA6_M1 */);
210 NVDmaNext (pNv, 0 /* NV04_IMAGE_PATTERN_MONOCHROME_SHAPE_8X8 */);
211 NVDmaNext (pNv, 1 /* NV04_IMAGE_PATTERN_SELECT_MONOCHROME */);
216 /* FLAGS_ROP_AND, 0, 0, 0 */
218 NVAccelInitRasterOp(ScrnInfoPtr pScrn)
220 NVPtr pNv = NVPTR(pScrn);
221 static int have_object = FALSE;
224 class = NV03_PRIMITIVE_RASTER_OP;
227 if (!NVDmaCreateContextObject(pNv, NvRop, class))
232 NVDmaStart(pNv, NvRop, NV03_PRIMITIVE_RASTER_OP_DMA_NOTIFY, 1);
233 NVDmaNext (pNv, NvNullObject);
235 pNv->currentRop = ~0;
239 /* FLAGS_ROP_AND | FLAGS_MONO, 0, 0, 0 */
241 NVAccelInitRectangle(ScrnInfoPtr pScrn)
243 NVPtr pNv = NVPTR(pScrn);
244 static int have_object = FALSE;
247 class = NV04_GDI_RECTANGLE_TEXT;
250 if (!NVDmaCreateContextObject(pNv, NvRectangle, class))
255 NVDmaStart(pNv, NvRectangle,
256 NV04_GDI_RECTANGLE_TEXT_SET_DMA_NOTIFY, 1);
257 NVDmaNext (pNv, NvDmaNotifier0);
258 NVDmaStart(pNv, NvRectangle,
259 NV04_GDI_RECTANGLE_TEXT_SET_DMA_FONTS, 1);
260 NVDmaNext (pNv, NvNullObject);
261 NVDmaStart(pNv, NvRectangle, NV04_GDI_RECTANGLE_TEXT_SURFACE, 1);
262 NVDmaNext (pNv, NvContextSurfaces);
263 NVDmaStart(pNv, NvRectangle, NV04_GDI_RECTANGLE_TEXT_ROP5, 1);
264 NVDmaNext (pNv, NvRop);
265 NVDmaStart(pNv, NvRectangle, NV04_GDI_RECTANGLE_TEXT_PATTERN, 1);
266 NVDmaNext (pNv, NvImagePattern);
267 NVDmaStart(pNv, NvRectangle, NV04_GDI_RECTANGLE_TEXT_OPERATION, 1);
268 NVDmaNext (pNv, 1 /* ROP_AND */);
269 NVDmaStart(pNv, NvRectangle,
270 NV04_GDI_RECTANGLE_TEXT_MONO_FORMAT, 1);
271 /* XXX why putting 1 like renouveau dump, swap the text */
272 #if 1 || X_BYTE_ORDER == X_BIG_ENDIAN
273 NVDmaNext (pNv, 2 /* NV04_GDI_RECTANGLE_BIGENDIAN/LE_M1 */);
275 NVDmaNext (pNv, 1 /* NV04_GDI_RECTANGLE_LOWENDIAN/CGA6_M1 */);
281 /* FLAGS_ROP_AND, DmaFB, DmaFB, 0 */
283 NVAccelInitImageBlit(ScrnInfoPtr pScrn)
285 NVPtr pNv = NVPTR(pScrn);
286 static int have_object = FALSE;
289 class = (pNv->WaitVSyncPossible) ? NV11_IMAGE_BLIT : NV_IMAGE_BLIT;
292 if (!NVDmaCreateContextObject(pNv, NvImageBlit, class))
297 NVDmaStart(pNv, NvImageBlit, NV_IMAGE_BLIT_SET_DMA_NOTIFY, 1);
298 NVDmaNext (pNv, NvDmaNotifier0);
299 NVDmaStart(pNv, NvImageBlit, NV_IMAGE_BLIT_SET_COLOR_KEY, 1);
300 NVDmaNext (pNv, NvNullObject);
301 NVDmaStart(pNv, NvImageBlit, NV_IMAGE_BLIT_SET_SURFACES_2D, 1);
302 NVDmaNext (pNv, NvContextSurfaces);
303 NVDmaStart(pNv, NvImageBlit, NV_IMAGE_BLIT_SET_CLIP_RECTANGLE, 3);
304 NVDmaNext (pNv, NvNullObject);
305 NVDmaNext (pNv, NvImagePattern);
306 NVDmaNext (pNv, NvRop);
307 NVDmaStart(pNv, NvImageBlit, NV_IMAGE_BLIT_OPERATION, 1);
308 NVDmaNext (pNv, 1 /* NV_IMAGE_BLIT_OPERATION_ROP_AND */);
310 if (pNv->WaitVSyncPossible) {
311 NVDmaStart(pNv, NvImageBlit, 0x0120, 3);
320 /* FLAGS_SRCCOPY, DmaFB, DmaFB, 0 */
322 NVAccelInitScaledImage(ScrnInfoPtr pScrn)
324 NVPtr pNv = NVPTR(pScrn);
325 static int have_object = FALSE;
328 switch (pNv->Architecture) {
330 class = NV04_SCALED_IMAGE_FROM_MEMORY;
335 class = NV10_SCALED_IMAGE_FROM_MEMORY;
339 class = NV10_SCALED_IMAGE_FROM_MEMORY | 0x3000;
344 if (!NVDmaCreateContextObject(pNv, NvScaledImage, class))
349 NVDmaStart(pNv, NvScaledImage,
350 NV04_SCALED_IMAGE_FROM_MEMORY_DMA_NOTIFY, 1);
351 NVDmaNext (pNv, NvDmaNotifier0);
352 NVDmaStart(pNv, NvScaledImage,
353 NV04_SCALED_IMAGE_FROM_MEMORY_DMA_IMAGE, 1);
354 NVDmaNext (pNv, NvDmaFB); /* source object */
355 NVDmaStart(pNv, NvScaledImage,
356 NV04_SCALED_IMAGE_FROM_MEMORY_SURFACE, 1);
357 NVDmaNext (pNv, NvContextSurfaces);
358 NVDmaStart(pNv, NvScaledImage,
359 NV04_SCALED_IMAGE_FROM_MEMORY_PATTERN, 1);
360 NVDmaNext (pNv, NvNullObject);
361 NVDmaStart(pNv, NvScaledImage,
362 NV04_SCALED_IMAGE_FROM_MEMORY_ROP, 1);
363 NVDmaNext (pNv, NvNullObject);
364 NVDmaStart(pNv, NvScaledImage,
365 NV04_SCALED_IMAGE_FROM_MEMORY_BETA1, 1); /* BETA1 */
366 NVDmaNext (pNv, NvContextBeta1);
367 NVDmaStart(pNv, NvScaledImage,
368 NV04_SCALED_IMAGE_FROM_MEMORY_BETA4, 1); /* BETA4 */
369 NVDmaNext (pNv, NvContextBeta4);
370 if (pNv->Architecture>=NV_ARCH_10)
372 NVDmaStart(pNv, NvScaledImage, 0x2fc, 1); /* NV05_SCALED_IMAGE_FROM_MEMORY_COLOR_CONVERSION */
373 NVDmaNext (pNv, 0); /* NV_063_SET_COLOR_CONVERSION_TYPE_DITHER */
375 NVDmaStart(pNv, NvScaledImage,
376 NV04_SCALED_IMAGE_FROM_MEMORY_OPERATION, 1);
377 NVDmaNext (pNv, 3 /* SRCCOPY */);
382 /* FLAGS_NONE, 0, 0, 0 */
384 NVAccelInitClipRectangle(ScrnInfoPtr pScrn)
386 NVPtr pNv = NVPTR(pScrn);
387 static int have_object = FALSE;
388 int class = NV01_CONTEXT_CLIP_RECTANGLE;
391 if (!NVDmaCreateContextObject(pNv, NvClipRectangle, class))
396 NVDmaStart(pNv, NvClipRectangle,
397 NV01_CONTEXT_CLIP_RECTANGLE_DMA_NOTIFY, 1);
398 NVDmaNext (pNv, NvNullObject);
403 /* FLAGS_ROP_AND | FLAGS_CLIP_ENABLE, 0, 0, 0 */
405 NVAccelInitSolidLine(ScrnInfoPtr pScrn)
407 NVPtr pNv = NVPTR(pScrn);
408 static int have_object = FALSE;
409 int class = NV04_SOLID_LINE;
412 if (!NVDmaCreateContextObject(pNv, NvSolidLine, class))
417 NVDmaStart(pNv, NvSolidLine, NV04_SOLID_LINE_CLIP_RECTANGLE, 3);
418 NVDmaNext (pNv, NvClipRectangle);
419 NVDmaNext (pNv, NvImagePattern);
420 NVDmaNext (pNv, NvRop);
421 NVDmaStart(pNv, NvSolidLine, NV04_SOLID_LINE_SURFACE, 1);
422 NVDmaNext (pNv, NvContextSurfaces);
423 NVDmaStart(pNv, NvSolidLine, NV04_SOLID_LINE_OPERATION, 1);
424 NVDmaNext (pNv, 1); /* ROP_AND */
429 /* FLAGS_NONE, NvDmaFB, NvDmaAGP, NvDmaNotifier0 */
431 NVAccelInitMemFormat(ScrnInfoPtr pScrn)
433 NVPtr pNv = NVPTR(pScrn);
434 static int have_object = FALSE;
437 if (pNv->Architecture < NV_ARCH_50)
438 class = NV_MEMORY_TO_MEMORY_FORMAT;
440 class = NV_MEMORY_TO_MEMORY_FORMAT | 0x5000;
443 if (!NVDmaCreateContextObject(pNv, NvMemFormat, class))
448 NVDmaStart(pNv, NvMemFormat,
449 NV_MEMORY_TO_MEMORY_FORMAT_DMA_NOTIFY, 1);
450 NVDmaNext (pNv, NvDmaNotifier0);
451 NVDmaStart(pNv, NvMemFormat,
452 NV_MEMORY_TO_MEMORY_FORMAT_OBJECT_IN, 2);
453 NVDmaNext (pNv, NvDmaFB);
454 NVDmaNext (pNv, NvDmaFB);
456 pNv->M2MFDirection = -1;
461 NVAccelInitImageFromCpu(ScrnInfoPtr pScrn)
463 NVPtr pNv = NVPTR(pScrn);
464 static int have_object = FALSE;
467 switch (pNv->Architecture) {
469 class = NV_IMAGE_FROM_CPU;
476 class = NV10_IMAGE_FROM_CPU;
481 if (!NVDmaCreateContextObject(pNv, NvImageFromCpu, class))
486 NVDmaStart(pNv, NvImageFromCpu, NV05_IMAGE_FROM_CPU_DMA_NOTIFY, 1);
487 NVDmaNext (pNv, NvDmaNotifier0);
488 NVDmaStart(pNv, NvImageFromCpu, NV05_IMAGE_FROM_CPU_CLIP_RECTANGLE, 1);
489 NVDmaNext (pNv, NvNullObject);
490 NVDmaStart(pNv, NvImageFromCpu, NV05_IMAGE_FROM_CPU_PATTERN, 1);
491 NVDmaNext (pNv, NvNullObject);
492 NVDmaStart(pNv, NvImageFromCpu, NV05_IMAGE_FROM_CPU_ROP, 1);
493 NVDmaNext (pNv, NvNullObject);
494 if (pNv->Architecture >= NV_ARCH_10)
496 NVDmaStart(pNv, NvImageFromCpu, NV05_IMAGE_FROM_CPU_BETA1, 1);
497 NVDmaNext (pNv, NvNullObject);
498 NVDmaStart(pNv, NvImageFromCpu, NV05_IMAGE_FROM_CPU_BETA4, 1);
499 NVDmaNext (pNv, NvNullObject);
501 NVDmaStart(pNv, NvImageFromCpu, NV05_IMAGE_FROM_CPU_SURFACE, 1);
502 NVDmaNext (pNv, NvContextSurfaces);
503 NVDmaStart(pNv, NvImageFromCpu, NV05_IMAGE_FROM_CPU_OPERATION, 1);
504 NVDmaNext (pNv, 3 /* SRCCOPY */);
509 NVAccelInit2D_NV50(ScrnInfoPtr pScrn)
511 NVPtr pNv = NVPTR(pScrn);
512 static int have_object = FALSE;
515 if (!NVDmaCreateContextObject(pNv, Nv2D, 0x502d))
520 NVDmaStart(pNv, Nv2D, 0x180, 3);
521 NVDmaNext (pNv, NvDmaNotifier0);
522 NVDmaNext (pNv, NvDmaFB);
523 NVDmaNext (pNv, NvDmaFB);
525 /* Magics from nv, no clue what they do, but at least some
526 * of them are needed to avoid crashes.
528 NVDmaStart(pNv, Nv2D, 0x260, 1);
530 NVDmaStart(pNv, Nv2D, 0x290, 1);
532 NVDmaStart(pNv, Nv2D, 0x29c, 1);
534 NVDmaStart(pNv, Nv2D, 0x58c, 1);
535 NVDmaNext (pNv, 0x111);
537 pNv->currentRop = 0xfffffffa;
541 #define INIT_CONTEXT_OBJECT(name) do { \
542 ret = NVAccelInit##name(pScrn); \
544 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \
545 "Failed to initialise context object: "#name \
552 NVAccelCommonInit(ScrnInfoPtr pScrn)
554 NVPtr pNv = NVPTR(pScrn);
556 if(pNv->NoAccel) return TRUE;
558 /* General engine objects */
559 INIT_CONTEXT_OBJECT(NullObject);
560 INIT_CONTEXT_OBJECT(DmaNotifier0);
563 if (pNv->Architecture < NV_ARCH_50) {
564 INIT_CONTEXT_OBJECT(ContextSurfaces);
565 INIT_CONTEXT_OBJECT(ContextBeta1);
566 INIT_CONTEXT_OBJECT(ContextBeta4);
567 INIT_CONTEXT_OBJECT(ImagePattern);
568 INIT_CONTEXT_OBJECT(RasterOp);
569 INIT_CONTEXT_OBJECT(Rectangle);
570 INIT_CONTEXT_OBJECT(ImageBlit);
571 INIT_CONTEXT_OBJECT(ScaledImage);
572 INIT_CONTEXT_OBJECT(ClipRectangle);
573 INIT_CONTEXT_OBJECT(SolidLine);
574 INIT_CONTEXT_OBJECT(ImageFromCpu);
576 INIT_CONTEXT_OBJECT(2D_NV50);
578 INIT_CONTEXT_OBJECT(MemFormat);
581 switch (pNv->Architecture) {
583 INIT_CONTEXT_OBJECT(NV40TCL);
586 INIT_CONTEXT_OBJECT(NV30TCL);
590 INIT_CONTEXT_OBJECT(NV10TCL);