static int ProcXDGAOpenFramebuffer(ClientPtr client) { REQUEST(xXDGAOpenFramebufferReq); xXDGAOpenFramebufferReply rep; char *deviceName; int nameSize; if (stuff->screen > screenInfo.numScreens) return BadValue; if (!DGAAvailable(stuff->screen)) return DGAErrorBase + XF86DGANoDirectVideoMode; REQUEST_SIZE_MATCH(xXDGAOpenFramebufferReq); rep.type = X_Reply; rep.length = 0; rep.sequenceNumber = client->sequence; if(!DGAOpenFramebuffer(stuff->screen, &deviceName, (unsigned char**)(&rep.mem1), (int*)&rep.size, (int*)&rep.offset, (int*)&rep.extra)) { return BadAlloc; } nameSize = deviceName ? (strlen(deviceName) + 1) : 0; rep.length = (nameSize + 3) >> 2; WriteToClient(client, sizeof(xXDGAOpenFramebufferReply), (char *)&rep); if(rep.length) WriteToClient(client, nameSize, deviceName); return (client->noClientException); }
Bool _xf86_di_dga_reinit_internal (ScreenPtr pScreen) { ScrnInfoPtr scrn = xf86Screens[pScreen->myNum]; xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); if (!DGAAvailable(pScreen->myNum)) return TRUE; if (!xf86_dga_get_modes (pScreen)) return FALSE; return DGAReInitModes (pScreen, xf86_config->dga_modes, xf86_config->dga_nmode); }
static int ProcXDGACloseFramebuffer(ClientPtr client) { REQUEST(xXDGACloseFramebufferReq); if (stuff->screen > screenInfo.numScreens) return BadValue; if (!DGAAvailable(stuff->screen)) return DGAErrorBase + XF86DGANoDirectVideoMode; REQUEST_SIZE_MATCH(xXDGACloseFramebufferReq); DGACloseFramebuffer(stuff->screen); return (client->noClientException); }
static int ProcXDGASetMode(ClientPtr client) { REQUEST(xXDGASetModeReq); xXDGASetModeReply rep; XDGAModeRec mode; xXDGAModeInfo info; PixmapPtr pPix; int size; if (stuff->screen > screenInfo.numScreens) return BadValue; REQUEST_SIZE_MATCH(xXDGASetModeReq); rep.type = X_Reply; rep.length = 0; rep.offset = 0; rep.flags = 0; rep.sequenceNumber = client->sequence; if (!DGAAvailable(stuff->screen)) return DGAErrorBase + XF86DGANoDirectVideoMode; if(DGAClients[stuff->screen] && (DGAClients[stuff->screen] != client)) return DGAErrorBase + XF86DGANoDirectVideoMode; if(!stuff->mode) { if(DGAClients[stuff->screen]) { if(--DGACallbackRefCount == 0) DeleteCallback(&ClientStateCallback, DGAClientStateChange, NULL); } DGAClients[stuff->screen] = NULL; DGASelectInput(stuff->screen, NULL, 0); DGASetMode(stuff->screen, 0, &mode, &pPix); WriteToClient(client, sz_xXDGASetModeReply, (char*)&rep); return (client->noClientException); } if(Success != DGASetMode(stuff->screen, stuff->mode, &mode, &pPix)) return BadValue; if(!DGAClients[stuff->screen]) { if(DGACallbackRefCount++ == 0) AddCallback (&ClientStateCallback, DGAClientStateChange, NULL); } DGAClients[stuff->screen] = client; if(pPix) { if(AddResource(stuff->pid, RT_PIXMAP, (pointer)(pPix))) { pPix->drawable.id = (int)stuff->pid; rep.flags = DGA_PIXMAP_AVAILABLE; } } size = strlen(mode.name) + 1; info.byte_order = mode.byteOrder; info.depth = mode.depth; info.num = mode.num; info.bpp = mode.bitsPerPixel; info.name_size = (size + 3) & ~3L; info.vsync_num = mode.VSync_num; info.vsync_den = mode.VSync_den; info.flags = mode.flags; info.image_width = mode.imageWidth; info.image_height = mode.imageHeight; info.pixmap_width = mode.pixmapWidth; info.pixmap_height = mode.pixmapHeight; info.bytes_per_scanline = mode.bytesPerScanline; info.red_mask = mode.red_mask; info.green_mask = mode.green_mask; info.blue_mask = mode.blue_mask; info.visual_class = mode.visualClass; info.viewport_width = mode.viewportWidth; info.viewport_height = mode.viewportHeight; info.viewport_xstep = mode.xViewportStep; info.viewport_ystep = mode.yViewportStep; info.viewport_xmax = mode.maxViewportX; info.viewport_ymax = mode.maxViewportY; info.viewport_flags = mode.viewportFlags; info.reserved1 = mode.reserved1; info.reserved2 = mode.reserved2; rep.length = (sz_xXDGAModeInfo + info.name_size) >> 2; WriteToClient(client, sz_xXDGASetModeReply, (char*)&rep); WriteToClient(client, sz_xXDGAModeInfo, (char*)(&info)); WriteToClient(client, size, mode.name); return (client->noClientException); }
static int ProcXDGAQueryModes(ClientPtr client) { int i, num, size; REQUEST(xXDGAQueryModesReq); xXDGAQueryModesReply rep; xXDGAModeInfo info; XDGAModePtr mode; if (stuff->screen > screenInfo.numScreens) return BadValue; REQUEST_SIZE_MATCH(xXDGAQueryModesReq); rep.type = X_Reply; rep.length = 0; rep.number = 0; rep.sequenceNumber = client->sequence; if (!DGAAvailable(stuff->screen) || ((num = DGAGetModes(stuff->screen)) <= 0)) { WriteToClient(client, sz_xXDGAQueryModesReply, (char*)&rep); return (client->noClientException); } if (num != (CARD16)num) num = (CARD16)-1; if(!(mode = (XDGAModePtr)xalloc(num * sizeof(XDGAModeRec)))) return BadAlloc; for(i = 0; i < num; i++) DGAGetModeInfo(stuff->screen, mode + i, i + 1); size = num * sz_xXDGAModeInfo; for(i = 0; i < num; i++) size += (strlen(mode[i].name) + 4) & ~3L; /* plus NULL */ rep.number = num; rep.length = size >> 2; WriteToClient(client, sz_xXDGAQueryModesReply, (char*)&rep); for(i = 0; i < num; i++) { size = strlen(mode[i].name) + 1; #undef SetCARD16 #define SetCARD16(a,b) \ do { \ info.a = mode[i].b; \ if (info.a != mode[i].b) \ info.a = (CARD16)-1; \ } while (0) info.byte_order = mode[i].byteOrder; info.depth = mode[i].depth; info.num = mode[i].num; info.bpp = mode[i].bitsPerPixel; info.name_size = (size + 3) & ~3L; info.vsync_num = mode[i].VSync_num; info.vsync_den = mode[i].VSync_den; info.flags = mode[i].flags; SetCARD16(image_width, imageWidth); SetCARD16(image_height, imageHeight); SetCARD16(pixmap_width, pixmapWidth); SetCARD16(pixmap_height, pixmapHeight); info.bytes_per_scanline = mode[i].bytesPerScanline; info.red_mask = mode[i].red_mask; info.green_mask = mode[i].green_mask; info.blue_mask = mode[i].blue_mask; info.visual_class = mode[i].visualClass; SetCARD16(viewport_width, viewportWidth); SetCARD16(viewport_height, viewportHeight); SetCARD16(viewport_xstep, xViewportStep); SetCARD16(viewport_ystep, yViewportStep); SetCARD16(viewport_xmax, maxViewportX); SetCARD16(viewport_ymax, maxViewportY); info.viewport_flags = mode[i].viewportFlags; info.reserved1 = mode[i].reserved1; info.reserved2 = mode[i].reserved2; #undef SetCARD16 WriteToClient(client, sz_xXDGAModeInfo, (char*)(&info)); WriteToClient(client, size, mode[i].name); } xfree(mode); return (client->noClientException); }