Subversion Repositories shark

Rev

Rev 56 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
56 pj 1
/* $Id: m_vector.c,v 1.1 2003-02-28 11:48:05 pj Exp $ */
2
 
3
/*
4
 * Mesa 3-D graphics library
5
 * Version:  3.5
6
 *
7
 * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
8
 *
9
 * Permission is hereby granted, free of charge, to any person obtaining a
10
 * copy of this software and associated documentation files (the "Software"),
11
 * to deal in the Software without restriction, including without limitation
12
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13
 * and/or sell copies of the Software, and to permit persons to whom the
14
 * Software is furnished to do so, subject to the following conditions:
15
 *
16
 * The above copyright notice and this permission notice shall be included
17
 * in all copies or substantial portions of the Software.
18
 *
19
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25
 */
26
 
27
/*
28
 * New (3.1) transformation code written by Keith Whitwell.
29
 */
30
 
31
 
32
#include "glheader.h"
33
#include "imports.h"
34
#include "macros.h"
35
#include "imports.h"
36
 
37
#include "m_vector.h"
38
 
39
 
40
 
41
/*
42
 * Given a vector [count][4] of floats, set all the [][elt] values
43
 * to 0 (if elt = 0, 1, 2) or 1.0 (if elt = 3).
44
 */
45
void _mesa_vector4f_clean_elem( GLvector4f *vec, GLuint count, GLuint elt )
46
{
47
   static const GLubyte elem_bits[4] = {
48
      VEC_DIRTY_0,
49
      VEC_DIRTY_1,
50
      VEC_DIRTY_2,
51
      VEC_DIRTY_3
52
   };
53
   static const GLfloat clean[4] = { 0, 0, 0, 1 };
54
   const GLfloat v = clean[elt];
55
   GLfloat (*data)[4] = (GLfloat (*)[4])vec->start;
56
   GLuint i;
57
 
58
   for (i = 0 ; i < count ; i++)
59
      data[i][elt] = v;
60
 
61
   vec->flags &= ~elem_bits[elt];
62
}
63
 
64
static const GLubyte size_bits[5] = {
65
   0,
66
   VEC_SIZE_1,
67
   VEC_SIZE_2,
68
   VEC_SIZE_3,
69
   VEC_SIZE_4,
70
};
71
 
72
 
73
 
74
/*
75
 * Initialize GLvector objects.
76
 * Input: v - the vector object to initialize.
77
 *        flags - bitwise-OR of VEC_* flags
78
 *        storage - pointer to storage for the vector's data
79
 */
80
 
81
 
82
void _mesa_vector4f_init( GLvector4f *v, GLuint flags, GLfloat (*storage)[4] )
83
{
84
   v->stride = 4 * sizeof(GLfloat);
85
   v->size = 2;   /* may change: 2-4 for vertices and 1-4 for texcoords */
86
   v->data = storage;
87
   v->start = (GLfloat *) storage;
88
   v->count = 0;
89
   v->flags = size_bits[4] | flags ;
90
}
91
 
92
void _mesa_vector3f_init( GLvector3f *v, GLuint flags, GLfloat (*storage)[3] )
93
{
94
   v->stride = 3 * sizeof(GLfloat);
95
   v->data = storage;
96
   v->start = (GLfloat *) storage;
97
   v->count = 0;
98
   v->flags = flags ;
99
}
100
 
101
void _mesa_vector1f_init( GLvector1f *v, GLuint flags, GLfloat *storage )
102
{
103
   v->stride = 1*sizeof(GLfloat);
104
   v->data = storage;
105
   v->start = (GLfloat *)storage;
106
   v->count = 0;
107
   v->flags = flags ;
108
}
109
 
110
void _mesa_vector4ub_init( GLvector4ub *v, GLuint flags, GLubyte (*storage)[4] )
111
{
112
   v->stride = 4 * sizeof(GLubyte);
113
   v->data = storage;
114
   v->start = (GLubyte *) storage;
115
   v->count = 0;
116
   v->flags = flags ;
117
}
118
 
