diff options
Diffstat (limited to 'src/uxa/intel_driver.c')
-rw-r--r-- | src/uxa/intel_driver.c | 171 |
1 files changed, 122 insertions, 49 deletions
diff --git a/src/uxa/intel_driver.c b/src/uxa/intel_driver.c index b3ac7421..732282a6 100644 --- a/src/uxa/intel_driver.c +++ b/src/uxa/intel_driver.c @@ -62,6 +62,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. #include "intel.h" #include "intel_video.h" #include "uxa_module.h" +#include "intel_none.h" #ifdef INTEL_XVMC #define _INTEL_XVMC_SERVER_ @@ -179,6 +180,10 @@ static Bool i830CreateScreenResources(ScreenPtr screen) return FALSE; intel_copy_fb(scrn); #endif + case ACCEL_NONE: + if (!intel_none_create_screen_resources(screen)) + return FALSE; + break; } return TRUE; @@ -201,6 +206,9 @@ intel_set_pixmap_bo(PixmapPtr pixmap, dri_bo *bo) intel_uxa_set_pixmap_bo(pixmap, bo); break; #endif + case ACCEL_NONE: + intel_none_set_pixmap_bo(pixmap, bo); + break; default: ErrorF("No accel architecture, cannot set pixmap bo\n"); break; @@ -222,6 +230,8 @@ intel_get_pixmap_bo(PixmapPtr pixmap) case ACCEL_UXA: return intel_uxa_get_pixmap_bo(pixmap); #endif + case ACCEL_NONE: + return intel_none_get_pixmap_bo(pixmap); default: ErrorF("No accel architecture, cannot set pixmap bo\n"); return NULL; @@ -242,6 +252,8 @@ intel_flush(intel_screen_private *intel) intel_batch_submit(intel->scrn); break; #endif + default: + break; } } @@ -278,6 +290,9 @@ static void intel_check_accel_option(ScrnInfoPtr scrn) accel_method = UXA; else #endif + if (strcasecmp(s, "none") == 0) + accel_method = NOACCEL; + else accel_method = DEFAULT_ACCEL_METHOD; } switch (accel_method) { @@ -292,6 +307,9 @@ static void intel_check_accel_option(ScrnInfoPtr scrn) intel->accel = ACCEL_UXA; break; #endif + case NOACCEL: + intel->accel = ACCEL_NONE; + break; } } @@ -378,10 +396,13 @@ static int intel_init_bufmgr(intel_screen_private *intel) if (!intel->bufmgr) return FALSE; - if (xf86ReturnOptValBool(intel->Options, OPTION_BUFFER_CACHE, TRUE)) - drm_intel_bufmgr_gem_enable_reuse(intel->bufmgr); - drm_intel_bufmgr_gem_set_vma_cache_size(intel->bufmgr, 512); - drm_intel_bufmgr_gem_enable_fenced_relocs(intel->bufmgr); +#if USE_UXA + if (intel->accel == ACCEL_UXA) { + if (xf86ReturnOptValBool(intel->Options, OPTION_BUFFER_CACHE, TRUE)) + drm_intel_bufmgr_gem_enable_reuse(intel->bufmgr); + drm_intel_bufmgr_gem_set_vma_cache_size(intel->bufmgr, 512); + drm_intel_bufmgr_gem_enable_fenced_relocs(intel->bufmgr); + } list_init(&intel->batch_pixmaps); @@ -390,6 +411,7 @@ static int intel_init_bufmgr(intel_screen_private *intel) drm_intel_bo_alloc(intel->bufmgr, "wa scratch", 4096, 4096); } +#endif return TRUE; } @@ -399,7 +421,10 @@ static void intel_bufmgr_fini(intel_screen_private *intel) if (intel->bufmgr == NULL) return; - drm_intel_bo_unreference(intel->wa_scratch_bo); +#if USE_UXA + if (intel->accel == ACCEL_UXA) + drm_intel_bo_unreference(intel->wa_scratch_bo); +#endif drm_intel_bufmgr_destroy(intel->bufmgr); } @@ -713,7 +738,11 @@ static Bool I830PreInit(ScrnInfoPtr scrn, int flags) PreInitCleanup(scrn); xf86DrvMsg(scrn->scrnIndex, X_ERROR, "Failed to pre init glamor display.\n"); +#if USE_UXA intel->accel = ACCEL_UXA; +#else + intel->accel = ACCEL_NONE; +#endif } break; #endif @@ -724,12 +753,14 @@ static Bool I830PreInit(ScrnInfoPtr scrn, int flags) switch (intel->accel) { #if USE_UXA case ACCEL_UXA: + /* fall through ... */ +#endif + case ACCEL_NONE: #if HAVE_DRI3 if (intel->dri3 != DRI_DISABLED && !xf86LoadSubModule(scrn, "dri3")) intel->dri3 = DRI_DISABLED; #endif break; -#endif default: break; } @@ -767,7 +798,7 @@ redisplay_dirty(ScreenPtr screen, PixmapDirtyUpdatePtr dirty) intel_flush(intel); if (!intel->has_prime_vmap_flush) { - drm_intel_bo *bo = intel_uxa_get_pixmap_bo(dirty->slave_dst->master_pixmap); + drm_intel_bo *bo = (drm_intel_bo *) intel_get_pixmap_bo(dirty->slave_dst->master_pixmap); was_blocked = xf86BlockSIGIO(); drm_intel_bo_map(bo, FALSE); drm_intel_bo_unmap(bo); @@ -834,8 +865,12 @@ I830BlockHandler(BLOCKHANDLER_ARGS_DECL) intel->BlockHandler = screen->BlockHandler; screen->BlockHandler = I830BlockHandler; - intel_uxa_block_handler(intel); - intel_video_block_handler(intel); +#if USE_UXA + if (intel->accel == ACCEL_UXA) { + intel_uxa_block_handler(intel); + intel_video_block_handler(intel); + } +#endif #ifdef INTEL_PIXMAP_SHARING intel_dirty_update(screen); #endif @@ -981,12 +1016,46 @@ I830UeventFini(ScrnInfoPtr scrn) } #endif /* HAVE_UDEV */ +Bool +intel_fb_init(ScreenPtr screen, void *pbits) +{ + ScrnInfoPtr scrn = xf86ScreenToScrn(screen); + VisualPtr visual; + + /* Must be first, before anything else installs screen callbacks. */ + if (!fbScreenInit(screen, pbits, + scrn->virtualX, scrn->virtualY, + scrn->xDpi, scrn->yDpi, + scrn->displayWidth, scrn->bitsPerPixel)) + return FALSE; + + if (scrn->bitsPerPixel > 8) { + /* Fixup RGB ordering */ + visual = screen->visuals + screen->numVisuals; + while (--visual >= screen->visuals) { + if ((visual->class | DynamicClass) == DirectColor) { + visual->offsetRed = scrn->offset.red; + visual->offsetGreen = scrn->offset.green; + visual->offsetBlue = scrn->offset.blue; + visual->redMask = scrn->mask.red; + visual->greenMask = scrn->mask.green; + visual->blueMask = scrn->mask.blue; + } + } + } + + fbPictureInit(screen, NULL, 0); + + xf86SetBlackWhitePixels(screen); + + return TRUE; +} + static Bool I830ScreenInit(SCREEN_INIT_ARGS_DECL) { ScrnInfoPtr scrn = xf86ScreenToScrn(screen); intel_screen_private *intel = intel_get_screen_private(scrn); - VisualPtr visual; #if USE_UXA #ifdef INTEL_XVMC MessageType from; @@ -1017,32 +1086,6 @@ I830ScreenInit(SCREEN_INIT_ARGS_DECL) if (!miSetPixmapDepths()) return FALSE; - /* Must be first, before anything else installs screen callbacks. */ - if (!fbScreenInit(screen, NULL, - scrn->virtualX, scrn->virtualY, - scrn->xDpi, scrn->yDpi, - scrn->displayWidth, scrn->bitsPerPixel)) - return FALSE; - - if (scrn->bitsPerPixel > 8) { - /* Fixup RGB ordering */ - visual = screen->visuals + screen->numVisuals; - while (--visual >= screen->visuals) { - if ((visual->class | DynamicClass) == DirectColor) { - visual->offsetRed = scrn->offset.red; - visual->offsetGreen = scrn->offset.green; - visual->offsetBlue = scrn->offset.blue; - visual->redMask = scrn->mask.red; - visual->greenMask = scrn->mask.green; - visual->blueMask = scrn->mask.blue; - } - } - } - - fbPictureInit(screen, NULL, 0); - - xf86SetBlackWhitePixels(screen); - switch (intel->accel) { #if USE_GLAMOR case ACCEL_GLAMOR: @@ -1064,6 +1107,22 @@ I830ScreenInit(SCREEN_INIT_ARGS_DECL) "Hardware acceleration initialization failed\n"); return FALSE; } + break; +#endif + case ACCEL_NONE: + if (!intel_none_init(screen)) { + xf86DrvMsg(scrn->scrnIndex, X_ERROR, + "Screen initialization failed\n"); + return FALSE; + } + } + + switch (intel->accel) { +#if USE_UXA + case ACCEL_UXA: + /* fall through ... */ +#endif /* USE_UXA */ + case ACCEL_NONE: #if HAVE_DRI3 if (!intel_sync_init(screen)) intel->dri3 = DRI_DISABLED; @@ -1071,7 +1130,8 @@ I830ScreenInit(SCREEN_INIT_ARGS_DECL) intel->dri3 = DRI_ACTIVE; #endif break; -#endif + default: + break; } #if HAVE_DRI2 @@ -1163,6 +1223,9 @@ I830ScreenInit(SCREEN_INIT_ARGS_DECL) xf86DrvMsg(scrn->scrnIndex, from, "Intel XvMC decoder %sabled\n", intel->XvMCEnabled ? "en" : "dis"); #endif + /* fall through */ +#endif + case ACCEL_NONE: #if HAVE_DRI3 switch (intel->dri3) { case DRI_ACTIVE: @@ -1182,7 +1245,6 @@ I830ScreenInit(SCREEN_INIT_ARGS_DECL) xf86DrvMsg(scrn->scrnIndex, X_INFO, "DRI3: Not available\n"); #endif -#endif break; default: break; @@ -1292,16 +1354,9 @@ static Bool I830CloseScreen(CLOSE_SCREEN_ARGS_DECL) #endif #if USE_UXA case ACCEL_UXA: - - TimerFree(intel->cache_expire); - intel->cache_expire = NULL; - - intel_batch_teardown(scrn); - - if (INTEL_INFO(intel)->gen >= 040 && INTEL_INFO(intel)->gen < 0100) - gen4_render_state_cleanup(scrn); - if (intel->uxa_driver) { + TimerFree(intel->cache_expire); + intel->cache_expire = NULL; uxa_driver_fini(screen); free(intel->uxa_driver); intel->uxa_driver = NULL; @@ -1332,9 +1387,28 @@ static Bool I830CloseScreen(CLOSE_SCREEN_ARGS_DECL) I830LeaveVT(VT_FUNC_ARGS(0)); } + switch (intel->accel) { +#if USE_UXA + case ACCEL_UXA: + intel_batch_teardown(scrn); + + if (INTEL_INFO(intel)->gen >= 040 && INTEL_INFO(intel)->gen < 0100) + gen4_render_state_cleanup(scrn); + + i965_free_video(scrn); + /* fall through ... */ +#endif + case ACCEL_NONE: +#if HAVE_DRI3 + intel_sync_close(screen); +#endif + break; + default: + break; + } + xf86_cursors_fini(screen); - i965_free_video(scrn); screen->CloseScreen = intel->CloseScreen; (*screen->CloseScreen) (CLOSE_SCREEN_ARGS); @@ -1356,7 +1430,6 @@ static Bool I830CloseScreen(CLOSE_SCREEN_ARGS_DECL) } intel_sync_close(screen); #endif - break; #endif default: |