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