This adds glamor support back into the driver, but instad of going through UXA, this uses it directly instead. Signed-off-by: Keith Packard <keithp@xxxxxxxxxx> --- src/uxa/intel.h | 17 +++ src/uxa/intel_display.c | 30 ++++- src/uxa/intel_dri.c | 20 +++ src/uxa/intel_driver.c | 247 ++++++++++++++++++++++++++++--------- src/uxa/intel_glamor.c | 316 +++++++++++++++++++++++++----------------------- src/uxa/intel_glamor.h | 18 ++- src/uxa/intel_present.c | 5 - src/uxa/intel_uxa.c | 5 + src/uxa/intel_video.c | 75 +++++++----- 9 files changed, 480 insertions(+), 253 deletions(-) diff --git a/src/uxa/intel.h b/src/uxa/intel.h index 64f573b..5fbb2c7 100644 --- a/src/uxa/intel.h +++ b/src/uxa/intel.h @@ -111,10 +111,21 @@ enum dri_type { DRI_ACTIVE }; +enum accel_type { +#if USE_GLAMOR + ACCEL_GLAMOR, +#endif +#if USE_UXA + ACCEL_UXA, +#endif +}; + typedef struct intel_screen_private { ScrnInfoPtr scrn; int cpp; + enum accel_type accel; + #define RENDER_BATCH I915_EXEC_RENDER #define BLT_BATCH I915_EXEC_BLT unsigned int current_batch; @@ -127,6 +138,7 @@ typedef struct intel_screen_private { dri_bufmgr *bufmgr; +#if USE_UXA uint32_t batch_ptr[4096]; /** Byte offset in batch_ptr for the next dword to be emitted. */ unsigned int batch_used; @@ -142,6 +154,7 @@ typedef struct intel_screen_private { struct list batch_pixmaps; drm_intel_bo *wa_scratch_bo; OsTimerPtr cache_expire; +#endif /* For Xvideo */ Bool use_overlay; @@ -178,8 +191,10 @@ typedef struct intel_screen_private { void (*batch_flush) (struct intel_screen_private *intel); void (*batch_commit_notify) (struct intel_screen_private *intel); +#if USE_UXA struct _UxaDriver *uxa_driver; int uxa_flags; +#endif Bool need_sync; int accel_pixmap_offset_alignment; int accel_max_x; @@ -212,6 +227,7 @@ typedef struct intel_screen_private { drm_intel_bo *gen6_depth_stencil_bo; } video; +#if USE_UXA /* Render accel state */ float scale_units[2][2]; /** Transform pointers for src/mask, or NULL if identity */ @@ -269,6 +285,7 @@ typedef struct intel_screen_private { /* 965 render acceleration state */ struct gen4_render_state *gen4_render_state; +#endif /* DRI enabled this generation. */ enum dri_type dri2, dri3; diff --git a/src/uxa/intel_display.c b/src/uxa/intel_display.c index add09b0..a4c4b82 100644 --- a/src/uxa/intel_display.c +++ b/src/uxa/intel_display.c @@ -56,6 +56,9 @@ #include "xf86DDC.h" #include "fb.h" #include "uxa.h" +#if USE_GLAMOR +#include "intel_glamor.h" +#endif #define KNOWN_MODE_FLAGS ((1<<14)-1) @@ -182,7 +185,7 @@ intel_output_backlight_init(xf86OutputPtr output) { struct intel_output *intel_output = output->driver_private; intel_screen_private *intel = intel_get_screen_private(output->scrn); - char *str; + const char *str; #if !USE_BACKLIGHT return; @@ -683,7 +686,10 @@ intel_set_scanout_pixmap(xf86CrtcPtr crtc, PixmapPtr ppix) return TRUE; } - bo = intel_get_pixmap_bo(ppix); + bo = intel_get_pixmap_bo(ppix); + if (!bo) + return FALSE; + if (intel->front_buffer) { ErrorF("have front buffer\n"); } @@ -1472,8 +1478,20 @@ intel_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height) scrn->virtualX = width; scrn->virtualY = height; - if (!intel_uxa_create_screen_resources(scrn->pScreen)) - goto fail; + switch (intel->accel) { +#if USE_GLAMOR + case ACCEL_GLAMOR: + if (!intel_glamor_create_screen_resources(scrn->pScreen)) + goto fail; + break; +#endif +#if USE_UXA + case ACCEL_UXA: + if (!intel_uxa_create_screen_resources(scrn->pScreen)) + goto fail; + break; +#endif + } for (i = 0; i < xf86_config->num_crtc; i++) { xf86CrtcPtr crtc = xf86_config->crtc[i]; @@ -1532,7 +1550,7 @@ intel_do_pageflip(intel_screen_private *intel, xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); struct intel_crtc *crtc = config->crtc[0]->driver_private; struct intel_mode *mode = crtc->mode; - unsigned int pitch = scrn->displayWidth * intel->cpp; + unsigned int pitch = scrn->displayWidth * intel->cpp; struct intel_pageflip *flip; uint32_t new_fb_id; uint32_t flags; @@ -2235,7 +2253,7 @@ intel_create_pixmap_for_bo(ScreenPtr pScreen, dri_bo *bo, return NullPixmap; } - intel_set_pixmap_bo(pixmap, bo); + intel_set_pixmap_bo(pixmap, bo); return pixmap; } diff --git a/src/uxa/intel_dri.c b/src/uxa/intel_dri.c index 78734cb..2055346 100644 --- a/src/uxa/intel_dri.c +++ b/src/uxa/intel_dri.c @@ -883,6 +883,26 @@ I830DRI2ScheduleFlip(struct intel_screen_private *intel, drm_intel_bo_disable_reuse(new_back); dri_bo_flink(new_back, &intel->back_name); +#if USE_GLAMOR + if (intel->accel == ACCEL_GLAMOR) { + I830DRI2BufferPrivatePtr drvpriv; + PixmapPtr front_pixmap, back_pixmap; + ScreenPtr screen; + + screen = draw->pScreen; + drvpriv = info->front->driverPrivate; + front_pixmap = drvpriv->pixmap; + + back_pixmap = intel_glamor_create_back_pixmap(screen, + front_pixmap, + new_back); + if (back_pixmap == NULL) { + drm_intel_bo_unreference(new_back); + return FALSE; + } + intel->back_pixmap = back_pixmap; + } +#endif } else { new_back = intel->back_buffer; intel->back_buffer = NULL; diff --git a/src/uxa/intel_driver.c b/src/uxa/intel_driver.c index 6d38cfe..065c679 100644 --- a/src/uxa/intel_driver.c +++ b/src/uxa/intel_driver.c @@ -164,29 +164,83 @@ static Bool i830CreateScreenResources(ScreenPtr screen) if (!(*screen->CreateScreenResources) (screen)) return FALSE; - if (!intel_uxa_create_screen_resources(screen)) - return FALSE; + switch (intel->accel) { +#if USE_GLAMOR + case ACCEL_GLAMOR: + if (!intel_glamor_create_screen_resources(screen)) + return FALSE; + break; +#endif +#if USE_UXA + case ACCEL_UXA: + if (!intel_uxa_create_screen_resources(screen)) + return FALSE; + intel_copy_fb(scrn); +#endif + } - intel_copy_fb(scrn); return TRUE; } void intel_set_pixmap_bo(PixmapPtr pixmap, dri_bo *bo) { - intel_uxa_set_pixmap_bo(pixmap, bo); + ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen); + intel_screen_private *intel = intel_get_screen_private(scrn); + + switch (intel->accel) { +#if USE_GLAMOR + case ACCEL_GLAMOR: + intel_glamor_set_pixmap_bo(pixmap, bo); + break; +#endif +#if USE_UXA + case ACCEL_UXA: + intel_uxa_set_pixmap_bo(pixmap, bo); + break; +#endif + default: + ErrorF("No accel architecture, cannot set pixmap bo\n"); + break; + } } dri_bo * intel_get_pixmap_bo(PixmapPtr pixmap) { - return intel_uxa_get_pixmap_bo(pixmap); + ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen); + intel_screen_private *intel = intel_get_screen_private(scrn); + + switch (intel->accel) { +#if USE_GLAMOR + case ACCEL_GLAMOR: + return intel_glamor_get_pixmap_bo(pixmap); +#endif +#if USE_UXA + case ACCEL_UXA: + return intel_uxa_get_pixmap_bo(pixmap); +#endif + default: + ErrorF("No accel architecture, cannot set pixmap bo\n"); + return NULL; + } } void intel_flush(intel_screen_private *intel) { - intel_batch_submit(intel->scrn); + switch (intel->accel) { +#if USE_GLAMOR + case ACCEL_GLAMOR: + intel_glamor_flush(intel); + break; +#endif +#if USE_UXA + case ACCEL_UXA: + intel_batch_submit(intel->scrn); + break; +#endif + } } static void PreInitCleanup(ScrnInfoPtr scrn) @@ -204,6 +258,41 @@ static void intel_check_chipset_option(ScrnInfoPtr scrn) intel_detect_chipset(scrn, intel->pEnt); } +static void intel_check_accel_option(ScrnInfoPtr scrn) +{ + intel_screen_private *intel = intel_get_screen_private(scrn); + enum { NONE, SNA, UXA, GLAMOR } accel_method = DEFAULT_ACCEL_METHOD; + const char *s; + + s = xf86GetOptValString(intel->Options, OPTION_ACCEL_METHOD); + if (s != NULL) { +#if USE_GLAMOR + if (strcasecmp(s, "glamor") == 0) + accel_method = GLAMOR; + else +#endif +#if USE_UXA + if (strcasecmp(s, "uxa") == 0) + accel_method = UXA; + else +#endif + accel_method = DEFAULT_ACCEL_METHOD; + } + switch (accel_method) { + default: +#if USE_GLAMOR + case GLAMOR: + intel->accel = ACCEL_GLAMOR; + break; +#endif +#if USE_UXA + case UXA: + intel->accel = ACCEL_UXA; + break; +#endif + } +} + static Bool I830GetEarlyOptions(ScrnInfoPtr scrn) { intel_screen_private *intel = intel_get_screen_private(scrn); @@ -213,6 +302,7 @@ static Bool I830GetEarlyOptions(ScrnInfoPtr scrn) if (!intel->Options) return FALSE; +#if USE_UXA intel->fallback_debug = xf86ReturnOptValBool(intel->Options, OPTION_FALLBACKDEBUG, FALSE); @@ -234,6 +324,7 @@ static Bool I830GetEarlyOptions(ScrnInfoPtr scrn) FALSE)) intel->debug_flush |= DEBUG_FLUSH_WAIT; +#endif return TRUE; } @@ -526,6 +617,7 @@ static Bool I830PreInit(ScrnInfoPtr scrn, int flags) intel_setup_capabilities(scrn); intel_check_chipset_option(scrn); intel_check_dri_option(scrn); + intel_check_accel_option(scrn); if (!intel_init_bufmgr(intel)) { PreInitCleanup(scrn); @@ -612,24 +704,33 @@ static Bool I830PreInit(ScrnInfoPtr scrn, int flags) return FALSE; } + switch (intel->accel) { #if USE_GLAMOR - if (!intel_glamor_pre_init(scrn)) { - PreInitCleanup(scrn); - xf86DrvMsg(scrn->scrnIndex, X_ERROR, - "Failed to pre init glamor display.\n"); - return FALSE; - } + case ACCEL_GLAMOR: + if (!intel_glamor_pre_init(scrn)) { + PreInitCleanup(scrn); + xf86DrvMsg(scrn->scrnIndex, X_ERROR, + "Failed to pre init glamor display.\n"); + intel->accel = ACCEL_UXA; + } + break; #endif - - /* Load the dri modules if requested. */ +#if USE_UXA + case ACCEL_UXA: + /* Load the dri modules if requested. */ #if HAVE_DRI2 - if (intel->dri2 != DRI_DISABLED && !xf86LoadSubModule(scrn, "dri2")) - intel->dri2 = DRI_DISABLED; + if (intel->dri2 != DRI_DISABLED && !xf86LoadSubModule(scrn, "dri2")) + intel->dri2 = DRI_DISABLED; #endif #if HAVE_DRI3 - if (intel->dri3 != DRI_DISABLED && !xf86LoadSubModule(scrn, "dri3")) - intel->dri3 = DRI_DISABLED; + if (intel->dri3 != DRI_DISABLED && !xf86LoadSubModule(scrn, "dri3")) + intel->dri3 = DRI_DISABLED; +#endif + break; #endif + default: + break; + } return TRUE; } @@ -876,11 +977,6 @@ I830ScreenInit(SCREEN_INIT_ARGS_DECL) if (!intel_init_initial_framebuffer(scrn)) return FALSE; - intel_batch_init(scrn); - - if (INTEL_INFO(intel)->gen >= 040 && INTEL_INFO(intel)->gen < 0100) - gen4_render_state_init(scrn); - miClearVisualTypes(); if (!miSetVisualTypes(scrn->depth, miGetDefaultVisualMask(scrn->depth), @@ -915,23 +1011,37 @@ I830ScreenInit(SCREEN_INIT_ARGS_DECL) xf86SetBlackWhitePixels(screen); - if (!intel_uxa_init(screen)) { - xf86DrvMsg(scrn->scrnIndex, X_ERROR, - "Hardware acceleration initialization failed\n"); - return FALSE; - } - + switch (intel->accel) { +#if USE_GLAMOR + case ACCEL_GLAMOR: + if (!intel_glamor_init(screen)) { + xf86DrvMsg(scrn->scrnIndex, X_ERROR, + "Glamor acceleration initialization failed\n"); + return FALSE; + } + break; +#endif +#if USE_UXA + case ACCEL_UXA: + if (!intel_uxa_init(screen)) { + xf86DrvMsg(scrn->scrnIndex, X_ERROR, + "Hardware acceleration initialization failed\n"); + return FALSE; + } #if HAVE_DRI2 - if (intel->dri2 == DRI_NONE && I830DRI2ScreenInit(screen)) - intel->dri2 = DRI_ACTIVE; + if (intel->dri2 == DRI_NONE && I830DRI2ScreenInit(screen)) + intel->dri2 = DRI_ACTIVE; #endif #if HAVE_DRI3 - if (!intel_sync_init(screen)) - intel->dri3 = DRI_DISABLED; - if (intel->dri3 == DRI_NONE && intel_dri3_screen_init(screen)) - intel->dri3 = DRI_ACTIVE; + if (!intel_sync_init(screen)) + intel->dri3 = DRI_DISABLED; + if (intel->dri3 == DRI_NONE && intel_dri3_screen_init(screen)) + intel->dri3 = DRI_ACTIVE; +#endif + break; #endif + } if (xf86ReturnOptValBool(intel->Options, OPTION_PRESENT, TRUE)) intel_present_screen_init(screen); @@ -1129,18 +1239,33 @@ static Bool I830CloseScreen(CLOSE_SCREEN_ARGS_DECL) DeleteCallback(&FlushCallback, intel_flush_callback, scrn); + switch (intel->accel) { #if USE_GLAMOR - intel_glamor_close_screen(screen); + case ACCEL_GLAMOR: + intel_glamor_close_screen(screen); + break; #endif +#if USE_UXA + case ACCEL_UXA: - TimerFree(intel->cache_expire); - intel->cache_expire = NULL; + TimerFree(intel->cache_expire); + intel->cache_expire = NULL; - if (intel->uxa_driver) { - uxa_driver_fini(screen); - free(intel->uxa_driver); - intel->uxa_driver = 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) { + uxa_driver_fini(screen); + free(intel->uxa_driver); + intel->uxa_driver = NULL; + } + break; +#endif + default: + break; + } if (intel->back_pixmap) { screen->DestroyPixmap(intel->back_pixmap); @@ -1162,11 +1287,6 @@ static Bool I830CloseScreen(CLOSE_SCREEN_ARGS_DECL) I830LeaveVT(VT_FUNC_ARGS(0)); } - intel_batch_teardown(scrn); - - if (INTEL_INFO(intel)->gen >= 040 && INTEL_INFO(intel)->gen < 0100) - gen4_render_state_cleanup(scrn); - xf86_cursors_fini(screen); i965_free_video(scrn); @@ -1174,17 +1294,28 @@ static Bool I830CloseScreen(CLOSE_SCREEN_ARGS_DECL) screen->CloseScreen = intel->CloseScreen; (*screen->CloseScreen) (CLOSE_SCREEN_ARGS); - if (intel->dri2 == DRI_ACTIVE) { - I830DRI2CloseScreen(screen); - intel->dri2 = DRI_NONE; - } - - if (intel->dri3 == DRI_ACTIVE) { - /* nothing to do here? */ - intel->dri3 = DRI_NONE; - } + switch (intel->accel) { +#if USE_UXA + case ACCEL_UXA: +#if HAVE_DRI2 + if (intel->dri2 == DRI_ACTIVE) { + I830DRI2CloseScreen(screen); + intel->dri2 = DRI_NONE; + } +#endif +#if HAVE_DRI3 + if (intel->dri3 == DRI_ACTIVE) { + /* nothing to do here? */ + intel->dri3 = DRI_NONE; + } + intel_sync_close(screen); +#endif - intel_sync_close(screen); + break; +#endif + default: + break; + } xf86GARTCloseScreen(scrn->scrnIndex); diff --git a/src/uxa/intel_glamor.c b/src/uxa/intel_glamor.c index 21636d1..e2bc24c 100644 --- a/src/uxa/intel_glamor.c +++ b/src/uxa/intel_glamor.c @@ -35,31 +35,89 @@ #include <xf86.h> #define GLAMOR_FOR_XORG 1 #include <glamor.h> +#include <unistd.h> #include "intel.h" #include "i915_drm.h" #include "intel_glamor.h" -#include "uxa.h" #include "intel_options.h" -void -intel_glamor_exchange_buffers(struct intel_screen_private *intel, - PixmapPtr src, - PixmapPtr dst) +struct intel_glamor_pixmap { + dri_bo *bo; +}; + +static DevPrivateKeyRec intel_glamor_pixmap_key; + +static inline struct intel_glamor_pixmap *intel_glamor_get_pixmap(PixmapPtr pixmap) { - if (!(intel->uxa_flags & UXA_USE_GLAMOR)) - return; - glamor_egl_exchange_buffers(src, dst); + return dixGetPrivateAddr(&pixmap->devPrivates, &intel_glamor_pixmap_key); } -XF86VideoAdaptorPtr intel_glamor_xv_init(ScreenPtr screen, int num_ports) +dri_bo * +intel_glamor_get_pixmap_bo(PixmapPtr pixmap) { - ScrnInfoPtr scrn = xf86ScreenToScrn(screen); - intel_screen_private *intel = intel_get_screen_private(scrn); + dri_bo *bo = intel_glamor_get_pixmap(pixmap)->bo; + + if (!bo) { + ScreenPtr screen = pixmap->drawable.pScreen; + CARD16 stride; + CARD32 size; + int fd; + + fd = glamor_fd_from_pixmap(screen, + pixmap, + &stride, + &size); + + if (fd >= 0) { + ScrnInfoPtr scrn = xf86ScreenToScrn(screen); + intel_screen_private *intel = intel_get_screen_private(scrn); + + bo = drm_intel_bo_gem_create_from_prime(intel->bufmgr, + fd, + size); + close(fd); + intel_glamor_get_pixmap(pixmap)->bo = bo; + } + } + return bo; +} - if ((intel->uxa_flags & UXA_USE_GLAMOR) == 0) - return NULL; +static void +intel_glamor_reference_pixmap_bo(PixmapPtr pixmap, drm_intel_bo *bo) +{ + struct intel_glamor_pixmap *glamor_pixmap = intel_glamor_get_pixmap(pixmap); + + if (glamor_pixmap->bo) { + ErrorF("Unreference bo %d size %lu from pixmap %d x %d\n", + glamor_pixmap->bo->handle, glamor_pixmap->bo->size, pixmap->drawable.width, pixmap->drawable.height); + drm_intel_bo_unreference(glamor_pixmap->bo); + glamor_pixmap->bo = NULL; + } + + if (bo) { + ErrorF("Reference bo %d size %lu from pixmap %d x %d\n", + bo->handle, bo->size, pixmap->drawable.width, pixmap->drawable.height); + drm_intel_bo_reference(bo); + glamor_pixmap->bo = bo; + } +} +Bool +intel_glamor_set_pixmap_bo(PixmapPtr pixmap, drm_intel_bo *bo) +{ + if (bo == NULL || glamor_egl_create_textured_pixmap(pixmap, + bo->handle, + intel_pixmap_pitch(pixmap))) + { + intel_glamor_reference_pixmap_bo(pixmap, bo); + return TRUE; + } + return FALSE; +} + +XF86VideoAdaptorPtr intel_glamor_xv_init(ScreenPtr screen, int num_ports) +{ return glamor_xv_init(screen, num_ports); } @@ -68,33 +126,42 @@ intel_glamor_create_screen_resources(ScreenPtr screen) { ScrnInfoPtr scrn = xf86ScreenToScrn(screen); intel_screen_private *intel = intel_get_screen_private(scrn); - - if (!(intel->uxa_flags & UXA_USE_GLAMOR)) - return TRUE; + PixmapPtr pixmap = screen->GetScreenPixmap(screen); + int old_width, old_height, old_pitch; + Bool ret; if (!glamor_glyphs_init(screen)) return FALSE; - if (!glamor_egl_create_textured_screen_ext(screen, - intel->front_buffer->handle, - intel->front_pitch, - &intel->back_pixmap)) + old_width = pixmap->drawable.width; + old_height = pixmap->drawable.height; + old_pitch = pixmap->devKind; + + if (!screen->ModifyPixmapHeader(pixmap, + scrn->virtualX, + scrn->virtualY, + -1, -1, + intel->front_pitch, + NULL)) return FALSE; - return TRUE; -} + ret = glamor_egl_create_textured_screen_ext(screen, + intel->front_buffer->handle, + intel->front_pitch, + &intel->back_pixmap); -static Bool -intel_glamor_enabled(intel_screen_private *intel) -{ - enum { SNA, UXA, GLAMOR } default_accel_method = DEFAULT_ACCEL_METHOD; - const char *s; + if (!ret) + goto fail; + + intel_glamor_reference_pixmap_bo(pixmap, intel->front_buffer); + + return TRUE; - s = xf86GetOptValString(intel->Options, OPTION_ACCEL_METHOD); - if (s == NULL) - return default_accel_method == GLAMOR; +fail: + screen->ModifyPixmapHeader(pixmap, + old_width, old_height, -1, -1, old_pitch, NULL); - return strcasecmp(s, "glamor") == 0; + return FALSE; } Bool @@ -104,9 +171,6 @@ intel_glamor_pre_init(ScrnInfoPtr scrn) pointer glamor_module; CARD32 version; - if (!intel_glamor_enabled(intel)) - return TRUE; - #if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1,15,0,0,0) if (!xf86LoaderCheckSymbol("glamor_egl_init")) { xf86DrvMsg(scrn->scrnIndex, X_ERROR, @@ -117,139 +181,57 @@ intel_glamor_pre_init(ScrnInfoPtr scrn) #endif /* Load glamor module */ - if ((glamor_module = xf86LoadSubModule(scrn, GLAMOR_EGL_MODULE_NAME))) { - version = xf86GetModuleVersion(glamor_module); - if (version < MODULE_VERSION_NUMERIC(0,3,1)) { - xf86DrvMsg(scrn->scrnIndex, X_ERROR, - "Incompatible glamor version, required >= 0.3.0.\n"); - } else { - if (glamor_egl_init(scrn, intel->drmSubFD)) { - xf86DrvMsg(scrn->scrnIndex, X_INFO, - "glamor detected, initialising egl layer.\n"); - intel->uxa_flags = UXA_GLAMOR_EGL_INITIALIZED; - } else - xf86DrvMsg(scrn->scrnIndex, X_WARNING, - "glamor detected, failed to initialize egl.\n"); - } - } else + glamor_module = xf86LoadSubModule(scrn, GLAMOR_EGL_MODULE_NAME); + if (!glamor_module) { xf86DrvMsg(scrn->scrnIndex, X_WARNING, "glamor not available\n"); + return TRUE; + } + + version = xf86GetModuleVersion(glamor_module); + if (version < MODULE_VERSION_NUMERIC(0,3,1)) { + xf86DrvMsg(scrn->scrnIndex, X_ERROR, + "Incompatible glamor version, required >= 0.3.0.\n"); + return TRUE; + } + if (!glamor_egl_init(scrn, intel->drmSubFD)) { + xf86DrvMsg(scrn->scrnIndex, X_WARNING, + "glamor detected, failed to initialize egl.\n"); + return TRUE; + } + xf86DrvMsg(scrn->scrnIndex, X_INFO, + "glamor detected, initialising egl layer.\n"); return TRUE; } -PixmapPtr -intel_glamor_create_pixmap(ScreenPtr screen, int w, int h, - int depth, unsigned int usage) -{ - ScrnInfoPtr scrn = xf86ScreenToScrn(screen); - intel_screen_private *intel = intel_get_screen_private(scrn); - - if (intel->uxa_flags & UXA_USE_GLAMOR) - return glamor_create_pixmap(screen, w, h, depth, usage); - else - return NULL; -} - -Bool -intel_glamor_create_textured_pixmap(PixmapPtr pixmap) -{ - ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen); - intel_screen_private *intel = intel_get_screen_private(scrn); - struct intel_uxa_pixmap *priv; - - if ((intel->uxa_flags & UXA_USE_GLAMOR) == 0) - return TRUE; - - priv = intel_uxa_get_pixmap_private(pixmap); - if (glamor_egl_create_textured_pixmap(pixmap, priv->bo->handle, - priv->stride)) { - drm_intel_bo_disable_reuse(priv->bo); - priv->pinned |= PIN_GLAMOR; - return TRUE; - } else - return FALSE; -} - -void -intel_glamor_destroy_pixmap(PixmapPtr pixmap) -{ - ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen); - intel_screen_private * intel; - - intel = intel_get_screen_private(scrn); - if (intel->uxa_flags & UXA_USE_GLAMOR) - glamor_egl_destroy_textured_pixmap(pixmap); -} - -static void -intel_glamor_need_flush(DrawablePtr pDrawable) -{ - ScrnInfoPtr scrn = xf86ScreenToScrn(pDrawable->pScreen); - intel_screen_private * intel; - - intel = intel_get_screen_private(scrn); - intel->needs_flush = TRUE; -} - -static void -intel_glamor_finish_access(PixmapPtr pixmap, uxa_access_t access) -{ - switch(access) { - case UXA_ACCESS_RO: - case UXA_ACCESS_RW: - case UXA_GLAMOR_ACCESS_RO: - break; - case UXA_GLAMOR_ACCESS_RW: - intel_glamor_need_flush(&pixmap->drawable); - break; - default: - ErrorF("Invalid access mode %d\n", access); - } - - return; -} - Bool intel_glamor_init(ScreenPtr screen) { ScrnInfoPtr scrn = xf86ScreenToScrn(screen); - intel_screen_private *intel = intel_get_screen_private(scrn); - if ((intel->uxa_flags & UXA_GLAMOR_EGL_INITIALIZED) == 0) - goto fail; + if (!dixPrivateKeyRegistered(&intel_glamor_pixmap_key)) + if (!dixRegisterPrivateKey(&intel_glamor_pixmap_key, PRIVATE_PIXMAP, sizeof (struct intel_glamor_pixmap))) + return FALSE; if (!glamor_init(screen, -#if defined(GLAMOR_NO_DRI3) - /* Not doing DRI3 yet, since Present support hasn't landed. */ - GLAMOR_NO_DRI3 | -#endif GLAMOR_INVERTED_Y_AXIS | - GLAMOR_USE_EGL_SCREEN)) { + GLAMOR_USE_EGL_SCREEN | + GLAMOR_USE_SCREEN | + GLAMOR_USE_PICTURE_SCREEN)) + { xf86DrvMsg(scrn->scrnIndex, X_ERROR, "Failed to initialize glamor.\n"); - goto fail; + return FALSE; } if (!glamor_egl_init_textured_pixmap(screen)) { xf86DrvMsg(scrn->scrnIndex, X_ERROR, "Failed to initialize textured pixmap of screen for glamor.\n"); - goto fail; + return FALSE; } - intel->uxa_driver->flags |= UXA_USE_GLAMOR; - intel->uxa_flags |= intel->uxa_driver->flags; - - intel->uxa_driver->finish_access = intel_glamor_finish_access; - - xf86DrvMsg(scrn->scrnIndex, X_INFO, - "Use GLAMOR acceleration.\n"); return TRUE; - - fail: - xf86DrvMsg(scrn->scrnIndex, X_INFO, - "Use legacy UXA acceleration.\n"); - return FALSE; } void @@ -258,18 +240,52 @@ intel_glamor_flush(intel_screen_private * intel) ScreenPtr screen; screen = xf86ScrnToScreen(intel->scrn); - if (intel->uxa_flags & UXA_USE_GLAMOR) - glamor_block_handler(screen); + glamor_block_handler(screen); } Bool intel_glamor_close_screen(ScreenPtr screen) { - ScrnInfoPtr scrn = xf86ScreenToScrn(screen); - intel_screen_private *intel = intel_get_screen_private(scrn); + return TRUE; +} - if (intel->uxa_flags & UXA_USE_GLAMOR) - intel->uxa_flags &= ~UXA_USE_GLAMOR; +#if HAVE_DRI2 +void +intel_glamor_exchange_buffers(struct intel_screen_private *intel, + PixmapPtr src, + PixmapPtr dst) +{ + glamor_egl_exchange_buffers(src, dst); +} - return TRUE; +PixmapPtr +intel_glamor_create_back_pixmap(ScreenPtr screen, + PixmapPtr front_pixmap, + drm_intel_bo *back_bo) +{ + PixmapPtr back_pixmap; + + back_pixmap = screen->CreatePixmap(screen, + 0, + 0, + front_pixmap->drawable.depth, + 0); + if (back_pixmap == NULL) + return NULL; + + screen->ModifyPixmapHeader(back_pixmap, + front_pixmap->drawable.width, + front_pixmap->drawable.height, + 0, 0, + front_pixmap->devKind, + 0); + if (!intel_glamor_set_pixmap_bo(back_pixmap, back_bo)) { + ScrnInfoPtr scrn = xf86ScreenToScrn(screen); + xf86DrvMsg(scrn->scrnIndex, X_WARNING, + "Failed to create textured back pixmap.\n"); + screen->DestroyPixmap(back_pixmap); + return NULL; + } + return back_pixmap; } +#endif diff --git a/src/uxa/intel_glamor.h b/src/uxa/intel_glamor.h index 97c2257..2fcabdf 100644 --- a/src/uxa/intel_glamor.h +++ b/src/uxa/intel_glamor.h @@ -40,11 +40,21 @@ void intel_glamor_free_screen(int scrnIndex, int flags); void intel_glamor_flush(intel_screen_private * intel); -Bool intel_glamor_create_textured_pixmap(PixmapPtr pixmap); -void intel_glamor_destroy_pixmap(PixmapPtr pixmap); -PixmapPtr intel_glamor_create_pixmap(ScreenPtr screen, int w, int h, - int depth, unsigned int usage); +#if HAVE_DRI2 +PixmapPtr +intel_glamor_create_back_pixmap(ScreenPtr screen, + PixmapPtr front_pixmap, + drm_intel_bo *back_bo); + void intel_glamor_exchange_buffers(struct intel_screen_private *intel, PixmapPtr src, PixmapPtr dst); +#endif + XF86VideoAdaptorPtr intel_glamor_xv_init(ScreenPtr screen, int num_ports); +dri_bo * +intel_glamor_get_pixmap_bo(PixmapPtr pixmap); + +Bool +intel_glamor_set_pixmap_bo(PixmapPtr pixmap, dri_bo *bo); + #endif /* INTEL_GLAMOR_H */ diff --git a/src/uxa/intel_present.c b/src/uxa/intel_present.c index b901fb1..04aeb78 100644 --- a/src/uxa/intel_present.c +++ b/src/uxa/intel_present.c @@ -54,11 +54,6 @@ #include "present.h" -#if USE_GLAMOR -#include "intel_glamor.h" -#endif -#include "uxa.h" - struct intel_present_vblank_event { uint64_t event_id; }; diff --git a/src/uxa/intel_uxa.c b/src/uxa/intel_uxa.c index da4eb97..e9d905b 100644 --- a/src/uxa/intel_uxa.c +++ b/src/uxa/intel_uxa.c @@ -1272,6 +1272,11 @@ Bool intel_uxa_init(ScreenPtr screen) ScrnInfoPtr scrn = xf86ScreenToScrn(screen); intel_screen_private *intel = intel_get_screen_private(scrn); + intel_batch_init(scrn); + + if (INTEL_INFO(intel)->gen >= 040 && INTEL_INFO(intel)->gen < 0100) + gen4_render_state_init(scrn); + #if HAS_DIXREGISTERPRIVATEKEY if (!dixRegisterPrivateKey(&uxa_pixmap_index, PRIVATE_PIXMAP, 0)) #else diff --git a/src/uxa/intel_video.c b/src/uxa/intel_video.c index ae3d351..73920e6 100644 --- a/src/uxa/intel_video.c +++ b/src/uxa/intel_video.c @@ -81,7 +81,10 @@ #if USE_GLAMOR #include "intel_glamor.h" #endif +#if USE_UXA #include "intel_uxa.h" +#endif + #include "intel_video_overlay.h" Atom intel_xv_Brightness, intel_xv_Contrast, intel_xv_Saturation, intel_xv_ColorKey, intel_xv_Pipe; @@ -165,14 +168,14 @@ void intel_video_init(ScreenPtr screen) ScrnInfoPtr scrn = xf86ScreenToScrn(screen); intel_screen_private *intel = intel_get_screen_private(scrn); XF86VideoAdaptorPtr *adaptors = NULL, *newAdaptors = NULL; - XF86VideoAdaptorPtr overlayAdaptor = NULL, texturedAdaptor = NULL, glamorAdaptor = NULL; + XF86VideoAdaptorPtr overlayAdaptor = NULL, texturedAdaptor = NULL; int num_adaptors = xf86XVListGenericAdaptors(scrn, &adaptors); /* Give our adaptor list enough space for the overlay and/or texture video * adaptors. */ newAdaptors = realloc(adaptors, - (num_adaptors + 3) * sizeof(XF86VideoAdaptorPtr)); + (num_adaptors + 2) * sizeof(XF86VideoAdaptorPtr)); if (newAdaptors == NULL) { free(adaptors); @@ -186,21 +189,37 @@ void intel_video_init(ScreenPtr screen) intel_xv_Brightness = MAKE_ATOM("XV_BRIGHTNESS"); intel_xv_Contrast = MAKE_ATOM("XV_CONTRAST"); - /* Set up textured video if we can do it at this depth and we are on - * supported hardware. - */ - if (!intel->force_fallback && - scrn->bitsPerPixel >= 16 && - INTEL_INFO(intel)->gen >= 030 && - INTEL_INFO(intel)->gen < 0100) { - texturedAdaptor = intel_uxa_video_setup_image_textured(screen); - if (texturedAdaptor != NULL) { - xf86DrvMsg(scrn->scrnIndex, X_INFO, - "Set up textured video\n"); - } else { - xf86DrvMsg(scrn->scrnIndex, X_ERROR, - "Failed to set up textured video\n"); + switch (intel->accel) { +#if USE_UXA + case ACCEL_UXA: + /* Set up textured video if we can do it at this depth and we are on + * supported hardware. + */ + if (!intel->force_fallback && + scrn->bitsPerPixel >= 16 && + INTEL_INFO(intel)->gen >= 030 && + INTEL_INFO(intel)->gen < 0100) { + texturedAdaptor = intel_uxa_video_setup_image_textured(screen); + if (texturedAdaptor != NULL) { + xf86DrvMsg(scrn->scrnIndex, X_INFO, + "Set up textured video\n"); + } else { + xf86DrvMsg(scrn->scrnIndex, X_ERROR, + "Failed to set up textured video\n"); + } } + break; +#endif +#if USE_GLAMOR + case ACCEL_GLAMOR: + texturedAdaptor = intel_glamor_xv_init(screen, 16); + if (texturedAdaptor != NULL) + xf86DrvMsg(scrn->scrnIndex, X_INFO, + "Set up textured video using glamor\n"); + break; +#endif + default: + break; } overlayAdaptor = intel_video_overlay_setup_image(screen); @@ -215,23 +234,12 @@ void intel_video_init(ScreenPtr screen) } } -#if USE_GLAMOR - glamorAdaptor = intel_glamor_xv_init(screen, 16); - if (glamorAdaptor != NULL) - xf86DrvMsg(scrn->scrnIndex, X_INFO, - "Set up textured video using glamor\n"); -#endif - - if (overlayAdaptor && intel->XvPreferOverlay) adaptors[num_adaptors++] = overlayAdaptor; if (texturedAdaptor) adaptors[num_adaptors++] = texturedAdaptor; - if (glamorAdaptor) - adaptors[num_adaptors++] = glamorAdaptor; - if (overlayAdaptor && !intel->XvPreferOverlay) adaptors[num_adaptors++] = overlayAdaptor; @@ -243,9 +251,16 @@ void intel_video_init(ScreenPtr screen) intel->XvEnabled = FALSE; } - if (texturedAdaptor) - intel_xvmc_adaptor_init(screen); - +#if defined(INTEL_XVMC) && defined(USE_UXA) + switch (intel->accel) { + case ACCEL_UXA: + if (texturedAdaptor) + intel_xvmc_adaptor_init(screen); + break; + default: + break; + } +#endif free(adaptors); } -- 2.0.1 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx