nir: Add texture sources and intrinsics for bindless
authorJason Ekstrand <jason.ekstrand@intel.com>
Sun, 28 Oct 2018 12:52:44 +0000 (07:52 -0500)
committerJason Ekstrand <jason@jlekstrand.net>
Mon, 25 Mar 2019 21:12:09 +0000 (16:12 -0500)
On Intel, we have both bindless and bindful and we'd like to use them at
the same time if we can so we need to be able to distinguish at the NIR
level between the two.  This also fixes nir_lower_tex to properly handle
bindless in its tex_texture_size and get_texture_lod helpers.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
src/compiler/nir/nir.h
src/compiler/nir/nir_intrinsics.py
src/compiler/nir/nir_lower_tex.c
src/compiler/nir/nir_print.c

index 40c5dcfe4ac2672331e704c2dcf07c27412c907d..e53b501d95966dcb4c42f1b420494f174240d807 100644 (file)
@@ -1434,6 +1434,8 @@ typedef enum {
    nir_tex_src_sampler_deref, /* < deref pointing to the sampler */
    nir_tex_src_texture_offset, /* < dynamically uniform indirect offset */
    nir_tex_src_sampler_offset, /* < dynamically uniform indirect offset */
+   nir_tex_src_texture_handle, /* < bindless texture handle */
+   nir_tex_src_sampler_handle, /* < bindless sampler handle */
    nir_tex_src_plane,          /* < selects plane for planar textures */
    nir_num_tex_src_types
 } nir_tex_src_type;
index ea092a991ca4e9fd05f37d4160b8f514addd57aa..148628645d0588a2389e33de2a9f1839cff5d372 100644 (file)
@@ -306,12 +306,13 @@ atomic3("atomic_counter_comp_swap")
 
 # Image load, store and atomic intrinsics.
 #
-# All image intrinsics come in two versions.  One which take an image target
-# passed as a deref chain as the first source and one which takes an index or
-# handle as the first source.  In the first version, the image variable
-# contains the memory and layout qualifiers that influence the semantics of
-# the intrinsic.  In the second, the image format and access qualifiers are
-# provided as constant indices.
+# All image intrinsics come in three versions.  One which take an image target
+# passed as a deref chain as the first source, one which takes an index as the
+# first source, and one which takes a bindless handle as the first source.
+# In the first version, the image variable contains the memory and layout
+# qualifiers that influence the semantics of the intrinsic.  In the second and
+# third, the image format and access qualifiers are provided as constant
+# indices.
 #
 # All image intrinsics take a four-coordinate vector and a sample index as
 # 2nd and 3rd sources, determining the location within the image that will be
@@ -324,6 +325,8 @@ def image(name, src_comp=[], **kwargs):
     intrinsic("image_deref_" + name, src_comp=[1] + src_comp, **kwargs)
     intrinsic("image_" + name, src_comp=[1] + src_comp,
               indices=[IMAGE_DIM, IMAGE_ARRAY, FORMAT, ACCESS], **kwargs)
+    intrinsic("bindless_image_" + name, src_comp=[1] + src_comp,
+              indices=[IMAGE_DIM, IMAGE_ARRAY, FORMAT, ACCESS], **kwargs)
 
 image("load", src_comp=[4, 1], dest_comp=0, flags=[CAN_ELIMINATE])
 image("store", src_comp=[4, 1, 0])
index 05d5a40f72c32c479f3d4ea8cfc29f0a3c56e44b..eee1b3105d5e988fadef79618ce571a57c531ef9 100644 (file)
@@ -114,7 +114,9 @@ get_texture_size(nir_builder *b, nir_tex_instr *tex)
       if (tex->src[i].src_type == nir_tex_src_texture_deref ||
           tex->src[i].src_type == nir_tex_src_sampler_deref ||
           tex->src[i].src_type == nir_tex_src_texture_offset ||
-          tex->src[i].src_type == nir_tex_src_sampler_offset)
+          tex->src[i].src_type == nir_tex_src_sampler_offset ||
+          tex->src[i].src_type == nir_tex_src_texture_handle ||
+          tex->src[i].src_type == nir_tex_src_sampler_handle)
          num_srcs++;
    }
 
@@ -133,7 +135,9 @@ get_texture_size(nir_builder *b, nir_tex_instr *tex)
       if (tex->src[i].src_type == nir_tex_src_texture_deref ||
           tex->src[i].src_type == nir_tex_src_sampler_deref ||
           tex->src[i].src_type == nir_tex_src_texture_offset ||
-          tex->src[i].src_type == nir_tex_src_sampler_offset) {
+          tex->src[i].src_type == nir_tex_src_sampler_offset ||
+          tex->src[i].src_type == nir_tex_src_texture_handle ||
+          tex->src[i].src_type == nir_tex_src_sampler_handle) {
          nir_src_copy(&txs->src[idx].src, &tex->src[i].src, txs);
          txs->src[idx].src_type = tex->src[i].src_type;
          idx++;
@@ -163,7 +167,9 @@ get_texture_lod(nir_builder *b, nir_tex_instr *tex)
           tex->src[i].src_type == nir_tex_src_texture_deref ||
           tex->src[i].src_type == nir_tex_src_sampler_deref ||
           tex->src[i].src_type == nir_tex_src_texture_offset ||
-          tex->src[i].src_type == nir_tex_src_sampler_offset)
+          tex->src[i].src_type == nir_tex_src_sampler_offset ||
+          tex->src[i].src_type == nir_tex_src_texture_handle ||
+          tex->src[i].src_type == nir_tex_src_sampler_handle)
          num_srcs++;
    }
 
@@ -184,7 +190,9 @@ get_texture_lod(nir_builder *b, nir_tex_instr *tex)
           tex->src[i].src_type == nir_tex_src_texture_deref ||
           tex->src[i].src_type == nir_tex_src_sampler_deref ||
           tex->src[i].src_type == nir_tex_src_texture_offset ||
-          tex->src[i].src_type == nir_tex_src_sampler_offset) {
+          tex->src[i].src_type == nir_tex_src_sampler_offset ||
+          tex->src[i].src_type == nir_tex_src_texture_handle ||
+          tex->src[i].src_type == nir_tex_src_sampler_handle) {
          nir_src_copy(&tql->src[idx].src, &tex->src[i].src, tql);
          tql->src[idx].src_type = tex->src[i].src_type;
          idx++;
index 8e714e6666b97a18588f7bdaf010686b07a6d770..3172a3f23b9cef401495ca728c3988ae1117395a 100644 (file)
@@ -968,6 +968,12 @@ print_tex_instr(nir_tex_instr *instr, print_state *state)
       case nir_tex_src_sampler_offset:
          fprintf(fp, "(sampler_offset)");
          break;
+      case nir_tex_src_texture_handle:
+         fprintf(fp, "(texture_handle)");
+         break;
+      case nir_tex_src_sampler_handle:
+         fprintf(fp, "(sampler_handle)");
+         break;
       case nir_tex_src_plane:
          fprintf(fp, "(plane)");
          break;