1 /* -*- mode: c; c-basic-offset: 3 -*- */
3 * Mesa 3-D graphics library
6 * Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and associated documentation files (the "Software"),
10 * to deal in the Software without restriction, including without limitation
11 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 * and/or sell copies of the Software, and to permit persons to whom the
13 * Software is furnished to do so, subject to the following conditions:
15 * The above copyright notice and this permission notice shall be included
16 * in all copies or substantial portions of the Software.
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 * Keith Whitwell <keithw@valinux.com>
28 * Adapted to Mach64 by:
29 * José Fonseca <j_r_fonseca@yahoo.co.uk>
32 #include "math/m_translate.h"
38 void TAG(translate_vertex
)(GLcontext
*ctx
,
43 GLuint format
= GET_VERTEX_FORMAT();
45 CARD32
*p
= (CARD32
*)src
+ 10 - mmesa
->vertex_size
;
47 dst
->attrib
[FRAG_ATTRIB_WPOS
][3] = 1.0;
50 case TEX1_VERTEX_FORMAT
:
51 #ifdef MACH64_PREMULT_TEXCOORDS
53 float rhw
= 1.0 / LE32_IN_FLOAT( p
+ 2 );
55 dst
->attrib
[FRAG_ATTRIB_TEX1
][0] = rhw
*LE32_IN_FLOAT( p
++ );
56 dst
->attrib
[FRAG_ATTRIB_TEX1
][1] = rhw
*LE32_IN_FLOAT( p
++ );
59 dst
->attrib
[FRAG_ATTRIB_TEX1
][0] = LE32_IN_FLOAT( p
++ );
60 dst
->attrib
[FRAG_ATTRIB_TEX1
][1] = LE32_IN_FLOAT( p
++ );
62 dst
->attrib
[FRAG_ATTRIB_TEX1
][3] = 1.0;
65 case TEX0_VERTEX_FORMAT
:
66 #ifdef MACH64_PREMULT_TEXCOORDS
68 float rhw
= 1.0 / LE32_IN_FLOAT( p
+ 2 );
70 dst
->attrib
[FRAG_ATTRIB_TEX0
][0] = rhw
*LE32_IN_FLOAT( p
++ );
71 dst
->attrib
[FRAG_ATTRIB_TEX0
][1] = rhw
*LE32_IN_FLOAT( p
++ );
74 dst
->attrib
[FRAG_ATTRIB_TEX0
][0] = LE32_IN_FLOAT( p
++ );
75 dst
->attrib
[FRAG_ATTRIB_TEX0
][1] = LE32_IN_FLOAT( p
++ );
77 dst
->attrib
[FRAG_ATTRIB_TEX0
][3] = 1.0;
78 dst
->attrib
[FRAG_ATTRIB_WPOS
][3] = LE32_IN_FLOAT( p
++ );
80 case NOTEX_VERTEX_FORMAT
:
81 dst
->attrib
[FRAG_ATTRIB_COL1
][2] = UBYTE_TO_FLOAT(((GLubyte
*)p
)[0]);
82 dst
->attrib
[FRAG_ATTRIB_COL1
][1] = UBYTE_TO_FLOAT(((GLubyte
*)p
)[1]);
83 dst
->attrib
[FRAG_ATTRIB_COL1
][0] = UBYTE_TO_FLOAT(((GLubyte
*)p
)[2]);
84 dst
->attrib
[FRAG_ATTRIB_FOGC
][0] = ((GLubyte
*)p
)[3]; /*XXX int->float?*/
87 case TINY_VERTEX_FORMAT
:
88 dst
->attrib
[FRAG_ATTRIB_WPOS
][2] = UNVIEWPORT_Z( LE32_IN( p
++ ) );
90 dst
->color
[2] = ((GLubyte
*)p
)[0];
91 dst
->color
[1] = ((GLubyte
*)p
)[1];
92 dst
->color
[0] = ((GLubyte
*)p
)[2];
93 dst
->color
[3] = ((GLubyte
*)p
)[3];
97 GLuint xy
= LE32_IN( p
);
99 dst
->attrib
[FRAG_ATTRIB_WPOS
][0] = UNVIEWPORT_X( (GLfloat
)(GLshort
)( xy
>> 16 ) );
100 dst
->attrib
[FRAG_ATTRIB_WPOS
][1] = UNVIEWPORT_Y( (GLfloat
)(GLshort
)( xy
& 0xffff ) );
104 assert( p
+ 1 - (CARD32
*)src
== 10 );
106 dst
->pointSize
= ctx
->Point
.Size
;
111 void TAG(print_vertex
)( GLcontext
*ctx
, const VERTEX
*v
)
114 GLuint format
= GET_VERTEX_FORMAT();
115 CARD32
*p
= (CARD32
*)v
+ 10 - mmesa
->vertex_size
;
118 case TEX1_VERTEX_FORMAT
:
121 #ifdef MACH64_PREMULT_TEXCOORDS
122 float rhw
= 1.0 / LE32_IN_FLOAT( p
+ 2 );
124 u
= rhw
*LE32_IN_FLOAT( p
++ );
125 v
= rhw
*LE32_IN_FLOAT( p
++ );
127 u
= LE32_IN_FLOAT( p
++ );
128 v
= LE32_IN_FLOAT( p
++ );
130 w
= LE32_IN_FLOAT( p
++ );
131 fprintf( stderr
, "u1 %f v1 %f w1 %f\n", u
, v
, w
);
134 case TEX0_VERTEX_FORMAT
:
137 #ifdef MACH64_PREMULT_TEXCOORDS
138 float rhw
= 1.0 / LE32_IN_FLOAT( p
+ 2 );
140 u
= rhw
*LE32_IN_FLOAT( p
++ );
141 v
= rhw
*LE32_IN_FLOAT( p
++ );
143 u
= LE32_IN_FLOAT( p
++ );
144 v
= LE32_IN_FLOAT( p
++ );
146 w
= LE32_IN_FLOAT( p
++ );
147 fprintf( stderr
, "u0 %f v0 %f w0 %f\n", u
, v
, w
);
150 case NOTEX_VERTEX_FORMAT
:
154 b
= ((GLubyte
*)p
)[0];
155 g
= ((GLubyte
*)p
)[1];
156 r
= ((GLubyte
*)p
)[2];
157 a
= ((GLubyte
*)p
)[3];
159 fprintf(stderr
, "spec: r %d g %d b %d a %d\n", r
, g
, b
, a
);
162 case TINY_VERTEX_FORMAT
:
168 z
= LE32_IN( p
++ ) / 65536.0;
170 b
= ((GLubyte
*)p
)[0];
171 g
= ((GLubyte
*)p
)[1];
172 r
= ((GLubyte
*)p
)[2];
173 a
= ((GLubyte
*)p
)[3];
176 x
= (GLfloat
)(GLshort
)( xy
>> 16 ) / 4.0;
177 y
= (GLfloat
)(GLshort
)( xy
& 0xffff ) / 4.0;
179 fprintf(stderr
, "x %f y %f z %f\n", x
, y
, z
);
180 fprintf(stderr
, "r %d g %d b %d a %d\n", r
, g
, b
, a
);
184 assert( p
+ 1 - (CARD32
*)v
== 10 );
186 fprintf(stderr
, "\n");
189 /* Interpolate the elements of the VB not included in typical hardware
192 * NOTE: All these arrays are guarenteed by tnl to be writeable and
195 #ifndef INTERP_QUALIFIER
196 #define INTERP_QUALIFIER static
199 #define GET_COLOR(ptr, idx) ((ptr)->data[idx])
202 INTERP_QUALIFIER
void TAG(interp_extras
)( GLcontext
*ctx
,
204 GLuint dst
, GLuint out
, GLuint in
,
205 GLboolean force_boundary
)
208 struct vertex_buffer
*VB
= &TNL_CONTEXT(ctx
)->vb
;
210 if (VB
->ColorPtr
[1]) {
211 assert(VB
->ColorPtr
[1]->stride
== 4 * sizeof(GLfloat
));
214 GET_COLOR(VB
->ColorPtr
[1], dst
),
215 GET_COLOR(VB
->ColorPtr
[1], out
),
216 GET_COLOR(VB
->ColorPtr
[1], in
) );
218 if (VB
->SecondaryColorPtr
[1]) {
220 GET_COLOR(VB
->SecondaryColorPtr
[1], dst
),
221 GET_COLOR(VB
->SecondaryColorPtr
[1], out
),
222 GET_COLOR(VB
->SecondaryColorPtr
[1], in
) );
227 VB
->EdgeFlag
[dst
] = VB
->EdgeFlag
[out
] || force_boundary
;
230 INTERP_VERTEX(ctx
, t
, dst
, out
, in
, force_boundary
);
233 INTERP_QUALIFIER
void TAG(copy_pv_extras
)( GLcontext
*ctx
,
234 GLuint dst
, GLuint src
)
237 struct vertex_buffer
*VB
= &TNL_CONTEXT(ctx
)->vb
;
239 if (VB
->ColorPtr
[1]) {
240 COPY_4FV( GET_COLOR(VB
->ColorPtr
[1], dst
),
241 GET_COLOR(VB
->ColorPtr
[1], src
) );
243 if (VB
->SecondaryColorPtr
[1]) {
244 COPY_4FV( GET_COLOR(VB
->SecondaryColorPtr
[1], dst
),
245 GET_COLOR(VB
->SecondaryColorPtr
[1], src
) );
249 COPY_PV_VERTEX(ctx
, dst
, src
);
253 #undef INTERP_QUALIFIER