1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software. 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Author: Alan Hourihane <alanh@tungstengraphics.com> 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Author: Jakob Bornecrantz <wallbraker@gmail.com> 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <unistd.h> 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <string.h> 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <assert.h> 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdlib.h> 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <math.h> 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdint.h> 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "xorg-server.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <xf86.h> 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <xf86i2c.h> 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <xf86Crtc.h> 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <cursorstr.h> 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "xorg_tracker.h" 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "xf86Modes.h" 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_XEXTPROTO_71 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <X11/extensions/dpmsconst.h> 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DPMS_SERVER 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <X11/extensions/dpms.h> 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "state_tracker/drm_driver.h" 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h" 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_rect.h" 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_LIBKMS 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "libkms/libkms.h" 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct crtc_private 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drmModeCrtcPtr drm_crtc; 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* hwcursor */ 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource *cursor_tex; 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct kms_bo *cursor_bo; 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned cursor_handle; 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcrtc_dpms(xf86CrtcPtr crtc, int mode) 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* ScrnInfoPtr pScrn = crtc->scrn; */ 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (mode) { 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case DPMSModeOn: 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case DPMSModeStandby: 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case DPMSModeSuspend: 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case DPMSModeOff: 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic Bool 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcrtc_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode, 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Rotation rotation, int x, int y) 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(crtc->scrn); 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org modesettingPtr ms = modesettingPTR(crtc->scrn); 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xf86OutputPtr output = NULL; 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct crtc_private *crtcp = crtc->driver_private; 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drmModeCrtcPtr drm_crtc = crtcp->drm_crtc; 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drmModeModeInfo drm_mode; 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i, ret; 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int connector_id; 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < config->num_output; output = NULL, i++) { 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org output = config->output[i]; 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (output->crtc == crtc) 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!output) 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org connector_id = xorg_output_get_id(output); 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_mode.clock = mode->Clock; 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_mode.hdisplay = mode->HDisplay; 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_mode.hsync_start = mode->HSyncStart; 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_mode.hsync_end = mode->HSyncEnd; 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_mode.htotal = mode->HTotal; 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_mode.vdisplay = mode->VDisplay; 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_mode.vsync_start = mode->VSyncStart; 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_mode.vsync_end = mode->VSyncEnd; 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_mode.vtotal = mode->VTotal; 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_mode.flags = mode->Flags; 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_mode.hskew = mode->HSkew; 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_mode.vscan = mode->VScan; 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_mode.vrefresh = mode->VRefresh; 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_mode.type = 0; 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!mode->name) 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xf86SetModeDefaultName(mode); 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org strncpy(drm_mode.name, mode->name, DRM_DISPLAY_MODE_LEN - 1); 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_mode.name[DRM_DISPLAY_MODE_LEN - 1] = '\0'; 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ret = drmModeSetCrtc(ms->fd, drm_crtc->crtc_id, ms->fb_id, x, y, 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &connector_id, 1, &drm_mode); 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ret) 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Only set gamma when needed, to avoid unneeded delays. */ 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if defined(XF86_CRTC_VERSION) && XF86_CRTC_VERSION >= 3 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!crtc->active && crtc->version >= 3) 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org crtc->funcs->gamma_set(crtc, crtc->gamma_red, crtc->gamma_green, 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org crtc->gamma_blue, crtc->gamma_size); 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org crtc->active = TRUE; 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org crtc->x = x; 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org crtc->y = y; 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org crtc->mode = *mode; 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org crtc->rotation = rotation; 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcrtc_gamma_set(xf86CrtcPtr crtc, CARD16 * red, CARD16 * green, CARD16 * blue, 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int size) 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org modesettingPtr ms = modesettingPTR(crtc->scrn); 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct crtc_private *crtcp = crtc->driver_private; 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drmModeCrtcSetGamma(ms->fd, crtcp->drm_crtc->crtc_id, size, red, green, blue); 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 /* Implement and enable to enable rotation and reflection. */ 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void * 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcrtc_shadow_allocate(xf86CrtcPtr crtc, int width, int height) 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* ScrnInfoPtr pScrn = crtc->scrn; */ 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic PixmapPtr 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcrtc_shadow_create(xf86CrtcPtr crtc, void *data, int width, int height) 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* ScrnInfoPtr pScrn = crtc->scrn; */ 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcrtc_shadow_destroy(xf86CrtcPtr crtc, PixmapPtr rotate_pixmap, void *data) 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* ScrnInfoPtr pScrn = crtc->scrn; */ 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Cursor functions 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcrtc_set_cursor_colors(xf86CrtcPtr crtc, int bg, int fg) 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX: See if this one is needed, as we only support ARGB cursors */ 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcrtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y) 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org modesettingPtr ms = modesettingPTR(crtc->scrn); 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct crtc_private *crtcp = crtc->driver_private; 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drmModeMoveCursor(ms->fd, crtcp->drm_crtc->crtc_id, x, y); 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcrtc_load_cursor_argb_ga3d(xf86CrtcPtr crtc, CARD32 * image) 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char *ptr; 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org modesettingPtr ms = modesettingPTR(crtc->scrn); 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct crtc_private *crtcp = crtc->driver_private; 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_transfer *transfer; 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_fence_handle *fence = NULL; 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_context *ctx = ms->ctx; 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_screen *screen = ms->screen; 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!crtcp->cursor_tex) { 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_resource templat; 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct winsys_handle whandle; 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&templat, 0, sizeof(templat)); 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.bind |= PIPE_BIND_RENDER_TARGET; 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.bind |= PIPE_BIND_SCANOUT; 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.bind |= PIPE_BIND_CURSOR; 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.target = PIPE_TEXTURE_2D; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.last_level = 0; 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.depth0 = 1; 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.array_size = 1; 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.format = PIPE_FORMAT_B8G8R8A8_UNORM; 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.width0 = 64; 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org templat.height0 = 64; 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&whandle, 0, sizeof(whandle)); 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org whandle.type = DRM_API_HANDLE_TYPE_KMS; 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org crtcp->cursor_tex = screen->resource_create(screen, &templat); 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->resource_get_handle(screen, crtcp->cursor_tex, &whandle); 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org crtcp->cursor_handle = whandle.handle; 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transfer = pipe_get_transfer(ctx, crtcp->cursor_tex, 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PIPE_TRANSFER_WRITE, 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, 64, 64); 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ptr = ctx->transfer_map(ctx, transfer); 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_copy_rect(ptr, crtcp->cursor_tex->format, 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transfer->stride, 0, 0, 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64, 64, (void*)image, 64 * 4, 0, 0); 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->transfer_unmap(ctx, transfer); 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->transfer_destroy(ctx, transfer); 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->flush(ctx, &fence); 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (fence) { 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->fence_finish(screen, fence, PIPE_TIMEOUT_INFINITE); 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org screen->fence_reference(screen, &fence, NULL); 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (crtc->cursor_shown) 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drmModeSetCursor(ms->fd, crtcp->drm_crtc->crtc_id, 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org crtcp->cursor_handle, 64, 64); 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if HAVE_LIBKMS 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcrtc_load_cursor_argb_kms(xf86CrtcPtr crtc, CARD32 * image) 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org modesettingPtr ms = modesettingPTR(crtc->scrn); 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct crtc_private *crtcp = crtc->driver_private; 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char *ptr; 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!crtcp->cursor_bo) { 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned attr[8]; 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attr[0] = KMS_BO_TYPE; 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attr[1] = KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8; 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attr[1] = KMS_BO_TYPE_CURSOR; 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attr[2] = KMS_WIDTH; 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attr[3] = 64; 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attr[4] = KMS_HEIGHT; 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attr[5] = 64; 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org attr[6] = 0; 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (kms_bo_create(ms->kms, attr, &crtcp->cursor_bo)) 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (kms_bo_get_prop(crtcp->cursor_bo, KMS_HANDLE, 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &crtcp->cursor_handle)) 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto err_bo_destroy; 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org kms_bo_map(crtcp->cursor_bo, (void**)&ptr); 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(ptr, image, 64*64*4); 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org kms_bo_unmap(crtcp->cursor_bo); 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (crtc->cursor_shown) 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drmModeSetCursor(ms->fd, crtcp->drm_crtc->crtc_id, 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org crtcp->cursor_handle, 64, 64); 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgerr_bo_destroy: 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org kms_bo_destroy(&crtcp->cursor_bo); 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcrtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 * image) 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(crtc->scrn); 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org modesettingPtr ms = modesettingPTR(crtc->scrn); 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Older X servers have cursor reference counting bugs leading to use of 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * freed memory and consequently random crashes. Should be fixed as of 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * xserver 1.8, but this workaround shouldn't hurt anyway. 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (config->cursor) 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org config->cursor->refcnt++; 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ms->cursor) 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FreeCursor(ms->cursor, None); 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ms->cursor = config->cursor; 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ms->screen) 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org crtc_load_cursor_argb_ga3d(crtc, image); 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_LIBKMS 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (ms->kms) 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org crtc_load_cursor_argb_kms(crtc, image); 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcrtc_show_cursor(xf86CrtcPtr crtc) 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org modesettingPtr ms = modesettingPTR(crtc->scrn); 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct crtc_private *crtcp = crtc->driver_private; 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (crtcp->cursor_tex || crtcp->cursor_bo) 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drmModeSetCursor(ms->fd, crtcp->drm_crtc->crtc_id, 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org crtcp->cursor_handle, 64, 64); 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcrtc_hide_cursor(xf86CrtcPtr crtc) 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org modesettingPtr ms = modesettingPTR(crtc->scrn); 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct crtc_private *crtcp = crtc->driver_private; 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drmModeSetCursor(ms->fd, crtcp->drm_crtc->crtc_id, 0, 0, 0); 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called at vt leave 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxorg_crtc_cursor_destroy(xf86CrtcPtr crtc) 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct crtc_private *crtcp = crtc->driver_private; 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (crtcp->cursor_tex) 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource_reference(&crtcp->cursor_tex, NULL); 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef HAVE_LIBKMS 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (crtcp->cursor_bo) 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org kms_bo_destroy(&crtcp->cursor_bo); 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Misc functions 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcrtc_destroy(xf86CrtcPtr crtc) 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct crtc_private *crtcp = crtc->driver_private; 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xorg_crtc_cursor_destroy(crtc); 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drmModeFreeCrtc(crtcp->drm_crtc); 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(crtcp); 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org crtc->driver_private = NULL; 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const xf86CrtcFuncsRec crtc_funcs = { 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .dpms = crtc_dpms, 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .set_mode_major = crtc_set_mode_major, 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .set_cursor_colors = crtc_set_cursor_colors, 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .set_cursor_position = crtc_set_cursor_position, 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .show_cursor = crtc_show_cursor, 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .hide_cursor = crtc_hide_cursor, 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .load_cursor_argb = crtc_load_cursor_argb, 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .shadow_create = NULL, 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .shadow_allocate = NULL, 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .shadow_destroy = NULL, 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .gamma_set = crtc_gamma_set, 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org .destroy = crtc_destroy, 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgxorg_crtc_init(ScrnInfoPtr pScrn) 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org modesettingPtr ms = modesettingPTR(pScrn); 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xf86CrtcPtr crtc; 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drmModeResPtr res; 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drmModeCrtcPtr drm_crtc = NULL; 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct crtc_private *crtcp; 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int c; 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res = drmModeGetResources(ms->fd); 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (res == 0) { 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ErrorF("Failed drmModeGetResources %d\n", errno); 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (c = 0; c < res->count_crtcs; c++) { 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drm_crtc = drmModeGetCrtc(ms->fd, res->crtcs[c]); 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!drm_crtc) 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org crtc = xf86CrtcCreate(pScrn, &crtc_funcs); 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (crtc == NULL) 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out; 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org crtcp = calloc(1, sizeof(struct crtc_private)); 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!crtcp) { 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xf86CrtcDestroy(crtc); 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto out; 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org crtcp->drm_crtc = drm_crtc; 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org crtc->driver_private = crtcp; 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org out: 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org drmModeFreeResources(res); 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* vim: set sw=4 ts=8 sts=4: */ 450