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 if (pPix->drawable.type == DRAWABLE_WINDOW) {
27 offset = pNv->FB->offset;
29 offset = (uint32_t)((unsigned long)pPix->devPrivate.ptr -
30 (unsigned long)pNv->FB->map);
31 offset += pNv->FB->offset;
38 NVAccelInitDmaNotifier0(ScrnInfoPtr pScrn)
40 NVPtr pNv = NVPTR(pScrn);
41 static int have_object = FALSE;
44 pNv->Notifier0 = NVNotifierAlloc(pScrn, NvDmaNotifier0);
53 /* FLAGS_ROP_AND, DmaFB, DmaFB, 0 */
55 NVAccelInitContextSurfaces(ScrnInfoPtr pScrn)
57 NVPtr pNv = NVPTR(pScrn);
58 static int have_object = FALSE;
61 class = (pNv->Architecture >= NV_10) ? NV10_CONTEXT_SURFACES_2D :
65 if (!NVDmaCreateContextObject(pNv, NvContextSurfaces, class))
70 NVDmaStart(pNv, NvContextSurfaces, NV04_SURFACE_DMA_NOTIFY, 1);
71 NVDmaNext (pNv, NvNullObject);
72 NVDmaStart(pNv, NvContextSurfaces, NV04_SURFACE_DMA_IMAGE_SOURCE, 2);
73 NVDmaNext (pNv, NvDmaFB);
74 NVDmaNext (pNv, NvDmaFB);
80 NVAccelGetCtxSurf2DFormatFromPixmap(PixmapPtr pPix, int *fmt_ret)
82 switch (pPix->drawable.bitsPerPixel) {
84 *fmt_ret = SURFACE_FORMAT_A8R8G8B8;
87 *fmt_ret = SURFACE_FORMAT_X8R8G8B8;
90 *fmt_ret = SURFACE_FORMAT_R5G6B5;
93 *fmt_ret = SURFACE_FORMAT_Y8;
103 NVAccelGetCtxSurf2DFormatFromPicture(PicturePtr pPict, int *fmt_ret)
105 switch (pPict->format) {
107 *fmt_ret = SURFACE_FORMAT_A8R8G8B8;
110 *fmt_ret = SURFACE_FORMAT_X8R8G8B8;
113 *fmt_ret = SURFACE_FORMAT_R5G6B5;
116 *fmt_ret = SURFACE_FORMAT_Y8;
126 NVAccelSetCtxSurf2D(PixmapPtr psPix, PixmapPtr pdPix, int format)
128 ScrnInfoPtr pScrn = xf86Screens[psPix->drawable.pScreen->myNum];
129 NVPtr pNv = NVPTR(pScrn);
131 NVDmaStart(pNv, NvContextSurfaces, SURFACE_FORMAT, 4);
132 NVDmaNext (pNv, format);
133 NVDmaNext (pNv, ((uint32_t)exaGetPixmapPitch(pdPix) << 16) |
134 (uint32_t)exaGetPixmapPitch(psPix));
135 NVDmaNext (pNv, NVAccelGetPixmapOffset(psPix));
136 NVDmaNext (pNv, NVAccelGetPixmapOffset(pdPix));
141 /* FLAGS_ROP_AND|FLAGS_MONO, 0, 0, 0 */
143 NVAccelInitImagePattern(ScrnInfoPtr pScrn)
145 NVPtr pNv = NVPTR(pScrn);
146 static int have_object = FALSE;
149 class = NV04_IMAGE_PATTERN;
152 if (!NVDmaCreateContextObject(pNv, NvImagePattern, class))
157 NVDmaStart(pNv, NvImagePattern,
158 0x180, /*NV04_IMAGE_PATTERN_SET_DMA_NOTIFY*/ 1);
159 NVDmaNext (pNv, NvNullObject);
160 NVDmaStart(pNv, NvImagePattern, NV04_IMAGE_PATTERN_MONO_FORMAT, 3);
161 #if X_BYTE_ORDER == X_BIG_ENDIAN
162 NVDmaNext (pNv, 2 /* NV04_IMAGE_PATTERN_BIGENDIAN/LE_M1 */);
164 NVDmaNext (pNv, 1 /* NV04_IMAGE_PATTERN_LOWENDIAN/CGA6_M1 */);
166 NVDmaNext (pNv, 0 /* NV04_IMAGE_PATTERN_MONOCHROME_SHAPE_8X8 */);
167 NVDmaNext (pNv, 1 /* NV04_IMAGE_PATTERN_SELECT_MONOCHROME */);
172 /* FLAGS_ROP_AND, 0, 0, 0 */
174 NVAccelInitRasterOp(ScrnInfoPtr pScrn)
176 NVPtr pNv = NVPTR(pScrn);
177 static int have_object = FALSE;
180 class = NV03_PRIMITIVE_RASTER_OP;
183 if (!NVDmaCreateContextObject(pNv, NvRop, class))
188 NVDmaStart(pNv, NvRop, NV03_PRIMITIVE_RASTER_OP_DMA_NOTIFY, 1);
189 NVDmaNext (pNv, NvNullObject);
194 /* FLAGS_ROP_AND | FLAGS_MONO, 0, 0, 0 */
196 NVAccelInitRectangle(ScrnInfoPtr pScrn)
198 NVPtr pNv = NVPTR(pScrn);
199 static int have_object = FALSE;
202 class = NV04_GDI_RECTANGLE_TEXT;
205 if (!NVDmaCreateContextObject(pNv, NvRectangle, class))
210 NVDmaStart(pNv, NvRectangle,
211 NV04_GDI_RECTANGLE_TEXT_SET_DMA_NOTIFY, 1);
212 NVDmaNext (pNv, NvDmaNotifier0);
213 NVDmaStart(pNv, NvRectangle,
214 0x184 /*NV04_GDI_RECTANGLE_TEXT_SET_DMA_FONTS*/, 1);
215 NVDmaNext (pNv, NvNullObject);
216 NVDmaStart(pNv, NvRectangle, NV04_GDI_RECTANGLE_TEXT_SURFACE, 1);
217 NVDmaNext (pNv, NvContextSurfaces);
218 NVDmaStart(pNv, NvRectangle, NV04_GDI_RECTANGLE_TEXT_ROP5, 1);
219 NVDmaNext (pNv, NvRop);
220 NVDmaStart(pNv, NvRectangle, NV04_GDI_RECTANGLE_TEXT_PATTERN, 1);
221 NVDmaNext (pNv, NvImagePattern);
222 NVDmaStart(pNv, NvRectangle, NV04_GDI_RECTANGLE_TEXT_OPERATION, 1);
223 NVDmaNext (pNv, 1 /* ROP_AND */);
224 NVDmaStart(pNv, NvRectangle,
225 0x304 /*NV04_GDI_RECTANGLE_TEXT_MONO_FORMAT*/, 1);
226 /* XXX why putting 1 like renouveau dump, swap the text */
227 #if 1 || X_BYTE_ORDER == X_BIG_ENDIAN
228 NVDmaNext (pNv, 2 /* NV04_GDI_RECTANGLE_BIGENDIAN/LE_M1 */);
230 NVDmaNext (pNv, 1 /* NV04_GDI_RECTANGLE_LOWENDIAN/CGA6_M1 */);
236 /* FLAGS_ROP_AND, DmaFB, DmaFB, 0 */
238 NVAccelInitImageBlit(ScrnInfoPtr pScrn)
240 NVPtr pNv = NVPTR(pScrn);
241 static int have_object = FALSE;
244 class = (pNv->WaitVSyncPossible) ? NV10_IMAGE_BLIT : NV_IMAGE_BLIT;
247 if (!NVDmaCreateContextObject(pNv, NvImageBlit, class))
252 NVDmaStart(pNv, NvImageBlit, NV_IMAGE_BLIT_DMA_NOTIFY, 1);
253 NVDmaNext (pNv, NvDmaNotifier0);
254 NVDmaStart(pNv, NvImageBlit, NV_IMAGE_BLIT_COLOR_KEY, 1);
255 NVDmaNext (pNv, NvNullObject);
256 NVDmaStart(pNv, NvImageBlit, NV_IMAGE_BLIT_SURFACE, 1);
257 NVDmaNext (pNv, NvContextSurfaces);
258 NVDmaStart(pNv, NvImageBlit, NV_IMAGE_BLIT_CLIP_RECTANGLE, 3);
259 NVDmaNext (pNv, NvNullObject);
260 NVDmaNext (pNv, NvImagePattern);
261 NVDmaNext (pNv, NvRop);
262 NVDmaStart(pNv, NvImageBlit, NV_IMAGE_BLIT_OPERATION, 1);
263 NVDmaNext (pNv, 1 /* NV_IMAGE_BLIT_OPERATION_ROP_AND */);
265 if (pNv->WaitVSyncPossible) {
266 NVDmaStart(pNv, NvImageBlit, 0x0120, 3);
275 /* FLAGS_SRCCOPY, DmaFB, DmaFB, 0 */
277 NVAccelInitScaledImage(ScrnInfoPtr pScrn)
279 NVPtr pNv = NVPTR(pScrn);
280 static int have_object = FALSE;
283 switch (pNv->Architecture) {
285 class = NV04_SCALED_IMAGE_FROM_MEMORY;
290 class = NV10_SCALED_IMAGE_FROM_MEMORY;
294 class = NV10_SCALED_IMAGE_FROM_MEMORY | 0x3000;
299 if (!NVDmaCreateContextObject(pNv, NvScaledImage, class))
304 NVDmaStart(pNv, NvScaledImage,
305 NV04_SCALED_IMAGE_FROM_MEMORY_DMA_NOTIFY, 1);
306 NVDmaNext (pNv, NvDmaNotifier0);
307 NVDmaStart(pNv, NvScaledImage,
308 NV04_SCALED_IMAGE_FROM_MEMORY_DMA_IMAGE, 1);
309 NVDmaNext (pNv, NvDmaFB); /* source object */
310 NVDmaStart(pNv, NvScaledImage,
311 NV04_SCALED_IMAGE_FROM_MEMORY_SURFACE, 1);
312 NVDmaNext (pNv, NvContextSurfaces);
313 NVDmaStart(pNv, NvScaledImage, 0x188, 1); /* PATTERN */
314 NVDmaNext (pNv, NvNullObject);
315 NVDmaStart(pNv, NvScaledImage, 0x18c, 1); /* ROP */
316 NVDmaNext (pNv, NvNullObject);
317 NVDmaStart(pNv, NvScaledImage, 0x190, 1); /* BETA1 */
318 NVDmaNext (pNv, NvNullObject);
319 NVDmaStart(pNv, NvScaledImage, 0x194, 1); /* BETA4 */
320 NVDmaNext (pNv, NvNullObject);
321 NVDmaStart(pNv, NvScaledImage,
322 NV04_SCALED_IMAGE_FROM_MEMORY_OPERATION, 1);
323 NVDmaNext (pNv, 3 /* SRCCOPY */);
328 /* FLAGS_NONE, 0, 0, 0 */
330 NVAccelInitClipRectangle(ScrnInfoPtr pScrn)
332 NVPtr pNv = NVPTR(pScrn);
333 static int have_object = FALSE;
334 int class = NV01_CONTEXT_CLIP_RECTANGLE;
337 if (!NVDmaCreateContextObject(pNv, NvClipRectangle, class))
342 NVDmaStart(pNv, NvClipRectangle, 0x180, 1); /* DMA_NOTIFY */
343 NVDmaNext (pNv, NvNullObject);
348 /* FLAGS_ROP_AND | FLAGS_CLIP_ENABLE, 0, 0, 0 */
350 NVAccelInitSolidLine(ScrnInfoPtr pScrn)
352 NVPtr pNv = NVPTR(pScrn);
353 static int have_object = FALSE;
354 int class = NV04_SOLID_LINE;
357 if (!NVDmaCreateContextObject(pNv, NvSolidLine, class))
362 NVDmaStart(pNv, NvSolidLine, NV04_SOLID_LINE_CLIP_RECTANGLE, 3);
363 NVDmaNext (pNv, NvClipRectangle);
364 NVDmaNext (pNv, NvImagePattern);
365 NVDmaNext (pNv, NvRop);
366 NVDmaStart(pNv, NvSolidLine, NV04_SOLID_LINE_SURFACE, 1);
367 NVDmaNext (pNv, NvContextSurfaces);
368 NVDmaStart(pNv, NvSolidLine, NV04_SOLID_LINE_OPERATION, 1);
369 NVDmaNext (pNv, 1); /* ROP_AND */
374 /* FLAGS_NONE, NvDmaFB, NvDmaAGP, NvDmaNotifier0 */
376 NVAccelInitMemFormat(ScrnInfoPtr pScrn)
378 NVPtr pNv = NVPTR(pScrn);
379 static int have_object = FALSE;
382 class = NV_MEMORY_TO_MEMORY_FORMAT;
385 if (!NVDmaCreateContextObject(pNv, NvMemFormat, class))
390 NVDmaStart(pNv, NvMemFormat,
391 NV_MEMORY_TO_MEMORY_FORMAT_DMA_NOTIFY, 1);
392 NVDmaNext (pNv, NvDmaNotifier0);
393 NVDmaStart(pNv, NvMemFormat,
394 NV_MEMORY_TO_MEMORY_FORMAT_OBJECT_IN, 2);
395 NVDmaNext (pNv, NvDmaFB);
396 NVDmaNext (pNv, NvDmaFB);
398 pNv->M2MFDirection = -1;
403 NVAccelInitImageFromCpu(ScrnInfoPtr pScrn)
405 NVPtr pNv = NVPTR(pScrn);
406 static int have_object = FALSE;
409 switch (pNv->Architecture) {
411 class = NV05_IMAGE_FROM_CPU;
418 class = NV10_IMAGE_FROM_CPU;
423 if (!NVDmaCreateContextObject(pNv, NvImageFromCpu, class))
428 NVDmaStart(pNv, NvImageFromCpu, NV05_IMAGE_FROM_CPU_DMA_NOTIFY, 1);
429 NVDmaNext (pNv, NvDmaNotifier0);
430 NVDmaStart(pNv, NvImageFromCpu, NV05_IMAGE_FROM_CPU_CLIP_RECTANGLE, 1);
431 NVDmaNext (pNv, NvNullObject);
432 NVDmaStart(pNv, NvImageFromCpu, NV05_IMAGE_FROM_CPU_PATTERN, 1); /* PATTERN */
433 NVDmaNext (pNv, NvNullObject);
434 NVDmaStart(pNv, NvImageFromCpu, NV05_IMAGE_FROM_CPU_ROP, 1); /* ROP */
435 NVDmaNext (pNv, NvNullObject);
436 NVDmaStart(pNv, NvImageFromCpu, 0x194, 1); /* BETA1 */
437 NVDmaNext (pNv, NvNullObject);
438 NVDmaStart(pNv, NvImageFromCpu, 0x198, 1); /* BETA4 */
439 NVDmaNext (pNv, NvNullObject);
440 NVDmaStart(pNv, NvImageFromCpu, NV05_IMAGE_FROM_CPU_SURFACE, 1);
441 NVDmaNext (pNv, NvContextSurfaces);
442 NVDmaStart(pNv, NvImageFromCpu, NV05_IMAGE_FROM_CPU_OPERATION, 1);
443 NVDmaNext (pNv, 3 /* SRCCOPY */);
447 #define INIT_CONTEXT_OBJECT(name) do { \
448 ret = NVAccelInit##name(pScrn); \
450 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \
451 "Failed to initialise context object: "#name \
458 NVAccelCommonInit(ScrnInfoPtr pScrn)
460 NVPtr pNv = NVPTR(pScrn);
462 if(pNv->NoAccel) return TRUE;
464 INIT_CONTEXT_OBJECT(NullObject);
465 INIT_CONTEXT_OBJECT(DmaNotifier0);
467 INIT_CONTEXT_OBJECT(ContextSurfaces);
468 INIT_CONTEXT_OBJECT(ImagePattern);
469 INIT_CONTEXT_OBJECT(RasterOp);
470 INIT_CONTEXT_OBJECT(Rectangle);
471 INIT_CONTEXT_OBJECT(ImageBlit);
472 INIT_CONTEXT_OBJECT(ScaledImage);
475 INIT_CONTEXT_OBJECT(ClipRectangle);
476 INIT_CONTEXT_OBJECT(SolidLine);
479 INIT_CONTEXT_OBJECT(MemFormat);
480 INIT_CONTEXT_OBJECT(ImageFromCpu);
483 switch (pNv->Architecture) {
485 INIT_CONTEXT_OBJECT(NV40TCL);