diff options
author | Iago Toral Quiroga <[email protected]> | 2015-11-18 12:09:30 +0100 |
---|---|---|
committer | Samuel Iglesias Gonsálvez <[email protected]> | 2016-05-10 11:25:03 +0200 |
commit | 830d87840c447f0938765b2e0b18d202803c1436 (patch) | |
tree | 8081577911e247c932dcbee155ceddbbbb911eb4 | |
parent | 7bcc4cccad08043dbe116406ec76d629a1a11e98 (diff) |
i965: fix brw_saturate_immediate() for doubles
v2 (Sam):
- Mark 'size' as const (Topi).
- Add comment to explain that we do copies 64-bits regardless of the
type (Topi)
Reviewed-by: Kenneth Graunke <[email protected]>
Reviewed-by: Jordan Justen <[email protected]>
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_shader.cpp | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_shader.cpp b/src/mesa/drivers/dri/i965/brw_shader.cpp index b3c6c58f924..759a6c25764 100644 --- a/src/mesa/drivers/dri/i965/brw_shader.cpp +++ b/src/mesa/drivers/dri/i965/brw_shader.cpp @@ -476,7 +476,19 @@ brw_saturate_immediate(enum brw_reg_type type, struct brw_reg *reg) unsigned ud; int d; float f; - } imm = { reg->ud }, sat_imm = { 0 }; + double df; + } imm, sat_imm = { 0 }; + + const unsigned size = type_sz(type); + + /* We want to either do a 32-bit or 64-bit data copy, the type is otherwise + * irrelevant, so just check the size of the type and copy from/to an + * appropriately sized field. + */ + if (size < 8) + imm.ud = reg->ud; + else + imm.df = reg->df; switch (type) { case BRW_REGISTER_TYPE_UD: @@ -490,6 +502,9 @@ brw_saturate_immediate(enum brw_reg_type type, struct brw_reg *reg) case BRW_REGISTER_TYPE_F: sat_imm.f = CLAMP(imm.f, 0.0f, 1.0f); break; + case BRW_REGISTER_TYPE_DF: + sat_imm.df = CLAMP(imm.df, 0.0, 1.0); + break; case BRW_REGISTER_TYPE_UB: case BRW_REGISTER_TYPE_B: unreachable("no UB/B immediates"); @@ -497,14 +512,20 @@ brw_saturate_immediate(enum brw_reg_type type, struct brw_reg *reg) case BRW_REGISTER_TYPE_UV: case BRW_REGISTER_TYPE_VF: unreachable("unimplemented: saturate vector immediate"); - case BRW_REGISTER_TYPE_DF: case BRW_REGISTER_TYPE_HF: - unreachable("unimplemented: saturate DF/HF immediate"); + unreachable("unimplemented: saturate HF immediate"); } - if (imm.ud != sat_imm.ud) { - reg->ud = sat_imm.ud; - return true; + if (size < 8) { + if (imm.ud != sat_imm.ud) { + reg->ud = sat_imm.ud; + return true; + } + } else { + if (imm.df != sat_imm.df) { + reg->df = sat_imm.df; + return true; + } } return false; } |