Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5563 serge 1
/**************************************************************************
2
 *
3
 * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
4
 * All Rights Reserved.
5
 *
6
 * Permission is hereby granted, free of charge, to any person obtaining a
7
 * copy of this software and associated documentation files (the
8
 * "Software"), to deal in the Software without restriction, including
9
 * without limitation the rights to use, copy, modify, merge, publish,
10
 * distribute, sub license, and/or sell copies of the Software, and to
11
 * permit persons to whom the Software is furnished to do so, subject to
12
 * the following conditions:
13
 *
14
 * The above copyright notice and this permission notice (including the
15
 * next paragraph) shall be included in all copies or substantial portions
16
 * of the Software.
17
 *
18
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21
 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22
 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25
 *
26
 **************************************************************************/
27
 
28
 /*
29
  * Authors:
30
  *   Keith Whitwell 
31
  */
32
 
33
 
34
#ifndef ST_PROGRAM_H
35
#define ST_PROGRAM_H
36
 
37
#include "main/mtypes.h"
38
#include "program/program.h"
39
#include "pipe/p_state.h"
40
#include "st_context.h"
41
#include "st_glsl_to_tgsi.h"
42
 
43
 
44
/** Fragment program variant key */
45
struct st_fp_variant_key
46
{
47
   struct st_context *st;         /**< variants are per-context */
48
 
49
   /** for glBitmap */
50
   GLuint bitmap:1;               /**< glBitmap variant? */
51
 
52
   /** for glDrawPixels */
53
   GLuint drawpixels:1;           /**< glDrawPixels variant */
54
   GLuint scaleAndBias:1;         /**< glDrawPixels w/ scale and/or bias? */
55
   GLuint pixelMaps:1;            /**< glDrawPixels w/ pixel lookup map? */
56
   GLuint drawpixels_z:1;         /**< glDrawPixels(GL_DEPTH) */
57
   GLuint drawpixels_stencil:1;   /**< glDrawPixels(GL_STENCIL) */
58
 
59
   /** for ARB_color_buffer_float */
60
   GLuint clamp_color:1;
61
};
62
 
63
 
64
/**
65
 * Variant of a fragment program.
66
 */
67
struct st_fp_variant
68
{
69
   /** Parameters which generated this version of fragment program */
70
   struct st_fp_variant_key key;
71
 
72
   struct pipe_shader_state tgsi;
73
 
74
   /** Driver's compiled shader */
75
   void *driver_shader;
76
 
77
   /** For glBitmap variants */
78
   struct gl_program_parameter_list *parameters;
79
   uint bitmap_sampler;
80
 
81
   /** next in linked list */
82
   struct st_fp_variant *next;
83
};
84
 
85
 
86
/**
87
 * Derived from Mesa gl_fragment_program:
88
 */
89
struct st_fragment_program
90
{
91
   struct gl_fragment_program Base;
92
   struct glsl_to_tgsi_visitor* glsl_to_tgsi;
93
 
94
   struct st_fp_variant *variants;
95
};
96
 
97
 
98
 
99
/** Vertex program variant key */
100
struct st_vp_variant_key
101
{
102
   struct st_context *st;          /**< variants are per-context */
103
   boolean passthrough_edgeflags;
104
 
105
   /** for ARB_color_buffer_float */
106
   boolean clamp_color;
107
};
108
 
109
 
110
/**
111
 * This represents a vertex program, especially translated to match
112
 * the inputs of a particular fragment shader.
113
 */
114
struct st_vp_variant
115
{
116
   /* Parameters which generated this translated version of a vertex
117
    * shader:
118
    */
119
   struct st_vp_variant_key key;
120
 
121
   /**
122
    * TGSI tokens (to later generate a 'draw' module shader for
123
    * selection/feedback/rasterpos)
124
    */
125
   struct pipe_shader_state tgsi;
126
 
127
   /** Driver's compiled shader */
128
   void *driver_shader;
129
 
130
   /** For using our private draw module (glRasterPos) */
131
   struct draw_vertex_shader *draw_shader;
132
 
133
   /** Next in linked list */
134
   struct st_vp_variant *next;
135
 
136
   /** similar to that in st_vertex_program, but with edgeflags info too */
137
   GLuint num_inputs;
138
};
139
 
140
 
141
/**
142
 * Derived from Mesa gl_fragment_program:
143
 */
144
struct st_vertex_program
145
{
146
   struct gl_vertex_program Base;  /**< The Mesa vertex program */
147
   struct glsl_to_tgsi_visitor* glsl_to_tgsi;
148
 
149
   /** maps a Mesa VERT_ATTRIB_x to a packed TGSI input index */
150
   GLuint input_to_index[VERT_ATTRIB_MAX];
151
   /** maps a TGSI input index back to a Mesa VERT_ATTRIB_x */
152
   GLuint index_to_input[PIPE_MAX_SHADER_INPUTS];
153
   GLuint num_inputs;
154
 
155
   /** Maps VARYING_SLOT_x to slot */
156
   GLuint result_to_output[VARYING_SLOT_MAX];
157
   ubyte output_semantic_name[VARYING_SLOT_MAX];
158
   ubyte output_semantic_index[VARYING_SLOT_MAX];
159
   GLuint num_outputs;
160
 
161
   /** List of translated variants of this vertex program.
162
    */
163
   struct st_vp_variant *variants;
164
};
165
 
