diff options
author | Samuel Pitoiset <samuel.pitoiset@gmail.com> | 2017-04-21 18:45:42 +0200 |
---|---|---|
committer | Samuel Pitoiset <samuel.pitoiset@gmail.com> | 2017-04-26 16:04:47 +0200 |
commit | d307b38f2498571e6dc8d48d6f3f2a370343ad76 (patch) | |
tree | cc95c901b4544a082de170f8893a83c942607d66 | |
parent | 315efd977cfc7270cfc84c25f4a0b899dfb439dc (diff) |
glsl: allow bindless samplers/images to be used with constructors
For the explicit conversions.
From section 4.1.7 of the ARB_bindless_texture spec:
"Samplers are represented using 64-bit integer handles, and
may be converted to and from 64-bit integers using constructors."
From section 4.1.X of the ARB_bindless_texture spec:
"Images are represented using 64-bit integer handles, and
may be converted to and from 64-bit integers using constructors."
v3: - add spec comment
- update the glsl error message
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com> (v2)
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com> (v2)
-rw-r--r-- | src/compiler/glsl/ast_function.cpp | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/src/compiler/glsl/ast_function.cpp b/src/compiler/glsl/ast_function.cpp index 6ec5eda043..026fe075eb 100644 --- a/src/compiler/glsl/ast_function.cpp +++ b/src/compiler/glsl/ast_function.cpp @@ -1968,9 +1968,21 @@ ast_function_expression::hir(exec_list *instructions, /* Constructors for opaque types are illegal. + * + * From section 4.1.7 of the ARB_bindless_texture spec: + * + * "Samplers are represented using 64-bit integer handles, and may be " + * converted to and from 64-bit integers using constructors." + * + * From section 4.1.X of the ARB_bindless_texture spec: + * + * "Images are represented using 64-bit integer handles, and may be + * converted to and from 64-bit integers using constructors." */ - if (constructor_type->contains_opaque()) { - _mesa_glsl_error(& loc, state, "cannot construct opaque type `%s'", + if (constructor_type->contains_atomic() || + (!state->has_bindless() && constructor_type->contains_opaque())) { + _mesa_glsl_error(& loc, state, "cannot construct %s type `%s'", + state->has_bindless() ? "atomic" : "opaque", constructor_type->name); return ir_rvalue::error_value(ctx); } |