i965/vec4: implement HW workaround for align16 double to float conversion
authorIago Toral Quiroga <itoral@igalia.com>
Wed, 29 Jun 2016 11:08:25 +0000 (13:08 +0200)
committerSamuel Iglesias Gonsálvez <siglesias@igalia.com>
Tue, 3 Jan 2017 10:26:50 +0000 (11:26 +0100)
From the BDW PRM, Workarounds chapter:

   "DF->f format conversion for Align16 has wrong emask calculation when
    source is immediate."

Notice that Broadwell and later are strictly scalar at the moment though, so
this is not really necessary.

v2: Instead of moving the immediate to a vgrf and converting from there, just
    convert the double immediate to float in the compiler and move the result
    to the destination (Matt)

Reviewed-by: Matt Turner <mattst88@gmail.com>
src/mesa/drivers/dri/i965/brw_vec4_nir.cpp

index 4aeb8cb48d3a4e434664c71c6b74803d9952a40e..e31c8c2772ed9653a7728b46416bdd617d97f071 100644 (file)
@@ -1071,6 +1071,17 @@ vec4_visitor::emit_conversion_from_double(dst_reg dst, src_reg src,
                                           bool saturate,
                                           brw_reg_type single_type)
 {
+   /* BDW PRM vol 15 - workarounds:
+    * DF->f format conversion for Align16 has wrong emask calculation when
+    * source is immediate.
+    */
+   if (devinfo->gen == 8 && single_type == BRW_REGISTER_TYPE_F &&
+       src.file == BRW_IMMEDIATE_VALUE) {
+      vec4_instruction *inst = emit(MOV(dst, brw_imm_f(src.df)));
+      inst->saturate = saturate;
+      return;
+   }
+
    dst_reg temp = dst_reg(this, glsl_type::dvec4_type);
    emit(MOV(temp, src));