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 NVDmaSetObjectOnSubchannel(pNv, NvSubContextSurfaces,
72 NVDmaStart(pNv, NvSubContextSurfaces, NV04_SURFACE_DMA_NOTIFY, 1);
73 NVDmaNext (pNv, NvNullObject);
74 NVDmaStart(pNv, NvSubContextSurfaces, NV04_SURFACE_DMA_IMAGE_SOURCE, 2);
75 NVDmaNext (pNv, NvDmaFB);
76 NVDmaNext (pNv, NvDmaFB);
82 NVAccelGetCtxSurf2DFormatFromPixmap(PixmapPtr pPix, int *fmt_ret)
84 switch (pPix->drawable.bitsPerPixel) {
86 *fmt_ret = SURFACE_FORMAT_A8R8G8B8;
89 *fmt_ret = SURFACE_FORMAT_X8R8G8B8;
92 *fmt_ret = SURFACE_FORMAT_R5G6B5;
95 *fmt_ret = SURFACE_FORMAT_Y8;
105 NVAccelGetCtxSurf2DFormatFromPicture(PicturePtr pPict, int *fmt_ret)
107 switch (pPict->format) {
109 *fmt_ret = SURFACE_FORMAT_A8R8G8B8;
112 *fmt_ret = SURFACE_FORMAT_X8R8G8B8;
115 *fmt_ret = SURFACE_FORMAT_R5G6B5;
118 *fmt_ret = SURFACE_FORMAT_Y8;
128 NVAccelSetCtxSurf2D(PixmapPtr psPix, PixmapPtr pdPix, int format)
130 ScrnInfoPtr pScrn = xf86Screens[psPix->drawable.pScreen->myNum];
131 NVPtr pNv = NVPTR(pScrn);
133 NVDmaStart(pNv, NvSubContextSurfaces, SURFACE_FORMAT, 4);
134 NVDmaNext (pNv, format);
135 NVDmaNext (pNv, ((uint32_t)exaGetPixmapPitch(pdPix) << 16) |
136 (uint32_t)exaGetPixmapPitch(psPix));
137 NVDmaNext (pNv, NVAccelGetPixmapOffset(psPix));
138 NVDmaNext (pNv, NVAccelGetPixmapOffset(pdPix));
143 /* FLAGS_ROP_AND|FLAGS_MONO, 0, 0, 0 */
145 NVAccelInitImagePattern(ScrnInfoPtr pScrn)
147 NVPtr pNv = NVPTR(pScrn);
148 static int have_object = FALSE;
151 class = NV04_IMAGE_PATTERN;
154 if (!NVDmaCreateContextObject(pNv, NvImagePattern, class))
159 NVDmaSetObjectOnSubchannel(pNv, NvSubImagePattern,
161 NVDmaStart(pNv, NvSubImagePattern,
162 0x180, /*NV04_IMAGE_PATTERN_SET_DMA_NOTIFY*/ 1);
163 NVDmaNext (pNv, NvNullObject);
164 NVDmaStart(pNv, NvSubImagePattern, NV04_IMAGE_PATTERN_MONO_FORMAT, 3);
165 #if X_BYTE_ORDER == X_BIG_ENDIAN
166 NVDmaNext (pNv, 2 /* NV04_IMAGE_PATTERN_BIGENDIAN/LE_M1 */);
168 NVDmaNext (pNv, 1 /* NV04_IMAGE_PATTERN_LOWENDIAN/CGA6_M1 */);
170 NVDmaNext (pNv, 0 /* NV04_IMAGE_PATTERN_MONOCHROME_SHAPE_8X8 */);
171 NVDmaNext (pNv, 1 /* NV04_IMAGE_PATTERN_SELECT_MONOCHROME */);
176 /* FLAGS_ROP_AND, 0, 0, 0 */
178 NVAccelInitRasterOp(ScrnInfoPtr pScrn)
180 NVPtr pNv = NVPTR(pScrn);
181 static int have_object = FALSE;
184 class = NV03_PRIMITIVE_RASTER_OP;
187 if (!NVDmaCreateContextObject(pNv, NvRop, class))
192 NVDmaSetObjectOnSubchannel(pNv, NvSubRop, NvRop);
193 NVDmaStart(pNv, NvSubRop, NV03_PRIMITIVE_RASTER_OP_DMA_NOTIFY, 1);
194 NVDmaNext (pNv, NvNullObject);
199 /* FLAGS_ROP_AND | FLAGS_MONO, 0, 0, 0 */
201 NVAccelInitRectangle(ScrnInfoPtr pScrn)
203 NVPtr pNv = NVPTR(pScrn);
204 static int have_object = FALSE;
207 class = NV04_GDI_RECTANGLE_TEXT;
210 if (!NVDmaCreateContextObject(pNv, NvRectangle, class))
215 NVDmaSetObjectOnSubchannel(pNv, NvSubRectangle, NvRectangle);
216 NVDmaStart(pNv, NvSubRectangle,
217 NV04_GDI_RECTANGLE_TEXT_SET_DMA_NOTIFY, 1);
218 NVDmaNext (pNv, NvDmaNotifier0);
219 NVDmaStart(pNv, NvSubRectangle,
220 0x184 /*NV04_GDI_RECTANGLE_TEXT_SET_DMA_FONTS*/, 1);
221 NVDmaNext (pNv, NvNullObject);
222 NVDmaStart(pNv, NvSubRectangle, NV04_GDI_RECTANGLE_TEXT_SURFACE, 1);
223 NVDmaNext (pNv, NvContextSurfaces);
224 NVDmaStart(pNv, NvSubRectangle, NV04_GDI_RECTANGLE_TEXT_ROP5, 1);
225 NVDmaNext (pNv, NvRop);
226 NVDmaStart(pNv, NvSubRectangle, NV04_GDI_RECTANGLE_TEXT_PATTERN, 1);
227 NVDmaNext (pNv, NvImagePattern);
228 NVDmaStart(pNv, NvSubRectangle, NV04_GDI_RECTANGLE_TEXT_OPERATION, 1);
229 NVDmaNext (pNv, 1 /* ROP_AND */);
234 /* FLAGS_ROP_AND, DmaFB, DmaFB, 0 */
236 NVAccelInitImageBlit(ScrnInfoPtr pScrn)
238 NVPtr pNv = NVPTR(pScrn);
239 static int have_object = FALSE;
242 class = (pNv->WaitVSyncPossible) ? NV10_IMAGE_BLIT : NV_IMAGE_BLIT;
245 if (!NVDmaCreateContextObject(pNv, NvImageBlit, class))
250 NVDmaSetObjectOnSubchannel(pNv, NvSubImageBlit, NvImageBlit);
251 NVDmaStart(pNv, NvSubImageBlit, NV_IMAGE_BLIT_DMA_NOTIFY, 1);
252 NVDmaNext (pNv, NvDmaNotifier0);
253 NVDmaStart(pNv, NvSubImageBlit, NV_IMAGE_BLIT_COLOR_KEY, 1);
254 NVDmaNext (pNv, NvNullObject);
255 NVDmaStart(pNv, NvSubImageBlit, NV_IMAGE_BLIT_SURFACE, 1);
256 NVDmaNext (pNv, NvContextSurfaces);
257 NVDmaStart(pNv, NvSubImageBlit, NV_IMAGE_BLIT_CLIP_RECTANGLE, 3);
258 NVDmaNext (pNv, NvNullObject);
259 NVDmaNext (pNv, NvImagePattern);
260 NVDmaNext (pNv, NvRop);
261 NVDmaStart(pNv, NvSubImageBlit, NV_IMAGE_BLIT_OPERATION, 1);
262 NVDmaNext (pNv, 1 /* NV_IMAGE_BLIT_OPERATION_ROP_AND */);
267 /* FLAGS_SRCCOPY, DmaFB, DmaFB, 0 */
269 NVAccelInitScaledImage(ScrnInfoPtr pScrn)
271 NVPtr pNv = NVPTR(pScrn);
272 static int have_object = FALSE;
275 switch (pNv->Architecture) {
277 class = NV04_SCALED_IMAGE_FROM_MEMORY;
282 class = NV10_SCALED_IMAGE_FROM_MEMORY;
286 class = NV10_SCALED_IMAGE_FROM_MEMORY | 0x3000;
291 if (!NVDmaCreateContextObject(pNv, NvScaledImage, class))
296 NVDmaSetObjectOnSubchannel(pNv, NvSubScaledImage, NvScaledImage);
297 NVDmaStart(pNv, NvSubScaledImage,
298 NV04_SCALED_IMAGE_FROM_MEMORY_DMA_NOTIFY, 1);
299 NVDmaNext (pNv, NvDmaNotifier0);
300 NVDmaStart(pNv, NvSubScaledImage,
301 NV04_SCALED_IMAGE_FROM_MEMORY_DMA_IMAGE, 1);
302 NVDmaNext (pNv, NvDmaFB); /* source object */
303 NVDmaStart(pNv, NvSubScaledImage,
304 NV04_SCALED_IMAGE_FROM_MEMORY_SURFACE, 1);
305 NVDmaNext (pNv, NvContextSurfaces);
306 NVDmaStart(pNv, NvSubScaledImage, 0x188, 1); /* PATTERN */
307 NVDmaNext (pNv, NvNullObject);
308 NVDmaStart(pNv, NvSubScaledImage, 0x18c, 1); /* ROP */
309 NVDmaNext (pNv, NvNullObject);
310 NVDmaStart(pNv, NvSubScaledImage, 0x190, 1); /* BETA1 */
311 NVDmaNext (pNv, NvNullObject);
312 NVDmaStart(pNv, NvSubScaledImage, 0x194, 1); /* BETA4 */
313 NVDmaNext (pNv, NvNullObject);
314 NVDmaStart(pNv, NvSubScaledImage,
315 NV04_SCALED_IMAGE_FROM_MEMORY_OPERATION, 1);
316 NVDmaNext (pNv, 3 /* SRCCOPY */);
321 /* FLAGS_NONE, 0, 0, 0 */
323 NVAccelInitClipRectangle(ScrnInfoPtr pScrn)
325 NVPtr pNv = NVPTR(pScrn);
326 static int have_object = FALSE;
327 int class = NV01_CONTEXT_CLIP_RECTANGLE;
330 if (!NVDmaCreateContextObject(pNv, NvClipRectangle, class))
335 NVDmaSetObjectOnSubchannel(pNv, NvSubClipRectangle, NvClipRectangle);
336 NVDmaStart(pNv, NvSubClipRectangle, 0x180, 1); /* DMA_NOTIFY */
337 NVDmaNext (pNv, NvNullObject);
342 /* FLAGS_ROP_AND | FLAGS_CLIP_ENABLE, 0, 0, 0 */
344 NVAccelInitSolidLine(ScrnInfoPtr pScrn)
346 NVPtr pNv = NVPTR(pScrn);
347 static int have_object = FALSE;
348 int class = NV04_SOLID_LINE;
351 if (!NVDmaCreateContextObject(pNv, NvSolidLine, class))
356 NVDmaSetObjectOnSubchannel(pNv, NvSubSolidLine, NvSolidLine);
357 NVDmaStart(pNv, NvSubSolidLine, NV04_SOLID_LINE_CLIP_RECTANGLE, 3);
358 NVDmaNext (pNv, NvClipRectangle);
359 NVDmaNext (pNv, NvImagePattern);
360 NVDmaNext (pNv, NvRop);
361 NVDmaStart(pNv, NvSubSolidLine, NV04_SOLID_LINE_SURFACE, 1);
362 NVDmaNext (pNv, NvContextSurfaces);
363 NVDmaStart(pNv, NvSubSolidLine, NV04_SOLID_LINE_OPERATION, 1);
364 NVDmaNext (pNv, 1); /* ROP_AND */
369 /* FLAGS_NONE, NvDmaFB, NvDmaAGP, NvDmaNotifier0 */
371 NVAccelInitMemFormat(ScrnInfoPtr pScrn)
373 NVPtr pNv = NVPTR(pScrn);
374 static int have_object = FALSE;
377 class = NV_MEMORY_TO_MEMORY_FORMAT;
380 if (!NVDmaCreateContextObject(pNv, NvMemFormat, class))
385 NVDmaSetObjectOnSubchannel(pNv, NvSubMemFormat, NvMemFormat);
386 NVDmaStart(pNv, NvSubMemFormat,
387 NV_MEMORY_TO_MEMORY_FORMAT_DMA_NOTIFY, 1);
388 NVDmaNext (pNv, NvDmaNotifier0);
389 NVDmaStart(pNv, NvSubMemFormat,
390 NV_MEMORY_TO_MEMORY_FORMAT_OBJECT_IN, 2);
391 NVDmaNext (pNv, NvDmaFB);
392 NVDmaNext (pNv, NvDmaFB);
394 pNv->M2MFDirection = -1;
398 #define INIT_CONTEXT_OBJECT(name) do { \
399 ret = NVAccelInit##name(pScrn); \
401 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \
402 "Failed to initialise context object: "#name \
409 NVAccelCommonInit(ScrnInfoPtr pScrn)
411 NVPtr pNv = NVPTR(pScrn);
413 if(pNv->NoAccel) return TRUE;
415 INIT_CONTEXT_OBJECT(NullObject);
416 INIT_CONTEXT_OBJECT(DmaNotifier0);
418 INIT_CONTEXT_OBJECT(ContextSurfaces);
419 INIT_CONTEXT_OBJECT(ImagePattern);
420 INIT_CONTEXT_OBJECT(RasterOp);
421 INIT_CONTEXT_OBJECT(Rectangle);
422 INIT_CONTEXT_OBJECT(ImageBlit);
423 INIT_CONTEXT_OBJECT(ScaledImage);
426 INIT_CONTEXT_OBJECT(ClipRectangle);
427 INIT_CONTEXT_OBJECT(SolidLine);
430 INIT_CONTEXT_OBJECT(MemFormat);
433 switch (pNv->Architecture) {
435 INIT_CONTEXT_OBJECT(NV40TCL);