* 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,
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,
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,
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.
* 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.
* \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:
/**
* \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);
*/
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 */