On Monday, August 22, 2016 1:39:54 PM PDT Francisco Jerez wrote:
> Kenneth Graunke <kenn...@whitecape.org> writes:
> 
> > Signed-off-by: Kenneth Graunke <kenn...@whitecape.org>
> > ---
> >  src/mesa/main/context.c | 51 
> > +++++++++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 51 insertions(+)
> >
> > diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c
> > index 4ff0979..e63d8a6 100644
> > --- a/src/mesa/main/context.c
> > +++ b/src/mesa/main/context.c
> > @@ -1876,6 +1876,57 @@ check_blend_func_error(struct gl_context *ctx)
> >      return false;
> >        }
> >     }
> > +
> > +   if (ctx->Color.BlendEnabled && ctx->Color._AdvancedBlendMode) {
> > +      /* The KHR_blend_equation_advanced spec says:
> > +       *
> > +       *    "If any non-NONE draw buffer uses a blend equation found in 
> > table
> > +       *     X.1 or X.2, the error INVALID_OPERATION is generated by Begin 
> > or
> > +       *     any operation that implicitly calls Begin (such as 
> > DrawElements)
> > +       *     if:
> > +       *
> > +       *       * the draw buffer for color output zero selects multiple 
> > color
> > +       *         buffers (e.g., FRONT_AND_BACK in the default 
> > framebuffer); or
> > +       *
> > +       *       * the draw buffer for any other color output is not NONE."
> > +       */
> > +      if (ctx->DrawBuffer->ColorDrawBuffer[0] == GL_FRONT_AND_BACK) {
> > +         _mesa_error(ctx, GL_INVALID_OPERATION,
> > +                     "advanced blending is active and draw buffer for 
> > color "
> > +                     "output zero selects multiple color buffers");
> > +         return false;
> > +      }
> > +
> > +      for (unsigned i = 1; i < ctx->DrawBuffer->_NumColorDrawBuffers; i++) 
> > {
> > +         if (ctx->DrawBuffer->ColorDrawBuffer[i] != GL_NONE) {
> > +            _mesa_error(ctx, GL_INVALID_OPERATION,
> > +                        "advanced blending is active with multiple color "
> > +                        "draw buffers");
> > +            return false;
> > +         }
> > +      }
> > +
> > +      /* The KHR_blend_equation_advanced spec says:
> > +       *
> > +       *    "Advanced blending equations require the use of a fragment 
> > shader
> > +       *     with a matching "blend_support" layout qualifier.  If the 
> > current
> > +       *     blend equation is found in table X.1 or X.2, and the active
> > +       *     fragment shader does not include the layout qualifier matching
> > +       *     the blend equation or "blend_support_all_equations", the error
> > +       *     INVALID_OPERATION is generated [...]"
> > +       */
> > +      struct gl_shader_program *sh_prog = 
> > ctx->_Shader->_CurrentFragmentProgram;
> > +      struct gl_shader_info *fs_info =
> > +         &sh_prog->_LinkedShaders[MESA_SHADER_FRAGMENT]->info;
> 
> Don't you need a NULL check here to avoid a crash if
> there is no valid fragment program bound to the pipeline?  You could
> also declare the variables above as pointers to const.  With that fixed:
> 
> Reviewed-by: Francisco Jerez <curroje...@riseup.net>

I think you're right.  I assumed that the caller would have checked that
before this point, but it's not obvious that it does without a lot of
chasing.  So...we may as well do it.

I've changed it to:

      const struct gl_shader_program *sh_prog =
         ctx->_Shader->_CurrentFragmentProgram;
      const GLbitfield blend_support = !sh_prog ? 0 :
         sh_prog->_LinkedShaders[MESA_SHADER_FRAGMENT]->info.BlendSupport;
 
      if ((blend_support & ctx->Color._AdvancedBlendMode) == 0) {

Attachment: signature.asc
Description: This is a digitally signed message part.

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

Reply via email to