[Mesa-dev] [PATCH 5/5] Change ir_function_signature::constant_expression_value to run through the function.

Eric Anholt eric at anholt.net
Mon Apr 30 11:45:50 PDT 2012


On Fri, 27 Apr 2012 10:28:04 +0200, Olivier Galibert <galibert at pobox.com> wrote:
> That removes code duplication with
> ir_expression::constant_expression_value and builtins/ir/*.

I'm concerned that this will turn things that shouldn't be constant
expressions in GLSL (some user-defined function just using its
(constant) arguments and constants) and treating them as constant
expressions.  Do we have tests for that?

>  src/glsl/ir_constant_expression.cpp |  450 +++++++----------------------------
>  1 file changed, 80 insertions(+), 370 deletions(-)
> 
> diff --git a/src/glsl/ir_constant_expression.cpp b/src/glsl/ir_constant_expression.cpp
> index ee1cc1a..a7aafaa 100644
> --- a/src/glsl/ir_constant_expression.cpp
> +++ b/src/glsl/ir_constant_expression.cpp
> @@ -1050,396 +1050,106 @@ ir_function_signature::constant_expression_value(exec_list *actual_parameters)
>     if (!this->is_builtin)
>        return NULL;
>  
> -   unsigned num_parameters = 0;
> +   /*
> +    * Of the builtin functions, only the texture lookups and the noise
> +    * ones must not be used in constant expressions.  They all include
> +    * specific opcodes so they don't need to be special-cased at this
> +    * point.
> +    */
> +
> +   /* Initialize the table of dereferencable names with the function
> +    * parameters.  Verify their const-ness on the way.
> +    *
> +    * We expect the correctness of the number of parameters to have
> +    * been checked earlier.
> +    */
> +   hash_table *deref_hash = hash_table_ctor(8, hash_table_string_hash,
> +					    hash_table_string_compare);

Our variables don't generally have unique names.  It looks like from
your usage, that you could use pointer_hash/compare and get cheaper
searches plus unique references to variables.

> +   const exec_node *parameter_info = parameters.head;
>  
> -   /* Check if all parameters are constant */
> -   ir_constant *op[3];
>     foreach_list(n, actual_parameters) {
> -      ir_constant *constant = ((ir_rvalue *) n)->constant_expression_value();
> +      ir_constant *constant = ((ir_rvalue *) n)->constant_expression_value(NULL);
>        if (constant == NULL)
>  	 return NULL;
>  
> -      op[num_parameters] = constant;
> +      ir_variable *var = (ir_variable *)parameter_info;
> +      hash_table_insert(deref_hash, constant, var->name);
>  
> -      assert(num_parameters < 3);
> -      num_parameters++;
> +      parameter_info = parameter_info->next;
>     }

Why drop the "check if all parameters are constant" code?  

From the GLSL 1.40 spec:

    "a built-in function call whose arguments are all constant
     expressions, with the exception of the texture lookup functions and
     the noise functions."

> +      case ir_type_assignment: {
> +	 ir_assignment *asg = inst->as_assignment();
> +	 if(asg->condition) {

"if ("

> +
> +	 /* (return (expression))
> +	  *
> +	  * End of the line, compute the result and exit.
> +	  */
> +      case ir_type_return:
> +	 result = inst->as_return()->value->constant_expression_value(deref_hash);
> +	 goto done;
> +
> +	 /* Every other expression type, we drop out.  Maybe some
> +	    builtins will need jumps someday, but not yet. */
> +      default:
> +	 goto done;

Does this patchset actually pass all of piglit?  I don't see ir_if
handling for the builtin function processing here, but I see ifs used in
atan(), for example.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20120430/fc66afab/attachment.pgp>


More information about the mesa-dev mailing list