{
return type == GLSL_TYPE_DOUBLE ||
type == GLSL_TYPE_UINT64 ||
- type == GLSL_TYPE_INT64;
+ type == GLSL_TYPE_INT64 ||
+ type == GLSL_TYPE_IMAGE ||
+ type == GLSL_TYPE_SAMPLER;
}
enum glsl_sampler_dim {
* easier to just ralloc_free 'mem_ctx' (or any of its ancestors). */
static void* operator new(size_t size)
{
- mtx_lock(&glsl_type::mutex);
+ mtx_lock(&glsl_type::mem_mutex);
/* mem_ctx should have been created by the static members */
assert(glsl_type::mem_ctx != NULL);
type = ralloc_size(glsl_type::mem_ctx, size);
assert(type != NULL);
- mtx_unlock(&glsl_type::mutex);
+ mtx_unlock(&glsl_type::mem_mutex);
return type;
}
* ralloc_free in that case. */
static void operator delete(void *type)
{
- mtx_lock(&glsl_type::mutex);
+ mtx_lock(&glsl_type::mem_mutex);
ralloc_free(type);
- mtx_unlock(&glsl_type::mutex);
+ mtx_unlock(&glsl_type::mem_mutex);
}
/**
{
return (vector_elements == 1)
&& (base_type >= GLSL_TYPE_UINT)
- && (base_type <= GLSL_TYPE_BOOL);
+ && (base_type <= GLSL_TYPE_IMAGE);
}
/**
return (base_type == GLSL_TYPE_UINT) || (base_type == GLSL_TYPE_INT);
}
+ /**
+ * Query whether or not a type is a 64-bit integer.
+ */
+ bool is_integer_64() const
+ {
+ return base_type == GLSL_TYPE_UINT64 || base_type == GLSL_TYPE_INT64;
+ }
+
/**
* Query whether or not a type is a 32-bit or 64-bit integer
*/
bool is_integer_32_64() const
{
- return (base_type == GLSL_TYPE_UINT) || (base_type == GLSL_TYPE_INT) ||
- (base_type == GLSL_TYPE_UINT64) || (base_type == GLSL_TYPE_INT64);
+ return is_integer() || is_integer_64();
}
/**
*/
bool contains_sampler() const;
+ /**
+ * Query whether or not type is an array or for struct, interface and
+ * array types, contains an array.
+ */
+ bool contains_array() const;
+
/**
* Get the Mesa texture target index for a sampler type.
*/
return size;
}
+ /**
+ * Query whether or not a type is an atomic_uint.
+ */
+ bool is_atomic_uint() const
+ {
+ return base_type == GLSL_TYPE_ATOMIC_UINT;
+ }
+
/**
* Return the amount of atomic counter storage required for a type.
*/
unsigned atomic_size() const
{
- if (base_type == GLSL_TYPE_ATOMIC_UINT)
+ if (is_atomic_uint())
return ATOMIC_COUNTER_SIZE;
else if (is_array())
return length * fields.array->atomic_size();
private:
- static mtx_t mutex;
+ static mtx_t mem_mutex;
+ static mtx_t hash_mutex;
/**
* ralloc context for all glsl_type allocations
unsigned precision:2;
/**
- * Image qualifiers, applicable to buffer variables defined in shader
+ * Memory qualifiers, applicable to buffer variables defined in shader
* storage buffer objects (SSBOs)
*/
- unsigned image_read_only:1;
- unsigned image_write_only:1;
- unsigned image_coherent:1;
- unsigned image_volatile:1;
- unsigned image_restrict:1;
+ unsigned memory_read_only:1;
+ unsigned memory_write_only:1;
+ unsigned memory_coherent:1;
+ unsigned memory_volatile:1;
+ unsigned memory_restrict:1;
+
+ /**
+ * Layout format, applicable to image variables only.
+ */
+ unsigned image_format:16;
/**
* Any of the xfb_* qualifiers trigger the shader to be in transform
: type(_type), name(_name), location(-1), offset(0), xfb_buffer(0),
xfb_stride(0), interpolation(0), centroid(0),
sample(0), matrix_layout(GLSL_MATRIX_LAYOUT_INHERITED), patch(0),
- precision(GLSL_PRECISION_NONE), image_read_only(0), image_write_only(0),
- image_coherent(0), image_volatile(0), image_restrict(0),
- explicit_xfb_buffer(0), implicit_sized_array(0)
+ precision(GLSL_PRECISION_NONE), memory_read_only(0),
+ memory_write_only(0), memory_coherent(0), memory_volatile(0),
+ memory_restrict(0), image_format(0), explicit_xfb_buffer(0),
+ implicit_sized_array(0)
{
/* empty */
}