Patches 1 and 3 are
Reviewed-by: Tapani Pälli <tapani.pa...@intel.com>

On 2/13/19 5:40 AM, Ilia Mirkin wrote:
If EXT_float_blend is not supported, error out on blending of FP32
attachments in an ES2 context.

Signed-off-by: Ilia Mirkin <imir...@alum.mit.edu>
---
  src/mesa/main/draw_validate.c    | 19 +++++++++++++++++++
  src/mesa/main/extensions_table.h |  2 +-
  src/mesa/main/fbobject.c         |  4 ++++
  src/mesa/main/mtypes.h           |  2 ++
  4 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/src/mesa/main/draw_validate.c b/src/mesa/main/draw_validate.c
index b715a27f8b7..779cd1c12c7 100644
--- a/src/mesa/main/draw_validate.c
+++ b/src/mesa/main/draw_validate.c
@@ -304,6 +304,25 @@ check_valid_to_render(struct gl_context *ctx, const char 
*function)
                       "%s(tess ctrl shader is missing)", function);
           return false;
        }
+
+      /* From GL_EXT_color_buffer_float:
+       *
+       *     "Blending applies only if the color buffer has a fixed-point or
+       *     or floating-point format. If the color buffer has an integer
+       *     format, proceed to the next operation.  Furthermore, an
+       *     INVALID_OPERATION error is generated by DrawArrays and the other
+       *     drawing commands defined in section 2.8.3 (10.5 in ES 3.1) if
+       *     blending is enabled (see below) and any draw buffer has 32-bit
+       *     floating-point format components."
+       *
+       * However GL_EXT_float_blend removes this text.
+       */
+      if (!ctx->Extensions.EXT_float_blend &&
+          (ctx->DrawBuffer->_FP32Buffers & ctx->Color.BlendEnabled)) {
+         _mesa_error(ctx, GL_INVALID_OPERATION,
+                     "%s(32-bit float output + blending)", function);
+         return false;
+      }
        break;
case API_OPENGL_CORE:
diff --git a/src/mesa/main/extensions_table.h b/src/mesa/main/extensions_table.h
index 0d6bb452ffa..b0492fed698 100644
--- a/src/mesa/main/extensions_table.h
+++ b/src/mesa/main/extensions_table.h
@@ -226,7 +226,7 @@ EXT(EXT_draw_buffers_indexed                , 
ARB_draw_buffers_blend
  EXT(EXT_draw_elements_base_vertex           , ARB_draw_elements_base_vertex   
       ,  x ,  x ,  x , ES2, 2014)
  EXT(EXT_draw_instanced                      , ARB_draw_instanced              
       , GLL, GLC,  x ,  x , 2006)
  EXT(EXT_draw_range_elements                 , dummy_true                      
       , GLL,  x ,  x ,  x , 1997)
-EXT(EXT_float_blend                         , dummy_true                       
      ,  x ,  x ,  x ,  30, 2015)
+EXT(EXT_float_blend                         , EXT_float_blend                  
      ,  x ,  x ,  x ,  30, 2015)
  EXT(EXT_fog_coord                           , dummy_true                      
       , GLL,  x ,  x ,  x , 1999)
  EXT(EXT_frag_depth                          , dummy_true                      
       ,  x ,  x ,  x , ES2, 2010)
  EXT(EXT_framebuffer_blit                    , dummy_true                      
       , GLL, GLC,  x ,  x , 2005)
diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
index 87c33be7854..21e3496593c 100644
--- a/src/mesa/main/fbobject.c
+++ b/src/mesa/main/fbobject.c
@@ -1004,6 +1004,7 @@ _mesa_test_framebuffer_completeness(struct gl_context 
*ctx,
     fb->_HasAttachments = true;
     fb->_IntegerBuffers = 0;
     fb->_RGBBuffers = 0;
+   fb->_FP32Buffers = 0;
/* Start at -2 to more easily loop over all attachment points.
      *  -2: depth buffer
@@ -1153,6 +1154,9 @@ _mesa_test_framebuffer_completeness(struct gl_context 
*ctx,
           if (f == GL_RGB)
              fb->_RGBBuffers |= (1 << i);
+ if (type == GL_FLOAT && _mesa_get_format_max_bits(attFormat) > 16)
+            fb->_FP32Buffers |= (1 << i);
+
           fb->_AllColorBuffersFixedPoint =
              fb->_AllColorBuffersFixedPoint &&
              (type == GL_UNSIGNED_NORMALIZED || type == GL_SIGNED_NORMALIZED);
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index dda96cd2f19..ca00de7dc63 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -3506,6 +3506,7 @@ struct gl_framebuffer
GLbitfield _IntegerBuffers; /**< Which color buffers are integer valued */
     GLbitfield _RGBBuffers;  /**< Which color buffers have baseformat == RGB */
+   GLbitfield _FP32Buffers; /**< Which color buffers are FP32 */
/* ARB_color_buffer_float */
     GLboolean _AllColorBuffersFixedPoint; /* no integer, no float */
@@ -4248,6 +4249,7 @@ struct gl_extensions
     GLboolean EXT_depth_bounds_test;
     GLboolean EXT_disjoint_timer_query;
     GLboolean EXT_draw_buffers2;
+   GLboolean EXT_float_blend;
     GLboolean EXT_framebuffer_multisample;
     GLboolean EXT_framebuffer_multisample_blit_scaled;
     GLboolean EXT_framebuffer_sRGB;

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to