mesa: Mark R*32F formats as filterable when an extension is present.
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 7 Jul 2016 18:50:44 +0000 (11:50 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Fri, 8 Jul 2016 08:26:23 +0000 (01:26 -0700)
GL_OES_texture_float_linear marks R32F, RG32F, RGB32F, and RGBA32F
as texture filterable.

Fixes glGenerateMipmap GL errors when visiting a WebGL demo in Chromium:
http://www.iamnop.com/particles

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/mesa/main/genmipmap.c
src/mesa/main/glformats.c
src/mesa/main/glformats.h

index d917220f7e8da2a1ddf137f9006a0e9df2b98bdc..5e780c97ca8fb1c9f41b9e8d717c62e468fdbcf6 100644 (file)
@@ -90,7 +90,7 @@ _mesa_is_valid_generate_texture_mipmap_internalformat(struct gl_context *ctx,
              internalformat == GL_LUMINANCE_ALPHA ||
              internalformat == GL_LUMINANCE || internalformat == GL_ALPHA ||
              (_mesa_is_es3_color_renderable(internalformat) &&
-              _mesa_is_es3_texture_filterable(internalformat));
+              _mesa_is_es3_texture_filterable(ctx, internalformat));
    }
 
    return (!_mesa_is_enum_format_integer(internalformat) &&
index 24ce7b04f6beb3872be8ab4fbef7df05cb2f6851..448577e059fa922b1deb4faeb3731930edb1077a 100644 (file)
@@ -3656,7 +3656,8 @@ _mesa_is_es3_color_renderable(GLenum internal_format)
  * is marked "Texture Filterable" in Table 8.10 of the ES 3.2 specification.
  */
 bool
-_mesa_is_es3_texture_filterable(GLenum internal_format)
+_mesa_is_es3_texture_filterable(const struct gl_context *ctx,
+                                GLenum internal_format)
 {
    switch (internal_format) {
    case GL_R8:
@@ -3680,6 +3681,20 @@ _mesa_is_es3_texture_filterable(GLenum internal_format)
    case GL_R11F_G11F_B10F:
    case GL_RGB9_E5:
       return true;
+   case GL_R32F:
+   case GL_RG32F:
+   case GL_RGB32F:
+   case GL_RGBA32F:
+      /* The OES_texture_float_linear spec says:
+       *
+       *    "When implemented against OpenGL ES 3.0 or later versions, sized
+       *     32-bit floating-point formats become texture-filterable. This
+       *     should be noted by, for example, checking the ``TF'' column of
+       *     table 8.13 in the ES 3.1 Specification (``Correspondence of sized
+       *     internal formats to base internal formats ... and use cases ...'')
+       *     for the R32F, RG32F, RGB32F, and RGBA32F formats."
+       */
+      return ctx->Extensions.OES_texture_float_linear;
    default:
       return false;
    }
index c73f464e5f9b277f223d78747add94dcfdf8d65e..782e0f2edc85c4e050acbd2bb3c379e26642d42d 100644 (file)
@@ -149,7 +149,8 @@ extern bool
 _mesa_is_es3_color_renderable(GLenum internal_format);
 
 extern bool
-_mesa_is_es3_texture_filterable(GLenum internal_format);
+_mesa_is_es3_texture_filterable(const struct gl_context *ctx,
+                                GLenum internal_format);
 
 #ifdef __cplusplus
 }