[Mesa-dev] [PATCH 01/11] i965: Fix ctx->Texture.CubeMapSeamless

Eduardo Lima Mitev elima at igalia.com
Tue Feb 10 07:40:38 PST 2015

From: Iago Toral Quiroga <itoral at igalia.com>

The intel driver code, and apparently all other Mesa drivers, call
_mesa_initialize_context early in the CreateContext hook. That
function will end up calling _mesa_init_texture which will do:

ctx->Texture.CubeMapSeamless = _mesa_is_gles3(ctx);

But this won't work at this point, since _mesa_is_gles3 requires
ctx->Version to be set and that will not happen until late
in the CreateContext hook, when _mesa_compute_version is called.

We can't just move the call to _mesa_compute_version before
_mesa_initialize_context since it needs that available extensions
have been computed, which again requires other things to be
initialized, etc. Instead, we just re-compute
ctx->Texture.CubeMapSeamless after the version is known.

As far as I can see, this should affect all Mesa drivers, as it
seems that all call _mesa_initialize_context before _mesa_compute_version.
Separate patches can fix the problem for other drivers.

Fixes the following 190 dEQP tests:
 src/mesa/drivers/dri/i965/brw_context.c | 6 ++++++
 src/mesa/main/texstate.c                | 8 ++++++++
 2 files changed, 14 insertions(+)

diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c
index e20da0b..f5b0624 100644
--- a/src/mesa/drivers/dri/i965/brw_context.c
+++ b/src/mesa/drivers/dri/i965/brw_context.c
@@ -859,6 +859,12 @@ brwCreateContext(gl_api api,
+   /* This is done in _mesa_init_texture called from _mesa_initialize_context
+    * above, but it won't work until we have computed the GL version, so
+    * do it again here.
+    */
+   ctx->Texture.CubeMapSeamless = _mesa_is_gles3(ctx);
diff --git a/src/mesa/main/texstate.c b/src/mesa/main/texstate.c
index 66fd718..f03862e 100644
--- a/src/mesa/main/texstate.c
+++ b/src/mesa/main/texstate.c
@@ -882,6 +882,14 @@ _mesa_init_texture(struct gl_context *ctx)
     *     "OpenGL ES 3.0 requires that all cube map filtering be
     *     seamless. OpenGL ES 2.0 specified that a single cube map face be
     *     selected and used for filtering."
+    *
+    * FIXME: the call to _mesa_is_gles3 below will only work as intended if
+    * the driver has already computed and set ctx->Version, however drivers
+    * seem to call _mesa_initialize_context (which calls this) early
+    * in the CreateContext hook and _mesa_compute_version much later (since
+    * it needs information about available extensions), which means that this
+    * won't actually work unless we figure out a way to compute the GL version
+    * before _mesa_initialize_context is called.
    ctx->Texture.CubeMapSeamless = _mesa_is_gles3(ctx);

More information about the mesa-dev mailing list