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:
parent
ae24f5bf6b
commit
02fbae85e7
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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];
|
||||||
|
|
Loading…
Reference in New Issue