[Mesa-dev] [glsl] indvar in ir_loop

Liu Xin liuxin at icubecorp.com
Fri Oct 11 08:14:06 CEST 2013


Hi, Mesa developers,

According to glsl v1.0, we have loop construct:
for (for-init-statement; condition(opt); expression)
statement-no-new-scope

Variables declared in for-init-statement or condition are only in scope 
until the end of the
statement-no-new-scope of the for loop.

let's assume I have a fragment shader:

~/testbed$ cat indvar.frag
void main(void)
{
         vec4 a[32];
         for(int i=0; i<10; ++i) {
                 if (i == 9)
                     gl_FragColor = a[i];
        }
}


I found current glsl compiler emits HIR like this:

(function main
   (signature void
     (parameters
     )
     (
       (declare () int i at 0x988eb84)
       (declare () (array vec4 32) a at 0x988ec5c)
       (declare (temporary ) int assignment_tmp at 0x988eaac)
       (assign (constant bool (1)) (x) (var_ref 
assignment_tmp at 0x988eaac)  (constant int (0)) )
       (assign (constant bool (1)) (x) (var_ref i at 0x988eb84)  (var_ref 
assignment_tmp at 0x988eaac) )
       (loop () () () () (
         (if (expression bool ! (expression bool < (var_ref i at 0x988eb84) 
(constant int (10)) ) ) (
           break
         )
         ())

         (if (expression bool all_equal (var_ref i at 0x988eb84) (constant 
int (9)) ) (
           (declare (temporary ) vec4 assignment_tmp at 0x987cee4)
           (assign (constant bool (1)) (xyzw) (var_ref 
assignment_tmp at 0x987cee4)  (array_ref (var_ref a at 0x988ec5c) (var_ref 
i at 0x988eb84) ) )
           (assign (constant bool (1)) (xyzw) (var_ref 
gl_FragColor at 0x96d8fc4)  (var_ref assignment_tmp at 0x987cee4) )
         )
         ())

         (declare (temporary ) int assignment_tmp at 0x987cb84)
         (assign (constant bool (1)) (x) (var_ref 
assignment_tmp at 0x987cb84)  (expression int + (var_ref i at 0x988eb84) 
(constant int (1)) ) )
         (assign (constant bool (1)) (x) (var_ref i at 0x988eb84)  (var_ref 
assignment_tmp at 0x987cb84) )
       ))

     ))

)

I think glsl compiler translates AST like this

int i = 0;
for (;;) {
     if (i < 10) break;
     if (i == 9) gl_FragColor = a [ i ] ;
     i = i + 1;
}

Is it correct?

Another question, for class ir_loop, why is ir_loop::counter ir_variable 
while from/to/increment are all ir_rvalue? I create an ir_variable for 
ir_loop counter, but hierarchical visitor won't access it. I don't think 
ir_loop::accept(ir_hierarchical_visitor *v)  will visit ir_loop::counter 
at all.

thanks,
--lx

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20131011/b4cd2f84/attachment.html>


More information about the mesa-dev mailing list