Hi everyone,<br><br>I took a look at OpenGl ES 3.0 this summer and noticed a little something than seems to still lack to the current implementation in mesa. It's about the support of seamless cube maps. The spec seems to suggest that linearly flltered cube maps should always be seamless, regarless of any state change<br>
<br>At Appendix F.2 (page 318 - page 330 of the PDF of OpenGL ES 3.0.0 specifications) you can read this :<br><br>"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."<br>
<br>So, i've made this little patch as an attempt to get a more conforming behavior. It involves a modification of interface for<br>_mesa_initialize_texture_object and _mesa_init_sampler_object functions to give access to gl_context properties to make some needed GL API checks.<br>
<br><br><br>Here is the patch :<br><br><br><br>From a0abd6e488aca5dca3d96868aea68bdffe25e339 Mon Sep 17 00:00:00 2001<br>From: Maxence Le Dore <<a href="mailto:maxence.ledore@gmail.com">maxence.ledore@gmail.com</a>><br>
Date: Wed, 7 Nov 2012 20:34:10 +0100<br>Subject: [PATCH] es3_seamless_cube_map<br><br>---<br> src/mesa/drivers/dri/intel/intel_tex.c         |    2 +-<br> src/mesa/drivers/dri/nouveau/nouveau_texture.c |    2 +-<br> src/mesa/drivers/dri/r200/r200_tex.c           |    2 +-<br>
 src/mesa/drivers/dri/radeon/radeon_tex.c       |    2 +-<br> src/mesa/main/enable.c                         |    4 +++-<br> src/mesa/main/samplerobj.c                     |   10 +++++++---<br> src/mesa/main/samplerobj.h                     |    3 ++-<br>
 src/mesa/main/texobj.c                         |    8 +++++---<br> src/mesa/main/texobj.h                         |    3 ++-<br> src/mesa/state_tracker/st_cb_texture.c         |    2 +-<br> 10 files changed, 24 insertions(+), 14 deletions(-)<br>
<br>diff --git a/src/mesa/drivers/dri/intel/intel_tex.c b/src/mesa/drivers/dri/intel/intel_tex.c<br>index 6820f98..b927440 100644<br>--- a/src/mesa/drivers/dri/intel/intel_tex.c<br>+++ b/src/mesa/drivers/dri/intel/intel_tex.c<br>
@@ -34,7 +34,7 @@ intelNewTextureObject(struct gl_context * ctx, GLuint name, GLenum target)<br>    (void) ctx;<br> <br>    DBG("%s\n", __FUNCTION__);<br>-   _mesa_initialize_texture_object(&obj->base, name, target);<br>
+   _mesa_initialize_texture_object(ctx, &obj->base, name, target);<br> <br>    return &obj->base;<br> }<br>diff --git a/src/mesa/drivers/dri/nouveau/nouveau_texture.c b/src/mesa/drivers/dri/nouveau/nouveau_texture.c<br>
index 37f7577..7a4ab60 100644<br>--- a/src/mesa/drivers/dri/nouveau/nouveau_texture.c<br>+++ b/src/mesa/drivers/dri/nouveau/nouveau_texture.c<br>@@ -46,7 +46,7 @@ nouveau_texture_new(struct gl_context *ctx, GLuint name, GLenum target)<br>
 {<br>     struct nouveau_texture *nt = CALLOC_STRUCT(nouveau_texture);<br> <br>-    _mesa_initialize_texture_object(&nt->base, name, target);<br>+    _mesa_initialize_texture_object(ctx, &nt->base, name, target);<br>
 <br>     return &nt->base;<br> }<br>diff --git a/src/mesa/drivers/dri/r200/r200_tex.c b/src/mesa/drivers/dri/r200/r200_tex.c<br>index a4347c6..a74a2e9 100644<br>--- a/src/mesa/drivers/dri/r200/r200_tex.c<br>+++ b/src/mesa/drivers/dri/r200/r200_tex.c<br>
