Zhigang Gong | 2 Feb 10:44 2012
Picon

Re: [PATCH] uxa/glamor: Refine CloseScreen and InitScreen process.

> -----Original Message-----
> From: zhigang.gong <at> linux.intel.com [mailto:zhigang.gong <at> linux.intel.com]
> Sent: Wednesday, February 01, 2012 7:47 PM
> To: chris <at> chris-wilson.co.uk
> Cc: intel-gfx <at> lists.freedesktop.org; zhigang.gong <at> linux.intel.com
> Subject: [PATCH] uxa/glamor: Refine CloseScreen and InitScreen process.
> 
> From: Zhigang Gong <zhigang.gong <at> linux.intel.com>
> 
> The previous version calls glamor_egl_close_screen and
> glamor_egl_free_screen manually which is not align with standard process.
> Now glamor change the way to follow standard method:
> 
> glamor layer and glamor egl layer both have their internal CloseScreens.
> The correct sequence is after the I830CloseScreen is registered, then
> register glamor_egl_close_screen and the last one is
> glamor_close_screen. So we move out the intel_glamor_init from the
> intel_uxa_init to I830ScreenInit and just after the registration of
> I830CloseScreen.
> 
> As the glamor interfaces changed, we need to check the glamor version
> when load the glamor egl module to make sure we are loading the right
> glamor module. If failed, it will switch back to UXA path.
> 
> Signed-off-by: Zhigang Gong <zhigang.gong <at> linux.intel.com>
> ---
>  src/intel_driver.c |    3 +-
>  src/intel_glamor.c |   66
> +++++++++++++++++++++++++++------------------------
>  src/intel_uxa.c    |    2 -
>  uxa/uxa.h          |   10 ++++++-
>  4 files changed, 44 insertions(+), 37 deletions(-)
> 
> diff --git a/src/intel_driver.c b/src/intel_driver.c index
9d1c4e8..d66a8fd
> 100644
> --- a/src/intel_driver.c
> +++ b/src/intel_driver.c
>  <at>  <at>  -1051,6 +1051,7  <at>  <at>  I830ScreenInit(int scrnIndex, ScreenPtr screen,
> int argc, char **argv)
>  	intel->CreateScreenResources = screen->CreateScreenResources;
>  	screen->CreateScreenResources = i830CreateScreenResources;
> 
> +	intel_glamor_init(screen);
>  	if (!xf86CrtcScreenInit(screen))
>  		return FALSE;
> 
>  <at>  <at>  -1124,8 +1125,6  <at>  <at>  static void I830FreeScreen(int scrnIndex, int
> flags)
>  	ScrnInfoPtr scrn = xf86Screens[scrnIndex];
>  	intel_screen_private *intel = intel_get_screen_private(scrn);
> 
> -	intel_glamor_free_screen(scrnIndex, flags);
> -
>  	if (intel) {
>  		intel_mode_fini(intel);
>  		intel_close_drm_master(intel);
> diff --git a/src/intel_glamor.c b/src/intel_glamor.c index
> e96daa6..446dd3d 100644
> --- a/src/intel_glamor.c
> +++ b/src/intel_glamor.c
>  <at>  <at>  -61,20 +61,31  <at>  <at> 
> intel_glamor_create_screen_resources(ScreenPtr screen)  Bool
> intel_glamor_pre_init(ScrnInfoPtr scrn)  {
> +	pointer glamor_module;
>  	intel_screen_private *intel;
> +	CARD32 version;
>  	intel = intel_get_screen_private(scrn);
> 
>  	/* Load glamor module */
> -	if (xf86LoadSubModule(scrn, "glamor_egl") &&
> -	    glamor_egl_init(scrn, intel->drmSubFD)) {
> -		xf86DrvMsg(scrn->scrnIndex, X_INFO,
> -			   "glamor detected, initialising\n");
> -		intel->uxa_flags |= UXA_USE_GLAMOR;
> -	} else {
> +	if ((glamor_module = xf86LoadSubModule(scrn, "glamor_egl"))) {
> +		version = xf86GetModuleVersion(glamor_module);
> +		if (version < MODULE_VERSION_NUMERIC(0,3,0)) {
> +			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
>  		xf86DrvMsg(scrn->scrnIndex, X_WARNING,
>  			   "glamor not available\n");
> -		intel->uxa_flags &= ~UXA_USE_GLAMOR;
> -	}
> 
>  	return TRUE;
>  }
>  <at>  <at>  -83,7 +94,13  <at>  <at>  PixmapPtr
>  intel_glamor_create_pixmap(ScreenPtr screen, int w, int h,
>  			   int depth, unsigned int usage)
>  {
> -	return glamor_create_pixmap(screen, w, h, depth, usage);
> +	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
> +	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
>  <at>  <at>  -145,17 +162,16  <at>  <at>  intel_glamor_finish_access(PixmapPtr pixmap,
> uxa_access_t access)
>  	return;
>  }
> 
> -
>  Bool
>  intel_glamor_init(ScreenPtr screen)
>  {
>  	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
>  	intel_screen_private *intel = intel_get_screen_private(scrn);
> 
> -	if ((intel->uxa_flags & UXA_USE_GLAMOR) == 0)
> -		return TRUE;
> +	if ((intel->uxa_flags & UXA_GLAMOR_EGL_INITIALIZED) == 0)
> +		goto fail;
> 
> -	if (!glamor_init(screen, GLAMOR_INVERTED_Y_AXIS)) {
> +	if (!glamor_init(screen, GLAMOR_INVERTED_Y_AXIS |
> +GLAMOR_USE_EGL_SCREEN)) {
>  		xf86DrvMsg(scrn->scrnIndex, X_ERROR,
>  			   "Failed to initialize glamor\n");
>  		goto fail;
>  <at>  <at>  -168,7 +184,7  <at>  <at>  intel_glamor_init(ScreenPtr screen)
>  	}
> 
>  	intel->uxa_driver->flags |= UXA_USE_GLAMOR;
> -	intel->uxa_flags = intel->uxa_driver->flags;
> +	intel->uxa_flags |= intel->uxa_driver->flags;
> 
>  	intel->uxa_driver->finish_access = intel_glamor_finish_access;
> 
>  <at>  <at>  -177,8 +193,8  <at>  <at>  intel_glamor_init(ScreenPtr screen)
>  	return TRUE;
> 
>    fail:
> -	xf86DrvMsg(scrn->scrnIndex, X_WARNING,
> -		   "Use standard UXA acceleration.");
> +	xf86DrvMsg(scrn->scrnIndex, X_ERROR,
> +		   "Use standard UXA acceleration.\n");
>  	return FALSE;
>  }
> 
>  <at>  <at>  -196,21 +212,9  <at>  <at>  Bool
>  intel_glamor_close_screen(ScreenPtr screen)  {
>  	ScrnInfoPtr scrn = xf86Screens[screen->myNum];
> -	intel_screen_private * intel;
> +	intel_screen_private *intel = intel_get_screen_private(scrn);
> 
> -	intel = intel_get_screen_private(scrn);
> -	if (intel && (intel->uxa_flags & UXA_USE_GLAMOR))
> -		return glamor_egl_close_screen(screen);
> +	if (intel->uxa_flags & UXA_USE_GLAMOR)
> +		intel->uxa_flags &= ~UXA_USE_GLAMOR;
>  	return TRUE;
>  }
> -
> -void
> -intel_glamor_free_screen(int scrnIndex, int flags) -{
> -	ScrnInfoPtr scrn = xf86Screens[scrnIndex];
> -	intel_screen_private * intel;
> -
> -	intel = intel_get_screen_private(scrn);
> -	if (intel && (intel->uxa_flags & UXA_USE_GLAMOR))
> -		glamor_egl_free_screen(scrnIndex,
> GLAMOR_EGL_EXTERNAL_BUFFER);
> -}
> diff --git a/src/intel_uxa.c b/src/intel_uxa.c index f04a2ef..a11846d
> 100644
> --- a/src/intel_uxa.c
> +++ b/src/intel_uxa.c
>  <at>  <at>  -1391,7 +1391,5  <at>  <at>  Bool intel_uxa_init(ScreenPtr screen)
>  	uxa_set_fallback_debug(screen, intel->fallback_debug);
>  	uxa_set_force_fallback(screen, intel->force_fallback);
> 
> -	intel_glamor_init(screen);
> -
>  	return TRUE;
>  }
> diff --git a/uxa/uxa.h b/uxa/uxa.h
> index 66b5f1e..b8569f0 100644
> --- a/uxa/uxa.h
> +++ b/uxa/uxa.h
>  <at>  <at>  -548,12 +548,18  <at>  <at>  typedef struct _UxaDriver {
>  /**
>   * UXA_USE_GLAMOR indicates to use glamor acceleration to perform
> rendering.
>   * And if glamor fail to accelerate the rendering, then goto fallback to
> - * use CPU to do the rendering.
> + * use CPU to do the rendering. This flag will be set only when glamor
> + get
> + * initialized successfully.
> + * Note, in ddx close screen, this bit need to be cleared.
>   */
>  #define UXA_USE_GLAMOR			(1 << 3)
> 
> -/**  <at> } */
> +/* UXA_GLAMOR_EGL_INITIALIZED indicates glamor egl layer get
> +initialized
> + * successfully. UXA layer does not use this flag, before call to
> + * glamor_init, ddx need to check this flag. */
> +#define UXA_GLAMOR_EGL_INITIALIZED	(1 << 4)
> 
> +/**  <at> } */
>  /**  <at> name UXA CreatePixmap hint flags
>   *  <at> {
>   */
> --
> 1.7.4.4
This commit depends on the following glamor patch which is also under
reviewing:
http://lists.freedesktop.org/archives/glamor/2012-February/000066.html

Gmane