This is a rather long series but I suspect it will be eventually squashed into fewer patches. The motivation for the work is to prepare for gen8 blorp support.
Currently the compiler for the blorp blit programs is written to emit EU-level instructions directly. This is not a big deal at the time being as blorp is supported only from gen6 onwards meaning that there are not that many hw-specific choices to be taken. But as one moves on to gen8 that will not be the case anymore. The plan is to lift the core of the blit compiler one level higher, i.e., to emit FS LIR which can be subsequently fed into gen-specific generator. This series aims to keep the generated EU-stream exactly the same as before. In order to increase the confidence that this is really the case I wrote a series of unit tests. I identified some 20 odd individual code blocks in the compiler that emit instructions for some special purpose. Then I started running piglit tests and hand-picked some dozen cases that together exercised each of the code blocks in question at least once. I dumped the key used to drive the compiler along with the original assembly in human readbale format. Then I simply placed each such pair as its own unit test case. I had to modify the existing assembly dumping infra a bit in order to have it in designated files instead of just stdout. Some care had to be taken to take the dump in correct phase - after jump instruction patching but before instruction stream compression. I suppose it could have been done after the compression as well but I thought safer to do it just after the generator phase instead. I also spent some time understanding how the execution size is controlled in the compiler (also referred to as compression control). I grouped instructions needing special care into their own subroutines which I'm hoping to explain better what is going on when one switches from direct control to higher level. Similar treatment was required for combining comparisons and for conditional assignments (predicate control). Message sending itself (texture fetch, render target write) is going to be different in gen8 but the message contents look to be more or less the same. Hence I chose to keep the message building in place and let the generators to handle only the issuing of the send command itself. Finally about the split in general. There is clearly the possibility of doing all the logic replacement in the compiler core itself instead of the split. However, that will need to be done more or less in one go and I thought that the split makes it clearer at least for initial review what sort of things are involved making it easier to discuss about the changes. I'll run tests on SNB also once I get my hands on one. Topi Pohjolainen (42): i965/fs: generate fs programs also without any 8-width instructions i965/fs: allow fs-generator use without gl_fragment_program i965: dump the disassembly to the given file i965/blorp: allow unit tests to compile and dump assembly i965/blorp: unit test compiling blend and scaled i965/blorp: unit test compiling msaa-8 ums to cms i965/blorp: unit test compiling msaa-8 cms to cms i965/blorp: unit test compiling msaa-4 ums to cms i965/blorp: unit test compiling msaa-8 cms alpha blend i965/blorp: unit test compiling unaligned msaa-8 i965/blorp: unit test compiling simple zero-src sampled i965/blorp: unit test compiling bilinear filtered i965/blorp: unit test compiling gen6 msaa-8 cms alpha blend i965/blorp: unit test compiling simple gen6 zero-src sampled i965/blorp: unit test compiling integer typed texture fetches i965/blorp: remove dependency to compression control state i965/blorp: reduce the scope of the explicit compression control i965/blorp: introduce separate eu-emitter for blit compiler i965/blorp: move emission of pixel kill into eu-emitter i965: rename tex_ms to tex_cms i965/fs: introduce non-compressed equivalent of tex_cms i965/blorp: move emission of texture lookup into eu-emitter i965/blorp: move emission of rt-write into eu-emitter i965/blorp: move emission of sample combining into eu-emitter i965/blorp: wrap emission of conditional assignment i965/blorp: wrap emission of if-equal-assignment i965/blorp: wrap LRP i965/blorp: wrap MOV (/brw_MOV(&func, /emit_mov(/) i965/blorp: wrap AND (/brw_AND(&func, /emit_and(/) i965/blorp: wrap ADD (/brw_ADD(&func, /emit_add(/) i965/blorp: wrap SHR (/brw_SHR(&func, /emit_shr(/) i965/blorp: wrap SHL (/brw_SHL(&func, /emit_shl(/) i965/blorp: wrap OR (/brw_OR(&func, /emit_or(/) i965/blorp: wrap MUL (/brw_MUL(&func, /emit_mul(/) i965/blorp: wrap FRC (/brw_FRC(&func, /emit_frc(/) i965/blorp: wrap RNDD (/brw_RNDD(&func, /emit_rndd(/) i965/blorp: wrap brw_IF/ELSE/ENDIF() into eu-emitter i965/fs: allow unit tests to dump the final patched assembly i965/fs: introduce blorp specific rt-write for fs_generator i965/fs: add support for BRW_OPCODE_AVG in fs_generator i965/eu: introduce blorp specific flavour of lrp i965/blorp: switch eu-emitter to use FS IR and fs_generator src/mesa/drivers/dri/i965/.gitignore | 1 + src/mesa/drivers/dri/i965/Makefile.am | 8 +- src/mesa/drivers/dri/i965/Makefile.sources | 1 + src/mesa/drivers/dri/i965/brw_blorp_blit.cpp | 535 ++++------ src/mesa/drivers/dri/i965/brw_blorp_blit_eu.cpp | 138 +++ src/mesa/drivers/dri/i965/brw_blorp_blit_eu.h | 190 ++++ src/mesa/drivers/dri/i965/brw_defines.h | 4 +- src/mesa/drivers/dri/i965/brw_eu.c | 20 +- src/mesa/drivers/dri/i965/brw_fs.cpp | 2 +- src/mesa/drivers/dri/i965/brw_fs.h | 10 +- src/mesa/drivers/dri/i965/brw_fs_generator.cpp | 67 +- src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 4 +- src/mesa/drivers/dri/i965/brw_shader.cpp | 11 +- src/mesa/drivers/dri/i965/brw_vec4.cpp | 2 +- src/mesa/drivers/dri/i965/brw_vec4_generator.cpp | 4 +- src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 2 +- .../drivers/dri/i965/test_blorp_blit_eu_gen.cpp | 1092 ++++++++++++++++++++ 17 files changed, 1738 insertions(+), 353 deletions(-) create mode 100644 src/mesa/drivers/dri/i965/brw_blorp_blit_eu.cpp create mode 100644 src/mesa/drivers/dri/i965/brw_blorp_blit_eu.h create mode 100644 src/mesa/drivers/dri/i965/test_blorp_blit_eu_gen.cpp -- 1.8.3.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev