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

Chad Versace chad.versace at linux.intel.com
Tue Nov 27 15:46:03 PST 2012


On 11/27/2012 01:04 PM, Ian Romanick wrote:
> 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>



>> +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.

Agreed that a switch statement is better. Expect a v2 of this patch.



>> @@ -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.

I'll make the change. Unless we start supporting building the driver *without*
desktop GL, there's no reason why it shouldn't be unconditional.

> 
>> +   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;


More information about the mesa-dev mailing list