2 * Copyright 2007 Ben Skeggs
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
19 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 #include "nv_include.h"
26 NVAccelInitNullObject(ScrnInfoPtr pScrn)
28 NVPtr pNv = NVPTR(pScrn);
29 static int have_object = FALSE;
32 if (!NVDmaCreateContextObject(pNv, NvNullObject, NV01_NULL))
41 NVAccelGetPixmapOffset(PixmapPtr pPix)
43 ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum];
44 NVPtr pNv = NVPTR(pScrn);
47 offset = exaGetPixmapOffset(pPix);
48 if (offset >= pNv->FB->size) {
49 xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
50 "AII, passed bad pixmap: offset 0x%lx\n", offset);
51 return pNv->FB->offset;
53 offset += pNv->FB->offset;
59 NVAccelInitDmaNotifier0(ScrnInfoPtr pScrn)
61 NVPtr pNv = NVPTR(pScrn);
62 static int have_object = FALSE;
65 pNv->Notifier0 = NVNotifierAlloc(pScrn, NvDmaNotifier0);
74 /* FLAGS_ROP_AND, DmaFB, DmaFB, 0 */
76 NVAccelInitContextSurfaces(ScrnInfoPtr pScrn)
78 NVPtr pNv = NVPTR(pScrn);
79 static int have_object = FALSE;
82 class = (pNv->Architecture >= NV_10) ? NV10_CONTEXT_SURFACES_2D :
83 NV04_CONTEXT_SURFACES_2D;
86 if (!NVDmaCreateContextObject(pNv, NvContextSurfaces, class))
91 BEGIN_RING(NvContextSurfaces, NV04_CONTEXT_SURFACES_2D_DMA_NOTIFY, 1);
92 OUT_RING (NvNullObject);
93 BEGIN_RING(NvContextSurfaces,
94 NV04_CONTEXT_SURFACES_2D_DMA_IMAGE_SOURCE, 2);
101 /* FLAGS_ROP_AND, DmaFB, DmaFB, 0 */
103 NVAccelInitContextBeta1(ScrnInfoPtr pScrn)
105 NVPtr pNv = NVPTR(pScrn);
106 static int have_object = FALSE;
112 if (!NVDmaCreateContextObject(pNv, NvContextBeta1, class))
117 BEGIN_RING(NvContextBeta1, 0x300, 1); /*alpha factor*/
118 OUT_RING (0xff << 23);
125 NVAccelInitContextBeta4(ScrnInfoPtr pScrn)
127 NVPtr pNv = NVPTR(pScrn);
128 static int have_object = FALSE;
134 if (!NVDmaCreateContextObject(pNv, NvContextBeta4, class))
139 BEGIN_RING(NvContextBeta4, 0x300, 1); /*RGBA factor*/
140 OUT_RING (0xffff0000);
145 NVAccelGetCtxSurf2DFormatFromPixmap(PixmapPtr pPix, int *fmt_ret)
147 switch (pPix->drawable.bitsPerPixel) {
149 *fmt_ret = NV04_CONTEXT_SURFACES_2D_FORMAT_A8R8G8B8;
152 *fmt_ret = NV04_CONTEXT_SURFACES_2D_FORMAT_X8R8G8B8_Z8R8G8B8;
155 *fmt_ret = NV04_CONTEXT_SURFACES_2D_FORMAT_R5G6B5;
158 *fmt_ret = NV04_CONTEXT_SURFACES_2D_FORMAT_Y8;
168 NVAccelGetCtxSurf2DFormatFromPicture(PicturePtr pPict, int *fmt_ret)
170 switch (pPict->format) {
172 *fmt_ret = NV04_CONTEXT_SURFACES_2D_FORMAT_A8R8G8B8;
175 *fmt_ret = NV04_CONTEXT_SURFACES_2D_FORMAT_X8R8G8B8_Z8R8G8B8;
178 *fmt_ret = NV04_CONTEXT_SURFACES_2D_FORMAT_R5G6B5;
181 *fmt_ret = NV04_CONTEXT_SURFACES_2D_FORMAT_Y8;
191 NVAccelSetCtxSurf2D(PixmapPtr psPix, PixmapPtr pdPix, int format)
193 ScrnInfoPtr pScrn = xf86Screens[psPix->drawable.pScreen->myNum];
194 NVPtr pNv = NVPTR(pScrn);
196 BEGIN_RING(NvContextSurfaces, NV04_CONTEXT_SURFACES_2D_FORMAT, 4);
198 OUT_RING (((uint32_t)exaGetPixmapPitch(pdPix) << 16) |
199 (uint32_t)exaGetPixmapPitch(psPix));
200 OUT_RING (NVAccelGetPixmapOffset(psPix));
201 OUT_RING (NVAccelGetPixmapOffset(pdPix));
207 NVAccelInitImagePattern(ScrnInfoPtr pScrn)
209 NVPtr pNv = NVPTR(pScrn);
210 static int have_object = FALSE;
213 class = NV04_IMAGE_PATTERN;
216 if (!NVDmaCreateContextObject(pNv, NvImagePattern, class))
221 BEGIN_RING(NvImagePattern, NV04_IMAGE_PATTERN_DMA_NOTIFY, 1);
222 OUT_RING (NvNullObject);
223 BEGIN_RING(NvImagePattern, NV04_IMAGE_PATTERN_MONOCHROME_FORMAT, 3);
224 #if X_BYTE_ORDER == X_BIG_ENDIAN
225 OUT_RING (NV04_IMAGE_PATTERN_MONOCHROME_FORMAT_LE);
227 OUT_RING (NV04_IMAGE_PATTERN_MONOCHROME_FORMAT_CGA6);
229 OUT_RING (NV04_IMAGE_PATTERN_MONOCHROME_SHAPE_8X8);
230 OUT_RING (NV04_IMAGE_PATTERN_PATTERN_SELECT_MONO);
236 NVAccelInitRasterOp(ScrnInfoPtr pScrn)
238 NVPtr pNv = NVPTR(pScrn);
239 static int have_object = FALSE;
242 class = NV03_CONTEXT_ROP;
245 if (!NVDmaCreateContextObject(pNv, NvRop, class))
250 BEGIN_RING(NvRop, NV03_CONTEXT_ROP_DMA_NOTIFY, 1);
251 OUT_RING (NvNullObject);
253 pNv->currentRop = ~0;
258 NVAccelInitRectangle(ScrnInfoPtr pScrn)
260 NVPtr pNv = NVPTR(pScrn);
261 static int have_object = FALSE;
264 class = NV04_GDI_RECTANGLE_TEXT;
267 if (!NVDmaCreateContextObject(pNv, NvRectangle, class))
272 BEGIN_RING(NvRectangle, NV04_GDI_RECTANGLE_TEXT_DMA_NOTIFY, 1);
273 OUT_RING (NvDmaNotifier0);
274 BEGIN_RING(NvRectangle, NV04_GDI_RECTANGLE_TEXT_DMA_FONTS, 1);
275 OUT_RING (NvNullObject);
276 BEGIN_RING(NvRectangle, NV04_GDI_RECTANGLE_TEXT_SURFACE, 1);
277 OUT_RING (NvContextSurfaces);
278 BEGIN_RING(NvRectangle, NV04_GDI_RECTANGLE_TEXT_ROP, 1);
280 BEGIN_RING(NvRectangle, NV04_GDI_RECTANGLE_TEXT_PATTERN, 1);
281 OUT_RING (NvImagePattern);
282 BEGIN_RING(NvRectangle, NV04_GDI_RECTANGLE_TEXT_OPERATION, 1);
283 OUT_RING (NV04_GDI_RECTANGLE_TEXT_OPERATION_ROP_AND);
284 BEGIN_RING(NvRectangle, NV04_GDI_RECTANGLE_TEXT_MONOCHROME_FORMAT, 1);
285 /* XXX why putting 1 like renouveau dump, swap the text */
286 #if 1 || X_BYTE_ORDER == X_BIG_ENDIAN
287 OUT_RING (NV04_GDI_RECTANGLE_TEXT_MONOCHROME_FORMAT_LE);
289 OUT_RING (NV04_GDI_RECTANGLE_TEXT_MONOCHROME_FORMAT_CGA6);
296 NVAccelInitImageBlit(ScrnInfoPtr pScrn)
298 NVPtr pNv = NVPTR(pScrn);
299 static int have_object = FALSE;
302 class = (pNv->WaitVSyncPossible) ? NV12_IMAGE_BLIT : NV_IMAGE_BLIT;
305 if (!NVDmaCreateContextObject(pNv, NvImageBlit, class))
310 BEGIN_RING(NvImageBlit, NV_IMAGE_BLIT_DMA_NOTIFY, 1);
311 OUT_RING (NvDmaNotifier0);
312 BEGIN_RING(NvImageBlit, NV_IMAGE_BLIT_COLOR_KEY, 1);
313 OUT_RING (NvNullObject);
314 BEGIN_RING(NvImageBlit, NV_IMAGE_BLIT_SURFACE, 1);
315 OUT_RING (NvContextSurfaces);
316 BEGIN_RING(NvImageBlit, NV_IMAGE_BLIT_CLIP_RECTANGLE, 3);
317 OUT_RING (NvNullObject);
318 OUT_RING (NvImagePattern);
320 BEGIN_RING(NvImageBlit, NV_IMAGE_BLIT_OPERATION, 1);
321 OUT_RING (NV_IMAGE_BLIT_OPERATION_ROP_AND);
323 if (pNv->WaitVSyncPossible) {
324 BEGIN_RING(NvImageBlit, 0x0120, 3);
334 NVAccelInitScaledImage(ScrnInfoPtr pScrn)
336 NVPtr pNv = NVPTR(pScrn);
337 static int have_object = FALSE;
340 switch (pNv->Architecture) {
342 class = NV04_SCALED_IMAGE_FROM_MEMORY;
347 class = NV10_SCALED_IMAGE_FROM_MEMORY;
351 class = NV10_SCALED_IMAGE_FROM_MEMORY | 0x3000;
356 if (!NVDmaCreateContextObject(pNv, NvScaledImage, class))
361 BEGIN_RING(NvScaledImage,
362 NV04_SCALED_IMAGE_FROM_MEMORY_DMA_NOTIFY, 7);
363 OUT_RING (NvDmaNotifier0);
365 OUT_RING (NvNullObject);
366 OUT_RING (NvNullObject);
367 OUT_RING (NvContextBeta1);
368 OUT_RING (NvContextBeta4);
369 OUT_RING (NvContextSurfaces);
370 if (pNv->Architecture>=NV_ARCH_10) {
371 BEGIN_RING(NvScaledImage,
372 NV04_SCALED_IMAGE_FROM_MEMORY_COLOR_CONVERSION, 1);
373 OUT_RING (NV04_SCALED_IMAGE_FROM_MEMORY_COLOR_CONVERSION_DITHER);
375 BEGIN_RING(NvScaledImage, NV04_SCALED_IMAGE_FROM_MEMORY_OPERATION, 1);
376 OUT_RING (NV04_SCALED_IMAGE_FROM_MEMORY_OPERATION_SRCCOPY);
382 NVAccelInitClipRectangle(ScrnInfoPtr pScrn)
384 NVPtr pNv = NVPTR(pScrn);
385 static int have_object = FALSE;
386 int class = NV01_CONTEXT_CLIP_RECTANGLE;
389 if (!NVDmaCreateContextObject(pNv, NvClipRectangle, class))
394 BEGIN_RING(NvClipRectangle, NV01_CONTEXT_CLIP_RECTANGLE_DMA_NOTIFY, 1);
395 OUT_RING (NvNullObject);
401 NVAccelInitSolidLine(ScrnInfoPtr pScrn)
403 NVPtr pNv = NVPTR(pScrn);
404 static int have_object = FALSE;
405 int class = NV04_RENDER_SOLID_LINE;
408 if (!NVDmaCreateContextObject(pNv, NvSolidLine, class))
413 BEGIN_RING(NvSolidLine, NV01_RENDER_SOLID_LINE_CLIP_RECTANGLE, 3);
414 OUT_RING (NvClipRectangle);
415 OUT_RING (NvImagePattern);
417 BEGIN_RING(NvSolidLine, NV04_RENDER_SOLID_LINE_SURFACE, 1);
418 OUT_RING (NvContextSurfaces);
419 BEGIN_RING(NvSolidLine, NV01_RENDER_SOLID_LINE_OPERATION, 1);
420 OUT_RING (NV01_RENDER_SOLID_LINE_OPERATION_ROP_AND);
425 /* FLAGS_NONE, NvDmaFB, NvDmaAGP, NvDmaNotifier0 */
427 NVAccelInitMemFormat(ScrnInfoPtr pScrn)
429 NVPtr pNv = NVPTR(pScrn);
430 static int have_object = FALSE;
433 if (pNv->Architecture < NV_ARCH_50)
434 class = NV_MEMORY_TO_MEMORY_FORMAT;
436 class = NV50_MEMORY_TO_MEMORY_FORMAT;
439 if (!NVDmaCreateContextObject(pNv, NvMemFormat, class))
444 BEGIN_RING(NvMemFormat, NV_MEMORY_TO_MEMORY_FORMAT_DMA_NOTIFY, 1);
445 OUT_RING (NvDmaNotifier0);
446 BEGIN_RING(NvMemFormat, NV_MEMORY_TO_MEMORY_FORMAT_DMA_BUFFER_IN, 2);
450 pNv->M2MFDirection = -1;
455 NVAccelInitImageFromCpu(ScrnInfoPtr pScrn)
457 NVPtr pNv = NVPTR(pScrn);
458 static int have_object = FALSE;
461 switch (pNv->Architecture) {
463 class = NV05_IMAGE_FROM_CPU;
470 class = NV10_IMAGE_FROM_CPU;
475 if (!NVDmaCreateContextObject(pNv, NvImageFromCpu, class))
480 BEGIN_RING(NvImageFromCpu, NV01_IMAGE_FROM_CPU_DMA_NOTIFY, 1);
481 OUT_RING (NvDmaNotifier0);
482 BEGIN_RING(NvImageFromCpu, NV01_IMAGE_FROM_CPU_CLIP_RECTANGLE, 1);
483 OUT_RING (NvNullObject);
484 BEGIN_RING(NvImageFromCpu, NV01_IMAGE_FROM_CPU_PATTERN, 1);
485 OUT_RING (NvNullObject);
486 BEGIN_RING(NvImageFromCpu, NV01_IMAGE_FROM_CPU_ROP, 1);
487 OUT_RING (NvNullObject);
488 if (pNv->Architecture >= NV_ARCH_10)
490 BEGIN_RING(NvImageFromCpu, NV01_IMAGE_FROM_CPU_BETA1, 1);
491 OUT_RING (NvNullObject);
492 BEGIN_RING(NvImageFromCpu, NV05_IMAGE_FROM_CPU_BETA4, 1);
493 OUT_RING (NvNullObject);
495 BEGIN_RING(NvImageFromCpu, NV05_IMAGE_FROM_CPU_SURFACE, 1);
496 OUT_RING (NvContextSurfaces);
497 BEGIN_RING(NvImageFromCpu, NV01_IMAGE_FROM_CPU_OPERATION, 1);
498 OUT_RING (NV01_IMAGE_FROM_CPU_OPERATION_SRCCOPY);
503 NVAccelInit2D_NV50(ScrnInfoPtr pScrn)
505 NVPtr pNv = NVPTR(pScrn);
506 static int have_object = FALSE;
509 if (!NVDmaCreateContextObject(pNv, Nv2D, 0x502d))
514 BEGIN_RING(Nv2D, 0x180, 3);
515 OUT_RING (NvDmaNotifier0);
519 /* Magics from nv, no clue what they do, but at least some
520 * of them are needed to avoid crashes.
522 BEGIN_RING(Nv2D, 0x260, 1);
524 BEGIN_RING(Nv2D, 0x290, 1);
526 BEGIN_RING(Nv2D, 0x29c, 1);
528 BEGIN_RING(Nv2D, 0x58c, 1);
531 pNv->currentRop = 0xfffffffa;
535 #define INIT_CONTEXT_OBJECT(name) do { \
536 ret = NVAccelInit##name(pScrn); \
538 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \
539 "Failed to initialise context object: "#name \
546 NVAccelCommonInit(ScrnInfoPtr pScrn)
548 NVPtr pNv = NVPTR(pScrn);
550 if(pNv->NoAccel) return TRUE;
552 /* General engine objects */
553 INIT_CONTEXT_OBJECT(NullObject);
554 INIT_CONTEXT_OBJECT(DmaNotifier0);
557 if (pNv->Architecture < NV_ARCH_50) {
558 INIT_CONTEXT_OBJECT(ContextSurfaces);
559 INIT_CONTEXT_OBJECT(ContextBeta1);
560 INIT_CONTEXT_OBJECT(ContextBeta4);
561 INIT_CONTEXT_OBJECT(ImagePattern);
562 INIT_CONTEXT_OBJECT(RasterOp);
563 INIT_CONTEXT_OBJECT(Rectangle);
564 INIT_CONTEXT_OBJECT(ImageBlit);
565 INIT_CONTEXT_OBJECT(ScaledImage);
566 INIT_CONTEXT_OBJECT(ClipRectangle);
567 INIT_CONTEXT_OBJECT(SolidLine);
568 INIT_CONTEXT_OBJECT(ImageFromCpu);
570 INIT_CONTEXT_OBJECT(2D_NV50);
572 INIT_CONTEXT_OBJECT(MemFormat);
575 switch (pNv->Architecture) {
577 INIT_CONTEXT_OBJECT(NV40TCL);
580 INIT_CONTEXT_OBJECT(NV30TCL);
584 INIT_CONTEXT_OBJECT(NV10TCL);