xorg_crtc.c revision e1b39c673d885e3dc990a29445360830b0a603aa
1cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* 2dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. 3dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * All Rights Reserved. 4dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * 59bba1cfc39d35b847c479dcc1afef3d5d8fb0bfcIan Romanick * Permission is hereby granted, free of charge, to any person obtaining a 69bba1cfc39d35b847c479dcc1afef3d5d8fb0bfcIan Romanick * copy of this software and associated documentation files (the 79bba1cfc39d35b847c479dcc1afef3d5d8fb0bfcIan Romanick * "Software"), to deal in the Software without restriction, including 8dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * without limitation the rights to use, copy, modify, merge, publish, 9dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * distribute, sub license, and/or sell copies of the Software, and to 10dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * permit persons to whom the Software is furnished to do so, subject to 11dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * the following conditions: 12dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * 13dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * The above copyright notice and this permission notice (including the 14dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * next paragraph) shall be included in all copies or substantial portions 15dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * of the Software. 16dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * 17dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 20dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 219bba1cfc39d35b847c479dcc1afef3d5d8fb0bfcIan Romanick * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 229bba1cfc39d35b847c479dcc1afef3d5d8fb0bfcIan Romanick * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 239bba1cfc39d35b847c479dcc1afef3d5d8fb0bfcIan Romanick * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * 25dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * 26dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * Author: Alan Hourihane <alanh@tungstengraphics.com> 27dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * Author: Jakob Bornecrantz <wallbraker@gmail.com> 28dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson * 29dc8058c3370588bfcad49fadace1691da47d58cdAdam Jackson */ 30cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 31cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include <unistd.h> 32cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include <string.h> 33cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include <assert.h> 34cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include <stdlib.h> 35cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include <math.h> 36cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include <stdint.h> 37cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 38cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include "xorg-server.h" 39cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include <xf86.h> 40cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include <xf86i2c.h> 41cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include <xf86Crtc.h> 4238c51a76533a90cf2c9381c99247cfac45fe70ebKristian Høgsberg#include "xorg_tracker.h" 437a9329ba99fe1242c07fbf4fd04e7a4dbeba2e72Robert Bragg#include "xf86Modes.h" 44cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 45cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#ifdef HAVE_XEXTPROTO_71 46cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include <X11/extensions/dpmsconst.h> 47cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#else 48cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#define DPMS_SERVER 49cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include <X11/extensions/dpms.h> 50ad919c30df71bc191be6f107385638b456da6a0fAdam Jackson#endif 51ad919c30df71bc191be6f107385638b456da6a0fAdam Jackson 52ad919c30df71bc191be6f107385638b456da6a0fAdam Jackson#include "pipe/p_inlines.h" 53cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson#include "util/u_rect.h" 5465d98e25770487456eb3d7eb8ec3ec8272f170b1Kristian Høgsberg 554a22ae8d446855d839cc199df8eb1b057045cb88Kristian Høgsbergstruct crtc_private 56a2f28ceea22254f09ee37039eec873ccdf689e6cMatt Turner{ 5702986cb2cc1b1d47b26a653e9ae0fa508365f616Ian Romanick drmModeCrtcPtr drm_crtc; 58cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 59cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson /* hwcursor */ 60ec770150edff9a5955f52e538adc4bac94c92cadJeremy Huddleston struct pipe_texture *cursor_tex; 61ec770150edff9a5955f52e538adc4bac94c92cadJeremy Huddleston unsigned cursor_handle; 626ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg}; 63a25e1aa0aab6bd278eefa7c0748b491c9c6ae62cBrian Paul 640896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 650896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófcrtc_dpms(xf86CrtcPtr crtc, int mode) 66cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 67cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson switch (mode) { 68cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson case DPMSModeOn: 69c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg case DPMSModeStandby: 70c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg case DPMSModeSuspend: 71cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson break; 72cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson case DPMSModeOff: 73cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson break; 74cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 75cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 76c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg 777b7845a076c933e096ac511b4184141ba194449aKristian Høgsbergstatic Bool 7880b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddlestoncrtc_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode, 7980b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston Rotation rotation, int x, int y) 80cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 8180b280db883edc9550484dba03bd5c124b6a9bf9Jeremy Huddleston xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(crtc->scrn); 82cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson modesettingPtr ms = modesettingPTR(crtc->scrn); 83cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson xf86OutputPtr output = NULL; 84cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson drmModeConnectorPtr drm_connector; 85cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson struct crtc_private *crtcp = crtc->driver_private; 86cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson drmModeCrtcPtr drm_crtc = crtcp->drm_crtc; 87425f9ed44e576aef27f7ab98968043f7f180d0fdKristian Høgsberg drmModeModeInfo drm_mode; 8892d2a78f8d2d56cfadb4cb5323adec32fe73e353Kristian Høgsberg int i, ret; 8920b9230ce1b96ca246850a8088caeffc3f391a0cKristian Høgsberg 9092d2a78f8d2d56cfadb4cb5323adec32fe73e353Kristian Høgsberg for (i = 0; i < config->num_output; output = NULL, i++) { 910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf output = config->output[i]; 920896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 93cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson if (output->crtc == crtc) 94cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson break; 95cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 960896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 97a1ea6f6198d80f716936a308cfab235f18a014e1Kristian Høgsberg if (!output) 98c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg return FALSE; 9992d2a78f8d2d56cfadb4cb5323adec32fe73e353Kristian Høgsberg 10092d2a78f8d2d56cfadb4cb5323adec32fe73e353Kristian Høgsberg drm_connector = output->driver_private; 101daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 102daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes drm_mode.clock = mode->Clock; 10366fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg drm_mode.hdisplay = mode->HDisplay; 104daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes drm_mode.hsync_start = mode->HSyncStart; 105c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg drm_mode.hsync_end = mode->HSyncEnd; 106c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg drm_mode.htotal = mode->HTotal; 107c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg drm_mode.vdisplay = mode->VDisplay; 108c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg drm_mode.vsync_start = mode->VSyncStart; 109daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes drm_mode.vsync_end = mode->VSyncEnd; 11066fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg drm_mode.vtotal = mode->VTotal; 111daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes drm_mode.flags = mode->Flags; 112daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes drm_mode.hskew = mode->HSkew; 1136ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg drm_mode.vscan = mode->VScan; 114daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes drm_mode.vrefresh = mode->VRefresh; 115daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes if (!mode->name) 116daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes xf86SetModeDefaultName(mode); 117daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes strncpy(drm_mode.name, mode->name, DRM_DISPLAY_MODE_LEN); 118daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 11966fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg ret = drmModeSetCrtc(ms->fd, drm_crtc->crtc_id, ms->fb_id, x, y, 120daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes &drm_connector->connector_id, 1, &drm_mode); 121daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 122daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes if (ret) 123daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes return FALSE; 124daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes 125daf7fe69f7bd0caa955d30b43fc35b7ce0069b6bJesse Barnes crtc->x = x; 126089fc37c6fa158824279e08e3b378ced94d6f803Kristian Høgsberg crtc->y = y; 127efc82e7c703f9160cfdbe6d97e166ca6f5e75d86Jesse Barnes crtc->mode = *mode; 12820b9230ce1b96ca246850a8088caeffc3f391a0cKristian Høgsberg crtc->rotation = rotation; 12920b9230ce1b96ca246850a8088caeffc3f391a0cKristian Høgsberg 1300896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return TRUE; 1310896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf} 1320896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1339110425c72e45f618131b559eba883fd6c5536b4Kristian Høgsbergstatic void 1340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófcrtc_gamma_set(xf86CrtcPtr crtc, CARD16 * red, CARD16 * green, CARD16 * blue, 1350896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf int size) 13666fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg{ 1370896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf} 1380896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 139f8d81c31cee30821da3aab331a57f484f6a07a5dNick Bowlerstatic void * 140bf69ce37f0dcbb479078ee676d5100ac63e20750Stéphane Marchesincrtc_shadow_allocate(xf86CrtcPtr crtc, int width, int height) 141cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 142cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson return NULL; 143cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 144cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 145cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic PixmapPtr 146cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksoncrtc_shadow_create(xf86CrtcPtr crtc, void *data, int width, int height) 1470896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{ 1480896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return NULL; 1490896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf} 15061d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerez 151a0e510320009766faa5ff8c0ed744e87f8095df7Luca Barbieristatic void 15261d26bc82e7c4100acfb551cbb0ba9d84bbc4ba5Francisco Jerezcrtc_shadow_destroy(xf86CrtcPtr crtc, PixmapPtr rotate_pixmap, void *data) 153cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 154cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 155cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 156cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* 157cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Cursor functions 1580896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf */ 159cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 1600896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 161cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksoncrtc_set_cursor_colors(xf86CrtcPtr crtc, int bg, int fg) 162cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 163cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 164cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 165cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic void 166cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksoncrtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y) 167cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 1680896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf modesettingPtr ms = modesettingPTR(crtc->scrn); 1690896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf struct crtc_private *crtcp = crtc->driver_private; 1700896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 1710896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf drmModeMoveCursor(ms->fd, crtcp->drm_crtc->crtc_id, x, y); 1720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf} 1730896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 1740896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófcrtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 * image) 1750896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{ 1760896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf unsigned char *ptr; 1770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf modesettingPtr ms = modesettingPTR(crtc->scrn); 1780896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf struct crtc_private *crtcp = crtc->driver_private; 179cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson struct pipe_transfer *transfer; 180cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 181cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson if (!crtcp->cursor_tex) { 1820896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf struct pipe_texture templat; 1830896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf unsigned pitch; 1840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 185cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson memset(&templat, 0, sizeof(templat)); 186cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson templat.tex_usage |= PIPE_TEXTURE_USAGE_RENDER_TARGET; 187fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick templat.tex_usage |= PIPE_TEXTURE_USAGE_PRIMARY; 188fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick templat.target = PIPE_TEXTURE_2D; 189fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick templat.last_level = 0; 190cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson templat.depth[0] = 1; 1910896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf templat.format = PIPE_FORMAT_A8R8G8B8_UNORM; 192cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson templat.width[0] = 64; 193cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson templat.height[0] = 64; 194fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick pf_get_block(templat.format, &templat.block); 195fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick 196cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson crtcp->cursor_tex = ms->screen->texture_create(ms->screen, 1970896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf &templat); 1980896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ms->api->local_handle_from_texture(ms->api, 199cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ms->screen, 200fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick crtcp->cursor_tex, 201fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick &pitch, 202fdb07636f2e6324c5250cd5ee97778b7f5933beaIan Romanick &crtcp->cursor_handle); 203cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 2040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 205cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson transfer = ms->screen->get_tex_transfer(ms->screen, crtcp->cursor_tex, 206cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 0, 0, 0, 2070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf PIPE_TRANSFER_WRITE, 2080896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 0, 0, 64, 64); 2090896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf ptr = ms->screen->transfer_map(ms->screen, transfer); 2100896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf util_copy_rect(ptr, &crtcp->cursor_tex->block, 211cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson transfer->stride, 0, 0, 212cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 64, 64, (void*)image, 64 * 4, 0, 0); 213643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg ms->screen->transfer_unmap(ms->screen, transfer); 214c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg ms->screen->tex_transfer_destroy(transfer); 215c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg} 216c491e585e43d48a2aeec96ccc4008da6c443fb42Kristian Høgsberg 2178a4b36de05a133c1c9527836ca58bf8ebdf229bdIan Romanickstatic void 218c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsbergcrtc_show_cursor(xf86CrtcPtr crtc) 219c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg{ 220c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg modesettingPtr ms = modesettingPTR(crtc->scrn); 2217b7845a076c933e096ac511b4184141ba194449aKristian Høgsberg struct crtc_private *crtcp = crtc->driver_private; 222643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg 223643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg if (crtcp->cursor_tex) 224643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg drmModeSetCursor(ms->fd, crtcp->drm_crtc->crtc_id, 225643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg crtcp->cursor_handle, 64, 64); 226559e4f8ebcb186b491d7d687ac43f22a62448fc1Jeremy Huddleston} 227643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsberg 228643b2af0203764cb9f0a5b9e082937ab3f243523Kristian Høgsbergstatic void 229cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksoncrtc_hide_cursor(xf86CrtcPtr crtc) 230cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 231cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson modesettingPtr ms = modesettingPTR(crtc->scrn); 232cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson struct crtc_private *crtcp = crtc->driver_private; 233c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg 2340896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf drmModeSetCursor(ms->fd, crtcp->drm_crtc->crtc_id, 0, 0, 0); 235cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 236cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 237cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonvoid 238cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksoncrtc_cursor_destroy(xf86CrtcPtr crtc) 239cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 240cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson struct crtc_private *crtcp = crtc->driver_private; 241cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 242cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson if (crtcp->cursor_tex) { 243cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson pipe_texture_reference(&crtcp->cursor_tex, NULL); 244cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 245cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 246cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 247cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* 248cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson * Misc functions 249cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson */ 250cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 2510896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófstatic void 2520896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristófcrtc_destroy(xf86CrtcPtr crtc) 2530896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf{ 2540896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf struct crtc_private *crtcp = crtc->driver_private; 2550896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 2560896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (crtcp->cursor_tex) 2570896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf pipe_texture_reference(&crtcp->cursor_tex, NULL); 258cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 2593ea3f5e0a542cfd9f9a3433515fd27e0a5d1b1acKristian Høgsberg drmModeFreeCrtc(crtcp->drm_crtc); 2603ea3f5e0a542cfd9f9a3433515fd27e0a5d1b1acKristian Høgsberg xfree(crtcp); 261cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 262cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 263cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonstatic const xf86CrtcFuncsRec crtc_funcs = { 264cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson .dpms = crtc_dpms, 265cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson .set_mode_major = crtc_set_mode_major, 266cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 2670896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf .set_cursor_colors = crtc_set_cursor_colors, 268cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson .set_cursor_position = crtc_set_cursor_position, 269cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson .show_cursor = crtc_show_cursor, 270cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson .hide_cursor = crtc_hide_cursor, 271cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson .load_cursor_argb = crtc_load_cursor_argb, 2720896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 273cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson .shadow_create = crtc_shadow_create, 274cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson .shadow_allocate = crtc_shadow_allocate, 275cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson .shadow_destroy = crtc_shadow_destroy, 276cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 2770896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf .gamma_set = crtc_gamma_set, 27866fc35cde9ed68a09920ad6a28de794dd1d3aa8cKristian Høgsberg .destroy = crtc_destroy, 279cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson}; 280cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 281cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksonvoid 282cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jacksoncrtc_init(ScrnInfoPtr pScrn) 283cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson{ 2840896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf modesettingPtr ms = modesettingPTR(pScrn); 285cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson xf86CrtcPtr crtc; 286cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson drmModeResPtr res; 287cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson drmModeCrtcPtr drm_crtc = NULL; 288cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson struct crtc_private *crtcp; 289cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson int c; 290cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 291cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson res = drmModeGetResources(ms->fd); 292cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson if (res == 0) { 293cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson ErrorF("Failed drmModeGetResources %d\n", errno); 2940896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf return; 295cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 296cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 297cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson for (c = 0; c < res->count_crtcs; c++) { 298cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson drm_crtc = drmModeGetCrtc(ms->fd, res->crtcs[c]); 299cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 300cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson if (!drm_crtc) 301cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson continue; 302cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 3030896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf crtc = xf86CrtcCreate(pScrn, &crtc_funcs); 3040896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf if (crtc == NULL) 3050896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf goto out; 3060896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 3070896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf crtcp = xcalloc(1, sizeof(struct crtc_private)); 308cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson if (!crtcp) { 309cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson xf86CrtcDestroy(crtc); 310cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson goto out; 311cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 312cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 313c356f5867f2c1fad7155df538b9affa8dbdcf869Kristian Høgsberg crtcp->drm_crtc = drm_crtc; 3140896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf 315cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson crtc->driver_private = crtcp; 316cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson } 31729206ae569c4c784ec6884084b4bd8631f66b866Ian Romanick 318cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson out: 3190896268b97674d009d609476acfa1eed5dfea350RALOVICH, Kristóf drmModeFreeResources(res); 320cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson} 321cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson 322cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson/* vim: set sw=4 ts=8 sts=4: */ 323cb3610e37c4c0a40520441b8515d044dabcc8854Adam Jackson