[Mesa-dev] [PATCH 07/10] glsl: add support for the imageSamples function

Kenneth Graunke kenneth at whitecape.org
Thu Aug 27 22:46:16 PDT 2015


On Thursday, August 27, 2015 11:48:36 PM Ilia Mirkin wrote:
> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> ---
>  src/glsl/builtin_functions.cpp | 48 +++++++++++++++++++++++++++++++++++++++---
>  1 file changed, 45 insertions(+), 3 deletions(-)
> 
> diff --git a/src/glsl/builtin_functions.cpp b/src/glsl/builtin_functions.cpp
> index 3fdda32..b3982f4 100644
> --- a/src/glsl/builtin_functions.cpp
> +++ b/src/glsl/builtin_functions.cpp
> @@ -540,7 +540,8 @@ private:
>        IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE = (1 << 3),
>        IMAGE_FUNCTION_READ_ONLY = (1 << 4),
>        IMAGE_FUNCTION_WRITE_ONLY = (1 << 5),
> -      IMAGE_FUNCTION_AVAIL_ATOMIC = (1 << 6)
> +      IMAGE_FUNCTION_AVAIL_ATOMIC = (1 << 6),
> +      IMAGE_FUNCTION_MS_ONLY = (1 << 7),
>     };
>  
>     /**
> @@ -753,6 +754,10 @@ private:
>                                                  const char *intrinsic_name,
>                                                  unsigned num_arguments,
>                                                  unsigned flags);
> +   ir_function_signature *_image_samples_prototype(const glsl_type *image_type,
> +                                                   const char *intrinsic_name,
> +                                                   unsigned num_arguments,
> +                                                   unsigned flags);
>     ir_function_signature *_image(image_prototype_ctr prototype,
>                                   const glsl_type *image_type,
>                                   const char *intrinsic_name,
> @@ -2688,8 +2693,10 @@ builtin_builder::add_image_function(const char *name,
>     ir_function *f = new(mem_ctx) ir_function(name);
>  
>     for (unsigned i = 0; i < ARRAY_SIZE(types); ++i) {
> -      if (types[i]->sampler_type != GLSL_TYPE_FLOAT ||
> -          (flags & IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE))
> +      if ((types[i]->sampler_type != GLSL_TYPE_FLOAT ||
> +           (flags & IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE)) &&
> +          (types[i]->sampler_dimensionality == GLSL_SAMPLER_DIM_MS ||
> +           !(flags & IMAGE_FUNCTION_MS_ONLY)))
>           f->add_signature(_image(prototype, types[i], intrinsic_name,
>                                   num_arguments, flags));
>     }
> @@ -2757,6 +2764,11 @@ builtin_builder::add_image_functions(bool glsl)
>                        "__intrinsic_image_size",
>                        &builtin_builder::_image_size_prototype, 1,
>                        flags | IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE);
> +
> +   add_image_function(glsl ? "imageSamples" : "__intrinsic_image_samples",
> +                      "__intrinsic_image_samples",
> +                      &builtin_builder::_image_samples_prototype, 1,
> +                      flags | IMAGE_FUNCTION_MS_ONLY);
>  }
>  
>  ir_variable *
> @@ -4987,6 +4999,36 @@ builtin_builder::_image_size_prototype(const glsl_type *image_type,
>  }
>  
>  ir_function_signature *
> +builtin_builder::_image_samples_prototype(const glsl_type *image_type,
> +                                          const char *intrinsic_name,
> +                                          unsigned num_arguments,
> +                                          unsigned flags)
> +{
> +   const glsl_type *ret_type;
> +   unsigned num_components = image_type->coordinate_components();
> +
> +   ret_type = glsl_type::get_instance(GLSL_TYPE_INT, num_components, 1);

Or, more concisely:

   const glsl_type *ret_type = glsl_type::ivec(num_components);

> +
> +   ir_variable *image = in_var(image_type, "image");
> +   ir_function_signature *sig = new_sig(ret_type, shader_samples, 1, image);
> +
> +   /* Set the maximal set of qualifiers allowed for this image
> +    * built-in.  Function calls with arguments having fewer
> +    * qualifiers than present in the prototype are allowed by the
> +    * spec, but not with more, i.e. this will make the compiler
> +    * accept everything that needs to be accepted, and reject cases
> +    * like loads from write-only or stores to read-only images.
> +    */
> +   image->data.image_read_only = true;
> +   image->data.image_write_only = true;
> +   image->data.image_coherent = true;
> +   image->data.image_volatile = true;
> +   image->data.image_restrict = true;
> +
> +   return sig;
> +}
> +
> +ir_function_signature *
>  builtin_builder::_image(image_prototype_ctr prototype,
>                          const glsl_type *image_type,
>                          const char *intrinsic_name,
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150827/71d6a102/attachment-0001.sig>


More information about the mesa-dev mailing list