[Mesa-dev] [RFC PATCH 22/26] glsl: add ARB_bindless_texture conversions

Samuel Pitoiset samuel.pitoiset at gmail.com
Tue Apr 11 16:48:33 UTC 2017


The ARB_bindless_texture spec says:

   "Modify Section 5.4.1, Conversion and Scalar Constructors, p. 60"

    (add the following constructors:)

      // In the following four constructors, the low 32 bits of the sampler
      // type correspond to the .x component of the uvec2 and the high 32 bits
      // correspond to the .y component.
      uvec2(any sampler type)     // Converts a sampler type to a
                                  //   pair of 32-bit unsigned integers
      any sampler type(uvec2)     // Converts a pair of 32-bit unsigned integers to
                                  //   a sampler type
      uvec2(any image type)       // Converts an image type to a
                                  //   pair of 32-bit unsigned integers
      any image type(uvec2)       // Converts a pair of 32-bit unsigned integers to
                                  //   an image type

Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
---
 src/compiler/glsl/ast_function.cpp | 95 ++++++++++++++++++++++++++++++++------
 1 file changed, 82 insertions(+), 13 deletions(-)

diff --git a/src/compiler/glsl/ast_function.cpp b/src/compiler/glsl/ast_function.cpp
index 95ec2db173..8485503e3d 100644
--- a/src/compiler/glsl/ast_function.cpp
+++ b/src/compiler/glsl/ast_function.cpp
@@ -30,7 +30,8 @@
 #include "builtin_functions.h"
 
 static ir_rvalue *
-convert_component(ir_rvalue *src, const glsl_type *desired_type);
+convert_component(ir_rvalue *src, const glsl_type *desired_type,
+                  const glsl_type *ctor_type);
 
 static unsigned
 process_parameters(exec_list *instructions, exec_list *actual_parameters,
@@ -405,7 +406,7 @@ fix_parameter(void *mem_ctx, ir_rvalue *actual, const glsl_type *formal_type,
     */
    ir_rvalue *rhs = new(mem_ctx) ir_dereference_variable(tmp);
    if (actual->type != formal_type)
-      rhs = convert_component(rhs, actual->type);
+      rhs = convert_component(rhs, actual->type, NULL);
 
    ir_rvalue *lhs = actual;
    if (expr != NULL && expr->operation == ir_binop_vector_extract) {
@@ -452,7 +453,7 @@ generate_call(exec_list *instructions, ir_function_signature *sig,
          case ir_var_const_in:
          case ir_var_function_in: {
             ir_rvalue *converted
-               = convert_component(actual, formal->type);
+               = convert_component(actual, formal->type, NULL);
             actual->replace_with(converted);
             break;
          }
@@ -728,7 +729,8 @@ no_matching_function_error(const char *name,
  * section (GLSL 1.10 section 5.4.1), not the "Implicit Conversions" rules.
  */
 static ir_rvalue *
-convert_component(ir_rvalue *src, const glsl_type *desired_type)
+convert_component(ir_rvalue *src, const glsl_type *desired_type,
+                  const glsl_type *ctor_type)
 {
    void *ctx = ralloc_parent(src);
    const unsigned a = desired_type->base_type;
@@ -738,8 +740,8 @@ convert_component(ir_rvalue *src, const glsl_type *desired_type)
    if (src->type->is_error())
       return src;
 
-   assert(a <= GLSL_TYPE_BOOL);
-   assert(b <= GLSL_TYPE_BOOL);
+   assert(a <= GLSL_TYPE_BINDLESS_IMAGE);
+   assert(b <= GLSL_TYPE_BINDLESS_IMAGE);
 
    if (a == b)
       return src;
@@ -767,6 +769,12 @@ convert_component(ir_rvalue *src, const glsl_type *desired_type)
       case GLSL_TYPE_INT64:
          result = new(ctx) ir_expression(ir_unop_i642u, src);
          break;
+      case GLSL_TYPE_BINDLESS_SAMPLER:
+         result = new(ctx) ir_expression(ir_unop_unpack_sampler_2x32, src);
+         break;
+      case GLSL_TYPE_BINDLESS_IMAGE:
+         result = new(ctx) ir_expression(ir_unop_unpack_image_2x32, src);
+         break;
       }
       break;
    case GLSL_TYPE_INT:
@@ -909,6 +917,35 @@ convert_component(ir_rvalue *src, const glsl_type *desired_type)
          break;
       }
       break;
+   case GLSL_TYPE_BINDLESS_SAMPLER:
+      switch (b) {
+      case GLSL_TYPE_UINT:
+         result = new(ctx) ir_expression(ir_unop_pack_sampler_2x32, src);
+
+         assert(ctor_type);
+         result->type = glsl_type::get_sampler_instance(
+            (glsl_sampler_dim)ctor_type->sampler_dimensionality,
+            ctor_type->sampler_shadow,
+            ctor_type->sampler_array,
+            (glsl_base_type)ctor_type->sampled_type,
+            true);
+         break;
+      }
+      break;
+   case GLSL_TYPE_BINDLESS_IMAGE:
+      switch (b) {
+      case GLSL_TYPE_UINT:
+         result = new(ctx) ir_expression(ir_unop_pack_image_2x32, src);
+
+         assert(ctor_type);
+         result->type = glsl_type::get_image_instance(
+            (glsl_sampler_dim)ctor_type->sampler_dimensionality,
+            ctor_type->sampler_array,
+            (glsl_base_type)ctor_type->sampled_type,
+            true);
+         break;
+      }
+      break;
    }
 
    assert(result != NULL);
@@ -957,7 +994,7 @@ implicitly_convert_component(ir_rvalue * &from, const glsl_base_type to,
           * to use it here because we already checked that the implicit
           * conversion is legal.
           */
-         result = convert_component(from, desired_type);
+         result = convert_component(from, desired_type, NULL);
       }
    }
 
@@ -2036,7 +2073,9 @@ ast_function_expression::hir(exec_list *instructions,
             return ir_rvalue::error_value(ctx);
          }
 
-         if (!result->type->is_numeric() && !result->type->is_boolean()) {
+         if (!result->type->is_numeric() && !result->type->is_boolean() &&
+             !result->type->is_bindless_sampler() &&
+             !result->type->is_bindless_image()) {
             _mesa_glsl_error(& loc, state, "cannot construct `%s' from a "
                              "non-numeric data type",
                              constructor_type->name);
@@ -2128,11 +2167,41 @@ ast_function_expression::hir(exec_list *instructions,
 
       /* Type cast each parameter and, if possible, fold constants.*/
       foreach_in_list_safe(ir_rvalue, ir, &actual_parameters) {
-         const glsl_type *desired_type =
-            glsl_type::get_instance(constructor_type->base_type,
-                                    ir->type->vector_elements,
-                                    ir->type->matrix_columns);
-         ir_rvalue *result = convert_component(ir, desired_type);
+         const glsl_type *desired_type;
+
+         if (ir->type->is_bindless_sampler() ||
+             ir->type->is_bindless_image()) {
+            /* Convert a sampler/image type to a pair of 32-bit unsigned
+             * integers as defined by ARB_bindless_texture. */
+            desired_type = glsl_type::uvec2_type;
+         } else if (constructor_type->is_bindless_sampler() ||
+                    constructor_type->is_bindless_image()) {
+            /* Convert a pair of 32-bit unsigned integers to a sampler or image
+             * type as defined by ARB_bindless_texture. */
+            if (constructor_type->is_bindless_sampler()) {
+               desired_type = glsl_type::get_sampler_instance(
+                     (glsl_sampler_dim)constructor_type->sampler_dimensionality,
+                     constructor_type->sampler_shadow,
+                     constructor_type->sampler_array,
+                     (glsl_base_type)constructor_type->sampled_type,
+                     true);
+            } else {
+               desired_type = glsl_type::get_image_instance(
+                     (glsl_sampler_dim)constructor_type->sampler_dimensionality,
+                     constructor_type->sampler_array,
+                     (glsl_base_type)constructor_type->sampled_type,
+                     true);
+
+            }
+         } else {
+            desired_type =
+               glsl_type::get_instance(constructor_type->base_type,
+                                       ir->type->vector_elements,
+                                       ir->type->matrix_columns);
+         }
+
+         ir_rvalue *result = convert_component(ir, desired_type,
+                                               constructor_type);
 
          /* Attempt to convert the parameter to a constant valued expression.
           * After doing so, track whether or not all the parameters to the
-- 
2.12.2



More information about the mesa-dev mailing list