1 /*
2  * Copyright © 2013 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 /**
25  * \file link_interface_blocks.cpp
26  * Linker support for GLSL's interface blocks.
27  */
28 
29 #include "ir.h"
30 #include "glsl_symbol_table.h"
31 #include "linker.h"
32 #include "main/macros.h"
33 #include "main/mtypes.h"
34 #include "util/hash_table.h"
35 #include "util/u_string.h"
36 
37 
38 namespace {
39 
40 /**
41  * Return true if interface members mismatch and its not allowed by GLSL.
42  */
43 static bool
interstage_member_mismatch(struct gl_shader_program * prog,const glsl_type * c,const glsl_type * p)44 interstage_member_mismatch(struct gl_shader_program *prog,
45                            const glsl_type *c, const glsl_type *p) {
46 
47    if (c->length != p->length)
48       return true;
49 
50    for (unsigned i = 0; i < c->length; i++) {
51       if (c->fields.structure[i].type != p->fields.structure[i].type)
52          return true;
53       if (strcmp(c->fields.structure[i].name,
54                  p->fields.structure[i].name) != 0)
55          return true;
56       if (c->fields.structure[i].location !=
57           p->fields.structure[i].location)
58          return true;
59       if (c->fields.structure[i].component !=
60           p->fields.structure[i].component)
61          return true;
62       if (c->fields.structure[i].patch !=
63           p->fields.structure[i].patch)
64          return true;
65 
66       /* From Section 4.5 (Interpolation Qualifiers) of the GLSL 4.40 spec:
67        *
68        *    "It is a link-time error if, within the same stage, the
69        *    interpolation qualifiers of variables of the same name do not
70        *    match."
71        */
72       if (prog->IsES || prog->data->Version < 440)
73          if (c->fields.structure[i].interpolation !=
74              p->fields.structure[i].interpolation)
75             return true;
76 
77       /* From Section 4.3.4 (Input Variables) of the GLSL ES 3.0 spec:
78        *
79        *    "The output of the vertex shader and the input of the fragment
80        *    shader form an interface.  For this interface, vertex shader
81        *    output variables and fragment shader input variables of the same
82        *    name must match in type and qualification (other than precision
83        *    and out matching to in).
84        *
85        * The table in Section 9.2.1 Linked Shaders of the GLSL ES 3.1 spec
86        * says that centroid no longer needs to match for varyings.
87        *
88        * The table in Section 9.2.1 Linked Shaders of the GLSL ES 3.2 spec
89        * says that sample need not match for varyings.
90        */
91       if (!prog->IsES || prog->data->Version < 310)
92          if (c->fields.structure[i].centroid !=
93              p->fields.structure[i].centroid)
94             return true;
95       if (!prog->IsES)
96          if (c->fields.structure[i].sample !=
97              p->fields.structure[i].sample)
98             return true;
99    }
100 
101    return false;
102 }
103 
104 /**
105  * Check if two interfaces match, according to intrastage interface matching
106  * rules.  If they do, and the first interface uses an unsized array, it will
107  * be updated to reflect the array size declared in the second interface.
108  */
109 bool
intrastage_match(ir_variable * a,ir_variable * b,struct gl_shader_program * prog,bool match_precision)110 intrastage_match(ir_variable *a,
111                  ir_variable *b,
112                  struct gl_shader_program *prog,
113                  bool match_precision)
114 {
115    /* From section 4.7 "Precision and Precision Qualifiers" in GLSL 4.50:
116     *
117     *    "For the purposes of determining if an output from one shader
118     *    stage matches an input of the next stage, the precision qualifier
119     *    need not match."
120     */
121    bool interface_type_match =
122       (prog->IsES ?
123        a->get_interface_type() == b->get_interface_type() :
124        a->get_interface_type()->compare_no_precision(b->get_interface_type()));
125 
126    /* Types must match. */
127    if (!interface_type_match) {
128       /* Exception: if both the interface blocks are implicitly declared,
129        * don't force their types to match.  They might mismatch due to the two
130        * shaders using different GLSL versions, and that's ok.
131        */
132       if ((a->data.how_declared != ir_var_declared_implicitly ||
133            b->data.how_declared != ir_var_declared_implicitly) &&
134           (!prog->IsES ||
135            interstage_member_mismatch(prog, a->get_interface_type(),
136                                       b->get_interface_type())))
137          return false;
138    }
139 
140    /* Presence/absence of interface names must match. */
141    if (a->is_interface_instance() != b->is_interface_instance())
142       return false;
143 
144    /* For uniforms, instance names need not match.  For shader ins/outs,
145     * it's not clear from the spec whether they need to match, but
146     * Mesa's implementation relies on them matching.
147     */
148    if (a->is_interface_instance() && b->data.mode != ir_var_uniform &&
149        b->data.mode != ir_var_shader_storage &&
150        strcmp(a->name, b->name) != 0) {
151       return false;
152    }
153 
154    bool type_match = (match_precision ?
155                       a->type == b->type :
156                       a->type->compare_no_precision(b->type));
157 
158    /* If a block is an array then it must match across the shader.
159     * Unsized arrays are also processed and matched agaist sized arrays.
160     */
161    if (!type_match && (b->type->is_array() || a->type->is_array()) &&
162        (b->is_interface_instance() || a->is_interface_instance()) &&
163        !validate_intrastage_arrays(prog, b, a, match_precision))
164       return false;
165 
166    return true;
167 }
168 
169 /**
170  * Check if two interfaces match, according to interstage (in/out) interface
171  * matching rules.
172  *
173  * If \c extra_array_level is true, the consumer interface is required to be
174  * an array and the producer interface is required to be a non-array.
175  * This is used for tessellation control and geometry shader consumers.
176  */
177 static bool
interstage_match(struct gl_shader_program * prog,ir_variable * producer,ir_variable * consumer,bool extra_array_level)178 interstage_match(struct gl_shader_program *prog, ir_variable *producer,
179                  ir_variable *consumer, bool extra_array_level)
180 {
181    /* Types must match. */
182    if (consumer->get_interface_type() != producer->get_interface_type()) {
183       /* Exception: if both the interface blocks are implicitly declared,
184        * don't force their types to match.  They might mismatch due to the two
185        * shaders using different GLSL versions, and that's ok.
186        *
187        * Also we store some member information such as interpolation in
188        * glsl_type that doesn't always have to match across shader stages.
189        * Therefore we make a pass over the members glsl_struct_field to make
190        * sure we don't reject shaders where fields don't need to match.
191        */
192       if ((consumer->data.how_declared != ir_var_declared_implicitly ||
193            producer->data.how_declared != ir_var_declared_implicitly) &&
194           interstage_member_mismatch(prog, consumer->get_interface_type(),
195                                      producer->get_interface_type()))
196          return false;
197    }
198 
199    /* Ignore outermost array if geom shader */
200    const glsl_type *consumer_instance_type;
201    if (extra_array_level) {
202       consumer_instance_type = consumer->type->fields.array;
203    } else {
204       consumer_instance_type = consumer->type;
205    }
206 
207    /* If a block is an array then it must match across shaders.
208     * Since unsized arrays have been ruled out, we can check this by just
209     * making sure the types are equal.
210     */
211    if ((consumer->is_interface_instance() &&
212         consumer_instance_type->is_array()) ||
213        (producer->is_interface_instance() &&
214         producer->type->is_array())) {
215       if (consumer_instance_type != producer->type)
216          return false;
217    }
218 
219    return true;
220 }
221 
222 
223 /**
224  * This class keeps track of a mapping from an interface block name to the
225  * necessary information about that interface block to determine whether to
226  * generate a link error.
227  *
228  * Note: this class is expected to be short lived, so it doesn't make copies
229  * of the strings it references; it simply borrows the pointers from the
230  * ir_variable class.
231  */
232 class interface_block_definitions
233 {
234 public:
interface_block_definitions()235    interface_block_definitions()
236       : mem_ctx(ralloc_context(NULL)),
237         ht(_mesa_hash_table_create(NULL, _mesa_hash_string,
238                                    _mesa_key_string_equal))
239    {
240    }
241 
~interface_block_definitions()242    ~interface_block_definitions()
243    {
244       ralloc_free(mem_ctx);
245       _mesa_hash_table_destroy(ht, NULL);
246    }
247 
248    /**
249     * Lookup the interface definition. Return NULL if none is found.
250     */
lookup(ir_variable * var)251    ir_variable *lookup(ir_variable *var)
252    {
253       if (var->data.explicit_location &&
254           var->data.location >= VARYING_SLOT_VAR0) {
255          char location_str[11];
256          snprintf(location_str, 11, "%d", var->data.location);
257 
258          const struct hash_entry *entry =
259             _mesa_hash_table_search(ht, location_str);
260          return entry ? (ir_variable *) entry->data : NULL;
261       } else {
262          const struct hash_entry *entry =
263             _mesa_hash_table_search(ht,
264                var->get_interface_type()->without_array()->name);
265          return entry ? (ir_variable *) entry->data : NULL;
266       }
267    }
268 
269    /**
270     * Add a new interface definition.
271     */
store(ir_variable * var)272    void store(ir_variable *var)
273    {
274       if (var->data.explicit_location &&
275           var->data.location >= VARYING_SLOT_VAR0) {
276          /* If explicit location is given then lookup the variable by location.
277           * We turn the location into a string and use this as the hash key
278           * rather than the name. Note: We allocate enough space for a 32-bit
279           * unsigned location value which is overkill but future proof.
280           */
281          char location_str[11];
282          snprintf(location_str, 11, "%d", var->data.location);
283          _mesa_hash_table_insert(ht, ralloc_strdup(mem_ctx, location_str), var);
284       } else {
285          _mesa_hash_table_insert(ht,
286             var->get_interface_type()->without_array()->name, var);
287       }
288    }
289 
290 private:
291    /**
292     * Ralloc context for data structures allocated by this class.
293     */
294    void *mem_ctx;
295 
296    /**
297     * Hash table mapping interface block name to an \c
298     * ir_variable.
299     */
300    hash_table *ht;
301 };
302 
303 
304 }; /* anonymous namespace */
305 
306 
307 void
validate_intrastage_interface_blocks(struct gl_shader_program * prog,const gl_shader ** shader_list,unsigned num_shaders)308 validate_intrastage_interface_blocks(struct gl_shader_program *prog,
309                                      const gl_shader **shader_list,
310                                      unsigned num_shaders)
311 {
312    interface_block_definitions in_interfaces;
313    interface_block_definitions out_interfaces;
314    interface_block_definitions uniform_interfaces;
315    interface_block_definitions buffer_interfaces;
316 
317    for (unsigned int i = 0; i < num_shaders; i++) {
318       if (shader_list[i] == NULL)
319          continue;
320 
321       foreach_in_list(ir_instruction, node, shader_list[i]->ir) {
322          ir_variable *var = node->as_variable();
323          if (!var)
324             continue;
325 
326          const glsl_type *iface_type = var->get_interface_type();
327 
328          if (iface_type == NULL)
329             continue;
330 
331          interface_block_definitions *definitions;
332          switch (var->data.mode) {
333          case ir_var_shader_in:
334             definitions = &in_interfaces;
335             break;
336          case ir_var_shader_out:
337             definitions = &out_interfaces;
338             break;
339          case ir_var_uniform:
340             definitions = &uniform_interfaces;
341             break;
342          case ir_var_shader_storage:
343             definitions = &buffer_interfaces;
344             break;
345          default:
346             /* Only in, out, and uniform interfaces are legal, so we should
347              * never get here.
348              */
349             assert(!"illegal interface type");
350             continue;
351          }
352 
353          ir_variable *prev_def = definitions->lookup(var);
354          if (prev_def == NULL) {
355             /* This is the first time we've seen the interface, so save
356              * it into the appropriate data structure.
357              */
358             definitions->store(var);
359          } else if (!intrastage_match(prev_def, var, prog,
360                                       true /* match_precision */)) {
361             linker_error(prog, "definitions of interface block `%s' do not"
362                          " match\n", iface_type->name);
363             return;
364          }
365       }
366    }
367 }
368 
369 static bool
is_builtin_gl_in_block(ir_variable * var,int consumer_stage)370 is_builtin_gl_in_block(ir_variable *var, int consumer_stage)
371 {
372    return !strcmp(var->name, "gl_in") &&
373           (consumer_stage == MESA_SHADER_TESS_CTRL ||
374            consumer_stage == MESA_SHADER_TESS_EVAL ||
375            consumer_stage == MESA_SHADER_GEOMETRY);
376 }
377 
378 void
validate_interstage_inout_blocks(struct gl_shader_program * prog,const gl_linked_shader * producer,const gl_linked_shader * consumer)379 validate_interstage_inout_blocks(struct gl_shader_program *prog,
380                                  const gl_linked_shader *producer,
381                                  const gl_linked_shader *consumer)
382 {
383    interface_block_definitions definitions;
384    /* VS -> GS, VS -> TCS, VS -> TES, TES -> GS */
385    const bool extra_array_level = (producer->Stage == MESA_SHADER_VERTEX &&
386                                    consumer->Stage != MESA_SHADER_FRAGMENT) ||
387                                   consumer->Stage == MESA_SHADER_GEOMETRY;
388 
389    /* Check that block re-declarations of gl_PerVertex are compatible
390     * across shaders: From OpenGL Shading Language 4.5, section
391     * "7.1 Built-In Language Variables", page 130 of the PDF:
392     *
393     *    "If multiple shaders using members of a built-in block belonging
394     *     to the same interface are linked together in the same program,
395     *     they must all redeclare the built-in block in the same way, as
396     *     described in section 4.3.9 “Interface Blocks” for interface-block
397     *     matching, or a link-time error will result."
398     *
399     * This is done explicitly outside of iterating the member variable
400     * declarations because it is possible that the variables are not used and
401     * so they would have been optimised out.
402     */
403    const glsl_type *consumer_iface =
404       consumer->symbols->get_interface("gl_PerVertex",
405                                        ir_var_shader_in);
406 
407    const glsl_type *producer_iface =
408       producer->symbols->get_interface("gl_PerVertex",
409                                        ir_var_shader_out);
410 
411    if (producer_iface && consumer_iface &&
412        interstage_member_mismatch(prog, consumer_iface, producer_iface)) {
413       linker_error(prog, "Incompatible or missing gl_PerVertex re-declaration "
414                    "in consecutive shaders");
415       return;
416    }
417 
418    /* Desktop OpenGL requires redeclaration of the built-in interfaces for
419     * SSO programs. Passes above implement following rules:
420     *
421     * From Section 7.4 (Program Pipeline Objects) of the OpenGL 4.6 Core
422     * spec:
423     *
424     *    "To use any built-in input or output in the gl_PerVertex and
425     *     gl_PerFragment blocks in separable program objects, shader code
426     *     must redeclare those blocks prior to use.  A separable program
427     *     will fail to link if:
428     *
429     *     it contains multiple shaders of a single type with different
430     *     redeclarations of these built-in input and output blocks; or
431     *
432     *     any shader uses a built-in block member not found in the
433     *     redeclaration of that block."
434     *
435     * ARB_separate_shader_objects issues section (issue #28) states that
436     * redeclaration is not required for GLSL shaders using #version 140 or
437     * earlier (since interface blocks are not possible with older versions).
438     *
439     * From Section 7.4.1 (Shader Interface Matching) of the OpenGL ES 3.1
440     * spec:
441     *
442     *    "Built-in inputs or outputs do not affect interface matching."
443     *
444     * GL_OES_shader_io_blocks adds following:
445     *
446     *    "When using any built-in input or output in the gl_PerVertex block
447     *     in separable program objects, shader code may redeclare that block
448     *     prior to use. If the shader does not redeclare the block, the
449     *     intrinsically declared definition of that block will be used."
450     */
451 
452    /* Add output interfaces from the producer to the symbol table. */
453    foreach_in_list(ir_instruction, node, producer->ir) {
454       ir_variable *var = node->as_variable();
455       if (!var || !var->get_interface_type() || var->data.mode != ir_var_shader_out)
456          continue;
457 
458       /* Built-in interface redeclaration check. */
459       if (prog->SeparateShader && !prog->IsES && prog->data->Version >= 150 &&
460           var->data.how_declared == ir_var_declared_implicitly &&
461           var->data.used && !producer_iface) {
462          linker_error(prog, "missing output builtin block %s redeclaration "
463                       "in separable shader program",
464                       var->get_interface_type()->name);
465          return;
466       }
467 
468       definitions.store(var);
469    }
470 
471    /* Verify that the consumer's input interfaces match. */
472    foreach_in_list(ir_instruction, node, consumer->ir) {
473       ir_variable *var = node->as_variable();
474       if (!var || !var->get_interface_type() || var->data.mode != ir_var_shader_in)
475          continue;
476 
477       ir_variable *producer_def = definitions.lookup(var);
478 
479       /* Built-in interface redeclaration check. */
480       if (prog->SeparateShader && !prog->IsES && prog->data->Version >= 150 &&
481           var->data.how_declared == ir_var_declared_implicitly &&
482           var->data.used && !producer_iface) {
483          linker_error(prog, "missing input builtin block %s redeclaration "
484                       "in separable shader program",
485                       var->get_interface_type()->name);
486          return;
487       }
488 
489       /* The producer doesn't generate this input: fail to link. Skip built-in
490        * 'gl_in[]' since that may not be present if the producer does not
491        * write to any of the pre-defined outputs (e.g. if the vertex shader
492        * does not write to gl_Position, etc), which is allowed and results in
493        * undefined behavior.
494        *
495        * From Section 4.3.4 (Inputs) of the GLSL 1.50 spec:
496        *
497        *    "Only the input variables that are actually read need to be written
498        *     by the previous stage; it is allowed to have superfluous
499        *     declarations of input variables."
500        */
501       if (producer_def == NULL &&
502           !is_builtin_gl_in_block(var, consumer->Stage) && var->data.used) {
503          linker_error(prog, "Input block `%s' is not an output of "
504                       "the previous stage\n", var->get_interface_type()->name);
505          return;
506       }
507 
508       if (producer_def &&
509           !interstage_match(prog, producer_def, var, extra_array_level)) {
510          linker_error(prog, "definitions of interface block `%s' do not "
511                       "match\n", var->get_interface_type()->name);
512          return;
513       }
514    }
515 }
516 
517 
518 void
validate_interstage_uniform_blocks(struct gl_shader_program * prog,gl_linked_shader ** stages)519 validate_interstage_uniform_blocks(struct gl_shader_program *prog,
520                                    gl_linked_shader **stages)
521 {
522    interface_block_definitions definitions;
523 
524    for (int i = 0; i < MESA_SHADER_STAGES; i++) {
525       if (stages[i] == NULL)
526          continue;
527 
528       const gl_linked_shader *stage = stages[i];
529       foreach_in_list(ir_instruction, node, stage->ir) {
530          ir_variable *var = node->as_variable();
531          if (!var || !var->get_interface_type() ||
532              (var->data.mode != ir_var_uniform &&
533               var->data.mode != ir_var_shader_storage))
534             continue;
535 
536          ir_variable *old_def = definitions.lookup(var);
537          if (old_def == NULL) {
538             definitions.store(var);
539          } else {
540             /* Interstage uniform matching rules are the same as intrastage
541              * uniform matchin rules (for uniforms, it is as though all
542              * shaders are in the same shader stage).
543              */
544             if (!intrastage_match(old_def, var, prog, false /* precision */)) {
545                linker_error(prog, "definitions of uniform block `%s' do not "
546                             "match\n", var->get_interface_type()->name);
547                return;
548             }
549          }
550       }
551    }
552 }
553