Mesa (main): spirv: Use texture types for sampled images

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Oct 16 06:15:09 UTC 2021


Module: Mesa
Branch: main
Commit: 5818d47ae661bfc7121a2e6c80d4e5870cf5fe8c
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=5818d47ae661bfc7121a2e6c80d4e5870cf5fe8c

Author: Jason Ekstrand <jason at jlekstrand.net>
Date:   Fri Oct 15 14:15:52 2021 -0500

spirv: Use texture types for sampled images

Instead of using gsamplerND types for sampled images, use the new
gtextureND types for sampled images and reserve gsamplerND for combined
image+samplers.  Combined image+sampler bindings still get a gsamplerND
type.

Reviewed-by: Jesse Natalie <jenatali at microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13389>

---

 src/compiler/nir/nir_lower_readonly_images_to_tex.c | 14 +++++++-------
 src/compiler/spirv/spirv_to_nir.c                   |  9 +++++----
 2 files changed, 12 insertions(+), 11 deletions(-)

diff --git a/src/compiler/nir/nir_lower_readonly_images_to_tex.c b/src/compiler/nir/nir_lower_readonly_images_to_tex.c
index 60b0a3451a8..25ecc707939 100644
--- a/src/compiler/nir/nir_lower_readonly_images_to_tex.c
+++ b/src/compiler/nir/nir_lower_readonly_images_to_tex.c
@@ -25,16 +25,16 @@
 #include "nir_builder.h"
 
 static const struct glsl_type *
-get_sampler_type_for_image(const struct glsl_type *type)
+get_texture_type_for_image(const struct glsl_type *type)
 {
    if (glsl_type_is_array(type)) {
       const struct glsl_type *elem_type =
-         get_sampler_type_for_image(glsl_get_array_element(type));
+         get_texture_type_for_image(glsl_get_array_element(type));
       return glsl_array_type(elem_type, glsl_get_length(type), 0 /*explicit size*/);
    }
 
    assert((glsl_type_is_image(type)));
-   return glsl_sampler_type(glsl_get_sampler_dim(type), false,
+   return glsl_texture_type(glsl_get_sampler_dim(type),
                             glsl_sampler_type_is_array(type),
                             glsl_get_sampler_result_type(type));
 }
@@ -45,15 +45,15 @@ replace_image_type_with_sampler(nir_deref_instr *deref)
    const struct glsl_type *type = deref->type;
 
    /* If we've already chased up the deref chain this far from a different intrinsic, we're done */
-   if (glsl_type_is_sampler(glsl_without_array(type)))
+   if (glsl_type_is_texture(glsl_without_array(type)))
       return;
 
-   deref->type = get_sampler_type_for_image(type);
+   deref->type = get_texture_type_for_image(type);
    deref->modes = nir_var_uniform;
    if (deref->deref_type == nir_deref_type_var) {
       type = deref->var->type;
-      if (!glsl_type_is_sampler(glsl_without_array(type))) {
-         deref->var->type = get_sampler_type_for_image(type);
+      if (!glsl_type_is_texture(glsl_without_array(type))) {
+         deref->var->type = get_texture_type_for_image(type);
          deref->var->data.mode = nir_var_uniform;
          memset(&deref->var->data.sampler, 0, sizeof(deref->var->data.sampler));
       }
diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c
index e685704c017..99be91e4d2b 100644
--- a/src/compiler/spirv/spirv_to_nir.c
+++ b/src/compiler/spirv/spirv_to_nir.c
@@ -950,14 +950,15 @@ vtn_type_get_nir_type(struct vtn_builder *b, struct vtn_type *type,
       }
 
       case vtn_base_type_image:
-         vtn_assert(glsl_type_is_sampler(type->glsl_image));
+         vtn_assert(glsl_type_is_texture(type->glsl_image));
          return type->glsl_image;
 
       case vtn_base_type_sampler:
          return glsl_bare_sampler_type();
 
       case vtn_base_type_sampled_image:
-         return type->image->glsl_image;
+         return glsl_texture_type_to_sampler(type->image->glsl_image,
+                                             false /* is_shadow */);
 
       default:
          return type->type;
@@ -1744,7 +1745,7 @@ vtn_handle_type(struct vtn_builder *b, SpvOp opcode,
       enum glsl_base_type sampled_base_type =
          glsl_get_base_type(sampled_type->type);
       if (sampled == 1) {
-         val->type->glsl_image = glsl_sampler_type(dim, false, is_array,
+         val->type->glsl_image = glsl_texture_type(dim, is_array,
                                                    sampled_base_type);
       } else if (sampled == 2) {
          val->type->glsl_image = glsl_image_type(dim, is_array,
@@ -5651,7 +5652,7 @@ vtn_handle_body_instruction(struct vtn_builder *b, SpvOp opcode,
       if (glsl_type_is_image(image_type->glsl_image)) {
          vtn_handle_image(b, opcode, w, count);
       } else {
-         vtn_assert(glsl_type_is_sampler(image_type->glsl_image));
+         vtn_assert(glsl_type_is_texture(image_type->glsl_image));
          vtn_handle_texture(b, opcode, w, count);
       }
       break;



More information about the mesa-commit mailing list