[Cogl] [PATCH 4/4] Don't set GL_TEXTURE_MAX_LEVEL on GLES

Robert Bragg robert at sixbynine.org
Fri Jan 25 09:15:34 PST 2013


This looks good to land to me:

Reviewed-by: Robert Bragg <robert at linux.intel.com>

thanks,
- Robert

On Thu, Jan 24, 2013 at 12:09 PM, Neil Roberts <neil at linux.intel.com> wrote:
> GL_TEXTURE_MAX_LEVEL is not supported on GLES so we can't set it. It
> looks like Mesa was letting us get away with this but on other drivers
> it may cause errors. The enum is not defined in the GLES headers so it
> was failing to compile unless the GL driver is also enabled.
>
> The test-texture-mipmap-get-set test is now marked as n/a on GLES2
> because it can't support limiting the sampled mipmaps.
> ---
>  cogl/cogl-private.h                            | 3 ++-
>  cogl/driver/gl/cogl-texture-gl.c               | 8 +++++++-
>  cogl/driver/gl/gl/cogl-driver-gl.c             | 3 ++-
>  cogl/driver/gl/gl/cogl-texture-driver-gl.c     | 5 ++++-
>  cogl/driver/gl/gles/cogl-texture-driver-gles.c | 8 --------
>  tests/conform/test-conform-main.c              | 4 +++-
>  6 files changed, 18 insertions(+), 13 deletions(-)
>
> diff --git a/cogl/cogl-private.h b/cogl/cogl-private.h
> index ea7c8d2..d1c32e8 100644
> --- a/cogl/cogl-private.h
> +++ b/cogl/cogl-private.h
> @@ -55,7 +55,8 @@ typedef enum
>    COGL_PRIVATE_FEATURE_BUILTIN_POINT_SIZE_UNIFORM = 1L<<19,
>    COGL_PRIVATE_FEATURE_QUERY_TEXTURE_PARAMETERS = 1L<<20,
>    COGL_PRIVATE_FEATURE_ALPHA_TEXTURES = 1L<<21,
> -  COGL_PRIVATE_FEATURE_TEXTURE_SWIZZLE = 1L<<22
> +  COGL_PRIVATE_FEATURE_TEXTURE_SWIZZLE = 1L<<22,
> +  COGL_PRIVATE_FEATURE_TEXTURE_MAX_LEVEL = 1L<<23
>  } CoglPrivateFeatureFlags;
>
>  /* Sometimes when evaluating pipelines, either during comparisons or
> diff --git a/cogl/driver/gl/cogl-texture-gl.c b/cogl/driver/gl/cogl-texture-gl.c
> index 3dd4607..a7dfc68 100644
> --- a/cogl/driver/gl/cogl-texture-gl.c
> +++ b/cogl/driver/gl/cogl-texture-gl.c
> @@ -99,7 +99,12 @@ void
>  _cogl_texture_gl_maybe_update_max_level (CoglTexture *texture,
>                                           int max_level)
>  {
> -  if (texture->max_level < max_level)
> +  /* This isn't supported on GLES */
> +#ifdef HAVE_COGL_GL
> +  CoglContext *ctx = texture->context;
> +
> +  if ((ctx->private_feature_flags & COGL_PRIVATE_FEATURE_TEXTURE_MAX_LEVEL) &&
> +      texture->max_level < max_level)
>      {
>        CoglContext *ctx = texture->context;
>        GLuint gl_handle;
> @@ -116,6 +121,7 @@ _cogl_texture_gl_maybe_update_max_level (CoglTexture *texture,
>        GE( ctx, glTexParameteri (gl_target,
>                                  GL_TEXTURE_MAX_LEVEL, texture->max_level));
>      }
> +#endif /* HAVE_COGL_GL */
>  }
>
>  void
> diff --git a/cogl/driver/gl/gl/cogl-driver-gl.c b/cogl/driver/gl/gl/cogl-driver-gl.c
> index d0776ee..140a0e7 100644
> --- a/cogl/driver/gl/gl/cogl-driver-gl.c
> +++ b/cogl/driver/gl/gl/cogl-driver-gl.c
> @@ -562,7 +562,8 @@ _cogl_driver_update_features (CoglContext *ctx,
>                      COGL_PRIVATE_FEATURE_FORMAT_CONVERSION |
>                      COGL_PRIVATE_FEATURE_BLEND_CONSTANT |
>                      COGL_PRIVATE_FEATURE_BUILTIN_POINT_SIZE_UNIFORM |
> -                    COGL_PRIVATE_FEATURE_QUERY_TEXTURE_PARAMETERS);
> +                    COGL_PRIVATE_FEATURE_QUERY_TEXTURE_PARAMETERS |
> +                    COGL_PRIVATE_FEATURE_TEXTURE_MAX_LEVEL);
>
>    /* Cache features */
>    ctx->private_feature_flags |= private_flags;
> diff --git a/cogl/driver/gl/gl/cogl-texture-driver-gl.c b/cogl/driver/gl/gl/cogl-texture-driver-gl.c
> index 8c20ead..731ef7e 100644
> --- a/cogl/driver/gl/gl/cogl-texture-driver-gl.c
> +++ b/cogl/driver/gl/gl/cogl-texture-driver-gl.c
> @@ -72,7 +72,10 @@ _cogl_texture_driver_gen (CoglContext *ctx,
>         * level to 0 so OpenGL will consider the texture storage to be
>         * "complete".
>         */
> -      GE( ctx, glTexParameteri (gl_target, GL_TEXTURE_MAX_LEVEL, 0));
> +#ifdef HAVE_COGL_GL
> +      if ((ctx->private_feature_flags & COGL_PRIVATE_FEATURE_TEXTURE_MAX_LEVEL))
> +        GE( ctx, glTexParameteri (gl_target, GL_TEXTURE_MAX_LEVEL, 0));
> +#endif
>
>        /* GL_TEXTURE_MAG_FILTER defaults to GL_LINEAR, no need to set it */
>        GE( ctx, glTexParameteri (gl_target,
> diff --git a/cogl/driver/gl/gles/cogl-texture-driver-gles.c b/cogl/driver/gl/gles/cogl-texture-driver-gles.c
> index 6c2abe7..1afab86 100644
> --- a/cogl/driver/gl/gles/cogl-texture-driver-gles.c
> +++ b/cogl/driver/gl/gles/cogl-texture-driver-gles.c
> @@ -81,14 +81,6 @@ _cogl_texture_driver_gen (CoglContext *ctx,
>      {
>      case GL_TEXTURE_2D:
>      case GL_TEXTURE_3D:
> -      /* In case automatic mipmap generation gets disabled for this
> -       * texture but a minification filter depending on mipmap
> -       * interpolation is selected then we initialize the max mipmap
> -       * level to 0 so OpenGL will consider the texture storage to be
> -       * "complete".
> -       */
> -      GE( ctx, glTexParameteri (gl_target, GL_TEXTURE_MAX_LEVEL, 0));
> -
>        /* GL_TEXTURE_MAG_FILTER defaults to GL_LINEAR, no need to set it */
>        GE( ctx, glTexParameteri (gl_target,
>                                  GL_TEXTURE_MIN_FILTER,
> diff --git a/tests/conform/test-conform-main.c b/tests/conform/test-conform-main.c
> index 389f611..167a39d 100644
> --- a/tests/conform/test-conform-main.c
> +++ b/tests/conform/test-conform-main.c
> @@ -75,7 +75,9 @@ main (int argc, char **argv)
>    ADD_TEST (test_wrap_modes, 0, 0);
>    UNPORTED_TEST (test_texture_pixmap_x11);
>    ADD_TEST (test_texture_get_set_data, 0, 0);
> -  ADD_TEST (test_texture_mipmap_get_set, 0, 0);
> +  /* This test won't work on GLES because that doesn't support setting
> +   * the maximum texture level. */
> +  ADD_TEST (test_texture_mipmap_get_set, TEST_REQUIREMENT_GL, 0);
>    ADD_TEST (test_atlas_migration, 0, 0);
>    ADD_TEST (test_read_texture_formats, 0, 0);
>    ADD_TEST (test_write_texture_formats, 0, 0);
> --
> 1.7.11.3.g3c3efa5
>
> _______________________________________________
> Cogl mailing list
> Cogl at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/cogl


More information about the Cogl mailing list