[Mesa-dev] [PATCH 09/17] glsl: Add a gl_variable_storage* tree type to hold storage information on UBO variables.

Vincent Lejeune vljn at ovi.com
Sun Dec 25 10:20:04 PST 2011


GL_ARB_uniform_buffer_object spec defines standard layout rules to define how data
are packed in a uniform buffer object, using offset and stride. A single
ir_variable::location is not enough to hold every possible case and thus we defined a
new type whose structure mirror the one of associated glsl_type of stored variable.
---
 src/glsl/linker.cpp    |   23 +++++++++++++++++++++++
 src/mesa/main/mtypes.h |   25 +++++++++++++++++++++++++
 2 files changed, 48 insertions(+), 0 deletions(-)

diff --git a/src/glsl/linker.cpp b/src/glsl/linker.cpp
index 289a398..5ae928d 100644
--- a/src/glsl/linker.cpp
+++ b/src/glsl/linker.cpp
@@ -1173,6 +1173,29 @@ update_array_sizes(struct gl_shader_program *prog)
    }
 }
 
+#if FEATURE_ARB_uniform_buffer_object
+/**
+ * Create gl_variable_storage tree that mirror type.
+ */
+static union gl_variable_storage *
+create_storage_type(const struct glsl_type *const type, void *ctx=NULL)
+{
+   union gl_variable_storage *storage_tree = (union gl_variable_storage *) ralloc_size(ctx,sizeof(union gl_variable_storage));
+   if ( type->is_record() ) {
+      storage_tree->AsRecord.Fields = (union gl_variable_storage **) ralloc_array_size(storage_tree, sizeof(union gl_variable_storage *), type->length);
+      for (unsigned i = 0; i < type->length; i++) {
+         storage_tree->AsRecord.Fields[i] = create_storage_type(type->fields.structure[i].type, storage_tree);
+      }
+   }
+   if (type->is_array()) {
+      storage_tree->AsArray.FirstElement = create_storage_type(type->fields.array, storage_tree);
+   }
+   return storage_tree;
+}
+
+#endif
+
+
 /**
  * Find a contiguous set of available bits in a bitmask.
  *
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index c4b5e28..865b6dc 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -2128,6 +2128,29 @@ struct gl_sl_pragmas
 };
 
 /**
+ * Holds storage information (offset and stride) about complex data type
+ */
+union gl_variable_storage
+{
+   struct {
+      GLuint Offset; /** Offset in bytes from start of buffer */
+   } AsLeaf; /** Associated type is scalar or vector not in an array */
+   struct {
+      GLuint Offset; /** Offset in bytes from start of buffer */
+      GLuint RowStride; /** Stride to access next element in a row */
+      GLuint ColumnStride; /** Stride to access next element in a column */
+   } AsMatrix; /** Associated type is a matrix */
+   struct {
+      union gl_variable_storage **Fields; /** Ralloced array of gl_variable_storage* associated to each fields */
+   } AsRecord; /** Associated type is record */
+   struct {
+      GLuint Stride; /** Stride in bytes between elements */
+      union gl_variable_storage *FirstElement; /** Ralloced gl_variable_storage that holds storage info for
+      the first element of the array ; info about others element are deducable using this and Stride */
+   } AsArray;
+};
+
+/**
  * Uniform Buffer Object variable informations.
  * This come in 2 flavors :
  * As layout informations (Size,Offset,...) are defined per program and not per shader,
@@ -2140,6 +2163,8 @@ struct gl_shader_ubo_variable
 {
    char* Name;
    const struct glsl_type* Type;
+   const union gl_variable_storage *Storage;
+};
 };
 
 
-- 
1.7.7



More information about the mesa-dev mailing list