[Mesa-dev] [PATCH 1/5] (gles3) intel: Set screen's api mask according to hw capabilities
Ian Romanick
idr at freedesktop.org
Tue Nov 27 13:04:40 PST 2012
On 11/21/2012 05:43 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...
I think this doesn't work. My guess is that EGL just won't work on i8xx.
> 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:
>
> if (max_gl_core_version > 0 || max_gl_compat_version > 0)
> 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.
>
> Signed-off-by: Chad Versace <chad.versace at linux.intel.com>
> ---
> src/mesa/drivers/dri/intel/intel_screen.c | 99 +++++++++++++++++++++++++++----
> src/mesa/drivers/dri/intel/intel_screen.h | 5 ++
> 2 files changed, 93 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..b63e4f7 100644
> --- a/src/mesa/drivers/dri/intel/intel_screen.c
> +++ b/src/mesa/drivers/dri/intel/intel_screen.c
> @@ -1046,6 +1046,85 @@ 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
> +
> + if (screen->gen >= 7) {
> + screen->max_gl_es1_version = 11;
> +
> + 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_es2_version = 30;
> + } else {
> + screen->max_gl_core_version = 0;
> + screen->max_gl_compat_version = 21;
> + screen->max_gl_es2_version = 20;
> + }
> +
> + } else if (screen->gen >= 6) {
> + screen->max_gl_es1_version = 11;
> +
> + if (has_texture_float) {
> + screen->max_gl_core_version = 31;
> + screen->max_gl_compat_version = 30;
> + screen->max_gl_es2_version = 30;
> + } else {
> + screen->max_gl_core_version = 0;
> + screen->max_gl_compat_version = 21;
> + screen->max_gl_es2_version = 20;
> + }
> +
> + } else if (screen->gen >= 4) {
> + screen->max_gl_core_version = 0;
> + screen->max_gl_compat_version = 21;
> + screen->max_gl_es2_version = 20;
> + screen->max_gl_es1_version = 11;
> +
> + } else if (screen->gen >= 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;
> + }
> +
> + if (has_fragment_shader) {
> + screen->max_gl_es2_version = 20;
> + } else {
> + screen->max_gl_es2_version = 0;
> + }
> +
> + } else if (screen->gen >= 2) {
> + screen->max_gl_core_version = 0;
> + screen->max_gl_compat_version = 13;
> + screen->max_gl_es2_version = 0;
> + screen->max_gl_es1_version = 11;
> +
> + } else {
> + assert(false);
> + }
I'd make this just "else" with 'assert(screen->gen == 2)'. I also think
this would be better as a switch-statement.
> +
> +#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 +1135,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 +1193,17 @@ __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 = 0;
> + if (intelScreen->max_gl_compat_version > 0)
> + psp->api_mask |= (1 << __DRI_API_OPENGL);
It seems like this should be unconditional. I know that's different
behavior than the existing code, but desktop OpenGL is supported by
every piece of hardware this driver can drive.
> + 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