On 20 November 2012 21:40, Kenneth Graunke <span dir="ltr"><<a href="mailto:kenneth@whitecape.org" target="_blank">kenneth@whitecape.org</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Hey all,<br>
<br>
Here's a bunch of preliminary refactoring which should help me<br>
implement the Gen8 code generator.<br>
<br>
A bit of background: Gen8 uses a different instruction encoding than<br>
Gen4-7 (essentially, a lot of bits got moved around), which means that<br>
I can't use struct brw_instruction.  This basically also means that the<br>
brw_eu_emit.c is useless to me, including the brw_compile struct with<br>
the store of brw_instruction structs.<br>
<br>
This patch series splits fs_visitor into two parts:<br>
<br>
- fs_visitor translates GLSL or Mesa IR into FS IR, optimizes it, and<br>
  performs register allocation (it's still a giant monolith, sadly).<br>
<br>
  This contains the emit() functions.<br>
<br>
- fs_generator generates the final assembly code, in a hardware specific<br>
  format.  This is the part that deals with brw_instruction and brw_eu_emit.<br>
<br>
  This corresponds to the generate() layer and all the code that lives in<br>
  the (poorly named) brw_fs_emit.cpp file.  (We might want to rename that.)<br>
<br>
  It actually generates both the SIMD8 and SIMD16 assembly together, as they<br>
  need to be packed into a single program that can be uploaded to the GPU.<br>
<br>
  Assembly generation can never fail.  (The only failure mode was due to<br>
  unsupported opcodes, which is an internal driver bug, not a user error.)<br>
<br>
For Gen8, I intend to replace fs_generator with a new backend, but reuse<br>
the fs_visitor frontends.<br>
<br>
A big reason for this refactoring is that my first attempt at a Gen8 code<br>
generator managed to emit a mix of Gen4-7 and Gen8 instructions.  This is<br>
really easy to do, since brw_eu.h tends to get included all over the place,<br>
which gives you access to brw_instruction, emitter functions like brw_SAMPLE,<br>
and struct brw_compile, containing the instruction store.  I want to ensure<br>
that C++ code which mixes encodings won't compile.<br>
<br>
By moving the brw_compile structure (commonly referred to as "p") into<br>
fs_generator, I manage to isolate it into the part I'm replacing, which<br>
means my new code won't have access to it, and thus can't mix encodings.<br>
<br>
Thanks in advance for the feedback.<br>
<br>
--Ken<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</blockquote></div><br>I really like what you've done here, Ken.  It's nice to see fs_visitor start to get broken down into smaller, more reusable components.  I'm also very happy to see the use of private data members in the new fs_generator class.  It gives me extra confidence that there aren't any hidden dependencies between fs_visitor and fs_generator that would get in the way of Gen8 code generation.  The series is:<br>
<br>Reviewed-by: Paul Berry <<a href="mailto:stereotype441@gmail.com">stereotype441@gmail.com</a>><br><br>Looking forward to seeing the patch series you alluded to in patch 11/12 (making helper functions for generating instructions in both classes).<br>
</div>