i965: Make sure that backend_reg::type and brw_reg::type are consistent for fixed...
authorFrancisco Jerez <currojerez@riseup.net>
Wed, 19 Feb 2014 14:21:07 +0000 (15:21 +0100)
committerFrancisco Jerez <currojerez@riseup.net>
Wed, 19 Feb 2014 15:27:25 +0000 (16:27 +0100)
And define non-mutating helper functions to retype fixed and normal
regs with a common interface.  At some point we may want to get rid of
::fixed_hw_reg completely and have fixed regs use the normal register
data members (e.g. backend_reg::reg to select a fixed GRF number,
src_reg::swizzle to store the swizzle, etc.), I have the feeling that
this is not the last headache we're going to get because of the
multiple ways to represent the same thing and the different register
interface depending on the file a register is stored in...

Reviewed-by: Paul Berry <stereotype441@gmail.com>
src/mesa/drivers/dri/i965/brw_fs.h
src/mesa/drivers/dri/i965/brw_fs_generator.cpp
src/mesa/drivers/dri/i965/brw_vec4.cpp
src/mesa/drivers/dri/i965/brw_vec4.h
src/mesa/drivers/dri/i965/brw_vec4_generator.cpp

index ce5050bd41aac2848482e3c7a8ce51ae324e98e7..4845156d74b3f2a0ceb3612255be4998ee2cb291 100644 (file)
@@ -129,6 +129,13 @@ public:
    fs_reg *reladdr;
 };
 
+static inline fs_reg
+retype(fs_reg reg, unsigned type)
+{
+   reg.fixed_hw_reg.type = reg.type = type;
+   return reg;
+}
+
 static inline fs_reg
 offset(fs_reg reg, unsigned delta)
 {
index 82db1407e8110433ab36c42bf51dcb4bff137324..3f2060d86bb87454bc8f887af909c6beb813d2a1 100644 (file)
@@ -1053,6 +1053,7 @@ brw_reg_from_fs_reg(fs_reg *reg)
       }
       break;
    case HW_REG:
+      assert(reg->type == reg->fixed_hw_reg.type);
       brw_reg = reg->fixed_hw_reg;
       break;
    case BAD_FILE:
index 53fb9ee222d86c954be7418554cd824f97cf9362..fbf7fb9e78b9419302d77a34a77595b55af2c44b 100644 (file)
@@ -118,6 +118,7 @@ src_reg::src_reg(struct brw_reg reg)
 
    this->file = HW_REG;
    this->fixed_hw_reg = reg;
+   this->type = reg.type;
 }
 
 src_reg::src_reg(dst_reg reg)
@@ -188,6 +189,7 @@ dst_reg::dst_reg(struct brw_reg reg)
 
    this->file = HW_REG;
    this->fixed_hw_reg = reg;
+   this->type = reg.type;
 }
 
 dst_reg::dst_reg(src_reg reg)
index a592af2f128e32b6b35e4430aff19acdba2f19ed..9dc4f0162d16b0835383000f9f7b7474411461c8 100644 (file)
@@ -140,6 +140,13 @@ public:
    src_reg *reladdr;
 };
 
+static inline src_reg
+retype(src_reg reg, unsigned type)
+{
+   reg.fixed_hw_reg.type = reg.type = type;
+   return reg;
+}
+
 static inline src_reg
 offset(src_reg reg, unsigned delta)
 {
@@ -192,6 +199,13 @@ public:
    src_reg *reladdr;
 };
 
+static inline dst_reg
+retype(dst_reg reg, unsigned type)
+{
+   reg.fixed_hw_reg.type = reg.type = type;
+   return reg;
+}
+
 static inline dst_reg
 offset(dst_reg reg, unsigned delta)
 {
index 058b639309b591ac6c58a998c69c18b3fdee173a..e0c59bac3d72829b9b13af896cb967e6c8c17d74 100644 (file)
@@ -50,6 +50,7 @@ vec4_instruction::get_dst(void)
       break;
 
    case HW_REG:
+      assert(dst.type == dst.fixed_hw_reg.type);
       brw_reg = dst.fixed_hw_reg;
       break;
 
@@ -116,6 +117,7 @@ vec4_instruction::get_src(const struct brw_vec4_prog_data *prog_data, int i)
       break;
 
    case HW_REG:
+      assert(src[i].type == src[i].fixed_hw_reg.type);
       brw_reg = src[i].fixed_hw_reg;
       break;