Reviewed-by: Ilia Mirkin <[email protected]>
On Tue, Apr 11, 2017 at 12:48 PM, Samuel Pitoiset <[email protected]> wrote: > Bindless sampler/image types are really different from the existing > sampler/image types. They are considered 64-bit unsigned integers, > they can be declared as temporary, shader inputs/outputs and are > non-opaque types. > > For these reasons, it looks more convenient to introduce new > internal base types to the GLSL compiler, called > GLSL_TYPE_BINDLESS_SAMPLER and respectively GLSL_TYPE_BINDLESS_IMAGE. > > Signed-off-by: Samuel Pitoiset <[email protected]> > --- > src/compiler/glsl/ast_to_hir.cpp | 2 ++ > src/compiler/glsl/ir.cpp | 2 +- > src/compiler/glsl/ir_clone.cpp | 2 ++ > src/compiler/glsl/link_uniform_initializers.cpp | 2 ++ > src/compiler/glsl_types.cpp | 4 ++++ > src/compiler/glsl_types.h | 12 ++++++++---- > src/intel/compiler/brw_fs.cpp | 2 ++ > src/intel/compiler/brw_shader.cpp | 2 ++ > src/intel/compiler/brw_vec4_visitor.cpp | 2 ++ > src/mesa/program/ir_to_mesa.cpp | 4 ++++ > src/mesa/state_tracker/st_glsl_types.cpp | 2 ++ > 11 files changed, 31 insertions(+), 5 deletions(-) > > diff --git a/src/compiler/glsl/ast_to_hir.cpp > b/src/compiler/glsl/ast_to_hir.cpp > index 27dc21fffe..38c0f5c8d4 100644 > --- a/src/compiler/glsl/ast_to_hir.cpp > +++ b/src/compiler/glsl/ast_to_hir.cpp > @@ -1162,7 +1162,9 @@ do_comparison(void *mem_ctx, int operation, ir_rvalue > *op0, ir_rvalue *op1) > > case GLSL_TYPE_ERROR: > case GLSL_TYPE_VOID: > + case GLSL_TYPE_BINDLESS_SAMPLER: > case GLSL_TYPE_SAMPLER: > + case GLSL_TYPE_BINDLESS_IMAGE: > case GLSL_TYPE_IMAGE: > case GLSL_TYPE_INTERFACE: > case GLSL_TYPE_ATOMIC_UINT: > diff --git a/src/compiler/glsl/ir.cpp b/src/compiler/glsl/ir.cpp > index 2bbc7a1cf7..3fbf0f68d3 100644 > --- a/src/compiler/glsl/ir.cpp > +++ b/src/compiler/glsl/ir.cpp > @@ -622,7 +622,7 @@ ir_constant::ir_constant(const struct glsl_type *type, > this->array_elements = NULL; > > assert((type->base_type >= GLSL_TYPE_UINT) > - && (type->base_type <= GLSL_TYPE_BOOL)); > + && (type->base_type <= GLSL_TYPE_BINDLESS_IMAGE)); > > this->type = type; > memcpy(& this->value, data, sizeof(this->value)); > diff --git a/src/compiler/glsl/ir_clone.cpp b/src/compiler/glsl/ir_clone.cpp > index bfe2573c07..bc21964be7 100644 > --- a/src/compiler/glsl/ir_clone.cpp > +++ b/src/compiler/glsl/ir_clone.cpp > @@ -339,6 +339,8 @@ ir_constant::clone(void *mem_ctx, struct hash_table *ht) > const > case GLSL_TYPE_BOOL: > case GLSL_TYPE_UINT64: > case GLSL_TYPE_INT64: > + case GLSL_TYPE_BINDLESS_SAMPLER: > + case GLSL_TYPE_BINDLESS_IMAGE: > return new(mem_ctx) ir_constant(this->type, &this->value); > > case GLSL_TYPE_STRUCT: { > diff --git a/src/compiler/glsl/link_uniform_initializers.cpp > b/src/compiler/glsl/link_uniform_initializers.cpp > index 8911c3de62..f2520393cf 100644 > --- a/src/compiler/glsl/link_uniform_initializers.cpp > +++ b/src/compiler/glsl/link_uniform_initializers.cpp > @@ -80,6 +80,8 @@ copy_constant_to_storage(union gl_constant_value *storage, > case GLSL_TYPE_VOID: > case GLSL_TYPE_SUBROUTINE: > case GLSL_TYPE_FUNCTION: > + case GLSL_TYPE_BINDLESS_SAMPLER: > + case GLSL_TYPE_BINDLESS_IMAGE: > case GLSL_TYPE_ERROR: > /* All other types should have already been filtered by other > * paths in the caller. > diff --git a/src/compiler/glsl_types.cpp b/src/compiler/glsl_types.cpp > index db65bb0e00..1b06eb68f4 100644 > --- a/src/compiler/glsl_types.cpp > +++ b/src/compiler/glsl_types.cpp > @@ -1281,6 +1281,8 @@ glsl_type::component_slots() const > case GLSL_TYPE_DOUBLE: > case GLSL_TYPE_UINT64: > case GLSL_TYPE_INT64: > + case GLSL_TYPE_BINDLESS_SAMPLER: > + case GLSL_TYPE_BINDLESS_IMAGE: > return 2 * this->components(); > > case GLSL_TYPE_STRUCT: > @@ -1967,6 +1969,8 @@ glsl_type::count_attribute_slots(bool is_vertex_input) > const > case GLSL_TYPE_INT: > case GLSL_TYPE_FLOAT: > case GLSL_TYPE_BOOL: > + case GLSL_TYPE_BINDLESS_SAMPLER: > + case GLSL_TYPE_BINDLESS_IMAGE: > return this->matrix_columns; > case GLSL_TYPE_DOUBLE: > case GLSL_TYPE_UINT64: > diff --git a/src/compiler/glsl_types.h b/src/compiler/glsl_types.h > index 7709556fe0..4cb330e4a3 100644 > --- a/src/compiler/glsl_types.h > +++ b/src/compiler/glsl_types.h > @@ -56,6 +56,8 @@ enum glsl_base_type { > GLSL_TYPE_UINT64, > GLSL_TYPE_INT64, > GLSL_TYPE_BOOL, > + GLSL_TYPE_BINDLESS_SAMPLER, > + GLSL_TYPE_BINDLESS_IMAGE, > GLSL_TYPE_SAMPLER, > GLSL_TYPE_IMAGE, > GLSL_TYPE_ATOMIC_UINT, > @@ -70,9 +72,11 @@ enum glsl_base_type { > > static inline bool glsl_base_type_is_64bit(enum glsl_base_type type) > { > - return type == GLSL_TYPE_DOUBLE || > - type == GLSL_TYPE_UINT64 || > - type == GLSL_TYPE_INT64; > + return type == GLSL_TYPE_DOUBLE || > + type == GLSL_TYPE_UINT64 || > + type == GLSL_TYPE_INT64 || > + type == GLSL_TYPE_BINDLESS_SAMPLER || > + type == GLSL_TYPE_BINDLESS_IMAGE; > } > > enum glsl_sampler_dim { > @@ -439,7 +443,7 @@ struct glsl_type { > { > return (vector_elements == 1) > && (base_type >= GLSL_TYPE_UINT) > - && (base_type <= GLSL_TYPE_BOOL); > + && (base_type <= GLSL_TYPE_BINDLESS_IMAGE); > } > > /** > diff --git a/src/intel/compiler/brw_fs.cpp b/src/intel/compiler/brw_fs.cpp > index 9dc21ac5e3..f4f247ec25 100644 > --- a/src/intel/compiler/brw_fs.cpp > +++ b/src/intel/compiler/brw_fs.cpp > @@ -486,6 +486,8 @@ type_size_scalar(const struct glsl_type *type) > case GLSL_TYPE_ERROR: > case GLSL_TYPE_INTERFACE: > case GLSL_TYPE_FUNCTION: > + case GLSL_TYPE_BINDLESS_SAMPLER: > + case GLSL_TYPE_BINDLESS_IMAGE: > unreachable("not reached"); > } > > diff --git a/src/intel/compiler/brw_shader.cpp > b/src/intel/compiler/brw_shader.cpp > index 73bbc93135..45511be3c4 100644 > --- a/src/intel/compiler/brw_shader.cpp > +++ b/src/intel/compiler/brw_shader.cpp > @@ -64,6 +64,8 @@ brw_type_for_base_type(const struct glsl_type *type) > case GLSL_TYPE_ERROR: > case GLSL_TYPE_INTERFACE: > case GLSL_TYPE_FUNCTION: > + case GLSL_TYPE_BINDLESS_SAMPLER: > + case GLSL_TYPE_BINDLESS_IMAGE: > unreachable("not reached"); > } > > diff --git a/src/intel/compiler/brw_vec4_visitor.cpp > b/src/intel/compiler/brw_vec4_visitor.cpp > index 262a084ca8..71376c3ae2 100644 > --- a/src/intel/compiler/brw_vec4_visitor.cpp > +++ b/src/intel/compiler/brw_vec4_visitor.cpp > @@ -625,6 +625,8 @@ type_size_xvec4(const struct glsl_type *type, bool > as_vec4) > case GLSL_TYPE_ERROR: > case GLSL_TYPE_INTERFACE: > case GLSL_TYPE_FUNCTION: > + case GLSL_TYPE_BINDLESS_SAMPLER: > + case GLSL_TYPE_BINDLESS_IMAGE: > unreachable("not reached"); > } > > diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp > index 6b33266f1b..79c82faac7 100644 > --- a/src/mesa/program/ir_to_mesa.cpp > +++ b/src/mesa/program/ir_to_mesa.cpp > @@ -548,7 +548,9 @@ type_size(const struct glsl_type *type) > size += type_size(type->fields.structure[i].type); > } > return size; > + case GLSL_TYPE_BINDLESS_SAMPLER: > case GLSL_TYPE_SAMPLER: > + case GLSL_TYPE_BINDLESS_IMAGE: > case GLSL_TYPE_IMAGE: > case GLSL_TYPE_SUBROUTINE: > /* Samplers take up one slot in UNIFORMS[], but they're baked in > @@ -2601,7 +2603,9 @@ _mesa_associate_uniform_storage(struct gl_context *ctx, > format = uniform_native; > columns = 1; > break; > + case GLSL_TYPE_BINDLESS_SAMPLER: > case GLSL_TYPE_SAMPLER: > + case GLSL_TYPE_BINDLESS_IMAGE: > case GLSL_TYPE_IMAGE: > case GLSL_TYPE_SUBROUTINE: > format = uniform_native; > diff --git a/src/mesa/state_tracker/st_glsl_types.cpp > b/src/mesa/state_tracker/st_glsl_types.cpp > index 37c3164254..e1365d5ada 100644 > --- a/src/mesa/state_tracker/st_glsl_types.cpp > +++ b/src/mesa/state_tracker/st_glsl_types.cpp > @@ -69,6 +69,8 @@ st_glsl_attrib_type_size(const struct glsl_type *type, bool > is_vs_input) > break; > case GLSL_TYPE_UINT64: > case GLSL_TYPE_INT64: > + case GLSL_TYPE_BINDLESS_SAMPLER: > + case GLSL_TYPE_BINDLESS_IMAGE: > if (type->vector_elements <= 2 || is_vs_input) > return 1; > else > -- > 2.12.2 > > _______________________________________________ > mesa-dev mailing list > [email protected] > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
