[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