1 /*
2  * Copyright © 2018 Intel Corporation
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21  * DEALINGS IN THE SOFTWARE.
22  */
23 
24 #ifndef GLSL_LINKER_UTIL_H
25 #define GLSL_LINKER_UTIL_H
26 
27 #include "util/bitset.h"
28 #include "compiler/glsl/list.h"
29 
30 struct gl_constants;
31 struct gl_shader_program;
32 struct gl_uniform_storage;
33 
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37 
38 /**
39  * Sometimes there are empty slots left over in UniformRemapTable after we
40  * allocate slots to explicit locations. This struct represents a single
41  * continouous block of empty slots in UniformRemapTable.
42  */
43 struct empty_uniform_block {
44    struct exec_node link;
45    /* The start location of the block */
46    unsigned start;
47    /* The number of slots in the block */
48    unsigned slots;
49 };
50 
51 /**
52  * Describes an access of an array element or an access of the whole array
53  */
54 struct array_deref_range {
55    /**
56     * Index that was accessed.
57     *
58     * All valid array indices are less than the size of the array.  If index
59     * is equal to the size of the array, this means the entire array has been
60     * accessed (e.g., due to use of a non-constant index).
61     */
62    unsigned index;
63 
64    /** Size of the array.  Used for offset calculations. */
65    unsigned size;
66 };
67 
68 void
69 linker_error(struct gl_shader_program *prog, const char *fmt, ...);
70 
71 void
72 linker_warning(struct gl_shader_program *prog, const char *fmt, ...);
73 
74 bool
75 link_util_should_add_buffer_variable(struct gl_shader_program *prog,
76                                      struct gl_uniform_storage *uniform,
77                                      int top_level_array_base_offset,
78                                      int top_level_array_size_in_bytes,
79                                      int second_element_offset,
80                                      int block_index);
81 
82 bool
83 link_util_add_program_resource(struct gl_shader_program *prog,
84                                struct set *resource_set,
85                                GLenum type, const void *data, uint8_t stages);
86 
87 int
88 link_util_find_empty_block(struct gl_shader_program *prog,
89                            struct gl_uniform_storage *uniform);
90 
91 void
92 link_util_update_empty_uniform_locations(struct gl_shader_program *prog);
93 
94 void
95 link_util_check_subroutine_resources(struct gl_shader_program *prog);
96 
97 void
98 link_util_check_uniform_resources(const struct gl_constants *consts,
99                                   struct gl_shader_program *prog);
100 
101 void
102 link_util_calculate_subroutine_compat(struct gl_shader_program *prog);
103 
104 void
105 link_util_mark_array_elements_referenced(const struct array_deref_range *dr,
106                                          unsigned count, unsigned array_depth,
107                                          BITSET_WORD *bits);
108 
109 #ifdef __cplusplus
110 }
111 #endif
112 
113 #endif /* GLSL_LINKER_UTIL_H */
114