166
 
167
 
168
/** Geometry program variant key */
169
struct st_gp_variant_key
170
{
171
   struct st_context *st;          /**< variants are per-context */
172
   /* no other fields yet */
173
};
174
 
175
 
176
/**
177
 * Geometry program variant.
178
 */
179
struct st_gp_variant
180
{
181
   /* Parameters which generated this translated version of a vertex */
182
   struct st_gp_variant_key key;
183
 
184
   void *driver_shader;
185
 
186
   struct st_gp_variant *next;
187
};
188
 
189
 
190
/**
191
 * Derived from Mesa gl_geometry_program:
192
 */
193
struct st_geometry_program
194
{
195
   struct gl_geometry_program Base;  /**< The Mesa geometry program */
196
   struct glsl_to_tgsi_visitor* glsl_to_tgsi;
197
 
198
   /** map GP input back to VP output */
199
   GLuint input_map[PIPE_MAX_SHADER_INPUTS];
200
 
201
   /** maps a Mesa VARYING_SLOT_x to a packed TGSI input index */
202
   GLuint input_to_index[VARYING_SLOT_MAX];
203
   /** maps a TGSI input index back to a Mesa VARYING_SLOT_x */
204
   GLuint index_to_input[PIPE_MAX_SHADER_INPUTS];
205
 
206
   GLuint num_inputs;
207
 
208
   GLuint input_to_slot[VARYING_SLOT_MAX];  /**< Maps VARYING_SLOT_x to slot */
209
   GLuint num_input_slots;
210
 
211
   ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS];
212
   ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
213
 
214
   struct pipe_shader_state tgsi;
215
 
216
   struct st_gp_variant *variants;
217
};
218
 
219
 
220
 
221
static INLINE struct st_fragment_program *
222
st_fragment_program( struct gl_fragment_program *fp )
223
{
224
   return (struct st_fragment_program *)fp;
225
}
226
 
227
 
228
static INLINE struct st_vertex_program *
229
st_vertex_program( struct gl_vertex_program *vp )
230
{
231
   return (struct st_vertex_program *)vp;
232
}
233
 
234
static INLINE struct st_geometry_program *
235
st_geometry_program( struct gl_geometry_program *gp )
236
{
237
   return (struct st_geometry_program *)gp;
238
}
239
 
240
static INLINE void
241
st_reference_vertprog(struct st_context *st,
242
                      struct st_vertex_program **ptr,
243
                      struct st_vertex_program *prog)
244
{
245
   _mesa_reference_program(st->ctx,
246
                           (struct gl_program **) ptr,
247
                           (struct gl_program *) prog);
248
}
249
 
250
static INLINE void
251
st_reference_geomprog(struct st_context *st,
252
                      struct st_geometry_program **ptr,
253
                      struct st_geometry_program *prog)
254
{
255
   _mesa_reference_program(st->ctx,
256
                           (struct gl_program **) ptr,
257
                           (struct gl_program *) prog);
258
}
259
 
260
static INLINE void
261
st_reference_fragprog(struct st_context *st,
262
                      struct st_fragment_program **ptr,
263
                      struct st_fragment_program *prog)
264
{
265
   _mesa_reference_program(st->ctx,
266
                           (struct gl_program **) ptr,
267
                           (struct gl_program *) prog);
268
}
269
 
270
 
271
extern struct st_vp_variant *
272
st_get_vp_variant(struct st_context *st,
273
                  struct st_vertex_program *stvp,
274
                  const struct st_vp_variant_key *key);
275
 
276
 
277
extern struct st_fp_variant *
278
st_get_fp_variant(struct st_context *st,
279
                  struct st_fragment_program *stfp,
280
                  const struct st_fp_variant_key *key);
281
 
282
 
283
extern struct st_gp_variant *
284
st_get_gp_variant(struct st_context *st,
285
                  struct st_geometry_program *stgp,
286
                  const struct st_gp_variant_key *key);
287
 
288
 
289
extern void
290
st_prepare_vertex_program(struct gl_context *ctx,
291
                          struct st_vertex_program *stvp);
292
 
293
extern GLboolean
294
st_prepare_fragment_program(struct gl_context *ctx,
295
                            struct st_fragment_program *stfp);
296
 
297
 
298
extern void
299
st_release_vp_variants( struct st_context *st,
300
                        struct st_vertex_program *stvp );
301
 
302
extern void
303
st_release_fp_variants( struct st_context *st,
304
                        struct st_fragment_program *stfp );
305
 
306
extern void
307
st_release_gp_variants(struct st_context *st,
308
                       struct st_geometry_program *stgp);
309
 
310
 
311
extern void
312
st_print_shaders(struct gl_context *ctx);
313
 
314
extern void
315
st_destroy_program_variants(struct st_context *st);
316
 
317
 
318
extern void
319
st_print_current_vertex_program(void);
320
 
321
 
322
#endif