This allows to use UXA and SNA from within the same driver, by setting an "UseSNA" option in the driver config - for example, by creating an /etc/X11/xorg.conf.d/99-intel-sna.conf:
Section "Device" Identifier "intel" driver "intel" Option "UseSna" "True" EndSection This also allows to record the entity_num within the main intel driver, not only SNA. Signed-off-by: Eugeni Dodonov <eugeni.dodo...@intel.com> --- src/common.h | 2 +- src/intel_driver.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++++- src/intel_module.c | 6 +--- src/sna/sna_driver.c | 14 +------ src/sna/sna_module.h | 3 +- 5 files changed, 100 insertions(+), 21 deletions(-) diff --git a/src/common.h b/src/common.h index 6f23cdd..6b86801 100644 --- a/src/common.h +++ b/src/common.h @@ -77,7 +77,7 @@ I830DPRINTF_stub(const char *filename, int line, const char *function, /* I830 hooks for the I810 driver setup/probe. */ extern const OptionInfoRec *I830AvailableOptions(int chipid, int busid); -extern void intel_init_scrn(ScrnInfoPtr scrn); +extern void intel_init_scrn(ScrnInfoPtr scrn, int entity_num); /* Symbol lists shared by the i810 and i830 parts. */ extern int I830EntityIndex; diff --git a/src/intel_driver.c b/src/intel_driver.c index 24696da..09c306c 100644 --- a/src/intel_driver.c +++ b/src/intel_driver.c @@ -101,6 +101,7 @@ typedef enum { OPTION_DEBUG_WAIT, OPTION_HOTPLUG, OPTION_RELAXED_FENCING, + OPTION_USE_SNA, } I830Opts; static OptionInfoRec I830Options[] = { @@ -122,6 +123,7 @@ static OptionInfoRec I830Options[] = { {OPTION_DEBUG_WAIT, "DebugWait", OPTV_BOOLEAN, {0}, FALSE}, {OPTION_HOTPLUG, "HotPlug", OPTV_BOOLEAN, {0}, TRUE}, {OPTION_RELAXED_FENCING, "RelaxedFencing", OPTV_BOOLEAN, {0}, TRUE}, + {OPTION_USE_SNA, "UseSna", OPTV_BOOLEAN, {0}, FALSE}, {-1, NULL, OPTV_NONE, {0}, FALSE} }; /* *INDENT-ON* */ @@ -1326,9 +1328,91 @@ static Bool I830PMEvent(int scrnIndex, pmEvent event, Bool undo) return TRUE; } -void intel_init_scrn(ScrnInfoPtr scrn) +/* + * Due to the nature of xserver drivers, we need to do a lot of + * things just to attempt to parse driver options. So we do it all + * here, check if we are supposed to use SNA, and call the corresponding + * real setup afterwards. + */ +static Bool intelPreInit(ScrnInfoPtr scrn, int flags) { - scrn->PreInit = I830PreInit; + rgb defaultWeight = { 0, 0, 0 }; + Bool use_sna; + EntityInfoPtr pEnt; + int flags24; + OptionInfoPtr Options; + + xf86DrvMsg(0, X_INFO, "Inside intelPreInit...\n"); + + if (scrn->numEntities != 1) + return FALSE; + + pEnt = xf86GetEntityInfo(scrn->entityList[0]); + + xf86DrvMsg(0, X_INFO, "Detecting monitor...\n"); + + scrn->monitor = scrn->confScreen->monitor; + scrn->progClock = TRUE; + scrn->rgbBits = 8; + + flags24 = Support32bppFb | PreferConvert24to32 | SupportConvert24to32; + + if (!xf86SetDepthBpp(scrn, 0, 0, 0, flags24)) + return FALSE; + + switch (scrn->depth) { + case 8: + case 15: + case 16: + case 24: + case 30: + break; + default: + xf86DrvMsg(scrn->scrnIndex, X_ERROR, + "Given depth (%d) is not supported by intel driver\n", + scrn->depth); + return FALSE; + } + + if (!xf86SetWeight(scrn, defaultWeight, defaultWeight)) + return FALSE; + if (!xf86SetDefaultVisual(scrn, -1)) + return FALSE; + + /* Now the main trick - collecting driver option to find out if we + * need SNA... */ + xf86CollectOptions(scrn, NULL); + + if (!(Options = malloc(sizeof(I830Options)))) + return FALSE; + memcpy(Options, I830Options, sizeof(I830Options)); + xf86ProcessOptions(scrn->scrnIndex, scrn->options, Options); + + xf86DrvMsg(0, X_INFO, "Detecting SNA...\n"); + use_sna = xf86ReturnOptValBool(Options, + OPTION_USE_SNA, + FALSE); + + /* Clean up */ + free(Options); + PreInitCleanup(scrn); + if (use_sna) { + /* Using SNA, re-initialize function pointers */ + xf86DrvMsg(scrn->scrnIndex, X_INFO, "Enabling SNA via option\n"); + sna_init_scrn(scrn); + return sna_pre_init(scrn, flags); + } + else { + xf86DrvMsg(scrn->scrnIndex, X_INFO, "SNA not enabled, using UXA\n"); + return I830PreInit(scrn, flags); + } +} + +void intel_init_scrn(ScrnInfoPtr scrn, int entity_num) +{ + EntityInfoPtr entity; + + scrn->PreInit = intelPreInit; scrn->ScreenInit = I830ScreenInit; scrn->SwitchMode = I830SwitchMode; scrn->AdjustFrame = i830AdjustFrame; @@ -1337,4 +1421,12 @@ void intel_init_scrn(ScrnInfoPtr scrn) scrn->FreeScreen = I830FreeScreen; scrn->ValidMode = I830ValidMode; scrn->PMEvent = I830PMEvent; + + xf86SetEntitySharable(scrn->entityList[0]); + + entity = xf86GetEntityInfo(entity_num); + xf86SetEntityInstanceForScreen(scrn, + entity->index, + xf86GetNumEntityInstances(entity->index)-1); + free(entity); } diff --git a/src/intel_module.c b/src/intel_module.c index cd9c1a3..a39ce21 100644 --- a/src/intel_module.c +++ b/src/intel_module.c @@ -344,11 +344,7 @@ static Bool intel_pci_probe(DriverPtr driver, #endif default: -#if USE_SNA - sna_init_scrn(scrn, entity_num); -#else - intel_init_scrn(scrn); -#endif + intel_init_scrn(scrn, entity_num); break; } } diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c index 0df7ca0..4118cdd 100644 --- a/src/sna/sna_driver.c +++ b/src/sna/sna_driver.c @@ -396,7 +396,7 @@ static void sna_selftest(void) * As a result, we want to set up that server initialization once rather * that doing it per generation. */ -static Bool sna_pre_init(ScrnInfoPtr scrn, int flags) +Bool sna_pre_init(ScrnInfoPtr scrn, int flags) { struct sna *sna; rgb defaultWeight = { 0, 0, 0 }; @@ -1019,10 +1019,8 @@ static Bool sna_pm_event(int scrnIndex, pmEvent event, Bool undo) return TRUE; } -void sna_init_scrn(ScrnInfoPtr scrn, int entity_num) +void sna_init_scrn(ScrnInfoPtr scrn) { - EntityInfoPtr entity; - #if defined(USE_GIT_DESCRIBE) xf86DrvMsg(scrn->scrnIndex, X_INFO, "SNA compiled from %s\n", git_version); @@ -1044,12 +1042,4 @@ void sna_init_scrn(ScrnInfoPtr scrn, int entity_num) scrn->FreeScreen = sna_free_screen; scrn->ValidMode = sna_valid_mode; scrn->PMEvent = sna_pm_event; - - xf86SetEntitySharable(scrn->entityList[0]); - - entity = xf86GetEntityInfo(entity_num); - xf86SetEntityInstanceForScreen(scrn, - entity->index, - xf86GetNumEntityInstances(entity->index)-1); - free(entity); } diff --git a/src/sna/sna_module.h b/src/sna/sna_module.h index 97d5dd5..34022ba 100644 --- a/src/sna/sna_module.h +++ b/src/sna/sna_module.h @@ -1,3 +1,4 @@ const OptionInfoRec *sna_available_options(int chipid, int busid); -void sna_init_scrn(ScrnInfoPtr scrn, int entity_num); +void sna_init_scrn(ScrnInfoPtr scrn); +Bool sna_pre_init(ScrnInfoPtr scrn, int flags); -- 1.7.7.1 _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/intel-gfx