[Mesa-dev] [PATCH] intel: Set screen's api mask according to hw capabilities (v2)

Ian Romanick idr at freedesktop.org
Tue Nov 27 16:39:21 PST 2012


On 11/27/2012 04:16 PM, Chad Versace wrote:
> Before this patch, intelInitScreen2 set DRIScreen::api_mask with the hacky
> heuristic below:
>
>      if (gen >= 3)
>          api_mask = GL | GLES1 | GLES2;
>      else
>          api_mask = 0;
>
> I don't understand why this hack works with gen2 (i830), or even if it
> works properly at all. I don't care enough to investigate. On first
> glance, it appears that this will cause every EGLConfig on i830 to have
> EGL_RENDERABLE_TYPE=0, and thus prevent eglCreateContext from ever
> succeeding. Anyway, moving on to living drivers...
>
> With the arrival of EGL_OPENGL_ES3_BIT_KHR, this heuristic is now
> insufficient. We must enable the GLES3 bit if and only if the driver is
> capable of creating a GLES3 context. This requires us to determine the
> maximum supported context version supported by the hardware/driver for
> each api *during initialization of intel_screen*.
>
> Therefore, this patch adds four new fields to intel_screen which indicate
> the maximum supported context version for each api:
>    max_gl_core_version
>    max_gl_compat_version
>    max_gl_es1_version
>    max_gl_es2_version
>
> The api mask is now correctly set as:
>
>      api_mask = GL;
>      if (max_gl_es1_version > 0)
>          api_mask |= GLES1;
>      if (max_gl_es2_version > 0)
>          api_mask |= GLES2;
>
> Tested against gen6 with piglit egl-create-context-verify-gl-flavor.
> Verified that this patch does not change the set of exposed EGL context
> flavors.
>
> v2:
>    - Replace the if-tree on gen with a switch, for Ian.
>    - Unconditionally enable the DRI_API_OPENGL bit, for Ian.
>
> CC: Ian Romanick <idr at freedesktop.org>

Other than the bug fix mentioned below,

Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>

