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

Matt Turner mattst88 at gmail.com
Fri Aug 28 00:17:15 PDT 2015


On Fri, Aug 28, 2015 at 12:10 AM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
> On Fri, Aug 28, 2015 at 3:02 AM, Matt Turner <mattst88 at gmail.com> wrote:
>> On Thu, Aug 27, 2015 at 8:48 PM, Ilia Mirkin <imirkin at alum.mit.edu> 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);
>>> +
>>> +   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.
>>> +    */
>>
>> This can be line wrapped better. I don't know how in emacs, but in vim
>> I highlight it with shift+v, and then gq.
>
> I copied this directly from _image_size_prototype, word for word, line
> for line. It's easy to rewrap in emacs too (Alt-q, I think...), happy
> to do it. But it seems more consistent to have the same text. Or
> perhaps just not have that comment at all.

Bah :(


More information about the mesa-dev mailing list