modesetting: attempt to work out if we want 24 or 32bpp
the cirrus driver presents certain challenges, and this is a workaround, until we can possibly agree some sane interface for exposing this information. Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
610f532e6a
commit
d063f64b5c
|
@ -59,10 +59,6 @@
|
||||||
|
|
||||||
#include "driver.h"
|
#include "driver.h"
|
||||||
|
|
||||||
#ifndef DRM_CAP_DUMB_PREFER_SHADOW
|
|
||||||
#define DRM_CAP_DUMB_PREFER_SHADOW 4
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void AdjustFrame(int scrnIndex, int x, int y, int flags);
|
static void AdjustFrame(int scrnIndex, int x, int y, int flags);
|
||||||
static Bool CloseScreen(int scrnIndex, ScreenPtr pScreen);
|
static Bool CloseScreen(int scrnIndex, ScreenPtr pScreen);
|
||||||
static Bool EnterVT(int scrnIndex, int flags);
|
static Bool EnterVT(int scrnIndex, int flags);
|
||||||
|
@ -397,6 +393,8 @@ PreInit(ScrnInfoPtr pScrn, int flags)
|
||||||
Bool prefer_shadow = TRUE;
|
Bool prefer_shadow = TRUE;
|
||||||
uint64_t value = 0;
|
uint64_t value = 0;
|
||||||
int ret;
|
int ret;
|
||||||
|
int bppflags;
|
||||||
|
int defaultdepth, defaultbpp;
|
||||||
|
|
||||||
if (pScrn->numEntities != 1)
|
if (pScrn->numEntities != 1)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -459,9 +457,16 @@ PreInit(ScrnInfoPtr pScrn, int flags)
|
||||||
if (ms->fd < 0)
|
if (ms->fd < 0)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
ms->drmmode.fd = ms->fd;
|
||||||
|
|
||||||
|
drmmode_get_default_bpp(pScrn, &ms->drmmode, &defaultdepth, &defaultbpp);
|
||||||
|
if (defaultdepth == 24 && defaultbpp == 24)
|
||||||
|
bppflags = Support24bppFb;
|
||||||
|
else
|
||||||
|
bppflags = PreferConvert24to32 | SupportConvert24to32 | Support32bppFb;
|
||||||
|
|
||||||
if (!xf86SetDepthBpp
|
if (!xf86SetDepthBpp
|
||||||
(pScrn, 0, 0, 0,
|
(pScrn, defaultdepth, defaultdepth, defaultbpp, bppflags))
|
||||||
PreferConvert24to32 | SupportConvert24to32 | Support32bppFb))
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
switch (pScrn->depth) {
|
switch (pScrn->depth) {
|
||||||
|
@ -501,7 +506,6 @@ PreInit(ScrnInfoPtr pScrn, int flags)
|
||||||
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");
|
||||||
ms->drmmode.fd = ms->fd;
|
|
||||||
if (drmmode_pre_init(pScrn, &ms->drmmode, pScrn->bitsPerPixel / 8) == FALSE) {
|
if (drmmode_pre_init(pScrn, &ms->drmmode, pScrn->bitsPerPixel / 8) == FALSE) {
|
||||||
xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "KMS setup failed\n");
|
xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "KMS setup failed\n");
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
|
@ -1355,3 +1355,50 @@ void drmmode_free_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode)
|
||||||
dumb_bo_destroy(drmmode->fd, drmmode_crtc->cursor_bo);
|
dumb_bo_destroy(drmmode->fd, drmmode_crtc->cursor_bo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ugly workaround to see if we can create 32bpp */
|
||||||
|
void drmmode_get_default_bpp(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int *depth, int *bpp)
|
||||||
|
{
|
||||||
|
drmModeResPtr mode_res;
|
||||||
|
uint64_t value;
|
||||||
|
struct dumb_bo *bo;
|
||||||
|
uint32_t fb_id;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/* 16 is fine */
|
||||||
|
ret = drmGetCap(drmmode->fd, DRM_CAP_DUMB_PREFERRED_DEPTH, &value);
|
||||||
|
if (!ret && (value == 16 || value == 8)) {
|
||||||
|
*depth = value;
|
||||||
|
*bpp = value;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
*depth = 24;
|
||||||
|
mode_res = drmModeGetResources(drmmode->fd);
|
||||||
|
if (!mode_res)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/*create a bo */
|
||||||
|
bo = dumb_bo_create(drmmode->fd, mode_res->min_width, mode_res->min_height, 32);
|
||||||
|
if (!bo) {
|
||||||
|
*bpp = 24;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = drmModeAddFB(drmmode->fd, mode_res->min_width, mode_res->min_height,
|
||||||
|
24, 32, bo->pitch, bo->handle, &fb_id);
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
*bpp = 24;
|
||||||
|
dumb_bo_destroy(drmmode->fd, bo);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
drmModeRmFB(drmmode->fd, fb_id);
|
||||||
|
*bpp = 32;
|
||||||
|
|
||||||
|
dumb_bo_destroy(drmmode->fd, bo);
|
||||||
|
out:
|
||||||
|
drmModeFreeResources(mode_res);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
|
@ -103,4 +103,14 @@ Bool drmmode_create_initial_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode);
|
||||||
void *drmmode_map_front_bo(drmmode_ptr drmmode);
|
void *drmmode_map_front_bo(drmmode_ptr drmmode);
|
||||||
Bool drmmode_map_cursor_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode);
|
Bool drmmode_map_cursor_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode);
|
||||||
void drmmode_free_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode);
|
void drmmode_free_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode);
|
||||||
|
void drmmode_get_default_bpp(ScrnInfoPtr pScrn, drmmode_ptr drmmmode, int *depth, int *bpp);
|
||||||
|
|
||||||
|
#ifndef DRM_CAP_DUMB_PREFERRED_DEPTH
|
||||||
|
#define DRM_CAP_DUMB_PREFERRED_DEPTH 3
|
||||||
|
#endif
|
||||||
|
#ifndef DRM_CAP_DUMB_PREFER_SHADOW
|
||||||
|
#define DRM_CAP_DUMB_PREFER_SHADOW 4
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue