[Mesa-dev] [PATCH v3 24/43] i965/fs: Use byte scattered read

Jose Maria Casanova Crespo jmcasanova at igalia.com
Thu Oct 12 18:38:13 UTC 2017


Added on do_untyped_vector_read, that is used on the following
intrinsics:
   * nir_intrinsic_load_shared
   * nir_intrinsic_load_ubo
   * nir_intrinsic_load_ssbo

v2: Removed use of stride = 2 on 16-bit sources (Jason Ekstrand)
---
 src/intel/compiler/brw_fs_nir.cpp | 24 ++++++++++++++++++++----
 1 file changed, 20 insertions(+), 4 deletions(-)

diff --git a/src/intel/compiler/brw_fs_nir.cpp b/src/intel/compiler/brw_fs_nir.cpp
index 13c16fc912..d2f2e17b70 100644
--- a/src/intel/compiler/brw_fs_nir.cpp
+++ b/src/intel/compiler/brw_fs_nir.cpp
@@ -2268,6 +2268,18 @@ do_untyped_vector_read(const fs_builder &bld,
 
          bld.ADD(read_offset, read_offset, brw_imm_ud(16));
       }
+   } else if (type_sz(dest.type) == 2) {
+      for (unsigned i = 0; i < num_components; i++) {
+         fs_reg base_offset = bld.vgrf(BRW_REGISTER_TYPE_UD);
+         bld.ADD(base_offset,
+                 offset_reg,
+                 brw_imm_ud(i * type_sz(dest.type)));
+         fs_reg read_reg = emit_byte_scattered_read(bld, surf_index, base_offset,
+                                                    1 /* dims */,
+                                                    1,
+                                                    BRW_PREDICATE_NONE);
+         bld.MOV(offset(dest,bld,i), subscript(read_reg, dest.type, 0));
+      }
    } else {
       unreachable("Unsupported type");
    }
@@ -3911,10 +3923,14 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr
       if (const_offset == NULL) {
          fs_reg base_offset = retype(get_nir_src(instr->src[1]),
                                      BRW_REGISTER_TYPE_UD);
-
-         for (int i = 0; i < instr->num_components; i++)
-            VARYING_PULL_CONSTANT_LOAD(bld, offset(dest, bld, i), surf_index,
-                                       base_offset, i * type_sz(dest.type));
+         if (type_sz(dest.type) == 2) {
+            do_untyped_vector_read(bld, dest, surf_index, base_offset,
+                                   instr->num_components);
+         } else {
+            for (int i = 0; i < instr->num_components; i++)
+               VARYING_PULL_CONSTANT_LOAD(bld, offset(dest, bld, i), surf_index,
+                                          base_offset, i * type_sz(dest.type));
+         }
       } else {
          /* Even if we are loading doubles, a pull constant load will load
           * a 32-bit vec4, so should only reserve vgrf space for that. If we
-- 
2.13.6



More information about the mesa-dev mailing list