diff options
author | Kenneth Graunke <[email protected]> | 2014-06-30 08:00:25 -0700 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2014-08-10 19:32:34 -0700 |
commit | 82ddd517afad7b133624e8dd32e90addfff27d1e (patch) | |
tree | 8a721a2f5dd4bcbf081dcbea7f093865a8b011bd /src/mesa/drivers/dri/i965/brw_eu.h | |
parent | a1c899c718758d68c112590d826e16c772ace195 (diff) |
i965/eu: Refactor jump distance scaling to use a helper function.
Different generations of hardware measure jump distances in different
units. Previously, every function that needed to set a jump target open
coded this scaling, or made a hardcoded assumption (i.e. just used 2).
Most functions start with the number of instructions to jump, and scale
up to the hardware-specific value. So, I made the function match that.
Others start with a byte offset, and divide by a constant (8) to obtain
the jump distance. This is actually 16 / 2 (the jump scale for Gen5-7).
v2: Make the helper a static inline defined in brw_eu.h, instead of
an actual function in brw_eu_emit.c (as suggested by Matt).
Signed-off-by: Kenneth Graunke <[email protected]>
Reviewed-by: Chris Forbes <[email protected]>
Reviewed-by: Matt Turner <[email protected]>
Diffstat (limited to 'src/mesa/drivers/dri/i965/brw_eu.h')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_eu.h | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_eu.h b/src/mesa/drivers/dri/i965/brw_eu.h index 7efc02816c9..3e03ab82cc0 100644 --- a/src/mesa/drivers/dri/i965/brw_eu.h +++ b/src/mesa/drivers/dri/i965/brw_eu.h @@ -316,6 +316,26 @@ void brw_shader_time_add(struct brw_compile *p, struct brw_reg payload, uint32_t surf_index); +/** + * Return the generation-specific jump distance scaling factor. + * + * Given the number of instructions to jump, we need to scale by + * some number to obtain the actual jump distance to program in an + * instruction. + */ +static inline unsigned +brw_jump_scale(const struct brw_context *brw) +{ + /* Ironlake and later measure jump targets in 64-bit data chunks (in order + * (to support compaction), so each 128-bit instruction requires 2 chunks. + */ + if (brw->gen >= 5) + return 2; + + /* Gen4 simply uses the number of 128-bit instructions. */ + return 1; +} + /* If/else/endif. Works by manipulating the execution flags on each * channel. */ |