modesetting: query cursor size from the kernel

Use new drm caps.  This allows hw cursors to work
correctly on gpus with non-64x64 cursors.

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Alex Deucher 2014-02-12 13:06:51 -05:00
parent ae24f5bf6b
commit 02fbae85e7
3 changed files with 36 additions and 6 deletions

View File

@ -566,6 +566,14 @@ FreeRec(ScrnInfoPtr pScrn)
} }
#ifndef DRM_CAP_CURSOR_WIDTH
#define DRM_CAP_CURSOR_WIDTH 0x8
#endif
#ifndef DRM_CAP_CURSOR_HEIGHT
#define DRM_CAP_CURSOR_HEIGHT 0x9
#endif
static Bool static Bool
PreInit(ScrnInfoPtr pScrn, int flags) PreInit(ScrnInfoPtr pScrn, int flags)
{ {
@ -706,6 +714,17 @@ PreInit(ScrnInfoPtr pScrn, int flags)
prefer_shadow = !!value; prefer_shadow = !!value;
} }
ms->cursor_width = 64;
ms->cursor_height = 64;
ret = drmGetCap(ms->fd, DRM_CAP_CURSOR_WIDTH, &value);
if (!ret) {
ms->cursor_width = value;
}
ret = drmGetCap(ms->fd, DRM_CAP_CURSOR_HEIGHT, &value);
if (!ret) {
ms->cursor_height = value;
}
ms->drmmode.shadow_enable = xf86ReturnOptValBool(ms->Options, OPTION_SHADOW_FB, prefer_shadow); ms->drmmode.shadow_enable = xf86ReturnOptValBool(ms->Options, OPTION_SHADOW_FB, prefer_shadow);
xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ShadowFB: preferred %s, enabled %s\n", prefer_shadow ? "YES" : "NO", ms->drmmode.shadow_enable ? "YES" : "NO"); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ShadowFB: preferred %s, enabled %s\n", prefer_shadow ? "YES" : "NO", ms->drmmode.shadow_enable ? "YES" : "NO");
@ -933,7 +952,7 @@ ScreenInit(SCREEN_INIT_ARGS_DECL)
/* Need to extend HWcursor support to handle mask interleave */ /* Need to extend HWcursor support to handle mask interleave */
if (!ms->drmmode.sw_cursor) if (!ms->drmmode.sw_cursor)
xf86_cursors_init(pScreen, 64, 64, xf86_cursors_init(pScreen, ms->cursor_width, ms->cursor_height,
HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64 | HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64 |
HARDWARE_CURSOR_ARGB); HARDWARE_CURSOR_ARGB);

View File

@ -76,6 +76,7 @@ typedef struct _modesettingRec
DamagePtr damage; DamagePtr damage;
Bool dirty_enabled; Bool dirty_enabled;
uint32_t cursor_width, cursor_height;
} modesettingRec, *modesettingPtr; } modesettingRec, *modesettingPtr;
#define modesettingPTR(p) ((modesettingPtr)((p)->driverPrivate)) #define modesettingPTR(p) ((modesettingPtr)((p)->driverPrivate))

View File

@ -52,6 +52,8 @@
#endif #endif
#include "compat-api.h" #include "compat-api.h"
#include "driver.h"
static struct dumb_bo *dumb_bo_create(int fd, static struct dumb_bo *dumb_bo_create(int fd,
const unsigned width, const unsigned height, const unsigned width, const unsigned height,
const unsigned bpp) const unsigned bpp)
@ -445,6 +447,7 @@ drmmode_set_cursor_position (xf86CrtcPtr crtc, int x, int y)
static void static void
drmmode_load_cursor_argb (xf86CrtcPtr crtc, CARD32 *image) drmmode_load_cursor_argb (xf86CrtcPtr crtc, CARD32 *image)
{ {
modesettingPtr ms = modesettingPTR(crtc->scrn);
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
int i; int i;
uint32_t *ptr; uint32_t *ptr;
@ -453,10 +456,11 @@ drmmode_load_cursor_argb (xf86CrtcPtr crtc, CARD32 *image)
/* cursor should be mapped already */ /* cursor should be mapped already */
ptr = (uint32_t *)(drmmode_crtc->cursor_bo->ptr); ptr = (uint32_t *)(drmmode_crtc->cursor_bo->ptr);
for (i = 0; i < 64 * 64; i++) for (i = 0; i < ms->cursor_width * ms->cursor_height; i++)
ptr[i] = image[i];// cpu_to_le32(image[i]); ptr[i] = image[i];// cpu_to_le32(image[i]);
ret = drmModeSetCursor(drmmode_crtc->drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, handle, 64, 64); ret = drmModeSetCursor(drmmode_crtc->drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, handle,
ms->cursor_width, ms->cursor_height);
if (ret) { if (ret) {
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn); xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
xf86CursorInfoPtr cursor_info = xf86_config->cursor_info; xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
@ -471,21 +475,25 @@ drmmode_load_cursor_argb (xf86CrtcPtr crtc, CARD32 *image)
static void static void
drmmode_hide_cursor (xf86CrtcPtr crtc) drmmode_hide_cursor (xf86CrtcPtr crtc)
{ {
modesettingPtr ms = modesettingPTR(crtc->scrn);
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
drmmode_ptr drmmode = drmmode_crtc->drmmode; drmmode_ptr drmmode = drmmode_crtc->drmmode;
drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, 0, 64, 64); drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, 0,
ms->cursor_width, ms->cursor_height);
} }
static void static void
drmmode_show_cursor (xf86CrtcPtr crtc) drmmode_show_cursor (xf86CrtcPtr crtc)
{ {
modesettingPtr ms = modesettingPTR(crtc->scrn);
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
drmmode_ptr drmmode = drmmode_crtc->drmmode; drmmode_ptr drmmode = drmmode_crtc->drmmode;
uint32_t handle = drmmode_crtc->cursor_bo->handle; uint32_t handle = drmmode_crtc->cursor_bo->handle;
drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, handle, 64, 64); drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, handle,
ms->cursor_width, ms->cursor_height);
} }
static void static void
@ -1485,6 +1493,7 @@ void drmmode_uevent_fini(ScrnInfoPtr scrn, drmmode_ptr drmmode)
/* create front and cursor BOs */ /* create front and cursor BOs */
Bool drmmode_create_initial_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode) Bool drmmode_create_initial_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode)
{ {
modesettingPtr ms = modesettingPTR(pScrn);
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
int width; int width;
int height; int height;
@ -1500,7 +1509,8 @@ Bool drmmode_create_initial_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode)
return FALSE; return FALSE;
pScrn->displayWidth = drmmode->front_bo->pitch / cpp; pScrn->displayWidth = drmmode->front_bo->pitch / cpp;
width = height = 64; width = ms->cursor_width;
height = ms->cursor_height;
bpp = 32; bpp = 32;
for (i = 0; i < xf86_config->num_crtc; i++) { for (i = 0; i < xf86_config->num_crtc; i++) {
xf86CrtcPtr crtc = xf86_config->crtc[i]; xf86CrtcPtr crtc = xf86_config->crtc[i];