xf86DiDGA.c revision 35c4bbdf
1/* 2 * Copyright © 2006 Keith Packard 3 * 4 * Permission to use, copy, modify, distribute, and sell this software and its 5 * documentation for any purpose is hereby granted without fee, provided that 6 * the above copyright notice appear in all copies and that both that copyright 7 * notice and this permission notice appear in supporting documentation, and 8 * that the name of the copyright holders not be used in advertising or 9 * publicity pertaining to distribution of the software without specific, 10 * written prior permission. The copyright holders make no representations 11 * about the suitability of this software for any purpose. It is provided "as 12 * is" without express or implied warranty. 13 * 14 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 16 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR 17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 20 * OF THIS SOFTWARE. 21 */ 22 23#ifdef HAVE_XORG_CONFIG_H 24#include <xorg-config.h> 25#else 26#ifdef HAVE_CONFIG_H 27#include <config.h> 28#endif 29#endif 30 31#include "xf86.h" 32#include "xf86DDC.h" 33#include "xf86_OSproc.h" 34#include "dgaproc.h" 35#include "xf86Crtc.h" 36#include "xf86Modes.h" 37#include "gcstruct.h" 38#include "scrnintstr.h" 39#include "windowstr.h" 40 41static Bool 42xf86_dga_get_modes(ScreenPtr pScreen) 43{ 44 ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen); 45 xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); 46 DGAModePtr modes, mode; 47 DisplayModePtr display_mode; 48 int bpp = scrn->bitsPerPixel >> 3; 49 int num; 50 51 num = 0; 52 display_mode = scrn->modes; 53 while (display_mode) { 54 num++; 55 display_mode = display_mode->next; 56 if (display_mode == scrn->modes) 57 break; 58 } 59 60 if (!num) 61 return FALSE; 62 63 modes = xallocarray(num, sizeof(DGAModeRec)); 64 if (!modes) 65 return FALSE; 66 67 num = 0; 68 display_mode = scrn->modes; 69 while (display_mode) { 70 mode = modes + num++; 71 72 mode->mode = display_mode; 73 mode->flags = DGA_CONCURRENT_ACCESS; 74 if (display_mode->Flags & V_DBLSCAN) 75 mode->flags |= DGA_DOUBLESCAN; 76 if (display_mode->Flags & V_INTERLACE) 77 mode->flags |= DGA_INTERLACED; 78 mode->byteOrder = scrn->imageByteOrder; 79 mode->depth = scrn->depth; 80 mode->bitsPerPixel = scrn->bitsPerPixel; 81 mode->red_mask = scrn->mask.red; 82 mode->green_mask = scrn->mask.green; 83 mode->blue_mask = scrn->mask.blue; 84 mode->visualClass = (bpp == 1) ? PseudoColor : TrueColor; 85 mode->viewportWidth = display_mode->HDisplay; 86 mode->viewportHeight = display_mode->VDisplay; 87 mode->xViewportStep = (bpp == 3) ? 2 : 1; 88 mode->yViewportStep = 1; 89 mode->viewportFlags = DGA_FLIP_RETRACE; 90 mode->offset = 0; 91 mode->address = 0; 92 mode->imageWidth = mode->viewportWidth; 93 mode->imageHeight = mode->viewportHeight; 94 mode->bytesPerScanline = (mode->imageWidth * scrn->bitsPerPixel) >> 3; 95 mode->pixmapWidth = mode->imageWidth; 96 mode->pixmapHeight = mode->imageHeight; 97 mode->maxViewportX = 0; 98 mode->maxViewportY = 0; 99 100 display_mode = display_mode->next; 101 if (display_mode == scrn->modes) 102 break; 103 } 104 free(xf86_config->dga_modes); 105 xf86_config->dga_nmode = num; 106 xf86_config->dga_modes = modes; 107 return TRUE; 108} 109 110static Bool 111xf86_dga_set_mode(ScrnInfoPtr scrn, DGAModePtr display_mode) 112{ 113 ScreenPtr pScreen = scrn->pScreen; 114 xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); 115 116 if (!display_mode) { 117 if (xf86_config->dga_save_mode) { 118 xf86SwitchMode(pScreen, xf86_config->dga_save_mode); 119 xf86_config->dga_save_mode = NULL; 120 } 121 } 122 else { 123 if (!xf86_config->dga_save_mode) { 124 xf86_config->dga_save_mode = scrn->currentMode; 125 xf86SwitchMode(pScreen, display_mode->mode); 126 } 127 } 128 return TRUE; 129} 130 131static int 132xf86_dga_get_viewport(ScrnInfoPtr scrn) 133{ 134 return 0; 135} 136 137static void 138xf86_dga_set_viewport(ScrnInfoPtr scrn, int x, int y, int flags) 139{ 140 scrn->AdjustFrame(scrn, x, y); 141} 142 143static Bool 144xf86_dga_open_framebuffer(ScrnInfoPtr scrn, 145 char **name, 146 unsigned char **mem, int *size, int *offset, 147 int *flags) 148{ 149 return FALSE; 150} 151 152static void 153xf86_dga_close_framebuffer(ScrnInfoPtr scrn) 154{ 155} 156 157static DGAFunctionRec xf86_dga_funcs = { 158 xf86_dga_open_framebuffer, 159 xf86_dga_close_framebuffer, 160 xf86_dga_set_mode, 161 xf86_dga_set_viewport, 162 xf86_dga_get_viewport, 163 NULL, 164 NULL, 165 NULL, 166 NULL 167}; 168 169Bool 170xf86DiDGAReInit(ScreenPtr pScreen) 171{ 172 return TRUE; 173} 174 175Bool 176_xf86_di_dga_reinit_internal(ScreenPtr pScreen) 177{ 178 ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen); 179 xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); 180 181 if (!DGAScreenAvailable(pScreen)) 182 return TRUE; 183 184 if (!xf86_dga_get_modes(pScreen)) 185 return FALSE; 186 187 return DGAReInitModes(pScreen, xf86_config->dga_modes, 188 xf86_config->dga_nmode); 189} 190 191Bool 192xf86DiDGAInit(ScreenPtr pScreen, unsigned long dga_address) 193{ 194 return TRUE; 195} 196 197Bool 198_xf86_di_dga_init_internal(ScreenPtr pScreen) 199{ 200 ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen); 201 xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); 202 203 xf86_config->dga_flags = 0; 204 xf86_config->dga_address = 0; 205 xf86_config->dga_width = 0; 206 xf86_config->dga_height = 0; 207 xf86_config->dga_stride = 0; 208 209 if (!xf86_dga_get_modes(pScreen)) 210 return FALSE; 211 212 return DGAInit(pScreen, &xf86_dga_funcs, xf86_config->dga_modes, 213 xf86_config->dga_nmode); 214} 215