Screen is primary, GPUScreen is not primary. Signed-off-by: Qiang Yu <qiang...@amd.com> --- hw/xfree86/drivers/modesetting/driver.c | 32 ++++++++++++++++++++++++++++---- hw/xfree86/drivers/modesetting/driver.h | 1 + 2 files changed, 29 insertions(+), 4 deletions(-)
diff --git a/hw/xfree86/drivers/modesetting/driver.c b/hw/xfree86/drivers/modesetting/driver.c index ebaeba9..c16bc0b 100644 --- a/hw/xfree86/drivers/modesetting/driver.c +++ b/hw/xfree86/drivers/modesetting/driver.c @@ -414,6 +414,7 @@ ms_platform_probe(DriverPtr driver, if (probe_hw(path, dev)) { static ScrnInfoPtr scrn_all = NULL; + modesettingEntPtr ms_ent; if (getenv("MS_ALL_IN_ONE")) { if (!scrn_all) { @@ -437,6 +438,9 @@ ms_platform_probe(DriverPtr driver, scrn_all ? "enabled" : "disabled"); ms_setup_entity(scrn, entity_num); + + ms_ent = xf86GetEntityPrivate(entity_num, ms_entity_index)->ptr; + ms_ent->is_primary = !(flags & PLATFORM_PROBE_GPU_SCREEN); } return scrn != NULL; @@ -899,11 +903,31 @@ PreInit(ScrnInfoPtr pScrn, int flags) int ret; int bppflags, connector_count; int defaultdepth, defaultbpp; + int primary_entity = -1; if (pScrn->numEntities <= 0) return FALSE; + else if (pScrn->numEntities > 1) { + int i; + + for (i = 0; i < pScrn->numEntities; i++) { + modesettingEntPtr ms_ent = xf86GetEntityPrivate( + pScrn->entityList[i], ms_entity_index)->ptr; + if (ms_ent->is_primary) { + primary_entity = pScrn->entityList[i]; + break; + } + } + + if (primary_entity == -1) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "all in one: no primary entity\n"); + return FALSE; + } + } + else + primary_entity = pScrn->entityList[0]; - pEnt = xf86GetEntityInfo(pScrn->entityList[0]); + pEnt = xf86GetEntityInfo(primary_entity); if (flags & PROBE_DETECT) { return FALSE; @@ -919,11 +943,11 @@ PreInit(ScrnInfoPtr pScrn, int flags) ms->drmmode.is_secondary = FALSE; pScrn->displayWidth = 640; /* default it */ - if (xf86IsEntityShared(pScrn->entityList[0])) { - if (xf86IsPrimInitDone(pScrn->entityList[0])) + if (xf86IsEntityShared(primary_entity)) { + if (xf86IsPrimInitDone(primary_entity)) ms->drmmode.is_secondary = TRUE; else - xf86SetPrimInitDone(pScrn->entityList[0]); + xf86SetPrimInitDone(primary_entity); } pScrn->monitor = pScrn->confScreen->monitor; diff --git a/hw/xfree86/drivers/modesetting/driver.h b/hw/xfree86/drivers/modesetting/driver.h index eee96e5..37d6c6a 100644 --- a/hw/xfree86/drivers/modesetting/driver.h +++ b/hw/xfree86/drivers/modesetting/driver.h @@ -62,6 +62,7 @@ typedef struct unsigned long fd_wakeup_registered; /* server generation for which fd has been registered for wakeup handling */ int fd_wakeup_ref; unsigned int assigned_crtcs; + Bool is_primary; } modesettingEntRec, *modesettingEntPtr; typedef void (*ms_drm_handler_proc)(uint64_t frame, -- 2.7.4 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: https://lists.x.org/mailman/listinfo/xorg-devel