intel/compiler: on MTL, DF instructions run in the math pipe
authorPaulo Zanoni <paulo.r.zanoni@intel.com>
Fri, 1 Apr 2022 22:06:36 +0000 (15:06 -0700)
committerMarge Bot <emma+marge@anholt.net>
Sat, 10 Dec 2022 03:59:19 +0000 (03:59 +0000)
Adjust the scoreboard code to take that into account.

Fixes at least:
  - dEQP-VK.glsl.builtin.precision_double.refract.compute.vec3
  - dEQP-VK.glsl.builtin.precision_double.matrixcompmult.compute.mat4

v2: use intel_device_info_is_mtl()  (Curro, Jordan)

Reviewed-by: Francisco Jerez <currojerez@riseup.net>
Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20072>

src/intel/compiler/brw_fs_scoreboard.cpp
src/intel/compiler/brw_ir_fs.h

index 34c2f53..f4e9915 100644 (file)
@@ -1003,6 +1003,11 @@ namespace {
       const ordered_address jp = p ? ordered_address(p, jps[ip].jp[IDX(p)]) :
                                      ordered_address();
       const bool is_ordered = ordered_unit(devinfo, inst, IDX(TGL_PIPE_ALL));
+      const bool uses_math_pipe =
+         inst->is_math() ||
+         (intel_device_info_is_mtl(devinfo) &&
+          (get_exec_type(inst) == BRW_REGISTER_TYPE_DF ||
+           inst->dst.type == BRW_REGISTER_TYPE_DF));
 
       /* Track any source registers that may be fetched asynchronously by this
        * instruction, otherwise clear the dependency in order to avoid
@@ -1011,7 +1016,7 @@ namespace {
       for (unsigned i = 0; i < inst->sources; i++) {
          const dependency rd_dep =
             (inst->is_payload(i) ||
-             inst->is_math()) ? dependency(TGL_SBID_SRC, ip, exec_all) :
+             uses_math_pipe) ? dependency(TGL_SBID_SRC, ip, exec_all) :
             is_ordered ? dependency(TGL_REGDIST_SRC, jp, exec_all) :
             dependency::done;
 
index 525e591..d6d6d3e 100644 (file)
@@ -548,7 +548,10 @@ is_send(const fs_inst *inst)
 static inline bool
 is_unordered(const intel_device_info *devinfo, const fs_inst *inst)
 {
-   return is_send(inst) || inst->is_math();
+   return is_send(inst) || inst->is_math() ||
+          (intel_device_info_is_mtl(devinfo) &&
+           (get_exec_type(inst) == BRW_REGISTER_TYPE_DF ||
+            inst->dst.type == BRW_REGISTER_TYPE_DF));
 }
 
 /**