mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-04 09:48:07 +02:00
glsl: Add new atomic_uint built-in GLSL type.
v2: Fix GLSL version in which the type became available. Add
contains_atomic() convenience method. Split off atomic counter
comparison error checking to a separate patch that will handle all
opaque types. Include new ir_variable fields for atomic types.
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
parent
0bed1ab73b
commit
26db3b933f
16 changed files with 58 additions and 1 deletions
|
|
@ -943,6 +943,7 @@ do_comparison(void *mem_ctx, int operation, ir_rvalue *op0, ir_rvalue *op1)
|
|||
case GLSL_TYPE_VOID:
|
||||
case GLSL_TYPE_SAMPLER:
|
||||
case GLSL_TYPE_INTERFACE:
|
||||
case GLSL_TYPE_ATOMIC_UINT:
|
||||
/* I assume a comparison of a struct containing a sampler just
|
||||
* ignores the sampler present in the type.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -110,6 +110,8 @@ DECL_TYPE(sampler2DRectShadow, GL_SAMPLER_2D_RECT_SHADOW, GLSL_SAMPLER
|
|||
|
||||
DECL_TYPE(samplerExternalOES, GL_SAMPLER_EXTERNAL_OES, GLSL_SAMPLER_DIM_EXTERNAL, 0, 0, GLSL_TYPE_FLOAT)
|
||||
|
||||
DECL_TYPE(atomic_uint, GL_UNSIGNED_INT_ATOMIC_COUNTER, GLSL_TYPE_ATOMIC_UINT, 1, 1)
|
||||
|
||||
STRUCT_TYPE(gl_DepthRangeParameters)
|
||||
STRUCT_TYPE(gl_PointParameters)
|
||||
STRUCT_TYPE(gl_MaterialParameters)
|
||||
|
|
|
|||
|
|
@ -203,6 +203,8 @@ const static struct builtin_type_versions {
|
|||
T(sampler2DRectShadow, 140, 999)
|
||||
|
||||
T(struct_gl_DepthRangeParameters, 110, 100)
|
||||
|
||||
T(atomic_uint, 420, 999)
|
||||
};
|
||||
|
||||
const glsl_type *const deprecated_types[] = {
|
||||
|
|
@ -284,5 +286,9 @@ _mesa_glsl_initialize_types(struct _mesa_glsl_parse_state *state)
|
|||
if (state->OES_texture_3D_enable) {
|
||||
add_type(symbols, glsl_type::sampler3D_type);
|
||||
}
|
||||
|
||||
if (state->ARB_shader_atomic_counters_enable) {
|
||||
add_type(symbols, glsl_type::atomic_uint_type);
|
||||
}
|
||||
}
|
||||
/** @} */
|
||||
|
|
|
|||
|
|
@ -601,6 +601,7 @@ glsl_type::component_slots() const
|
|||
return this->length * this->fields.array->component_slots();
|
||||
|
||||
case GLSL_TYPE_SAMPLER:
|
||||
case GLSL_TYPE_ATOMIC_UINT:
|
||||
case GLSL_TYPE_VOID:
|
||||
case GLSL_TYPE_ERROR:
|
||||
break;
|
||||
|
|
@ -889,6 +890,7 @@ glsl_type::count_attribute_slots() const
|
|||
return this->length * this->fields.array->count_attribute_slots();
|
||||
|
||||
case GLSL_TYPE_SAMPLER:
|
||||
case GLSL_TYPE_ATOMIC_UINT:
|
||||
case GLSL_TYPE_VOID:
|
||||
case GLSL_TYPE_ERROR:
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -53,6 +53,7 @@ enum glsl_base_type {
|
|||
GLSL_TYPE_FLOAT,
|
||||
GLSL_TYPE_BOOL,
|
||||
GLSL_TYPE_SAMPLER,
|
||||
GLSL_TYPE_ATOMIC_UINT,
|
||||
GLSL_TYPE_STRUCT,
|
||||
GLSL_TYPE_INTERFACE,
|
||||
GLSL_TYPE_ARRAY,
|
||||
|
|
@ -440,6 +441,27 @@ struct glsl_type {
|
|||
return base_type == GLSL_TYPE_ERROR;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the amount of atomic counter storage required for a type.
|
||||
*/
|
||||
unsigned atomic_size() const
|
||||
{
|
||||
if (base_type == GLSL_TYPE_ATOMIC_UINT)
|
||||
return ATOMIC_COUNTER_SIZE;
|
||||
else if (is_array())
|
||||
return length * element_type()->atomic_size();
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return whether a type contains any atomic counters.
|
||||
*/
|
||||
bool contains_atomic() const
|
||||
{
|
||||
return atomic_size();
|
||||
}
|
||||
|
||||
/**
|
||||
* Query the full type of a matrix row
|
||||
*
|
||||
|
|
|
|||
|
|
@ -1586,7 +1586,7 @@ ir_variable::ir_variable(const struct glsl_type *type, const char *name,
|
|||
ir_variable_mode mode)
|
||||
: max_array_access(0), max_ifc_array_access(NULL),
|
||||
read_only(false), centroid(false), invariant(false),
|
||||
mode(mode), interpolation(INTERP_QUALIFIER_NONE)
|
||||
mode(mode), interpolation(INTERP_QUALIFIER_NONE), atomic()
|
||||
{
|
||||
this->ir_type = ir_type_variable;
|
||||
this->type = type;
|
||||
|
|
|
|||
|
|
@ -638,6 +638,14 @@ public:
|
|||
*/
|
||||
int binding;
|
||||
|
||||
/**
|
||||
* Location an atomic counter is stored at.
|
||||
*/
|
||||
struct {
|
||||
unsigned buffer_index;
|
||||
unsigned offset;
|
||||
} atomic;
|
||||
|
||||
/**
|
||||
* Built-in state that backs this uniform
|
||||
*
|
||||
|
|
|
|||
|
|
@ -57,6 +57,8 @@ ir_variable::clone(void *mem_ctx, struct hash_table *ht) const
|
|||
var->location = this->location;
|
||||
var->index = this->index;
|
||||
var->binding = this->binding;
|
||||
var->atomic.buffer_index = this->atomic.buffer_index;
|
||||
var->atomic.offset = this->atomic.offset;
|
||||
var->warn_extension = this->warn_extension;
|
||||
var->origin_upper_left = this->origin_upper_left;
|
||||
var->pixel_center_integer = this->pixel_center_integer;
|
||||
|
|
@ -395,6 +397,7 @@ ir_constant::clone(void *mem_ctx, struct hash_table *ht) const
|
|||
}
|
||||
|
||||
case GLSL_TYPE_SAMPLER:
|
||||
case GLSL_TYPE_ATOMIC_UINT:
|
||||
case GLSL_TYPE_VOID:
|
||||
case GLSL_TYPE_ERROR:
|
||||
case GLSL_TYPE_INTERFACE:
|
||||
|
|
|
|||
|
|
@ -69,6 +69,7 @@ copy_constant_to_storage(union gl_constant_value *storage,
|
|||
break;
|
||||
case GLSL_TYPE_ARRAY:
|
||||
case GLSL_TYPE_STRUCT:
|
||||
case GLSL_TYPE_ATOMIC_UINT:
|
||||
case GLSL_TYPE_INTERFACE:
|
||||
case GLSL_TYPE_VOID:
|
||||
case GLSL_TYPE_ERROR:
|
||||
|
|
|
|||
|
|
@ -92,6 +92,7 @@ generate_data_element(void *mem_ctx, const glsl_type *type,
|
|||
case GLSL_TYPE_BOOL:
|
||||
data.b[i] = bool(values[idx]);
|
||||
break;
|
||||
case GLSL_TYPE_ATOMIC_UINT:
|
||||
case GLSL_TYPE_STRUCT:
|
||||
case GLSL_TYPE_ARRAY:
|
||||
case GLSL_TYPE_VOID:
|
||||
|
|
@ -119,6 +120,7 @@ generate_data_element(void *mem_ctx, const glsl_type *type,
|
|||
case GLSL_TYPE_BOOL:
|
||||
ASSERT_EQ(data.b[i], val->value.b[i]);
|
||||
break;
|
||||
case GLSL_TYPE_ATOMIC_UINT:
|
||||
case GLSL_TYPE_STRUCT:
|
||||
case GLSL_TYPE_ARRAY:
|
||||
case GLSL_TYPE_VOID:
|
||||
|
|
@ -217,6 +219,7 @@ verify_data(gl_constant_value *storage, unsigned storage_array_size,
|
|||
case GLSL_TYPE_BOOL:
|
||||
EXPECT_EQ(int(val->value.b[i]), storage[i].i);
|
||||
break;
|
||||
case GLSL_TYPE_ATOMIC_UINT:
|
||||
case GLSL_TYPE_STRUCT:
|
||||
case GLSL_TYPE_ARRAY:
|
||||
case GLSL_TYPE_VOID:
|
||||
|
|
|
|||
|
|
@ -496,6 +496,8 @@ fs_visitor::type_size(const struct glsl_type *type)
|
|||
* link time.
|
||||
*/
|
||||
return 0;
|
||||
case GLSL_TYPE_ATOMIC_UINT:
|
||||
return 0;
|
||||
case GLSL_TYPE_VOID:
|
||||
case GLSL_TYPE_ERROR:
|
||||
case GLSL_TYPE_INTERFACE:
|
||||
|
|
|
|||
|
|
@ -808,6 +808,7 @@ fs_visitor::emit_assignment_writes(fs_reg &l, fs_reg &r,
|
|||
break;
|
||||
|
||||
case GLSL_TYPE_SAMPLER:
|
||||
case GLSL_TYPE_ATOMIC_UINT:
|
||||
break;
|
||||
|
||||
case GLSL_TYPE_VOID:
|
||||
|
|
|
|||
|
|
@ -304,6 +304,7 @@ brw_type_for_base_type(const struct glsl_type *type)
|
|||
return brw_type_for_base_type(type->fields.array);
|
||||
case GLSL_TYPE_STRUCT:
|
||||
case GLSL_TYPE_SAMPLER:
|
||||
case GLSL_TYPE_ATOMIC_UINT:
|
||||
/* These should be overridden with the type of the member when
|
||||
* dereferenced into. BRW_REGISTER_TYPE_UD seems like a likely
|
||||
* way to trip up if we don't.
|
||||
|
|
|
|||
|
|
@ -569,6 +569,8 @@ type_size(const struct glsl_type *type)
|
|||
* at link time.
|
||||
*/
|
||||
return 1;
|
||||
case GLSL_TYPE_ATOMIC_UINT:
|
||||
return 0;
|
||||
case GLSL_TYPE_VOID:
|
||||
case GLSL_TYPE_ERROR:
|
||||
case GLSL_TYPE_INTERFACE:
|
||||
|
|
|
|||
|
|
@ -622,6 +622,7 @@ type_size(const struct glsl_type *type)
|
|||
* at link time.
|
||||
*/
|
||||
return 1;
|
||||
case GLSL_TYPE_ATOMIC_UINT:
|
||||
case GLSL_TYPE_VOID:
|
||||
case GLSL_TYPE_ERROR:
|
||||
case GLSL_TYPE_INTERFACE:
|
||||
|
|
@ -2601,6 +2602,7 @@ _mesa_associate_uniform_storage(struct gl_context *ctx,
|
|||
format = uniform_native;
|
||||
columns = 1;
|
||||
break;
|
||||
case GLSL_TYPE_ATOMIC_UINT:
|
||||
case GLSL_TYPE_ARRAY:
|
||||
case GLSL_TYPE_VOID:
|
||||
case GLSL_TYPE_STRUCT:
|
||||
|
|
|
|||
|
|
@ -993,6 +993,7 @@ type_size(const struct glsl_type *type)
|
|||
* at link time.
|
||||
*/
|
||||
return 1;
|
||||
case GLSL_TYPE_ATOMIC_UINT:
|
||||
case GLSL_TYPE_INTERFACE:
|
||||
case GLSL_TYPE_VOID:
|
||||
case GLSL_TYPE_ERROR:
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue