On 10/16/2011 04:37 PM, vlj wrote:
---
  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

This structure name isn't consistent with others. I'd call it gl_ubo_variable_info.


+{
+   char* Name;
+   const struct glsl_type* Type;
+   GLuint Offset;
+   GLuint Stride;

Offset and Stride fields should probably have comments to indicate what the units are (bytes or ???).


+   GLuint IndexInUBO;
+   struct ubo* UBO;
+};
+
+enum UBOLayout {
+   packed,
+   shared,
+   std140,
+};
+
+enum UBOMatrixLayout {
+   rowmajor,
+   columnmajor,
+};

Enum values should be in all caps and have some kind of prefix. For example:

enum gl_ubo_matrix_layout
{
   UBO_MATRIX_LAYOUT_ROW_MAJOR,
   UBO_MATRIX_LAYOUT_COLUMN_MAJOR
};

I know it's more typing, but it'll save time for all the people who will read this in the future.


+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;
+};


The struct above should have a comment explaining exactly what it is since it's not immediately obvious. Also, it should be called gl_ubo to be consistent.


+
  /**
   * 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)

Please put a space between 'if' and '('.


+      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;
  };



_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to