[Mesa-dev] [PATCH 07/10] glsl: add support for the imageSamples function
Ilia Mirkin
imirkin at alum.mit.edu
Thu Aug 27 22:51:55 PDT 2015
On Fri, Aug 28, 2015 at 1:46 AM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> 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);
Or even more concisely and less buggily, glsl_type::int :) [which I'll
move down into the new_sig thing...]
>
>> +
>> + 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,
>>
More information about the mesa-dev
mailing list