@@ -477,7 +477,7 @@ static struct gl_texture_object *r200NewTextureObject(struct gl_context * ctx,<br>        __FUNCTION__, ctx,<br>        _mesa_lookup_enum_by_nr(target), t);<br> <br>-   _mesa_initialize_texture_object(&t->base, name, target);<br>
+   _mesa_initialize_texture_object(ctx, &t->base, name, target);<br>    t->base.Sampler.MaxAnisotropy = rmesa->radeon.initialMaxAnisotropy;<br> <br>    /* Initialize hardware state */<br>diff --git a/src/mesa/drivers/dri/radeon/radeon_tex.c b/src/mesa/drivers/dri/radeon/radeon_tex.c<br>
index 5ca07e0..56efb8c 100644<br>--- a/src/mesa/drivers/dri/radeon/radeon_tex.c<br>+++ b/src/mesa/drivers/dri/radeon/radeon_tex.c<br>@@ -411,7 +411,7 @@ radeonNewTextureObject( struct gl_context *ctx, GLuint name, GLenum target )<br>
    r100ContextPtr rmesa = R100_CONTEXT(ctx);<br>    radeonTexObj* t = CALLOC_STRUCT(radeon_tex_obj);<br> <br>-   _mesa_initialize_texture_object(&t->base, name, target);<br>+   _mesa_initialize_texture_object(ctx, &t->base, name, target);<br>
    t->base.Sampler.MaxAnisotropy = rmesa->radeon.initialMaxAnisotropy;<br> <br>    t->border_fallback = GL_FALSE;<br>diff --git a/src/mesa/main/enable.c b/src/mesa/main/enable.c<br>index e704f2f..4197e9d 100644<br>
--- a/src/mesa/main/enable.c<br>+++ b/src/mesa/main/enable.c<br>@@ -938,6 +938,8 @@ _mesa_set_enable(struct gl_context *ctx, GLenum cap, GLboolean state)<br>          break;<br> <br>       case GL_TEXTURE_CUBE_MAP_SEAMLESS:<br>
+     if (_mesa_is_gles3(ctx))<br>+        return;<br>          if (!_mesa_is_desktop_gl(ctx))<br>             goto invalid_enum_error;<br>      CHECK_EXTENSION(ARB_seamless_cube_map, cap);<br>@@ -1517,7 +1519,7 @@ _mesa_IsEnabled( GLenum cap )<br>
      return ctx->ATIFragmentShader.Enabled;<br> <br>       case GL_TEXTURE_CUBE_MAP_SEAMLESS:<br>-         if (!_mesa_is_desktop_gl(ctx))<br>+         if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx))<br>
             goto invalid_enum_error;<br>      CHECK_EXTENSION(ARB_seamless_cube_map);<br>      return ctx->Texture.CubeMapSeamless;<br>diff --git a/src/mesa/main/samplerobj.c b/src/mesa/main/samplerobj.c<br>index 3c3bfff..4dacb7f 100644<br>
