Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4358 Serge 1
/*
2
 * Copyright © 2012 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
#pragma once
25
#ifndef GLSL_LINK_VARYINGS_H
26
#define GLSL_LINK_VARYINGS_H
27
 
28
/**
29
 * \file link_varyings.h
30
 *
31
 * Linker functions related specifically to linking varyings between shader
32
 * stages.
33
 */
34
 
35
 
36
#include "main/glheader.h"
37
 
38
 
39
struct gl_shader_program;
40
struct gl_shader;
41
class ir_variable;
42
 
43
 
44
/**
45
 * Data structure describing a varying which is available for use in transform
46
 * feedback.
47
 *
48
 * For example, if the vertex shader contains:
49
 *
50
 *     struct S {
51
 *       vec4 foo;
52
 *       float[3] bar;
53
 *     };
54
 *
55
 *     varying S[2] v;
56
 *
57
 * Then there would be tfeedback_candidate objects corresponding to the
58
 * following varyings:
59
 *
60
 *     v[0].foo
61
 *     v[0].bar
62
 *     v[1].foo
63
 *     v[1].bar
64
 */
65
struct tfeedback_candidate
66
{
67
   /**
68
    * Toplevel variable containing this varying.  In the above example, this
69
    * would point to the declaration of the varying v.
70
    */
71
   ir_variable *toplevel_var;
72
 
73
   /**
74
    * Type of this varying.  In the above example, this would point to the
75
    * glsl_type for "vec4" or "float[3]".
76
    */
77
   const glsl_type *type;
78
 
79
   /**
80
    * Offset within the toplevel variable where this varying occurs (counted
81
    * in multiples of the size of a float).
82
    */
83
   unsigned offset;
84
};
85
 
86
 
87
/**
88
 * Data structure tracking information about a transform feedback declaration
89
 * during linking.
90
 */
91
class tfeedback_decl
92
{
93
public:
94
   void init(struct gl_context *ctx, struct gl_shader_program *prog,
95
             const void *mem_ctx, const char *input);
96
   static bool is_same(const tfeedback_decl &x, const tfeedback_decl &y);
97
   bool assign_location(struct gl_context *ctx,
98
                        struct gl_shader_program *prog);
99
   unsigned get_num_outputs() const;
100
   bool store(struct gl_context *ctx, struct gl_shader_program *prog,
101
              struct gl_transform_feedback_info *info, unsigned buffer,
102
              const unsigned max_outputs) const;
103
   const tfeedback_candidate *find_candidate(gl_shader_program *prog,
104
                                             hash_table *tfeedback_candidates);
105
 
106
   bool is_next_buffer_separator() const
107
   {
108
      return this->next_buffer_separator;
109
   }
110
 
111
   bool is_varying() const
112
   {
113
      return !this->next_buffer_separator && !this->skip_components;
114
   }
115
 
116
   /**
117
    * The total number of varying components taken up by this variable.  Only
118
    * valid if assign_location() has been called.
119
    */
120
   unsigned num_components() const
121
   {
122
      if (this->is_clip_distance_mesa)
123
         return this->size;
124
      else
125
         return this->vector_elements * this->matrix_columns * this->size;
126
   }
127
 
128
   unsigned get_location() const {
129
      return this->location;
130
   }
131
 
132
private:
133
   /**
134
    * The name that was supplied to glTransformFeedbackVaryings.  Used for
135
    * error reporting and glGetTransformFeedbackVarying().
136
    */
137
   const char *orig_name;
138
 
139
   /**
140
    * The name of the variable, parsed from orig_name.
141
    */
142
   const char *var_name;
143
 
144
   /**
145
    * True if the declaration in orig_name represents an array.
146
    */
147
   bool is_subscripted;
148
 
149
   /**
150
    * If is_subscripted is true, the subscript that was specified in orig_name.
151
    */
152
   unsigned array_subscript;
153
 
154
   /**
155
    * True if the variable is gl_ClipDistance and the driver lowers
156
    * gl_ClipDistance to gl_ClipDistanceMESA.
157
    */
158
   bool is_clip_distance_mesa;
159
 
160
   /**
161
    * The vertex shader output location that the linker assigned for this
162
    * variable.  -1 if a location hasn't been assigned yet.
163
    */
164
   int location;
165
 
166
   /**
167
    * If non-zero, then this variable may be packed along with other variables
168
    * into a single varying slot, so this offset should be applied when
169
    * accessing components.  For example, an offset of 1 means that the x
170
    * component of this variable is actually stored in component y of the
171
    * location specified by \c location.
172
    *
173
    * Only valid if location != -1.
174
    */
175
   unsigned location_frac;
176
 
177
   /**
178
    * If location != -1, the number of vector elements in this variable, or 1
179
    * if this variable is a scalar.
180
    */
181
   unsigned vector_elements;
182
 
183
   /**
184
    * If location != -1, the number of matrix columns in this variable, or 1
185
    * if this variable is not a matrix.
186
    */
187
   unsigned matrix_columns;
188
 
189
   /** Type of the varying returned by glGetTransformFeedbackVarying() */
190
   GLenum type;
191
 
192
   /**
193
    * If location != -1, the size that should be returned by
194
    * glGetTransformFeedbackVarying().
195
    */
196
   unsigned size;
197
 
198
   /**
199
    * How many components to skip. If non-zero, this is
200
    * gl_SkipComponents{1,2,3,4} from ARB_transform_feedback3.
201
    */
202
   unsigned skip_components;
203
 
204
   /**
205
    * Whether this is gl_NextBuffer from ARB_transform_feedback3.
206
    */
207
   bool next_buffer_separator;
208
 
209
   /**
210
    * If find_candidate() has been called, pointer to the tfeedback_candidate
211
    * data structure that was found.  Otherwise NULL.
212
    */
213
   const tfeedback_candidate *matched_candidate;
214
};
215
 
216
 
217
bool
218
cross_validate_outputs_to_inputs(struct gl_shader_program *prog,
219
				 gl_shader *producer, gl_shader *consumer);
220
 
221
bool
222
parse_tfeedback_decls(struct gl_context *ctx, struct gl_shader_program *prog,
223
                      const void *mem_ctx, unsigned num_names,
224
                      char **varying_names, tfeedback_decl *decls);
225
 
226
bool
227
store_tfeedback_info(struct gl_context *ctx, struct gl_shader_program *prog,
228
                     unsigned num_tfeedback_decls,
229
                     tfeedback_decl *tfeedback_decls);
230
 
231
bool
232
assign_varying_locations(struct gl_context *ctx,
233
			 void *mem_ctx,
234
			 struct gl_shader_program *prog,
235
			 gl_shader *producer, gl_shader *consumer,
236
                         unsigned num_tfeedback_decls,
237
                         tfeedback_decl *tfeedback_decls);
238
 
239
bool
240
check_against_varying_limit(struct gl_context *ctx,
241
                            struct gl_shader_program *prog,
242
                            gl_shader *consumer);
243
 
244
#endif /* GLSL_LINK_VARYINGS_H */