119
void _mesa_vector4chan_init( GLvector4chan *v, GLuint flags, GLchan (*storage)[4] )
120
{
121
   v->stride = 4 * sizeof(GLchan);
122
   v->data = storage;
123
   v->start = (GLchan *) storage;
124
   v->count = 0;
125
   v->flags = flags ;
126
}
127
 
128
void _mesa_vector4us_init( GLvector4us *v, GLuint flags, GLushort (*storage)[4] )
129
{
130
   v->stride = 4 * sizeof(GLushort);
131
   v->data = storage;
132
   v->start = (GLushort *) storage;
133
   v->count = 0;
134
   v->flags = flags ;
135
}
136
 
137
void _mesa_vector1ub_init( GLvector1ub *v, GLuint flags, GLubyte *storage )
138
{
139
   v->stride = 1 * sizeof(GLubyte);
140
   v->data = storage;
141
   v->start = (GLubyte *) storage;
142
   v->count = 0;
143
   v->flags = flags ;
144
}
145
 
146
void _mesa_vector1ui_init( GLvector1ui *v, GLuint flags, GLuint *storage )
147
{
148
   v->stride = 1 * sizeof(GLuint);
149
   v->data = storage;
150
   v->start = (GLuint *) storage;
151
   v->count = 0;
152
   v->flags = flags ;
153
}
154
 
155
 
156
/*
157
 * Initialize GLvector objects and allocate storage.
158
 * Input: v - the vector object
159
 *        sz - unused????
160
 *        flags - bitwise-OR of VEC_* flags
161
 *        count - number of elements to allocate in vector
162
 *        alignment - desired memory alignment for the data (in bytes)
163
 */
164
 
165
 
166
void _mesa_vector4f_alloc( GLvector4f *v, GLuint flags, GLuint count,
167
                        GLuint alignment )
168
{
169
   v->stride = 4 * sizeof(GLfloat);
170
   v->size = 2;
171
   v->storage = ALIGN_MALLOC( count * 4 * sizeof(GLfloat), alignment );
172
   v->start = (GLfloat *) v->storage;
173
   v->data = (GLfloat (*)[4]) v->storage;
174
   v->count = 0;
175
   v->flags = size_bits[4] | flags | VEC_MALLOC ;
176
}
177
 
178
void _mesa_vector3f_alloc( GLvector3f *v, GLuint flags, GLuint count,
179
                        GLuint alignment )
180
{
181
   v->stride = 3 * sizeof(GLfloat);
182
   v->storage = ALIGN_MALLOC( count * 3 * sizeof(GLfloat), alignment );
183
   v->start = (GLfloat *) v->storage;
184
   v->data = (GLfloat (*)[3]) v->storage;
185
   v->count = 0;
186
   v->flags = flags | VEC_MALLOC ;
187
}
188
 
189
void _mesa_vector1f_alloc( GLvector1f *v, GLuint flags, GLuint count,
190
                        GLuint alignment )
191
{
192
   v->stride = sizeof(GLfloat);
193
   v->storage = v->start = (GLfloat *)
194
      ALIGN_MALLOC( count * sizeof(GLfloat), alignment );
195
   v->data = v->start;
196
   v->count = 0;
197
   v->flags = flags | VEC_MALLOC ;
198
}
199
 
200
void _mesa_vector4ub_alloc( GLvector4ub *v, GLuint flags, GLuint count,
201
                         GLuint alignment )
202
{
203
   v->stride = 4 * sizeof(GLubyte);
204
   v->storage = ALIGN_MALLOC( count * 4 * sizeof(GLubyte), alignment );
205
   v->start = (GLubyte *) v->storage;
206
   v->data = (GLubyte (*)[4]) v->storage;
207
   v->count = 0;
208
   v->flags = flags | VEC_MALLOC ;
209
}
210
 
211
void _mesa_vector4chan_alloc( GLvector4chan *v, GLuint flags, GLuint count,
212
                           GLuint alignment )
213
{
214
   v->stride = 4 * sizeof(GLchan);
215
   v->storage = ALIGN_MALLOC( count * 4 * sizeof(GLchan), alignment );
216
   v->start = (GLchan *) v->storage;
217
   v->data = (GLchan (*)[4]) v->storage;
218
   v->count = 0;
219
   v->flags = flags | VEC_MALLOC ;
220
}
221
 
222
void _mesa_vector4us_alloc( GLvector4us *v, GLuint flags, GLuint count,
223
                         GLuint alignment )
224
{
225
   v->stride = 4 * sizeof(GLushort);
226
   v->storage = ALIGN_MALLOC( count * 4 * sizeof(GLushort), alignment );
227
   v->start = (GLushort *) v->storage;
228
   v->data = (GLushort (*)[4]) v->storage;
229
   v->count = 0;
230
   v->flags = flags | VEC_MALLOC ;
231
}
232
 
233
void _mesa_vector1ub_alloc( GLvector1ub *v, GLuint flags, GLuint count,
234
                         GLuint alignment )
235
{
236
   v->stride = 1 * sizeof(GLubyte);
237
   v->storage = ALIGN_MALLOC( count * sizeof(GLubyte), alignment );
238
   v->start = (GLubyte *) v->storage;
239
   v->data = (GLubyte *) v->storage;
240
   v->count = 0;
241
   v->flags = flags | VEC_MALLOC ;
242
}
243
 
244
void _mesa_vector1ui_alloc( GLvector1ui *v, GLuint flags, GLuint count,
245
                         GLuint alignment )
246
{
247
   v->stride = 1 * sizeof(GLuint);
248
   v->storage = ALIGN_MALLOC( count * sizeof(GLuint), alignment );
249
   v->start = (GLuint *) v->storage;
250
   v->data = (GLuint *) v->storage;
251
   v->count = 0;
252
   v->flags = flags | VEC_MALLOC ;
253
}
254
 
255
 
256
 
257
/*
258
 * Vector deallocation.  Free whatever memory is pointed to by the
259
 * vector's storage field if the VEC_MALLOC flag is set.
260
 * DO NOT free the GLvector object itself, though.
261
 */
262
 
263
 
264
void _mesa_vector4f_free( GLvector4f *v )
265
{
266
   if (v->flags & VEC_MALLOC) {
267
      ALIGN_FREE( v->storage );
268
      v->data = NULL;
269
      v->start = NULL;
270
      v->storage = NULL;
271
      v->flags &= ~VEC_MALLOC;
272
   }
273
}
274
 
275
void _mesa_vector3f_free( GLvector3f *v )
276
{
277
   if (v->flags & VEC_MALLOC) {
278
      ALIGN_FREE( v->storage );
279
      v->data = 0;
280
      v->start = 0;
281
      v->storage = 0;
282
      v->flags &= ~VEC_MALLOC;
283
   }
284
}
285
 
286
void _mesa_vector1f_free( GLvector1f *v )
287
{
288
   if (v->flags & VEC_MALLOC) {
289
      ALIGN_FREE( v->storage );
290
      v->data = NULL;
291
      v->start = NULL;
292
      v->storage = NULL;
293
      v->flags &= ~VEC_MALLOC;
294
   }
295
}
296
 
297
void _mesa_vector4ub_free( GLvector4ub *v )
298
{
299
   if (v->flags & VEC_MALLOC) {
300
      ALIGN_FREE( v->storage );
301
      v->data = NULL;
302
      v->start = NULL;
303
      v->storage = NULL;
304
      v->flags &= ~VEC_MALLOC;
305
   }
306
}
307
 
308
void _mesa_vector4chan_free( GLvector4chan *v )
309
{
310
   if (v->flags & VEC_MALLOC) {
311
      ALIGN_FREE( v->storage );
312
      v->data = NULL;
313
      v->start = NULL;
314
      v->storage = NULL;
315
      v->flags &= ~VEC_MALLOC;
316
   }
317
}
318
 
319
void _mesa_vector4us_free( GLvector4us *v )
320
{
321
   if (v->flags & VEC_MALLOC) {
322
      ALIGN_FREE( v->storage );
323
      v->data = NULL;
324
      v->start = NULL;
325
      v->storage = NULL;
326
      v->flags &= ~VEC_MALLOC;
327
   }
328
}
329
 
330
void _mesa_vector1ub_free( GLvector1ub *v )
331
{
332
   if (v->flags & VEC_MALLOC) {
333
      ALIGN_FREE( v->storage );
334
      v->data = NULL;
335
      v->start = NULL;
336
      v->storage = NULL;
337
      v->flags &= ~VEC_MALLOC;
338
   }
339
}
340
 
341
void _mesa_vector1ui_free( GLvector1ui *v )
342
{
343
   if (v->flags & VEC_MALLOC) {
344
      ALIGN_FREE( v->storage );
345
      v->data = NULL;
346
      v->start = NULL;
347
      v->storage = NULL;
348
      v->flags &= ~VEC_MALLOC;
349
   }
350
}
351
 
352
 
353
/*
354
 * For debugging
355
 */
356
void _mesa_vector4f_print( GLvector4f *v, GLubyte *cullmask, GLboolean culling )
357
{
358
   GLfloat c[4] = { 0, 0, 0, 1 };
359
   const char *templates[5] = {
360
      "%d:\t0, 0, 0, 1\n",
361
      "%d:\t%f, 0, 0, 1\n",
362
      "%d:\t%f, %f, 0, 1\n",
363
      "%d:\t%f, %f, %f, 1\n",
364
      "%d:\t%f, %f, %f, %f\n"
365
   };
366
 
367
   const char *t = templates[v->size];
368
   GLfloat *d = (GLfloat *)v->data;
369
   GLuint j, i = 0, count;
370
 
371
   _mesa_printf(NULL, "data-start\n");
372
   for ( ; d != v->start ; STRIDE_F(d, v->stride), i++)
373
      _mesa_printf(NULL, t, i, d[0], d[1], d[2], d[3]);
374
 
375
   _mesa_printf(NULL, "start-count(%u)\n", v->count);
376
   count = i + v->count;
377
 
378
   if (culling) {
379
      for ( ; i < count ; STRIDE_F(d, v->stride), i++)
380
         if (cullmask[i])
381
            _mesa_printf(NULL, t, i, d[0], d[1], d[2], d[3]);
382
   }
383
   else {
384
      for ( ; i < count ; STRIDE_F(d, v->stride), i++)
385
         _mesa_printf(NULL, t, i, d[0], d[1], d[2], d[3]);
386
   }
387
 
388
   for (j = v->size ; j < 4; j++) {
389
      if ((v->flags & (1<<j)) == 0) {
390
 
391
         _mesa_printf(NULL, "checking col %u is clean as advertised ", j);
392
 
393
         for (i = 0, d = (GLfloat *) v->data ;
394
              i < count && d[j] == c[j] ;
395
              i++, STRIDE_F(d, v->stride)) {};
396
 
397
         if (i == count)
398
            _mesa_printf(NULL, " --> ok\n");
399
         else
400
            _mesa_printf(NULL, " --> Failed at %u ******\n", i);
401
      }
402
   }
403
}
404
 
405
 
406
/*
407
 * For debugging
408
 */
409
void _mesa_vector3f_print( GLvector3f *v, GLubyte *cullmask, GLboolean culling )
410
{
411
   GLfloat *d = (GLfloat *)v->data;
412
   GLuint i = 0, count;
413
 
414
   _mesa_printf(NULL, "data-start\n");
415
   for ( ; d != v->start ; STRIDE_F(d,v->stride), i++)
416
      _mesa_printf(NULL,  "%u:\t%f, %f, %f\n", i, d[0], d[1], d[2]);
417
 
418
   _mesa_printf(NULL, "start-count(%u)\n", v->count);
419
   count = i + v->count;
420
 
421
   if (culling) {
422
      for ( ; i < count ; STRIDE_F(d,v->stride), i++)
423
         if (cullmask[i])
424
            _mesa_printf(NULL, "%u:\t%f, %f, %f\n", i, d[0], d[1], d[2]);
425
   }
426
   else {
427
      for ( ; i < count ; STRIDE_F(d,v->stride), i++)
428
         _mesa_printf(NULL, "%u:\t%f, %f, %f\n", i, d[0], d[1], d[2]);
429
   }
430
}