--- a/src/mesa/main/samplerobj.c<br>+++ b/src/mesa/main/samplerobj.c<br>@@ -111,7 +111,8 @@ _mesa_reference_sampler_object_(struct gl_context *ctx,<br>  * Initialize the fields of the given sampler object.<br>  */<br> void<br>
-_mesa_init_sampler_object(struct gl_sampler_object *sampObj, GLuint name)<br>+_mesa_init_sampler_object(struct gl_context *ctx,<br>+                          struct gl_sampler_object *sampObj, GLuint name)<br> {<br>    sampObj->Name = name;<br>
    sampObj->RefCount = 1;<br>@@ -131,7 +132,7 @@ _mesa_init_sampler_object(struct gl_sampler_object *sampObj, GLuint name)<br>    sampObj->CompareMode = GL_NONE;<br>    sampObj->CompareFunc = GL_LEQUAL;<br>    sampObj->sRGBDecode = GL_DECODE_EXT;<br>
-   sampObj->CubeMapSeamless = GL_FALSE;<br>+   sampObj->CubeMapSeamless = _mesa_is_gles3(ctx) ? GL_TRUE : GL_FALSE;<br> }<br> <br> /**<br>@@ -142,7 +143,7 @@ _mesa_new_sampler_object(struct gl_context *ctx, GLuint name)<br>
 {<br>    struct gl_sampler_object *sampObj = CALLOC_STRUCT(gl_sampler_object);<br>    if (sampObj) {<br>-      _mesa_init_sampler_object(sampObj, name);<br>+      _mesa_init_sampler_object(ctx, sampObj, name);<br>    }<br>
    return sampObj;<br> }<br>@@ -576,6 +577,9 @@ set_sampler_cube_map_seamless(struct gl_context *ctx,<br>    if (param != GL_TRUE && param != GL_FALSE)<br>       return INVALID_VALUE;<br> <br>+   if (_mesa_is_gles3(ctx))<br>
+      return GL_FALSE;<br>+<br>    flush(ctx);<br>    samp->CubeMapSeamless = param;<br>    return GL_TRUE;<br>diff --git a/src/mesa/main/samplerobj.h b/src/mesa/main/samplerobj.h<br>index ecff032..a758c7f 100644<br>--- a/src/mesa/main/samplerobj.h<br>
+++ b/src/mesa/main/samplerobj.h<br>@@ -64,7 +64,8 @@ _mesa_reference_sampler_object(struct gl_context *ctx,<br> <br> <br> extern void<br>-_mesa_init_sampler_object(struct gl_sampler_object *sampObj, GLuint name);<br>+_mesa_init_sampler_object(struct gl_context *ctx,<br>
+                          struct gl_sampler_object *sampObj, GLuint name);<br> <br> extern struct gl_sampler_object *<br> _mesa_new_sampler_object(struct gl_context *ctx, GLuint name);<br>diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c<br>
index c083c72..2e6bab3 100644<br>--- a/src/mesa/main/texobj.c<br>+++ b/src/mesa/main/texobj.c<br>@@ -84,19 +84,21 @@ _mesa_new_texture_object( struct gl_context *ctx, GLuint name, GLenum target )<br>    struct gl_texture_object *obj;<br>
    (void) ctx;<br>    obj = MALLOC_STRUCT(gl_texture_object);<br>-   _mesa_initialize_texture_object(obj, name, target);<br>+   _mesa_initialize_texture_object(ctx, obj, name, target);<br>    return obj;<br> }<br> <br> <br>
 /**<br>  * Initialize a new texture object to default values.<br>+ * \param ctx the GL context<br>  * \param obj  the texture object<br>  * \param name  the texture name<br>  * \param target  the texture target<br>  */<br>
 void<br>-_mesa_initialize_texture_object( struct gl_texture_object *obj,<br>+_mesa_initialize_texture_object( struct gl_context *ctx,<br>+                                 struct gl_texture_object *obj,<br>                                  GLuint name, GLenum target )<br>
 {<br>    ASSERT(target == 0 ||<br>@@ -146,7 +148,7 @@ _mesa_initialize_texture_object( struct gl_texture_object *obj,<br>    obj->Sampler.CompareMode = GL_NONE;         /* ARB_shadow */<br>    obj->Sampler.CompareFunc = GL_LEQUAL;       /* ARB_shadow */<br>
    obj->DepthMode = GL_LUMINANCE;<br>-   obj->Sampler.CubeMapSeamless = GL_FALSE;<br>+   obj->Sampler.CubeMapSeamless = _mesa_is_gles3(ctx) ? GL_TRUE : GL_FALSE;<br>    obj->Swizzle[0] = GL_RED;<br>    obj->Swizzle[1] = GL_GREEN;<br>
    obj->Swizzle[2] = GL_BLUE;<br>diff --git a/src/mesa/main/texobj.h b/src/mesa/main/texobj.h<br>index f86b4eb..368927a 100644<br>--- a/src/mesa/main/texobj.h<br>+++ b/src/mesa/main/texobj.h<br>@@ -50,7 +50,8 @@ extern struct gl_texture_object *<br>
 _mesa_new_texture_object( struct gl_context *ctx, GLuint name, GLenum target );<br> <br> extern void<br>-_mesa_initialize_texture_object( struct gl_texture_object *obj,<br>+_mesa_initialize_texture_object( struct gl_context *ctx,<br>
+                                 struct gl_texture_object *obj,<br>                                  GLuint name, GLenum target );<br> <br> extern void<br>diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c<br>
index b2711c3..6702e4d 100644<br>--- a/src/mesa/state_tracker/st_cb_texture.c<br>+++ b/src/mesa/state_tracker/st_cb_texture.c<br>@@ -138,7 +138,7 @@ st_NewTextureObject(struct gl_context * ctx, GLuint name, GLenum target)<br>
    struct st_texture_object *obj = ST_CALLOC_STRUCT(st_texture_object);<br> <br>    DBG("%s\n", __FUNCTION__);<br>-   _mesa_initialize_texture_object(&obj->base, name, target);<br>+   _mesa_initialize_texture_object(ctx, &obj->base, name, target);<br>
 <br>    return &obj->base;<br> }<br>-- <br>1.7.9.5<br><br><br>