X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fcompiler%2Fglsl%2Flinker.h;h=037b0ef47251aa25c27e7b550c125bb8344b09be;hb=37c88c670f79f4833856e9193d3b7696c8b5ad8a;hp=a60bb6ed087fc2f87129e0bb58536238d1876036;hpb=65dfb3048e8291675ca33581aeff8921f7ea509d;p=mesa.git diff --git a/src/compiler/glsl/linker.h b/src/compiler/glsl/linker.h index a60bb6ed087..037b0ef4725 100644 --- a/src/compiler/glsl/linker.h +++ b/src/compiler/glsl/linker.h @@ -22,22 +22,25 @@ * DEALINGS IN THE SOFTWARE. */ -#pragma once #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_shader *main, - gl_shader **shader_list, unsigned num_shaders); +link_function_calls(gl_shader_program *prog, gl_linked_shader *main, + gl_shader **shader_list, unsigned num_shaders); extern void link_invalidate_variable_locations(exec_list *ir); extern void link_assign_uniform_locations(struct gl_shader_program *prog, - unsigned int boolean_true, - unsigned int num_explicit_uniform_locs, - unsigned int max_uniform_locs); + struct gl_context *ctx); extern void link_set_uniform_initializers(struct gl_shader_program *prog, @@ -45,26 +48,25 @@ link_set_uniform_initializers(struct gl_shader_program *prog, extern int link_cross_validate_uniform_block(void *mem_ctx, - struct gl_uniform_block **linked_blocks, - unsigned int *num_linked_blocks, - struct gl_uniform_block *new_block); - -extern bool -link_uniform_blocks_are_compatible(const gl_uniform_block *a, - const gl_uniform_block *b); + struct gl_uniform_block **linked_blocks, + unsigned int *num_linked_blocks, + struct gl_uniform_block *new_block); -extern unsigned +extern void link_uniform_blocks(void *mem_ctx, struct gl_context *ctx, struct gl_shader_program *prog, - struct gl_shader **shader_list, - unsigned num_shaders, - struct gl_uniform_block **blocks_ret); + struct gl_linked_shader *shader, + struct gl_uniform_block **ubo_blocks, + unsigned *num_ubo_blocks, + struct gl_uniform_block **ssbo_blocks, + unsigned *num_ssbo_blocks); 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, @@ -73,12 +75,12 @@ validate_intrastage_interface_blocks(struct gl_shader_program *prog, void validate_interstage_inout_blocks(struct gl_shader_program *prog, - const gl_shader *producer, - const gl_shader *consumer); + const gl_linked_shader *producer, + const gl_linked_shader *consumer); void validate_interstage_uniform_blocks(struct gl_shader_program *prog, - gl_shader **stages, int num_stages); + gl_linked_shader **stages); extern void link_assign_atomic_counter_resources(struct gl_context *ctx, @@ -88,6 +90,19 @@ extern void link_check_atomic_counter_resources(struct gl_context *ctx, struct gl_shader_program *prog); + +extern struct gl_linked_shader * +link_intrastage_shaders(void *mem_ctx, + struct gl_context *ctx, + struct gl_shader_program *prog, + struct gl_shader **shader_list, + 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. @@ -118,7 +133,27 @@ public: * matter. For example, enumerating the names of members of the block, but * not for determining the offsets of members. */ - void process(ir_variable *var); + 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. @@ -135,7 +170,8 @@ public: * \c type must be \c GLSL_TYPE_RECORD, \c GLSL_TYPE_INTERFACE, or an array * there of. */ - void process(const glsl_type *type, const char *name); + void process(const glsl_type *type, const char *name, + bool use_std430_as_default); protected: /** @@ -148,39 +184,19 @@ protected: * \param last_field Set if \c name is the last field of the structure * containing it. This will always be false for items * not contained in a structure or interface block. - * - * The default implementation just calls the other \c visit_field method. */ virtual void visit_field(const glsl_type *type, const char *name, bool row_major, const glsl_type *record_type, - const unsigned packing, - bool last_field); - - /** - * Method invoked for each leaf of the variable - * - * \param type Type of the field. - * \param name Fully qualified name of the field. - * \param row_major For a matrix type, is it stored row-major. - */ - virtual void visit_field(const glsl_type *type, const char *name, - bool row_major) = 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); + const enum glsl_interface_packing packing, + bool last_field) = 0; virtual void enter_record(const glsl_type *type, const char *name, - bool row_major, const unsigned packing); + bool row_major, const enum glsl_interface_packing packing); virtual void leave_record(const glsl_type *type, const char *name, - bool row_major, const unsigned packing); + bool row_major, const enum glsl_interface_packing packing); + + virtual void set_buffer_offset(unsigned offset); virtual void set_record_array_count(unsigned record_array_count); @@ -194,27 +210,9 @@ private: */ void recursion(const glsl_type *t, char **name, size_t name_length, bool row_major, const glsl_type *record_type, - const unsigned packing, - bool last_field, unsigned record_array_count); -}; - -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; + const enum glsl_interface_packing packing, + bool last_field, unsigned record_array_count, + const glsl_struct_field *named_ifc_member); }; #endif /* GLSL_LINKER_H */