[Mesa-dev] [PATCH 4/9] mesa: initial data structures for Uniform Buffer Objects

vlj vljn at ovi.com
Sun Oct 16 15:37:17 PDT 2011


---
 src/mesa/main/config.h          |    5 ++++
 src/mesa/main/mtypes.h          |   51 +++++++++++++++++++++++++++++++++++++++
 src/mesa/main/shaderobj.c       |   10 +++++++
 src/mesa/program/prog_uniform.h |    1 +
 4 files changed, 67 insertions(+), 0 deletions(-)

diff --git a/src/mesa/main/config.h b/src/mesa/main/config.h
index fffb1a7..4221521 100644
--- a/src/mesa/main/config.h
+++ b/src/mesa/main/config.h
@@ -354,5 +354,10 @@
  */
 #define MAX_CLIPPED_VERTICES ((2 * (6 + MAX_CLIP_PLANES))+1)
 
+/**
+ * UBO Variables
+ */
+#define MAX_UBO_IN_SHADER 8
+#define MAX_VARIABLES_IN_UBO 8
 
 #endif /* MESA_CONFIG_H_INCLUDED */
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index f2eb889..4ef097f 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -1696,6 +1696,14 @@ struct gl_array_attrib
    struct gl_buffer_object *ElementArrayBufferObj;
 };
 
+/**
+ * UBO state
+ */
+struct gl_ubo_attribs
+{
+    struct gl_buffer_object *UniformObj;
+    GLint ActiveUBO;
+};
 
 /**
  * Feedback buffer state
@@ -2139,6 +2147,37 @@ struct gl_sl_pragmas
 };
 
 
+struct UBOVariableInfo
+{
+   char* Name;
+   const struct glsl_type* Type;
+   GLuint Offset;
+   GLuint Stride;
+   GLuint IndexInUBO;
+   struct ubo* UBO;
+};
+
+enum UBOLayout {
+   packed,
+   shared,
+   std140,
+};
+
+enum UBOMatrixLayout {
+   rowmajor,
+   columnmajor,
+};
+
+struct ubo {
+   char* Name;
+   GLuint Index;
+   struct UBOVariableInfo* StorageLayout;
+   GLuint Layout; /** packed, shared or std140 */
+   GLuint MatrixLayout; /** rowmajor or columnmajor */
+   GLuint NumberOfVariables; /**< number of UBOVariableInfo in StorageLayout */
+   GLuint BoundBuffer;
+};
+
 /**
  * A GLSL vertex or fragment shader object.
  */
@@ -2163,6 +2202,8 @@ struct gl_shader
    /** Shaders containing built-in functions that are used for linking. */
    struct gl_shader *builtins_to_link[16];
    unsigned num_builtins_to_link;
+   struct ubo* UniformBufferObjects;
+   unsigned UBOCount;
 };
 
 
@@ -2203,6 +2244,8 @@ struct gl_shader_program
    struct gl_fragment_program *FragmentProgram; /**< Linked fragment prog */
    struct gl_geometry_program *GeometryProgram; /**< Linked geometry prog */
    struct gl_uniform_list *Uniforms;
+   struct UBOVariableInfo **IndexedUniformsInUBO; /**< Flat array that indexes all variables from UBO */
+   unsigned UBOVariableCount;
    struct gl_program_parameter_list *Varying;
    GLboolean LinkStatus;   /**< GL_LINK_STATUS */
    GLboolean Validated;
@@ -2219,6 +2262,11 @@ struct gl_shader_program
     * \c NULL.
     */
    struct gl_shader *_LinkedShaders[MESA_SHADER_TYPES];
+   /**
+    * Program scope Uniform Buffer Object
+    */
+   struct ubo* UniformBufferObject[MAX_UBO_IN_SHADER];
+   unsigned UBOCount;
 };   
 
 
@@ -3285,6 +3333,9 @@ struct gl_context
    struct gl_pixelstore_attrib	DefaultPacking;	/**< Default params */
    /*@}*/
 
+   /** \name Attributes for UBO */
+   struct gl_ubo_attribs UniformBufferObject;
+
    /** \name Other assorted state (not pushed/popped on attribute stack) */
    /*@{*/
    struct gl_pixelmaps          PixelMaps;
diff --git a/src/mesa/main/shaderobj.c b/src/mesa/main/shaderobj.c
index f128648..a98fef7 100644
--- a/src/mesa/main/shaderobj.c
+++ b/src/mesa/main/shaderobj.c
@@ -123,8 +123,18 @@ _mesa_new_shader(struct gl_context *ctx, GLuint name, GLenum type)
 static void
 _mesa_delete_shader(struct gl_context *ctx, struct gl_shader *sh)
 {
+   unsigned i,j;
    if (sh->Source)
       free((void *) sh->Source);
+   for (i = 0; i < sh->UBOCount; i++) {
+      free(sh->UniformBufferObjects[i].Name);
+      for (j = 0; j < sh->UniformBufferObjects[i].NumberOfVariables;j++) {
+         free(sh->UniformBufferObjects[i].StorageLayout[j].Name);
+      }
+      free(sh->UniformBufferObjects[i].StorageLayout);
+   }
+   if(sh->UniformBufferObjects)
+      free(sh->UniformBufferObjects);
    _mesa_reference_program(ctx, &sh->Program, NULL);
    ralloc_free(sh);
 }
diff --git a/src/mesa/program/prog_uniform.h b/src/mesa/program/prog_uniform.h
index 67f7800..cf00410 100644
--- a/src/mesa/program/prog_uniform.h
+++ b/src/mesa/program/prog_uniform.h
@@ -52,6 +52,7 @@ struct gl_uniform
    GLint GeomPos;
    GLboolean Initialized;   /**< For debug.  Has this uniform been set? */
    const struct glsl_type *Type;
+   struct UBOVariableInfo* UBOInformation;
 };
 
 
-- 
1.7.6.4



More information about the mesa-dev mailing list