<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, Oct 13, 2014 at 5:12 PM, Kenneth Graunke <span dir="ltr"><<a href="mailto:kenneth@whitecape.org" target="_blank">kenneth@whitecape.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">fs_visitor::grf_used is used to calculate prog_data->reg_blocks_16,<br>
which was getting populated with an uninitialized value.  Normally,<br>
grf_used is set by the register allocator, but emit_repclear_shader<br>
bypasses that; it must set grf_used directly.<br>
<br>
This bug was well hidden: reg_blocks and reg_blocks_16 are unused on<br>
Gen6+.  However, when uploading programs, we look for an existing entry<br>
in the cache.  If we find a potential hit, we memcmp the two prog_data<br>
structures, including the uninitialized reg_blocks_16 field.  Of course,<br>
this only happens if we upload the repclear shader twice - which only<br>
happens if the precompile guesses the program key incorrectly.<br>
<br>
On Gen6+, precompile guesses the program key for the repclear shader<br>
correctly, so this bug ought to remain untriggered.  However, on Gen5,<br>
we make more mistakes when guessing the key, which is how I spotted the<br>
bug.  It is reproducible on Haswell by making precompile choose daft<br>
values for fields.<br>
<br>
Cc: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>><br>
Signed-off-by: Kenneth Graunke <<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</a>><br>
---<br>
 src/mesa/drivers/dri/i965/brw_fs.cpp | 2 ++<br>
 1 file changed, 2 insertions(+)<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp<br>
index 8d470f2..8d9e63f 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp<br>
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp<br>
@@ -2614,6 +2614,8 @@ fs_visitor::emit_repclear_shader()<br>
<br>
    calculate_cfg();<br>
<br>
+   grf_used = 0;<br>
+<br></blockquote><div><br></div><div>I'm not sure 0 is actually the value we want.  It usually uses at least a couple of grfs because it uses a uniform.<br></div><div>--Jason<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
    assign_constant_locations();<br>
    assign_curb_setup();<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
2.1.2<br>
<br>
</font></span></blockquote></div><br></div></div>