> Signed-off-by: Chad Versace <chad.versace at linux.intel.com>
> ---
>   src/mesa/drivers/dri/intel/intel_screen.c | 101 ++++++++++++++++++++++++++----
>   src/mesa/drivers/dri/intel/intel_screen.h |   5 ++
>   2 files changed, 95 insertions(+), 11 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/intel/intel_screen.c b/src/mesa/drivers/dri/intel/intel_screen.c
> index 0194804..f7d0986 100644
> --- a/src/mesa/drivers/dri/intel/intel_screen.c
> +++ b/src/mesa/drivers/dri/intel/intel_screen.c
> @@ -1046,6 +1046,89 @@ intel_screen_make_configs(__DRIscreen *dri_screen)
>      return configs;
>   }
>
> +static void
> +set_max_gl_versions(struct intel_screen *screen)
> +{
> +#ifdef TEXTURE_FLOAT_ENABLED
> +   bool has_texture_float = true;
> +#else
> +   bool has_texture_float = false;
> +#endif
> +
> +   switch (screen->gen) {
> +   case 7:
> +      if (has_texture_float && screen->kernel_has_gen7_sol_reset) {
> +         screen->max_gl_core_version = 31;
> +         screen->max_gl_compat_version = 30;
> +         screen->max_gl_es1_version = 11;
> +         screen->max_gl_es2_version = 30;
> +      } else {
> +         screen->max_gl_core_version = 0;
> +         screen->max_gl_compat_version = 21;
> +         screen->max_gl_es1_version = 11;
> +         screen->max_gl_es2_version = 20;
> +      }
> +      break;
> +   case 6:
> +      if (has_texture_float) {
> +         screen->max_gl_core_version = 31;
> +         screen->max_gl_compat_version = 30;
> +         screen->max_gl_es1_version = 11;
> +         screen->max_gl_es2_version = 30;
> +      } else {
> +         screen->max_gl_core_version = 0;
> +         screen->max_gl_compat_version = 21;
> +         screen->max_gl_es1_version = 11;
> +         screen->max_gl_es2_version = 20;
> +      }
> +      break;
> +   case 5:
> +   case 4:
> +      screen->max_gl_core_version = 0;
> +      screen->max_gl_compat_version = 21;
> +      screen->max_gl_es1_version = 11;
> +      screen->max_gl_es2_version = 20;
> +      break;
> +   case 3:
> +      bool has_fragment_shader = driQueryOptionb(&screen->optionCache, "fragment_shader");
> +      bool has_occlusion_query = driQueryOptionb(&screen->optionCache, "stub_occlusion_query");
> +
> +      screen->max_gl_core_version = 0;
> +      screen->max_gl_es1_version = 11;
> +
> +      if (has_fragment_shader && has_occlusion_query) {
> +         screen->max_gl_compat_version = 21;
> +      } else {
> +         screen->max_gl_compat_version = 15;

This should be 14.  GL_ARB_occlusion_query became part of core in 1.5... 
it looks like this was a pre-existing bug... created by me. :(

> +      }
> +
> +      if (has_fragment_shader) {
> +         screen->max_gl_es2_version = 20;
> +      } else {
> +         screen->max_gl_es2_version = 0;
> +      }
> +
> +      break;
> +   case 2:
> +      screen->max_gl_core_version = 0;
> +      screen->max_gl_compat_version = 13;
> +      screen->max_gl_es1_version = 11;
> +      screen->max_gl_es2_version = 0;
> +      break;
> +   default:
> +      assert(!"unrecognized intel_screen::gen");
> +      break;
> +   }
> +
> +#ifndef FEATURE_ES1
> +   screen->max_gl_es1_version = 0;
> +#endif
> +
> +#ifndef FEATURE_ES2
> +   screen->max_gl_es2_version = 0;
> +#endif
> +}
> +
>   /**
>    * This is the driver specific part of the createNewScreen entry point.
>    * Called when using DRI2.
> @@ -1056,7 +1139,6 @@ static const
>   __DRIconfig **intelInitScreen2(__DRIscreen *psp)
>   {
>      struct intel_screen *intelScreen;
> -   unsigned int api_mask;
>
>      if (psp->dri2.loader->base.version <= 2 ||
>          psp->dri2.loader->getBuffersWithFormat == NULL) {
> @@ -1115,18 +1197,15 @@ __DRIconfig **intelInitScreen2(__DRIscreen *psp)
>
>      intel_override_separate_stencil(intelScreen);
>
> -   api_mask = (1 << __DRI_API_OPENGL);
> -#if FEATURE_ES1
> -   api_mask |= (1 << __DRI_API_GLES);
> -#endif
> -#if FEATURE_ES2
> -   api_mask |= (1 << __DRI_API_GLES2);
> -#endif
> +   intelScreen->hw_has_swizzling = intel_detect_swizzling(intelScreen);
>
> -   if (IS_9XX(intelScreen->deviceID) || IS_965(intelScreen->deviceID))
> -      psp->api_mask = api_mask;
> +   set_max_gl_versions(intelScreen);
>
> -   intelScreen->hw_has_swizzling = intel_detect_swizzling(intelScreen);
> +   psp->api_mask = (1 << __DRI_API_OPENGL);
> +   if (intelScreen->max_gl_es1_version > 0)
> +      psp->api_mask |= (1 << __DRI_API_GLES);
> +   if (intelScreen->max_gl_es2_version > 0)
> +      psp->api_mask |= (1 << __DRI_API_GLES2);
>
>      psp->extensions = intelScreenExtensions;
>
> diff --git a/src/mesa/drivers/dri/intel/intel_screen.h b/src/mesa/drivers/dri/intel/intel_screen.h
> index f5a374d..534363c 100644
> --- a/src/mesa/drivers/dri/intel/intel_screen.h
> +++ b/src/mesa/drivers/dri/intel/intel_screen.h
> @@ -40,6 +40,11 @@ struct intel_screen
>      int deviceID;
>      int gen;
>
> +   int max_gl_core_version;
> +   int max_gl_compat_version;
> +   int max_gl_es1_version;
> +   int max_gl_es2_version;
> +
>      int logTextureGranularity;
>
>      __DRIscreen *driScrnPriv;
>



More information about the mesa-dev mailing list