[Mesa-dev] [PATCH 1/5] (gles3) intel: Set screen's api mask according to hw capabilities
Chad Versace
chad.versace at linux.intel.com
Wed Nov 21 17:43:35 PST 2012
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:
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);
+ }
+
+#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);
+ 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;
--
1.7.11.7
More information about the mesa-dev
mailing list