--- 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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev