/* * xprAddScreen * Init the framebuffer and record pixmap parameters for the screen. */ static Bool xprAddScreen(int index, ScreenPtr pScreen) { DarwinFramebufferPtr dfb = SCREEN_PRIV(pScreen); int depth = darwinDesiredDepth; DEBUG_LOG("index=%d depth=%d\n", index, depth); if(depth == -1) { depth = CGDisplaySamplesPerPixel(kCGDirectMainDisplay) * CGDisplayBitsPerSample(kCGDirectMainDisplay); } switch(depth) { case 8: // pseudo-working dfb->visuals = PseudoColorMask; dfb->preferredCVC = PseudoColor; dfb->depth = 8; dfb->bitsPerRGB = 8; dfb->bitsPerPixel = 8; dfb->redMask = 0; dfb->greenMask = 0; dfb->blueMask = 0; break; case 15: dfb->visuals = TrueColorMask; //LARGE_VISUALS; dfb->preferredCVC = TrueColor; dfb->depth = 15; dfb->bitsPerRGB = 5; dfb->bitsPerPixel = 16; dfb->redMask = RM_ARGB(0,5,5,5); dfb->greenMask = GM_ARGB(0,5,5,5); dfb->blueMask = BM_ARGB(0,5,5,5); break; // case 24: default: if(depth != 24) ErrorF("Unsupported color depth requested. Defaulting to 24bit. (depth=%d darwinDesiredDepth=%d CGDisplaySamplesPerPixel=%d CGDisplayBitsPerSample=%d)\n", darwinDesiredDepth, depth, (int)CGDisplaySamplesPerPixel(kCGDirectMainDisplay), (int)CGDisplayBitsPerSample(kCGDirectMainDisplay)); dfb->visuals = TrueColorMask; //LARGE_VISUALS; dfb->preferredCVC = TrueColor; dfb->depth = 24; dfb->bitsPerRGB = 8; dfb->bitsPerPixel = 32; dfb->redMask = RM_ARGB(0,8,8,8); dfb->greenMask = GM_ARGB(0,8,8,8); dfb->blueMask = BM_ARGB(0,8,8,8); break; } if (noPseudoramiXExtension) { CGDirectDisplayID dpy; CGRect frame; ErrorF("Warning: noPseudoramiXExtension!\n"); dpy = displayAtIndex(index); QuartzCopyDisplayIDs(pScreen, 1, &dpy); frame = displayScreenBounds(dpy); dfb->x = frame.origin.x; dfb->y = frame.origin.y; dfb->width = frame.size.width; dfb->height = frame.size.height; } else { xprAddPseudoramiXScreens(&dfb->x, &dfb->y, &dfb->width, &dfb->height, pScreen); } /* Passing zero width (pitch) makes miCreateScreenResources set the screen pixmap to the framebuffer pointer, i.e. NULL. The generic rootless code takes care of making this work. */ dfb->pitch = 0; dfb->framebuffer = NULL; DRIScreenInit(pScreen); return TRUE; }
/* * xprAddScreen * Init the framebuffer and record pixmap parameters for the screen. */ static Bool xprAddScreen(int index, ScreenPtr pScreen) { DarwinFramebufferPtr dfb = SCREEN_PRIV(pScreen); int depth = darwinDesiredDepth; DEBUG_LOG("index=%d depth=%d\n", index, depth); if(depth == -1) { #if MAC_OS_X_VERSION_MIN_REQUIRED < 1060 depth = CGDisplaySamplesPerPixel(kCGDirectMainDisplay) * CGDisplayBitsPerSample(kCGDirectMainDisplay); #else CGDisplayModeRef modeRef; CFStringRef encStrRef; modeRef = CGDisplayCopyDisplayMode(kCGDirectMainDisplay); if(!modeRef) goto have_depth; encStrRef = CGDisplayModeCopyPixelEncoding(modeRef); CFRelease(modeRef); if(!encStrRef) goto have_depth; if(CFStringCompare(encStrRef, CFSTR(IO32BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) { depth = 24; } else if(CFStringCompare(encStrRef, CFSTR(IO16BitDirectPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) { depth = 15; } else if(CFStringCompare(encStrRef, CFSTR(IO8BitIndexedPixels), kCFCompareCaseInsensitive) == kCFCompareEqualTo) { depth = 8; } CFRelease(encStrRef); #endif } have_depth: switch(depth) { case 8: // pseudo-working dfb->visuals = PseudoColorMask; dfb->preferredCVC = PseudoColor; dfb->depth = 8; dfb->bitsPerRGB = 8; dfb->bitsPerPixel = 8; dfb->redMask = 0; dfb->greenMask = 0; dfb->blueMask = 0; break; case 15: dfb->visuals = TrueColorMask; //LARGE_VISUALS; dfb->preferredCVC = TrueColor; dfb->depth = 15; dfb->bitsPerRGB = 5; dfb->bitsPerPixel = 16; dfb->redMask = RM_ARGB(0,5,5,5); dfb->greenMask = GM_ARGB(0,5,5,5); dfb->blueMask = BM_ARGB(0,5,5,5); break; // case 24: default: if(depth != 24) ErrorF("Unsupported color depth requested. Defaulting to 24bit. (depth=%d darwinDesiredDepth=%d)\n", depth, darwinDesiredDepth); dfb->visuals = TrueColorMask; //LARGE_VISUALS; dfb->preferredCVC = TrueColor; dfb->depth = 24; dfb->bitsPerRGB = 8; dfb->bitsPerPixel = 32; dfb->redMask = RM_ARGB(0,8,8,8); dfb->greenMask = GM_ARGB(0,8,8,8); dfb->blueMask = BM_ARGB(0,8,8,8); break; } if (noPseudoramiXExtension) { CGDirectDisplayID dpy; CGRect frame; ErrorF("Warning: noPseudoramiXExtension!\n"); dpy = displayAtIndex(index); QuartzCopyDisplayIDs(pScreen, 1, &dpy); frame = displayScreenBounds(dpy); dfb->x = frame.origin.x; dfb->y = frame.origin.y; dfb->width = frame.size.width; dfb->height = frame.size.height; } else { xprAddPseudoramiXScreens(&dfb->x, &dfb->y, &dfb->width, &dfb->height, pScreen); } /* Passing zero width (pitch) makes miCreateScreenResources set the screen pixmap to the framebuffer pointer, i.e. NULL. The generic rootless code takes care of making this work. */ dfb->pitch = 0; dfb->framebuffer = NULL; DRIScreenInit(pScreen); return TRUE; }
/* * xprAddScreen * Init the framebuffer and record pixmap parameters for the screen. */ static Bool xprAddScreen(int index, ScreenPtr pScreen) { DarwinFramebufferPtr dfb = SCREEN_PRIV(pScreen); /* If no specific depth chosen, look for the depth of the main display. Else if 16bpp specified, use that. Else use 32bpp. */ dfb->colorType = TrueColor; dfb->bitsPerComponent = 8; dfb->bitsPerPixel = 32; dfb->colorBitsPerPixel = 24; if (darwinDesiredDepth == -1) { dfb->bitsPerComponent = CGDisplayBitsPerSample(kCGDirectMainDisplay); dfb->bitsPerPixel = CGDisplayBitsPerPixel(kCGDirectMainDisplay); dfb->colorBitsPerPixel = CGDisplaySamplesPerPixel(kCGDirectMainDisplay) * dfb->bitsPerComponent; } else if (darwinDesiredDepth == 15) { dfb->bitsPerComponent = 5; dfb->bitsPerPixel = 16; dfb->colorBitsPerPixel = 15; } else if (darwinDesiredDepth == 8) { dfb->colorType = PseudoColor; dfb->bitsPerComponent = 8; dfb->bitsPerPixel = 8; dfb->colorBitsPerPixel = 8; } if (noPseudoramiXExtension) { CGDirectDisplayID dpy; CGRect frame; dpy = displayAtIndex(index); frame = displayScreenBounds(dpy); dfb->x = frame.origin.x; dfb->y = frame.origin.y; dfb->width = frame.size.width; dfb->height = frame.size.height; } else { xprAddPseudoramiXScreens(&dfb->x, &dfb->y, &dfb->width, &dfb->height); } /* Passing zero width (pitch) makes miCreateScreenResources set the screen pixmap to the framebuffer pointer, i.e. NULL. The generic rootless code takes care of making this work. */ dfb->pitch = 0; dfb->framebuffer = NULL; DRIScreenInit(pScreen); return TRUE; }