v2:Big cleanup of data structures used v3:Data structures moved to mtypes.h --- src/mesa/main/config.h | 4 ++ src/mesa/main/mtypes.h | 109 +++++++++++++++++++++++++++++++++++++ src/mesa/main/shaderobj.c | 25 ++++++++- src/mesa/program/prog_parameter.h | 1 + 4 files changed, 138 insertions(+), 1 deletions(-)
diff --git a/src/mesa/main/config.h b/src/mesa/main/config.h index 7b7740e..1c4c810 100644 --- a/src/mesa/main/config.h +++ b/src/mesa/main/config.h @@ -357,5 +357,9 @@ */ #define MAX_CLIPPED_VERTICES ((2 * (6 + MAX_CLIP_PLANES))+1) +/** + * UBO Variables + */ +#define MAX_UBO_COUNT 8 #endif /* MESA_CONFIG_H_INCLUDED */ diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 08cd80a..654ae98 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -1653,6 +1653,14 @@ struct gl_array_attrib struct gl_buffer_object *ArrayBufferObj; }; +/** + * UBO state + */ +struct gl_ubo_attribs +{ + struct gl_buffer_object *UniformObj; + struct gl_buffer_object *BindingPoint[MAX_UBO_COUNT]; +}; /** * Feedback buffer state @@ -2127,6 +2135,82 @@ struct gl_sl_pragmas GLboolean Debug; /**< defaults off */ }; +/** + * Uniform Buffer Object variable informations. + * This come in 2 flavors : + * As layout informations (Size,Offset,...) are defined per program and not per shader, + * shaders_ubo_variable only store the relevant information to preserve memory. + * program_ubo_variable stores everything that can be retrieved by GetActiveUniformsiv + * (which makes it bigger than the data it refers to...). + */ + +struct gl_shader_ubo_variable +{ + char* Name; + const struct glsl_type* Type; +}; + +struct gl_program_ubo_variable +{ + char* Name; + GLenum Type; /** TYPE_ARRAY,TYPE_RECORD,TYPE_FLOAT,TYPE_VEC */ + GLuint Size; /** In bytes */ + GLuint Offset; /** In bytes, from start of UBO */ + GLuint Stride; /** In TYPE_ARRAY case, stride between 2 consecutive elements, undef otherwise */ + GLuint IndexInUBO; /** Position inside UBO declaration */ + GLuint ContainedVariablesCount; /** For TYPE_ARRAY and TYPE_RECORD, number of element in ContainedVariables */ + struct gl_program_ubo_variable* ContainedVariables; /** For TYPE_ARRAY and TYPE_RECORD, array holding child data */ + struct gl_uniform_buffer_object* UBO; /** Pointer to containing UBO structure inside program */ +}; + + +/** + * glsl_base_type doesn't have a VEC type, + * we have to define our own enum here + * FIXME:investigate if glsl_base_type can accept another item ? + */ +enum { + TYPE_ARRAY, + TYPE_RECORD, + TYPE_SCALAR, + TYPE_VEC, +}; + +enum UBOLayout { + UBO_LAYOUT_PACKED, + UBO_LAYOUT_SHARED, + UBO_LAYOUT_SDT140, +}; + +enum UBOMatrixLayout { + UBO_MATRIX_LAYOUT_ROW_MAJOR, + UBO_MATRIX_LAYOUT_COLUMN_MAJOR, +}; + +/** + * Uniform Buffer Object Information. + * This struct is used by shader and program struct ; + * For StorageLayout, Compact form is used in shader, + * Full form is used in program. + */ + +struct gl_uniform_buffer_object +{ + char* Name; + GLuint Index; + union { + struct gl_program_ubo_variable* Full; /** Malloced, sefined in program */ + struct gl_shader_ubo_variable* Compact; /** Ralloced, defined in shader */ + } StorageLayout; /** array of variables that are part of the UBO */ + GLuint Layout; /** packed, shared or std140 */ + GLuint MatrixLayout; /** rowmajor or columnmajor */ + GLuint NumberOfVariables; /**< number of UBOVariableInfo in StorageLayout */ + unsigned ReferencedByVS:1; /** Is it present in VS ? Set at link time */ + unsigned ReferencedByGS:1; /** Is it present in GS ? Set at link time */ + unsigned ReferencedByFS:1; /** Is it present in FS ? Set at link time */ + unsigned Size; /** In bytes, with padding included */ +}; + /** * A GLSL vertex or fragment shader object. @@ -2162,6 +2246,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 gl_uniform_buffer_object* UniformBufferObjects; + unsigned UBOCount; }; @@ -2275,6 +2361,26 @@ struct gl_shader_program * \c NULL. */ struct gl_shader *_LinkedShaders[MESA_SHADER_TYPES]; + /** + * Program Scope UBO + */ + struct gl_uniform_buffer_object *UniformBufferObject; + unsigned UBOCount; + + /** All uniforms (in UBO or not) have to be accessed by a 1D index ; + * For classical uniform, index equals location (matches others drivers) + * For variables in UBO, we use an array of gl_ubo_variable* pointing to + * structures already stored inside program's + * gl_uniform_buffer_object.StorageLayout.Full + */ + GLuint IndexedVariableCount; + struct gl_program_ubo_variable** IndexedUBOVariables; /** 1D array of pointers */ + /** String to GLuint hashtable, provides a quick access to (moreless) variable + * index from its name. + * To leave NULL/index 0 ambiguity, it does not really store a variable's index, + * but variable's index + 1 instead. + */ + struct string_to_uint_map* NamedAccessUBOVariables; }; @@ -3299,6 +3405,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 454007f..caeed31 100644 --- a/src/mesa/main/shaderobj.c +++ b/src/mesa/main/shaderobj.c @@ -110,6 +110,7 @@ _mesa_new_shader(struct gl_context *ctx, GLuint name, GLenum type) if (shader) { shader->Type = type; shader->Name = name; + shader->UBOCount = 0; _mesa_init_shader(ctx, shader); } return shader; @@ -296,6 +297,17 @@ _mesa_clear_shader_program_data(struct gl_context *ctx, shProg->InfoLog = ralloc_strdup(shProg, ""); } +static void +recursive_free_ubo(struct gl_program_ubo_variable* ubovar) +{ + unsigned i; + for (i = 0; i < ubovar->ContainedVariablesCount;i++) { + recursive_free_ubo(&(ubovar->ContainedVariables[i])); + } + free(ubovar->Name); + if (ubovar->ContainedVariablesCount) + free(ubovar->ContainedVariables); +} /** * Free all the data that hangs off a shader program object, but not the @@ -305,7 +317,7 @@ void _mesa_free_shader_program_data(struct gl_context *ctx, struct gl_shader_program *shProg) { - GLuint i; + GLuint i,j; gl_shader_type sh; assert(shProg->Type == GL_SHADER_PROGRAM_MESA); @@ -348,6 +360,17 @@ _mesa_free_shader_program_data(struct gl_context *ctx, shProg->_LinkedShaders[sh] = NULL; } } + + for (i = 0; i < shProg->UBOCount; i++) { + free(shProg->UniformBufferObject[i].Name); + for (j = 0; j < shProg->UniformBufferObject[i].NumberOfVariables;j++) { + recursive_free_ubo(&(shProg->UniformBufferObject[i].StorageLayout.Full[j])); + } + } + + if (shProg->UBOCount) + free(shProg->UniformBufferObject); + shProg->UBOCount = 0; } diff --git a/src/mesa/program/prog_parameter.h b/src/mesa/program/prog_parameter.h index 3c6dc8c..9266861 100644 --- a/src/mesa/program/prog_parameter.h +++ b/src/mesa/program/prog_parameter.h @@ -100,6 +100,7 @@ struct gl_program_parameter_list gl_constant_value (*ParameterValues)[4]; /**< Array [Size] of constant[4] */ GLbitfield StateFlags; /**< _NEW_* flags indicating which state changes might invalidate ParameterValues[] */ + GLuint NumUBO; /** Number of UBO in the program */ }; -- 1.7.7 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev