intel/fs: Emit HALT for discard on Gen4-5
authorJason Ekstrand <jason@jlekstrand.net>
Sat, 25 Apr 2020 19:59:30 +0000 (14:59 -0500)
committerMarge Bot <eric+marge@anholt.net>
Sat, 30 May 2020 06:21:15 +0000 (06:21 +0000)
commitc48f42e178a1cc484870367c0cfe5fbbf71d86cc
tree306f90e708bf4adafddb2c0b23e0ab325dcc87ad
parent94aa7997e45b5314d169bbee5bf22ad368c2fd25
intel/fs: Emit HALT for discard on Gen4-5

Using HALT to immediately jump to the end of the shader is required to
implement GL_EXT_gpu_shader4 and OpenGL 3.0.  However, vanilla OpenGL
1.2 doesn't forbid it and it likely makes something somewhere faster.
We should be consistent and implement the same discard behavior on all
hardware if we can.

The rules for HALT on Gen4-5 are a bit different from Gen6+.  On the
older hardware, there is no stack for HALT; instead it's up to software
to save and restore mask registers.  However, there's no real saving
needed since we only use HALT to jump to the end of the program where
we're about about to do our FB writes.  All we need to do is reset AMask
to DMask, the value it was initialized to at the start of the thread.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5244>
src/intel/compiler/brw_disasm.c
src/intel/compiler/brw_eu.h
src/intel/compiler/brw_eu_emit.c
src/intel/compiler/brw_fs_generator.cpp
src/intel/compiler/brw_fs_nir.cpp
src/intel/compiler/brw_reg.h