[Mesa-dev] [PATCH 02/23] glsl: Add image type to the GLSL IR.
Francisco Jerez
currojerez at riseup.net
Tue Nov 26 00:02:18 PST 2013
---
src/glsl/ast_to_hir.cpp | 1 +
src/glsl/glsl_types.cpp | 23 +++++++++++++++++++++++
src/glsl/glsl_types.h | 22 ++++++++++++++++++++++
src/glsl/ir_clone.cpp | 1 +
src/glsl/link_uniform_initializers.cpp | 1 +
src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 1 +
src/mesa/program/ir_to_mesa.cpp | 2 ++
src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 1 +
8 files changed, 52 insertions(+)
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index 43cf497..e7c4ff4 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -948,6 +948,7 @@ do_comparison(void *mem_ctx, int operation, ir_rvalue *op0, ir_rvalue *op1)
case GLSL_TYPE_ERROR:
case GLSL_TYPE_VOID:
case GLSL_TYPE_SAMPLER:
+ case GLSL_TYPE_IMAGE:
case GLSL_TYPE_INTERFACE:
case GLSL_TYPE_ATOMIC_UINT:
/* I assume a comparison of a struct containing a sampler just
diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp
index f740130..e24417d 100644
--- a/src/glsl/glsl_types.cpp
+++ b/src/glsl/glsl_types.cpp
@@ -80,6 +80,24 @@ glsl_type::glsl_type(GLenum gl_type,
memset(& fields, 0, sizeof(fields));
}
+glsl_type::glsl_type(GLenum gl_type,
+ enum glsl_image_dim dim, bool array,
+ glsl_base_type type, const char *name) :
+ gl_type(gl_type),
+ base_type(GLSL_TYPE_IMAGE),
+ sampler_dimensionality(0), sampler_shadow(0),
+ sampler_array(0), sampler_type(0), interface_packing(0),
+ vector_elements(1), matrix_columns(1),
+ length(0), fields()
+{
+ init_ralloc_type_ctx();
+ assert(name != NULL);
+ this->name = ralloc_strdup(this->mem_ctx, name);
+ fields.image.type = type;
+ fields.image.dimension = dim;
+ fields.image.array = array;
+}
+
glsl_type::glsl_type(const glsl_struct_field *fields, unsigned num_fields,
const char *name) :
gl_type(0),
@@ -172,6 +190,7 @@ bool
glsl_type::contains_opaque() const {
switch (base_type) {
case GLSL_TYPE_SAMPLER:
+ case GLSL_TYPE_IMAGE:
case GLSL_TYPE_ATOMIC_UINT:
return true;
case GLSL_TYPE_ARRAY:
@@ -618,6 +637,9 @@ glsl_type::component_slots() const
case GLSL_TYPE_ARRAY:
return this->length * this->fields.array->component_slots();
+ case GLSL_TYPE_IMAGE:
+ return 1;
+
case GLSL_TYPE_SAMPLER:
case GLSL_TYPE_ATOMIC_UINT:
case GLSL_TYPE_VOID:
@@ -908,6 +930,7 @@ glsl_type::count_attribute_slots() const
return this->length * this->fields.array->count_attribute_slots();
case GLSL_TYPE_SAMPLER:
+ case GLSL_TYPE_IMAGE:
case GLSL_TYPE_ATOMIC_UINT:
case GLSL_TYPE_VOID:
case GLSL_TYPE_ERROR:
diff --git a/src/glsl/glsl_types.h b/src/glsl/glsl_types.h
index 96eee5e..ea65bcd 100644
--- a/src/glsl/glsl_types.h
+++ b/src/glsl/glsl_types.h
@@ -53,6 +53,7 @@ enum glsl_base_type {
GLSL_TYPE_FLOAT,
GLSL_TYPE_BOOL,
GLSL_TYPE_SAMPLER,
+ GLSL_TYPE_IMAGE,
GLSL_TYPE_ATOMIC_UINT,
GLSL_TYPE_STRUCT,
GLSL_TYPE_INTERFACE,
@@ -72,6 +73,16 @@ enum glsl_sampler_dim {
GLSL_SAMPLER_DIM_MS
};
+enum glsl_image_dim {
+ GLSL_IMAGE_DIM_1D,
+ GLSL_IMAGE_DIM_2D,
+ GLSL_IMAGE_DIM_3D,
+ GLSL_IMAGE_DIM_RECT,
+ GLSL_IMAGE_DIM_CUBE,
+ GLSL_IMAGE_DIM_BUFFER,
+ GLSL_IMAGE_DIM_MS
+};
+
enum glsl_interface_packing {
GLSL_INTERFACE_PACKING_STD140,
GLSL_INTERFACE_PACKING_SHARED,
@@ -152,6 +163,12 @@ struct glsl_type {
const struct glsl_type *array; /**< Type of array elements. */
const struct glsl_type *parameters; /**< Parameters to function. */
struct glsl_struct_field *structure; /**< List of struct fields. */
+
+ struct {
+ glsl_base_type type; /**< Image data type as seen by the shader. */
+ glsl_image_dim dimension; /**< Base dimensionality of this image. */
+ bool array; /**< True if this is an array image type. */
+ } image;
} fields;
/**
@@ -562,6 +579,11 @@ private:
enum glsl_sampler_dim dim, bool shadow, bool array,
unsigned type, const char *name);
+ /** Constructor for image types */
+ glsl_type(GLenum gl_type,
+ enum glsl_image_dim dim, bool array,
+ glsl_base_type type, const char *name);
+
/** Constructor for record types */
glsl_type(const glsl_struct_field *fields, unsigned num_fields,
const char *name);
diff --git a/src/glsl/ir_clone.cpp b/src/glsl/ir_clone.cpp
index 40ed33a..ed26aae 100644
--- a/src/glsl/ir_clone.cpp
+++ b/src/glsl/ir_clone.cpp
@@ -398,6 +398,7 @@ ir_constant::clone(void *mem_ctx, struct hash_table *ht) const
}
case GLSL_TYPE_SAMPLER:
+ case GLSL_TYPE_IMAGE:
case GLSL_TYPE_ATOMIC_UINT:
case GLSL_TYPE_VOID:
case GLSL_TYPE_ERROR:
diff --git a/src/glsl/link_uniform_initializers.cpp b/src/glsl/link_uniform_initializers.cpp
index 786aaf0..f02978c 100644
--- a/src/glsl/link_uniform_initializers.cpp
+++ b/src/glsl/link_uniform_initializers.cpp
@@ -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_IMAGE:
case GLSL_TYPE_ATOMIC_UINT:
case GLSL_TYPE_INTERFACE:
case GLSL_TYPE_VOID:
diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
index 9eb9a9d..3b08f6f 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
@@ -820,6 +820,7 @@ fs_visitor::emit_assignment_writes(fs_reg &l, fs_reg &r,
break;
case GLSL_TYPE_SAMPLER:
+ case GLSL_TYPE_IMAGE:
case GLSL_TYPE_ATOMIC_UINT:
break;
diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp
index c833a12..17490cd 100644
--- a/src/mesa/program/ir_to_mesa.cpp
+++ b/src/mesa/program/ir_to_mesa.cpp
@@ -618,6 +618,7 @@ type_size(const struct glsl_type *type)
}
return size;
case GLSL_TYPE_SAMPLER:
+ case GLSL_TYPE_IMAGE:
/* Samplers take up one slot in UNIFORMS[], but they're baked in
* at link time.
*/
@@ -2599,6 +2600,7 @@ _mesa_associate_uniform_storage(struct gl_context *ctx,
columns = 1;
break;
case GLSL_TYPE_SAMPLER:
+ case GLSL_TYPE_IMAGE:
format = uniform_native;
columns = 1;
break;
diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
index ac95968..08d5807 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -983,6 +983,7 @@ type_size(const struct glsl_type *type)
}
return size;
case GLSL_TYPE_SAMPLER:
+ case GLSL_TYPE_IMAGE:
/* Samplers take up one slot in UNIFORMS[], but they're baked in
* at link time.
*/
--
1.8.3.4
More information about the mesa-dev
mailing list