On Thu, Aug 27, 2015 at 8:48 PM, Ilia Mirkin <imir...@alum.mit.edu> wrote: > Signed-off-by: Ilia Mirkin <imir...@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. _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev