[Mesa-dev] [Mesa-stable] [PATCH] glsl: Allow implicit int -> uint conversions for bitwise operators (&, ^, |).

Ian Romanick idr at freedesktop.org
Fri Jan 15 07:49:19 PST 2016


On 01/14/2016 11:27 PM, Kenneth Graunke wrote:
> The ARB has decided that implicit conversions should be performed for
> bitwise operators in future language revisions.  Implementations of
> current language revisions may or may not perform them.
> 
> This patch makes Mesa apply implicti conversions even on current
                              implicit

> language versions.  Applications appear to expect this behavior,
> and there's really no downside to doing so.
> 
> Fixes shader compilation in Shadow of Mordor.
> 
> Bugzilla: https://www.khronos.org/bugzilla/show_bug.cgi?id=1405
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> Cc: mesa-stable at lists.freedesktop.org

Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>

> ---
>  src/glsl/ast_to_hir.cpp | 46 ++++++++++++++++++++++++++++++++++++++--------
>  1 file changed, 38 insertions(+), 8 deletions(-)
> 
> The bug hasn't been updated yet, but I heard about the decision, so
> here's the patch.
> 
> diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
> index 13696a3..0f51c54 100644
> --- a/src/glsl/ast_to_hir.cpp
> +++ b/src/glsl/ast_to_hir.cpp
> @@ -487,15 +487,17 @@ unary_arithmetic_result_type(const struct glsl_type *type,
>   * If the given types to the bit-logic operator are invalid, return
>   * glsl_type::error_type.
>   *
> - * \param type_a Type of LHS of bit-logic op
> - * \param type_b Type of RHS of bit-logic op
> + * \param value_a LHS of bit-logic op
> + * \param value_b RHS of bit-logic op
>   */
>  static const struct glsl_type *
> -bit_logic_result_type(const struct glsl_type *type_a,
> -                      const struct glsl_type *type_b,
> +bit_logic_result_type(ir_rvalue * &value_a, ir_rvalue * &value_b,
>                        ast_operators op,
>                        struct _mesa_glsl_parse_state *state, YYLTYPE *loc)
>  {
> +   const glsl_type *type_a = value_a->type;
> +   const glsl_type *type_b = value_b->type;
> +
>     if (!state->check_bitwise_operations_allowed(loc)) {
>        return glsl_type::error_type;
>     }
> @@ -517,6 +519,36 @@ bit_logic_result_type(const struct glsl_type *type_a,
>        return glsl_type::error_type;
>     }
>  
> +   /* Prior to GLSL 4.0 / GL_ARB_gpu_shader5, implicit conversions didn't
> +    * make sense for bitwise operations, as they don't operate on floats.
> +    *
> +    * GLSL 4.0 added implicit int -> uint conversions, which are relevant
> +    * here.  It wasn't clear whether or not we should apply them to bitwise
> +    * operations.  However, Khronos has decided that they should in future
> +    * language revisions.  Applications also rely on this behavior.  We opt
> +    * to apply them in general, but issue a portability warning.
> +    *
> +    * See https://www.khronos.org/bugzilla/show_bug.cgi?id=1405
> +    */
> +   if (type_a->base_type != type_b->base_type) {
> +      if (!apply_implicit_conversion(type_a, value_b, state)
> +          && !apply_implicit_conversion(type_b, value_a, state)) {
> +         _mesa_glsl_error(loc, state,
> +                          "could not implicitly convert operands to "
> +                          "`%s` operator",
> +                          ast_expression::operator_string(op));
> +         return glsl_type::error_type;
> +      } else {
> +         _mesa_glsl_warning(loc, state,
> +                            "some implementations may not support implicit "
> +                            "int -> uint conversions for `%s' operators; "
> +                            "consider casting explicitly for portability",
> +                            ast_expression::operator_string(op));
> +      }
> +      type_a = value_a->type;
> +      type_b = value_b->type;
> +   }
> +
>     /*     "The fundamental types of the operands (signed or unsigned) must
>      *     match,"
>      */
> @@ -1434,8 +1466,7 @@ ast_expression::do_hir(exec_list *instructions,
>     case ast_bit_or:
>        op[0] = this->subexpressions[0]->hir(instructions, state);
>        op[1] = this->subexpressions[1]->hir(instructions, state);
> -      type = bit_logic_result_type(op[0]->type, op[1]->type, this->oper,
> -                                   state, &loc);
> +      type = bit_logic_result_type(op[0], op[1], this->oper, state, &loc);
>        result = new(ctx) ir_expression(operations[this->oper], type,
>                                        op[0], op[1]);
>        error_emitted = op[0]->type->is_error() || op[1]->type->is_error();
> @@ -1625,8 +1656,7 @@ ast_expression::do_hir(exec_list *instructions,
>     case ast_or_assign: {
>        op[0] = this->subexpressions[0]->hir(instructions, state);
>        op[1] = this->subexpressions[1]->hir(instructions, state);
> -      type = bit_logic_result_type(op[0]->type, op[1]->type, this->oper,
> -                                   state, &loc);
> +      type = bit_logic_result_type(op[0], op[1], this->oper, state, &loc);
>        ir_rvalue *temp_rhs = new(ctx) ir_expression(operations[this->oper],
>                                                     type, op[0], op[1]);
>        error_emitted =
> 



More information about the mesa-dev mailing list