xorg_crtc.c revision 71d3961a47844baeaf5d0e4a4fd1001dee89d71b
18bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * All Rights Reserved. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Permission is hereby granted, free of charge, to any person obtaining a 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * copy of this software and associated documentation files (the 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "Software"), to deal in the Software without restriction, including 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * without limitation the rights to use, copy, modify, merge, publish, 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * distribute, sub license, and/or sell copies of the Software, and to 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * permit persons to whom the Software is furnished to do so, subject to 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the following conditions: 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The above copyright notice and this permission notice (including the 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * next paragraph) shall be included in all copies or substantial portions 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of the Software. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 25ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch * 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Author: Alan Hourihane <alanh@tungstengraphics.com> 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * Author: Jakob Bornecrantz <wallbraker@gmail.com> 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <unistd.h> 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string.h> 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <assert.h> 3458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include <stdlib.h> 35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <math.h> 36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <stdint.h> 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "xorg-server.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <xf86.h> 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <xf86i2c.h> 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <xf86Crtc.h> 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <cursorstr.h> 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "xorg_tracker.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "xf86Modes.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_XEXTPROTO_71 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <X11/extensions/dpmsconst.h> 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DPMS_SERVER 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <X11/extensions/dpms.h> 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "util/u_inlines.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "util/u_rect.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_LIBKMS 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libkms.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct crtc_private 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drmModeCrtcPtr drm_crtc; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* hwcursor */ 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct pipe_resource *cursor_tex; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct kms_bo *cursor_bo; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned cursor_handle; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccicrtc_dpms(xf86CrtcPtr crtc, int mode) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* ScrnInfoPtr pScrn = crtc->scrn; */ 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) switch (mode) { 778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) case DPMSModeOn: 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DPMSModeStandby: 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DPMSModeSuspend: 808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) break; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case DPMSModeOff: 828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) break; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static Bool 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)crtc_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rotation rotation, int x, int y) 89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles){ 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(crtc->scrn); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modesettingPtr ms = modesettingPTR(crtc->scrn); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xf86OutputPtr output = NULL; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct crtc_private *crtcp = crtc->driver_private; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drmModeCrtcPtr drm_crtc = crtcp->drm_crtc; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drmModeModeInfo drm_mode; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, ret, connector_id; 97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) for (i = 0; i < config->num_output; output = NULL, i++) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output = config->output[i]; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (output->crtc == crtc) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!output) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return FALSE; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) connector_id = xorg_output_get_id(output); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drm_mode.clock = mode->Clock; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drm_mode.hdisplay = mode->HDisplay; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drm_mode.hsync_start = mode->HSyncStart; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drm_mode.hsync_end = mode->HSyncEnd; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drm_mode.htotal = mode->HTotal; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drm_mode.vdisplay = mode->VDisplay; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drm_mode.vsync_start = mode->VSyncStart; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drm_mode.vsync_end = mode->VSyncEnd; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drm_mode.vtotal = mode->VTotal; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drm_mode.flags = mode->Flags; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drm_mode.hskew = mode->HSkew; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drm_mode.vscan = mode->VScan; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drm_mode.vrefresh = mode->VRefresh; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!mode->name) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xf86SetModeDefaultName(mode); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strncpy(drm_mode.name, mode->name, DRM_DISPLAY_MODE_LEN - 1); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drm_mode.name[DRM_DISPLAY_MODE_LEN - 1] = '\0'; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = drmModeSetCrtc(ms->fd, drm_crtc->crtc_id, ms->fb_id, x, y, 1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &connector_id, 1, &drm_mode); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return FALSE; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crtc->x = x; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crtc->y = y; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crtc->mode = *mode; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crtc->rotation = rotation; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return TRUE; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)crtc_gamma_set(xf86CrtcPtr crtc, CARD16 * red, CARD16 * green, CARD16 * blue, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int size) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* XXX: hockup */ 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void * 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)crtc_shadow_allocate(xf86CrtcPtr crtc, int width, int height) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* ScrnInfoPtr pScrn = crtc->scrn; */ 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static PixmapPtr 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)crtc_shadow_create(xf86CrtcPtr crtc, void *data, int width, int height) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* ScrnInfoPtr pScrn = crtc->scrn; */ 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)crtc_shadow_destroy(xf86CrtcPtr crtc, PixmapPtr rotate_pixmap, void *data) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* ScrnInfoPtr pScrn = crtc->scrn; */ 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Cursor functions 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)crtc_set_cursor_colors(xf86CrtcPtr crtc, int bg, int fg) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* XXX: See if this one is needed, as we only support ARGB cursors */ 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)crtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modesettingPtr ms = modesettingPTR(crtc->scrn); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct crtc_private *crtcp = crtc->driver_private; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drmModeMoveCursor(ms->fd, crtcp->drm_crtc->crtc_id, x, y); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)crtc_load_cursor_argb_ga3d(xf86CrtcPtr crtc, CARD32 * image) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu unsigned char *ptr; 1945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu modesettingPtr ms = modesettingPTR(crtc->scrn); 1955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu struct crtc_private *crtcp = crtc->driver_private; 1965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu struct pipe_transfer *transfer; 1975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!crtcp->cursor_tex) { 1997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch struct pipe_resource templat; 2007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch struct winsys_handle whandle; 2017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch memset(&templat, 0, sizeof(templat)); 2037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch templat.bind |= PIPE_BIND_RENDER_TARGET; 2047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch templat.bind |= PIPE_BIND_SCANOUT; 2057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch templat.target = PIPE_TEXTURE_2D; 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) templat.last_level = 0; 207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) templat.depth0 = 1; 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) templat.format = PIPE_FORMAT_B8G8R8A8_UNORM; 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) templat.width0 = 64; 2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci templat.height0 = 64; 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) memset(&whandle, 0, sizeof(whandle)); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) whandle.type = DRM_API_HANDLE_TYPE_KMS; 2147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch crtcp->cursor_tex = ms->screen->resource_create(ms->screen, 2167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &templat); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ms->screen->resource_get_handle(ms->screen, crtcp->cursor_tex, &whandle); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crtcp->cursor_handle = whandle.handle; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transfer = pipe_get_transfer(ms->ctx, crtcp->cursor_tex, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 0, 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PIPE_TRANSFER_WRITE, 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, 64, 64); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ptr = ms->ctx->transfer_map(ms->ctx, transfer); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) util_copy_rect(ptr, crtcp->cursor_tex->format, 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transfer->stride, 0, 0, 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64, 64, (void*)image, 64 * 4, 0, 0); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ms->ctx->transfer_unmap(ms->ctx, transfer); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ms->ctx->transfer_destroy(ms->ctx, transfer); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if HAVE_LIBKMS 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)crtc_load_cursor_argb_kms(xf86CrtcPtr crtc, CARD32 * image) 2377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch{ 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modesettingPtr ms = modesettingPTR(crtc->scrn); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct crtc_private *crtcp = crtc->driver_private; 2407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch unsigned char *ptr; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!crtcp->cursor_bo) { 2437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch unsigned attr[8]; 2447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch attr[0] = KMS_BO_TYPE; 2467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#ifdef KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attr[1] = KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attr[1] = KMS_BO_TYPE_CURSOR; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attr[2] = KMS_WIDTH; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attr[3] = 64; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attr[4] = KMS_HEIGHT; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attr[5] = 64; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attr[6] = 0; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (kms_bo_create(ms->kms, attr, &crtcp->cursor_bo)) 2587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 2597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (kms_bo_get_prop(crtcp->cursor_bo, KMS_HANDLE, 2617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &crtcp->cursor_handle)) 2627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch goto err_bo_destroy; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch kms_bo_map(crtcp->cursor_bo, (void**)&ptr); 2667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch memcpy(ptr, image, 64*64*4); 2677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch kms_bo_unmap(crtcp->cursor_bo); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)err_bo_destroy: 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kms_bo_destroy(&crtcp->cursor_bo); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)crtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 * image) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(crtc->scrn); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modesettingPtr ms = modesettingPTR(crtc->scrn); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Older X servers have cursor reference counting bugs leading to use of 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * freed memory and consequently random crashes. Should be fixed as of 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xserver 1.8, but this workaround shouldn't hurt anyway. 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (config->cursor) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config->cursor->refcnt++; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ms->cursor) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FreeCursor(ms->cursor, None); 2915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ms->cursor = config->cursor; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ms->screen) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crtc_load_cursor_argb_ga3d(crtc, image); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_LIBKMS 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (ms->kms) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crtc_load_cursor_argb_kms(crtc, image); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)crtc_show_cursor(xf86CrtcPtr crtc) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modesettingPtr ms = modesettingPTR(crtc->scrn); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct crtc_private *crtcp = crtc->driver_private; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (crtcp->cursor_tex || crtcp->cursor_bo) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drmModeSetCursor(ms->fd, crtcp->drm_crtc->crtc_id, 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crtcp->cursor_handle, 64, 64); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)crtc_hide_cursor(xf86CrtcPtr crtc) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modesettingPtr ms = modesettingPTR(crtc->scrn); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct crtc_private *crtcp = crtc->driver_private; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drmModeSetCursor(ms->fd, crtcp->drm_crtc->crtc_id, 0, 0, 0); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Called at vt leave 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xorg_crtc_cursor_destroy(xf86CrtcPtr crtc) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct crtc_private *crtcp = crtc->driver_private; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (crtcp->cursor_tex) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pipe_resource_reference(&crtcp->cursor_tex, NULL); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_LIBKMS 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (crtcp->cursor_bo) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kms_bo_destroy(&crtcp->cursor_bo); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Misc functions 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)crtc_destroy(xf86CrtcPtr crtc) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct crtc_private *crtcp = crtc->driver_private; 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xorg_crtc_cursor_destroy(crtc); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drmModeFreeCrtc(crtcp->drm_crtc); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xfree(crtcp); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crtc->driver_private = NULL; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const xf86CrtcFuncsRec crtc_funcs = { 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .dpms = crtc_dpms, 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .set_mode_major = crtc_set_mode_major, 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .set_cursor_colors = crtc_set_cursor_colors, 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .set_cursor_position = crtc_set_cursor_position, 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .show_cursor = crtc_show_cursor, 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .hide_cursor = crtc_hide_cursor, 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .load_cursor_argb = crtc_load_cursor_argb, 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .shadow_create = crtc_shadow_create, 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .shadow_allocate = crtc_shadow_allocate, 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .shadow_destroy = crtc_shadow_destroy, 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .gamma_set = crtc_gamma_set, 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .destroy = crtc_destroy, 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xorg_crtc_init(ScrnInfoPtr pScrn) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modesettingPtr ms = modesettingPTR(pScrn); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xf86CrtcPtr crtc; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drmModeResPtr res; 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drmModeCrtcPtr drm_crtc = NULL; 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct crtc_private *crtcp; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int c; 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = drmModeGetResources(ms->fd); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res == 0) { 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ErrorF("Failed drmModeGetResources %d\n", errno); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (c = 0; c < res->count_crtcs; c++) { 3907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch drm_crtc = drmModeGetCrtc(ms->fd, res->crtcs[c]); 3917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!drm_crtc) 3937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch continue; 3947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch crtc = xf86CrtcCreate(pScrn, &crtc_funcs); 3967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (crtc == NULL) 3977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch goto out; 3985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch crtcp = xcalloc(1, sizeof(struct crtc_private)); 4007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!crtcp) { 4017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch xf86CrtcDestroy(crtc); 4027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch goto out; 4037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 4047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch crtcp->drm_crtc = drm_crtc; 4067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch crtc->driver_private = crtcp; 4087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 4097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch out: 4117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch drmModeFreeResources(res); 4127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 4137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch/* vim: set sw=4 ts=8 sts=4: */ 4157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch