summaryrefslogtreecommitdiff
path: root/src/uxa/intel_driver.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/uxa/intel_driver.c')
-rw-r--r--src/uxa/intel_driver.c171
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: