[Mesa-dev] [PATCH] i965: Avoid dependency hints on math opcodes

Matt Turner mattst88 at gmail.com
Thu Feb 20 18:52:30 PST 2014


On Thu, Feb 20, 2014 at 4:55 PM, Mike Stroyan <mike at lunarg.com> wrote:
> Ian,
>
>   Here is a shader_test version.  It lacks the sparkling uncertainty of the
> pixel values in the previous animated example program.
> It just gets all vertices uniformly wrong when I run it.

Thanks for the test Mike. I reproduced it locally.

Comparing the vertex shader assembly before and after your patch, I
get the attached diff.

The good news is that it doesn't look like the math instructions'
dependency control flags are broken. The bad news is that our
dependency control optimization has a bug. :)

After three math exp instructions write to g8.{x,y,z}, we mov.sat
g8.xyz into g116.xyz which we use as a message register. The problem
is that we wrote a 1.0 into g116.w before the exp instructions, and
the dependency control optimization code recognized that the write to
g116.xyz would stall waiting for the write to g116.w and marked the
instructions with NoDDClr/NoDDChk. Unfortunately, marking the write to
g116.xyz with NoDDChk means that the instruction doesn't wait on the
writes to g8 to complete either!
-------------- next part --------------
--- pass	2014-02-20 18:45:43.227973145 -0800
+++ fail	2014-02-20 18:46:07.915975294 -0800
@@ -252,16 +252,16 @@
    (assign  (xyz) (var_ref R_1)  (swiz xyz (expression vec4 * (swiz xxxx (var_ref conditional_tmp) )(expression vec4 neg (var_ref R_1) ) ) )) 
 0x00000550: mul(8)          g7<1>.xyzF      g70<4,4,1>.xF   -g7<4,4,1>F     { align16 WE_normal 1Q };
    (assign  (w) (var_ref gl_FrontColor)  (constant float (1.000000)) ) 
-0x00000560: mov.sat(8)      g116<1>.wF      1F                              { align16 WE_normal 1Q };
+0x00000560: mov.sat(8)      g116<1>.wF      1F                              { align16 WE_normal NoDDClr 1Q };
    (assign  (x) (var_ref R_2)  (swiz x (expression vec4 exp2 (swiz xxxx (var_ref R_1) )) )) 
-0x00000570: math exp(8)     g8<1>.xF        g7<4,4,1>.xF    null            { align16 WE_normal 1Q };
+0x00000570: math exp(8)     g8<1>.xF        g7<4,4,1>.xF    null            { align16 WE_normal NoDDClr 1Q };
    (assign  (y) (var_ref R_2)  (swiz y (expression vec4 exp2 (expression vec4 + (swiz yyyy (var_ref R_1) )(constant float (0x1.5798eep-27)) ) ) )) 
 0x00000580: add(8)          g80<1>F         g7<4,4,1>.yF    1e-08F          { align16 WE_normal 1Q };
-0x00000590: math exp(8)     g8<1>.yF        g80<4,4,1>F     null            { align16 WE_normal 1Q };
+0x00000590: math exp(8)     g8<1>.yF        g80<4,4,1>F     null            { align16 WE_normal NoDDClr,NoDDChk 1Q };
    (assign  (z) (var_ref R_2)  (swiz z (expression vec4 exp2 (swiz zzzz (var_ref R_1) )) )) 
-0x000005a0: math exp(8)     g8<1>.zF        g7<4,4,1>.zF    null            { align16 WE_normal 1Q };
+0x000005a0: math exp(8)     g8<1>.zF        g7<4,4,1>.zF    null            { align16 WE_normal NoDDChk 1Q };
    (assign  (xyz) (var_ref gl_FrontColor)  (swiz xyz (var_ref R_2) )) 
-0x000005b0: mov.sat(8)      g116<1>.xyzF    g8<4,4,1>.xyzxF                 { align16 WE_normal 1Q };
+0x000005b0: mov.sat(8)      g116<1>.xyzF    g8<4,4,1>.xyzxF                 { align16 WE_normal NoDDChk 1Q };
    indices, point width, clip flags
 0x000005c0: mov(8)          g114<1>D        0D                              { align16 WE_normal 1Q };
    gl_Position
@@ -272,4 +272,7 @@
 0x00000600: send(8)         null            g113<4,4,1>F
                 urb 0 urb_write used complete mlen 5 rlen 0     { align16 WE_normal 1Q EOT };
 
-PIGLIT: {'result': 'pass' }
+Probe color at (1,1)
+  Expected: 0.000000 0.000000 0.000000
+  Observed: 0.000000 0.000000 1.000000
+PIGLIT: {'result': 'fail' }


More information about the mesa-dev mailing list