X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fcompiler%2Fglsl%2Flinker.h;h=037b0ef47251aa25c27e7b550c125bb8344b09be;hb=9b577f2a887968483b88b629673d3f9904a179ff;hp=5cec121e63468d527f32efdadd2805dd8d8c9d4f;hpb=4c2422067b5c114977d228b38ee95077cd55b7e9;p=mesa.git diff --git a/src/compiler/glsl/linker.h b/src/compiler/glsl/linker.h index 5cec121e634..037b0ef4725 100644 --- a/src/compiler/glsl/linker.h +++ b/src/compiler/glsl/linker.h @@ -25,6 +25,12 @@ #ifndef GLSL_LINKER_H #define GLSL_LINKER_H +#include "linker_util.h" + +struct gl_shader_program; +struct gl_shader; +struct gl_linked_shader; + extern bool link_function_calls(gl_shader_program *prog, gl_linked_shader *main, gl_shader **shader_list, unsigned num_shaders); @@ -59,7 +65,8 @@ link_uniform_blocks(void *mem_ctx, bool validate_intrastage_arrays(struct gl_shader_program *prog, ir_variable *const var, - ir_variable *const existing); + ir_variable *const existing, + bool match_precision = true); void validate_intrastage_interface_blocks(struct gl_shader_program *prog, @@ -92,6 +99,10 @@ link_intrastage_shaders(void *mem_ctx, unsigned num_shaders, bool allow_missing_main); +extern unsigned +link_calculate_matrix_stride(const glsl_type *matrix, bool row_major, + enum glsl_interface_packing packing); + /** * Class for processing all of the leaf fields of a variable that corresponds * to a program resource. @@ -124,6 +135,26 @@ public: */ void process(ir_variable *var, bool use_std430_as_default); + /** + * Begin processing a variable + * + * Classes that overload this function should call \c ::process from the + * base class to start the recursive processing of the variable. + * + * \param var The variable that is to be processed + * \param var_type The glsl_type reference of the variable + * + * Calls \c ::visit_field for each leaf of the variable. + * + * \warning + * When processing a uniform block, this entry should only be used in cases + * where the row / column ordering of matrices in the block does not + * matter. For example, enumerating the names of members of the block, but + * not for determining the offsets of members. + */ + void process(ir_variable *var, const glsl_type *var_type, + bool use_std430_as_default); + /** * Begin processing a variable of a structured type. * @@ -159,16 +190,6 @@ protected: const enum glsl_interface_packing packing, bool last_field) = 0; - /** - * Visit a record before visiting its fields - * - * For structures-of-structures or interfaces-of-structures, this visits - * the inner structure before visiting its fields. - * - * The default implementation does nothing. - */ - virtual void visit_field(const glsl_struct_field *field); - virtual void enter_record(const glsl_type *type, const char *name, bool row_major, const enum glsl_interface_packing packing); @@ -194,23 +215,4 @@ private: const glsl_struct_field *named_ifc_member); }; -void -linker_error(gl_shader_program *prog, const char *fmt, ...); - -void -linker_warning(gl_shader_program *prog, const char *fmt, ...); - -/** - * Sometimes there are empty slots left over in UniformRemapTable after we - * allocate slots to explicit locations. This struct represents a single - * continouous block of empty slots in UniformRemapTable. - */ -struct empty_uniform_block { - struct exec_node link; - /* The start location of the block */ - unsigned start; - /* The number of slots in the block */ - unsigned slots; -}; - #endif /* GLSL_LINKER_H */