6
Copyright (C) 1996-1997 Id Software, Inc.
8
This program is free software; you can redistribute it and/or
9
modify it under the terms of the GNU General Public License
10
as published by the Free Software Foundation; either version 2
11
of the License, or (at your option) any later version.
13
This program is distributed in the hope that it will be useful,
14
but WITHOUT ANY WARRANTY; without even the implied warranty of
15
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
17
See the GNU General Public License for more details.
19
You should have received a copy of the GNU General Public License
20
along with this program; if not, write to:
22
Free Software Foundation, Inc.
23
59 Temple Place - Suite 330
24
Boston, MA 02111-1307, USA
26
$Id: d_polysa.s,v 1.1 2000/08/26 12:26:18 tonik Exp $
29
// x86 assembly-language polygon model drawing code
38
// !!! if this is changed, it must be changed in d_polyse.c too !!!
39
#define DPS_MAXSPANS MAXHEIGHT+1
40
// 1 extra for spanpackage that marks end
42
//#define SPAN_SIZE (((DPS_MAXSPANS + 1 + ((CACHE_SIZE - 1) / spanpackage_t_size)) + 1) * spanpackage_t_size)
43
#define SPAN_SIZE (1024+1+1+1)*32
49
p10_minus_p20: .single 0
50
p01_minus_p21: .single 0
55
aff8entryvec_table: .long LDraw8, LDraw7, LDraw6, LDraw5
56
.long LDraw4, LDraw3, LDraw2, LDraw1
64
.extern C(D_PolysetSetEdgeTable)
65
.extern C(D_RasterizeAliasPolySmooth)
68
//----------------------------------------------------------------------
69
// affine triangle gradient calculation code
70
//----------------------------------------------------------------------
74
.globl C(D_PolysetCalcGradients)
75
C(D_PolysetCalcGradients):
77
// p00_minus_p20 = r_p0[0] - r_p2[0];
78
// p01_minus_p21 = r_p0[1] - r_p2[1];
79
// p10_minus_p20 = r_p1[0] - r_p2[0];
80
// p11_minus_p21 = r_p1[1] - r_p2[1];
82
// xstepdenominv = 1.0 / (p10_minus_p20 * p01_minus_p21 -
83
// p00_minus_p20 * p11_minus_p21);
85
// ystepdenominv = -xstepdenominv;
87
fildl C(r_p0)+0 // r_p0[0]
88
fildl C(r_p2)+0 // r_p2[0] | r_p0[0]
89
fildl C(r_p0)+4 // r_p0[1] | r_p2[0] | r_p0[0]
90
fildl C(r_p2)+4 // r_p2[1] | r_p0[1] | r_p2[0] | r_p0[0]
91
fildl C(r_p1)+0 // r_p1[0] | r_p2[1] | r_p0[1] | r_p2[0] | r_p0[0]
92
fildl C(r_p1)+4 // r_p1[1] | r_p1[0] | r_p2[1] | r_p0[1] |
94
fxch %st(3) // r_p0[1] | r_p1[0] | r_p2[1] | r_p1[1] |
96
fsub %st(2),%st(0) // p01_minus_p21 | r_p1[0] | r_p2[1] | r_p1[1] |
98
fxch %st(1) // r_p1[0] | p01_minus_p21 | r_p2[1] | r_p1[1] |
100
fsub %st(4),%st(0) // p10_minus_p20 | p01_minus_p21 | r_p2[1] |
101
// r_p1[1] | r_p2[0] | r_p0[0]
102
fxch %st(5) // r_p0[0] | p01_minus_p21 | r_p2[1] |
103
// r_p1[1] | r_p2[0] | p10_minus_p20
104
fsubp %st(0),%st(4) // p01_minus_p21 | r_p2[1] | r_p1[1] |
105
// p00_minus_p20 | p10_minus_p20
106
fxch %st(2) // r_p1[1] | r_p2[1] | p01_minus_p21 |
107
// p00_minus_p20 | p10_minus_p20
108
fsubp %st(0),%st(1) // p11_minus_p21 | p01_minus_p21 |
109
// p00_minus_p20 | p10_minus_p20
110
fxch %st(1) // p01_minus_p21 | p11_minus_p21 |
111
// p00_minus_p20 | p10_minus_p20
112
flds C(d_xdenom) // d_xdenom | p01_minus_p21 | p11_minus_p21 |
113
// p00_minus_p20 | p10_minus_p20
114
fxch %st(4) // p10_minus_p20 | p01_minus_p21 | p11_minus_p21 |
115
// p00_minus_p20 | d_xdenom
116
fstps p10_minus_p20 // p01_minus_p21 | p11_minus_p21 |
117
// p00_minus_p20 | d_xdenom
118
fstps p01_minus_p21 // p11_minus_p21 | p00_minus_p20 | xstepdenominv
119
fxch %st(2) // xstepdenominv | p00_minus_p20 | p11_minus_p21
121
//// ceil () for light so positive steps are exaggerated, negative steps
122
//// diminished, pushing us away from underflow toward overflow. Underflow is
123
//// very visible, overflow is very unlikely, because of ambient lighting
124
// t0 = r_p0[4] - r_p2[4];
125
// t1 = r_p1[4] - r_p2[4];
127
fildl C(r_p2)+16 // r_p2[4] | xstepdenominv | p00_minus_p20 |
129
fildl C(r_p0)+16 // r_p0[4] | r_p2[4] | xstepdenominv |
130
// p00_minus_p20 | p11_minus_p21
131
fildl C(r_p1)+16 // r_p1[4] | r_p0[4] | r_p2[4] | xstepdenominv |
132
// p00_minus_p20 | p11_minus_p21
133
fxch %st(2) // r_p2[4] | r_p0[4] | r_p1[4] | xstepdenominv |
134
// p00_minus_p20 | p11_minus_p21
135
fld %st(0) // r_p2[4] | r_p2[4] | r_p0[4] | r_p1[4] |
136
// xstepdenominv | p00_minus_p20 | p11_minus_p21
137
fsubrp %st(0),%st(2) // r_p2[4] | t0 | r_p1[4] | xstepdenominv |
138
// p00_minus_p20 | p11_minus_p21
139
fsubrp %st(0),%st(2) // t0 | t1 | xstepdenominv | p00_minus_p20 |
143
// ceil((t1 * p01_minus_p21 - t0 * p11_minus_p21) * xstepdenominv);
145
// ceil((t1 * p00_minus_p20 - t0 * p10_minus_p20) * ystepdenominv);
147
fld %st(0) // t0 | t0 | t1 | xstepdenominv | p00_minus_p20 |
149
fmul %st(5),%st(0) // t0*p11_minus_p21 | t0 | t1 | xstepdenominv |
150
// p00_minus_p20 | p11_minus_p21
151
fxch %st(2) // t1 | t0 | t0*p11_minus_p21 | xstepdenominv |
152
// p00_minus_p20 | p11_minus_p21
153
fld %st(0) // t1 | t1 | t0 | t0*p11_minus_p21 |
154
// xstepdenominv | p00_minus_p20 | p11_minus_p21
155
fmuls p01_minus_p21 // t1*p01_minus_p21 | t1 | t0 | t0*p11_minus_p21 |
156
// xstepdenominv | p00_minus_p20 | p11_minus_p21
157
fxch %st(2) // t0 | t1 | t1*p01_minus_p21 | t0*p11_minus_p21 |
158
// xstepdenominv | p00_minus_p20 | p11_minus_p21
159
fmuls p10_minus_p20 // t0*p10_minus_p20 | t1 | t1*p01_minus_p21 |
160
// t0*p11_minus_p21 | xstepdenominv |
161
// p00_minus_p20 | p11_minus_p21
162
fxch %st(1) // t1 | t0*p10_minus_p20 | t1*p01_minus_p21 |
163
// t0*p11_minus_p21 | xstepdenominv |
164
// p00_minus_p20 | p11_minus_p21
165
fmul %st(5),%st(0) // t1*p00_minus_p20 | t0*p10_minus_p20 |
166
// t1*p01_minus_p21 | t0*p11_minus_p21 |
167
// xstepdenominv | p00_minus_p20 | p11_minus_p21
168
fxch %st(2) // t1*p01_minus_p21 | t0*p10_minus_p20 |
169
// t1*p00_minus_p20 | t0*p11_minus_p21 |
170
// xstepdenominv | p00_minus_p20 | p11_minus_p21
171
fsubp %st(0),%st(3) // t0*p10_minus_p20 | t1*p00_minus_p20 |
172
// t1*p01_minus_p21 - t0*p11_minus_p21 |
173
// xstepdenominv | p00_minus_p20 | p11_minus_p21
174
fsubrp %st(0),%st(1) // t1*p00_minus_p20 - t0*p10_minus_p20 |
175
// t1*p01_minus_p21 - t0*p11_minus_p21 |
176
// xstepdenominv | p00_minus_p20 | p11_minus_p21
177
fld %st(2) // xstepdenominv |
178
// t1*p00_minus_p20 - t0*p10_minus_p20 |
179
// t1*p01_minus_p21 - t0*p11_minus_p21 |
180
// xstepdenominv | p00_minus_p20 | p11_minus_p21
181
fmuls float_minus_1 // ystepdenominv |
182
// t1*p00_minus_p20 - t0*p10_minus_p20 |
183
// t1*p01_minus_p21 - t0*p11_minus_p21 |
184
// xstepdenominv | p00_minus_p20 | p11_minus_p21
185
fxch %st(2) // t1*p01_minus_p21 - t0*p11_minus_p21 |
186
// t1*p00_minus_p20 - t0*p10_minus_p20 |
187
// ystepdenominv | xstepdenominv | p00_minus_p20 |
189
fmul %st(3),%st(0) // (t1*p01_minus_p21 - t0*p11_minus_p21)*
191
// t1*p00_minus_p20 - t0*p10_minus_p20 |
192
// | ystepdenominv | xstepdenominv |
193
// p00_minus_p20 | p11_minus_p21
194
fxch %st(1) // t1*p00_minus_p20 - t0*p10_minus_p20 |
195
// (t1*p01_minus_p21 - t0*p11_minus_p21)*
196
// xstepdenominv | ystepdenominv |
197
// xstepdenominv | p00_minus_p20 | p11_minus_p21
198
fmul %st(2),%st(0) // (t1*p00_minus_p20 - t0*p10_minus_p20)*
200
// (t1*p01_minus_p21 - t0*p11_minus_p21)*
201
// xstepdenominv | ystepdenominv |
202
// xstepdenominv | p00_minus_p20 | p11_minus_p21
204
fistpl C(r_lstepy) // r_lstepx | ystepdenominv | xstepdenominv |
205
// p00_minus_p20 | p11_minus_p21
206
fistpl C(r_lstepx) // ystepdenominv | xstepdenominv | p00_minus_p20 |
210
// t0 = r_p0[2] - r_p2[2];
211
// t1 = r_p1[2] - r_p2[2];
213
fildl C(r_p2)+8 // r_p2[2] | ystepdenominv | xstepdenominv |
214
// p00_minus_p20 | p11_minus_p21
215
fildl C(r_p0)+8 // r_p0[2] | r_p2[2] | ystepdenominv |
216
// xstepdenominv | p00_minus_p20 | p11_minus_p21
217
fildl C(r_p1)+8 // r_p1[2] | r_p0[2] | r_p2[2] | ystepdenominv |
218
// xstepdenominv | p00_minus_p20 | p11_minus_p21
219
fxch %st(2) // r_p2[2] | r_p0[2] | r_p1[2] | ystepdenominv |
220
// xstepdenominv | p00_minus_p20 | p11_minus_p21
221
fld %st(0) // r_p2[2] | r_p2[2] | r_p0[2] | r_p1[2] |
222
// ystepdenominv | xstepdenominv | p00_minus_p20 |
224
fsubrp %st(0),%st(2) // r_p2[2] | t0 | r_p1[2] | ystepdenominv |
225
// xstepdenominv | p00_minus_p20 | p11_minus_p21
226
fsubrp %st(0),%st(2) // t0 | t1 | ystepdenominv | xstepdenominv |
227
// p00_minus_p20 | p11_minus_p21
229
// r_sstepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) *
231
// r_sstepy = (int)((t1 * p00_minus_p20 - t0 * p10_minus_p20) *
234
fld %st(0) // t0 | t0 | t1 | ystepdenominv | xstepdenominv
235
fmul %st(6),%st(0) // t0*p11_minus_p21 | t0 | t1 | ystepdenominv |
236
// xstepdenominv | p00_minus_p20 | p11_minus_p21
237
fxch %st(2) // t1 | t0 | t0*p11_minus_p21 | ystepdenominv |
238
// xstepdenominv | p00_minus_p20 | p11_minus_p21
239
fld %st(0) // t1 | t1 | t0 | t0*p11_minus_p21 |
240
// ystepdenominv | xstepdenominv | p00_minus_p20 |
242
fmuls p01_minus_p21 // t1*p01_minus_p21 | t1 | t0 | t0*p11_minus_p21 |
243
// ystepdenominv | xstepdenominv | p00_minus_p20 |
245
fxch %st(2) // t0 | t1 | t1*p01_minus_p21 | t0*p11_minus_p21 |
246
// ystepdenominv | xstepdenominv | p00_minus_p20 |
248
fmuls p10_minus_p20 // t0*p10_minus_p20 | t1 | t1*p01_minus_p21 |
249
// t0*p11_minus_p21 | ystepdenominv |
250
// xstepdenominv | p00_minus_p20 | p11_minus_p21
251
fxch %st(1) // t1 | t0*p10_minus_p20 | t1*p01_minus_p21 |
252
// t0*p11_minus_p21 | ystepdenominv |
253
// xstepdenominv | p00_minus_p20 | p11_minus_p21
254
fmul %st(6),%st(0) // t1*p00_minus_p20 | t0*p10_minus_p20 |
255
// t1*p01_minus_p21 | t0*p11_minus_p21 |
256
// ystepdenominv | xstepdenominv | p00_minus_p20 |
258
fxch %st(2) // t1*p01_minus_p21 | t0*p10_minus_p20 |
259
// t1*p00_minus_p20 | t0*p11_minus_p21 |
260
// ystepdenominv | xstepdenominv | p00_minus_p20 |
262
fsubp %st(0),%st(3) // t0*p10_minus_p20 | t1*p00_minus_p20 |
263
// t1*p01_minus_p21 - t0*p11_minus_p21 |
264
// ystepdenominv | xstepdenominv | p00_minus_p20 |
266
fsubrp %st(0),%st(1) // t1*p00_minus_p20 - t0*p10_minus_p20 |
267
// t1*p01_minus_p21 - t0*p11_minus_p21 |
268
// ystepdenominv | xstepdenominv | p00_minus_p20 |
270
fmul %st(2),%st(0) // (t1*p00_minus_p20 - t0*p10_minus_p20)*
272
// t1*p01_minus_p21 - t0*p11_minus_p21 |
273
// ystepdenominv | xstepdenominv | p00_minus_p20 |
275
fxch %st(1) // t1*p01_minus_p21 - t0*p11_minus_p21 |
276
// (t1*p00_minus_p20 - t0*p10_minus_p20)*
277
// ystepdenominv | ystepdenominv |
278
// xstepdenominv | p00_minus_p20 | p11_minus_p21
279
fmul %st(3),%st(0) // (t1*p01_minus_p21 - t0*p11_minus_p21)*
281
// (t1*p00_minus_p20 - t0*p10_minus_p20)*
282
// ystepdenominv | ystepdenominv |
283
// xstepdenominv | p00_minus_p20 | p11_minus_p21
284
fxch %st(1) // (t1*p00_minus_p20 - t0*p10_minus_p20)*
286
// (t1*p01_minus_p21 - t0*p11_minus_p21)*
287
// xstepdenominv | ystepdenominv |
288
// xstepdenominv | p00_minus_p20 | p11_minus_p21
289
fistpl C(r_sstepy) // r_sstepx | ystepdenominv | xstepdenominv |
290
// p00_minus_p20 | p11_minus_p21
291
fistpl C(r_sstepx) // ystepdenominv | xstepdenominv | p00_minus_p20 |
294
// t0 = r_p0[3] - r_p2[3];
295
// t1 = r_p1[3] - r_p2[3];
297
fildl C(r_p2)+12 // r_p2[3] | ystepdenominv | xstepdenominv |
298
// p00_minus_p20 | p11_minus_p21
299
fildl C(r_p0)+12 // r_p0[3] | r_p2[3] | ystepdenominv |
300
// xstepdenominv | p00_minus_p20 | p11_minus_p21
301
fildl C(r_p1)+12 // r_p1[3] | r_p0[3] | r_p2[3] | ystepdenominv |
302
// xstepdenominv | p00_minus_p20 | p11_minus_p21
303
fxch %st(2) // r_p2[3] | r_p0[3] | r_p1[3] | ystepdenominv |
304
// xstepdenominv | p00_minus_p20 | p11_minus_p21
305
fld %st(0) // r_p2[3] | r_p2[3] | r_p0[3] | r_p1[3] |
306
// ystepdenominv | xstepdenominv | p00_minus_p20 |
308
fsubrp %st(0),%st(2) // r_p2[3] | t0 | r_p1[3] | ystepdenominv |
309
// xstepdenominv | p00_minus_p20 | p11_minus_p21
310
fsubrp %st(0),%st(2) // t0 | t1 | ystepdenominv | xstepdenominv |
311
// p00_minus_p20 | p11_minus_p21
313
// r_tstepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) *
315
// r_tstepy = (int)((t1 * p00_minus_p20 - t0 * p10_minus_p20) *
318
fld %st(0) // t0 | t0 | t1 | ystepdenominv | xstepdenominv |
319
// p00_minus_p20 | p11_minus_p21
320
fmul %st(6),%st(0) // t0*p11_minus_p21 | t0 | t1 | ystepdenominv |
321
// xstepdenominv | p00_minus_p20 | p11_minus_p21
322
fxch %st(2) // t1 | t0 | t0*p11_minus_p21 | ystepdenominv |
323
// xstepdenominv | p00_minus_p20 | p11_minus_p21
324
fld %st(0) // t1 | t1 | t0 | t0*p11_minus_p21 |
325
// ystepdenominv | xstepdenominv | p00_minus_p20 |
327
fmuls p01_minus_p21 // t1*p01_minus_p21 | t1 | t0 | t0*p11_minus_p21 |
328
// ystepdenominv | xstepdenominv | p00_minus_p20 |
330
fxch %st(2) // t0 | t1 | t1*p01_minus_p21 | t0*p11_minus_p21 |
331
// ystepdenominv | xstepdenominv | p00_minus_p20 |
333
fmuls p10_minus_p20 // t0*p10_minus_p20 | t1 | t1*p01_minus_p21 |
334
// t0*p11_minus_p21 | ystepdenominv |
335
// xstepdenominv | p00_minus_p20 | p11_minus_p21
336
fxch %st(1) // t1 | t0*p10_minus_p20 | t1*p01_minus_p21 |
337
// t0*p11_minus_p21 | ystepdenominv |
338
// xstepdenominv | p00_minus_p20 | p11_minus_p21
339
fmul %st(6),%st(0) // t1*p00_minus_p20 | t0*p10_minus_p20 |
340
// t1*p01_minus_p21 | t0*p11_minus_p21 |
341
// ystepdenominv | xstepdenominv | p00_minus_p20 |
343
fxch %st(2) // t1*p01_minus_p21 | t0*p10_minus_p20 |
344
// t1*p00_minus_p20 | t0*p11_minus_p21 |
345
// ystepdenominv | xstepdenominv | p00_minus_p20 |
347
fsubp %st(0),%st(3) // t0*p10_minus_p20 | t1*p00_minus_p20 |
348
// t1*p01_minus_p21 - t0*p11_minus_p21 |
349
// ystepdenominv | xstepdenominv | p00_minus_p20 |
351
fsubrp %st(0),%st(1) // t1*p00_minus_p20 - t0*p10_minus_p20 |
352
// t1*p01_minus_p21 - t0*p11_minus_p21 |
353
// ystepdenominv | xstepdenominv | p00_minus_p20 |
355
fmul %st(2),%st(0) // (t1*p00_minus_p20 - t0*p10_minus_p20)*
357
// t1*p01_minus_p21 - t0*p11_minus_p21 |
358
// ystepdenominv | xstepdenominv | p00_minus_p20 |
360
fxch %st(1) // t1*p01_minus_p21 - t0*p11_minus_p21 |
361
// (t1*p00_minus_p20 - t0*p10_minus_p20)*
362
// ystepdenominv | ystepdenominv |
363
// xstepdenominv | p00_minus_p20 | p11_minus_p21
364
fmul %st(3),%st(0) // (t1*p01_minus_p21 - t0*p11_minus_p21)*
366
// (t1*p00_minus_p20 - t0*p10_minus_p20)*
367
// ystepdenominv | ystepdenominv |
368
// xstepdenominv | p00_minus_p20 | p11_minus_p21
369
fxch %st(1) // (t1*p00_minus_p20 - t0*p10_minus_p20)*
371
// (t1*p01_minus_p21 - t0*p11_minus_p21)*
372
// xstepdenominv | ystepdenominv |
373
// xstepdenominv | p00_minus_p20 | p11_minus_p21
374
fistpl C(r_tstepy) // r_tstepx | ystepdenominv | xstepdenominv |
375
// p00_minus_p20 | p11_minus_p21
376
fistpl C(r_tstepx) // ystepdenominv | xstepdenominv | p00_minus_p20 |
379
// t0 = r_p0[5] - r_p2[5];
380
// t1 = r_p1[5] - r_p2[5];
382
fildl C(r_p2)+20 // r_p2[5] | ystepdenominv | xstepdenominv |
383
// p00_minus_p20 | p11_minus_p21
384
fildl C(r_p0)+20 // r_p0[5] | r_p2[5] | ystepdenominv |
385
// xstepdenominv | p00_minus_p20 | p11_minus_p21
386
fildl C(r_p1)+20 // r_p1[5] | r_p0[5] | r_p2[5] | ystepdenominv |
387
// xstepdenominv | p00_minus_p20 | p11_minus_p21
388
fxch %st(2) // r_p2[5] | r_p0[5] | r_p1[5] | ystepdenominv |
389
// xstepdenominv | p00_minus_p20 | p11_minus_p21
390
fld %st(0) // r_p2[5] | r_p2[5] | r_p0[5] | r_p1[5] |
391
// ystepdenominv | xstepdenominv | p00_minus_p20 |
393
fsubrp %st(0),%st(2) // r_p2[5] | t0 | r_p1[5] | ystepdenominv |
394
// xstepdenominv | p00_minus_p20 | p11_minus_p21
395
fsubrp %st(0),%st(2) // t0 | t1 | ystepdenominv | xstepdenominv |
396
// p00_minus_p20 | p11_minus_p21
398
// r_zistepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) *
400
// r_zistepy = (int)((t1 * p00_minus_p20 - t0 * p10_minus_p20) *
403
fld %st(0) // t0 | t0 | t1 | ystepdenominv | xstepdenominv |
404
// p00_minus_p20 | p11_minus_p21
405
fmulp %st(0),%st(6) // t0 | t1 | ystepdenominv | xstepdenominv |
406
// p00_minus_p20 | t0*p11_minus_p21
407
fxch %st(1) // t1 | t0 | ystepdenominv | xstepdenominv |
408
// p00_minus_p20 | t0*p11_minus_p21
409
fld %st(0) // t1 | t1 | t0 | ystepdenominv | xstepdenominv |
410
// p00_minus_p20 | t0*p11_minus_p21
411
fmuls p01_minus_p21 // t1*p01_minus_p21 | t1 | t0 | ystepdenominv |
412
// xstepdenominv | p00_minus_p20 |
414
fxch %st(2) // t0 | t1 | t1*p01_minus_p21 | ystepdenominv |
415
// xstepdenominv | p00_minus_p20 |
417
fmuls p10_minus_p20 // t0*p10_minus_p20 | t1 | t1*p01_minus_p21 |
418
// ystepdenominv | xstepdenominv | p00_minus_p20 |
420
fxch %st(1) // t1 | t0*p10_minus_p20 | t1*p01_minus_p21 |
421
// ystepdenominv | xstepdenominv | p00_minus_p20 |
423
fmulp %st(0),%st(5) // t0*p10_minus_p20 | t1*p01_minus_p21 |
424
// ystepdenominv | xstepdenominv |
425
// t1*p00_minus_p20 | t0*p11_minus_p21
426
fxch %st(5) // t0*p11_minus_p21 | t1*p01_minus_p21 |
427
// ystepdenominv | xstepdenominv |
428
// t1*p00_minus_p20 | t0*p10_minus_p20
429
fsubrp %st(0),%st(1) // t1*p01_minus_p21 - t0*p11_minus_p21 |
430
// ystepdenominv | xstepdenominv |
431
// t1*p00_minus_p20 | t0*p10_minus_p20
432
fxch %st(3) // t1*p00_minus_p20 | ystepdenominv |
434
// t1*p01_minus_p21 - t0*p11_minus_p21 |
436
fsubp %st(0),%st(4) // ystepdenominv | xstepdenominv |
437
// t1*p01_minus_p21 - t0*p11_minus_p21 |
438
// t1*p00_minus_p20 - t0*p10_minus_p20
439
fxch %st(1) // xstepdenominv | ystepdenominv |
440
// t1*p01_minus_p21 - t0*p11_minus_p21 |
441
// t1*p00_minus_p20 - t0*p10_minus_p20
442
fmulp %st(0),%st(2) // ystepdenominv |
443
// (t1*p01_minus_p21 - t0*p11_minus_p21) *
445
// t1*p00_minus_p20 - t0*p10_minus_p20
446
fmulp %st(0),%st(2) // (t1*p01_minus_p21 - t0*p11_minus_p21) *
448
// (t1*p00_minus_p20 - t0*p10_minus_p20) *
450
fistpl C(r_zistepx) // (t1*p00_minus_p20 - t0*p10_minus_p20) *
454
// a_sstepxfrac = r_sstepx << 16;
455
// a_tstepxfrac = r_tstepx << 16;
457
// a_ststepxwhole = r_affinetridesc.skinwidth * (r_tstepx >> 16) +
460
movl C(r_sstepx),%eax
461
movl C(r_tstepx),%edx
464
movl %eax,C(a_sstepxfrac)
465
movl %edx,C(a_tstepxfrac)
467
movl C(r_sstepx),%ecx
468
movl C(r_tstepx),%eax
471
imull skinwidth(%esp)
473
movl %eax,C(a_ststepxwhole)
478
//----------------------------------------------------------------------
479
// recursive subdivision affine triangle drawing code
481
// not C-callable because of stdcall return
482
//----------------------------------------------------------------------
488
.globl C(D_PolysetRecursiveTriangle)
489
C(D_PolysetRecursiveTriangle):
490
pushl %ebp // preserve caller stack frame pointer
491
pushl %esi // preserve register variables
505
// d = lp2[0] - lp1[0];
506
// if (d < -1 || d > 1)
522
// d = lp2[1] - lp1[1];
523
// if (d < -1 || d > 1)
531
// d = lp3[0] - lp2[0];
532
// if (d < -1 || d > 1)
546
// d = lp3[1] - lp2[1];
547
// if (d < -1 || d > 1)
555
// d = lp1[0] - lp3[0];
556
// if (d < -1 || d > 1)
573
// d = lp1[1] - lp3[1];
574
// if (d < -1 || d > 1)
584
// return; // entire tri is filled
610
subl $24,%esp // allocate space for a new vertex
613
// new[0] = (lp1[0] + lp2[0]) >> 1;
614
// new[1] = (lp1[1] + lp2[1]) >> 1;
615
// new[2] = (lp1[2] + lp2[2]) >> 1;
616
// new[3] = (lp1[3] + lp2[3]) >> 1;
617
// new[5] = (lp1[5] + lp2[5]) >> 1;
656
//// draw the point if splitting a leading edge
657
// if (lp2[1] > lp1[1])
662
// if ((lp2[1] == lp1[1]) && (lp2[0] < lp1[0]))
679
// zbuf = zspantable[new[1]] + new[0];
680
movl C(zspantable)(,%ecx,4),%eax
684
cmpw (%eax,%ebp,2),%dx
690
movw %dx,(%eax,%ebp,2)
692
// pix = d_pcolormap[skintable[new[3]>>16][new[2]>>16]];
701
movl C(skintable)(,%eax,4),%eax
704
movb (%eax,%edx,),%cl
705
movl C(d_pcolormap),%edx
707
movb (%edx,%ecx,),%dl
710
// d_viewbuffer[d_scantable[new[1]] + new[0]] = pix;
711
movl C(d_scantable)(,%ebp,4),%eax
713
movl C(d_viewbuffer),%eax
714
movb %dl,(%eax,%ecx,1)
721
//// recursively continue
722
// D_PolysetRecursiveTriangle (lp3, lp1, new);
726
call C(D_PolysetRecursiveTriangle)
728
// D_PolysetRecursiveTriangle (lp3, new, lp2);
733
call C(D_PolysetRecursiveTriangle)
737
popl %ebx // restore register variables
740
popl %ebp // restore caller stack frame pointer
744
//----------------------------------------------------------------------
745
// 8-bpp horizontal span drawing code for affine polygons, with smooth
746
// shading and no transparency
747
//----------------------------------------------------------------------
751
.globl C(D_PolysetAff8Start)
752
C(D_PolysetAff8Start):
754
.globl C(D_PolysetDrawSpans8)
755
C(D_PolysetDrawSpans8):
756
pushl %esi // preserve register variables
759
movl pspans(%esp),%esi // point to the first span descriptor
760
movl C(r_zistepx),%ecx
762
pushl %ebp // preserve caller's stack frame
765
rorl $16,%ecx // put high 16 bits of 1/z step in low word
766
movl spanpackage_t_count(%esi),%edx
772
// lcount = d_aspancount - pspanpackage->count;
774
// errorterm += erroradjustup;
775
// if (errorterm >= 0)
777
// d_aspancount += d_countextrastep;
778
// errorterm -= erroradjustdown;
782
// d_aspancount += ubasestep;
784
movl C(d_aspancount),%eax
787
movl C(erroradjustup),%edx
788
movl C(errorterm),%ebx
792
movl C(erroradjustdown),%edx
793
movl C(d_countextrastep),%edi
795
movl C(d_aspancount),%ebp
796
movl %ebx,C(errorterm)
798
movl %ebp,C(d_aspancount)
799
jmp LRightEdgeStepped
802
movl C(d_aspancount),%edi
803
movl C(ubasestep),%edx
804
movl %ebx,C(errorterm)
806
movl %edi,C(d_aspancount)
815
// set up advancetable
817
movl C(a_ststepxwhole),%ecx
818
movl C(r_affinetridesc)+atd_skinwidth,%edx
820
movl %ecx,advancetable+4 // advance base in t
823
movl %ecx,advancetable // advance extra in t
824
movl C(a_tstepxfrac),%ecx
827
movl %eax,%edx // count
832
shrl $3,%edx // count of full and partial loops
833
movl spanpackage_t_sfrac(%esi),%ebx
836
movl spanpackage_t_pz(%esi),%ecx
840
movl spanpackage_t_pdest(%esi),%edi
841
andl $7,%eax // 0->0, 1->7, 2->6, ... , 7->1
843
subl %eax,%edi // compensate for hardwired offsets
847
movl spanpackage_t_tfrac(%esi),%edx
849
movw spanpackage_t_light(%esi),%dx
850
movl spanpackage_t_zi(%esi),%ebp
852
rorl $16,%ebp // put high 16 bits of 1/z in low word
855
movl spanpackage_t_ptex(%esi),%esi
856
jmp aff8entryvec_table(,%eax,4)
858
// %bx = count of full and partial loops
859
// %ebx high word = sfrac
862
// %edx high word = tfrac
866
// tstep low word = C(r_lstepx)
867
// tstep high word = C(a_tstepxfrac)
868
// C(a_sstepxfrac) low word = 0
869
// C(a_sstepxfrac) high word = C(a_sstepxfrac)
873
// FIXME: do we need to clamp light? We may need at least a buffer bit to
874
// keep it from poking into tfrac and causing problems
883
movb 0x12345678(%eax),%al
891
addl C(a_sstepxfrac),%ebx
892
adcl advancetable+4(,%eax,4),%esi
901
movb 0x12345678(%eax),%al
909
addl C(a_sstepxfrac),%ebx
910
adcl advancetable+4(,%eax,4),%esi
919
movb 0x12345678(%eax),%al
927
addl C(a_sstepxfrac),%ebx
928
adcl advancetable+4(,%eax,4),%esi
937
movb 0x12345678(%eax),%al
945
addl C(a_sstepxfrac),%ebx
946
adcl advancetable+4(,%eax,4),%esi
955
movb 0x12345678(%eax),%al
963
addl C(a_sstepxfrac),%ebx
964
adcl advancetable+4(,%eax,4),%esi
973
movb 0x12345678(%eax),%al
981
addl C(a_sstepxfrac),%ebx
982
adcl advancetable+4(,%eax,4),%esi
991
movb 0x12345678(%eax),%al
999
addl C(a_sstepxfrac),%ebx
1000
adcl advancetable+4(,%eax,4),%esi
1009
movb 0x12345678(%eax),%al
1017
addl C(a_sstepxfrac),%ebx
1018
adcl advancetable+4(,%eax,4),%esi
1026
popl %esi // restore spans pointer
1028
addl $(spanpackage_t_size),%esi // point to next span
1030
movl spanpackage_t_count(%esi),%edx
1031
cmpl $-999999,%edx // any more spans?
1032
jnz LSpanLoop // yes
1035
popl %ebp // restore the caller's stack frame
1036
popl %ebx // restore register variables
1041
// draw a one-long span
1045
movl spanpackage_t_pz(%esi),%ecx
1046
movl spanpackage_t_zi(%esi),%ebp
1048
rorl $16,%ebp // put high 16 bits of 1/z in low word
1049
movl spanpackage_t_ptex(%esi),%ebx
1054
movl spanpackage_t_pdest(%esi),%edi
1055
movb spanpackage_t_light+1(%esi),%ah
1056
addl $(spanpackage_t_size),%esi // point to next span
1059
movb 0x12345678(%eax),%al
1065
.globl C(D_PolysetAff8End)
1066
C(D_PolysetAff8End):
1071
.globl C(D_Aff8Patch)
1073
movl pcolormap(%esp),%eax
1087
//----------------------------------------------------------------------
1088
// Alias model polygon dispatching code, combined with subdivided affine
1089
// triangle drawing code
1090
//----------------------------------------------------------------------
1092
.globl C(D_PolysetDraw)
1095
// spanpackage_t spans[DPS_MAXSPANS + 1 +
1096
// ((CACHE_SIZE - 1) / sizeof(spanpackage_t)) + 1];
1097
// // one extra because of cache line pretouching
1099
// a_spans = (spanpackage_t *)
1100
// (((long)&spans[0] + CACHE_SIZE - 1) & ~(CACHE_SIZE - 1));
1101
subl $(SPAN_SIZE),%esp
1103
addl $(CACHE_SIZE - 1),%eax
1104
andl $(~(CACHE_SIZE - 1)),%eax
1105
movl %eax,C(a_spans)
1107
// if (r_affinetridesc.drawtype)
1110
// D_DrawNonSubdiv ();
1111
movl C(r_affinetridesc)+atd_drawtype,%eax
1113
jz C(D_DrawNonSubdiv)
1115
pushl %ebp // preserve caller stack frame pointer
1117
// lnumtriangles = r_affinetridesc.numtriangles;
1118
movl C(r_affinetridesc)+atd_numtriangles,%ebp
1120
pushl %esi // preserve register variables
1124
// ptri = r_affinetridesc.ptriangles;
1125
movl C(r_affinetridesc)+atd_ptriangles,%ebx
1129
// mtriangle_t *ptri;
1130
// finalvert_t *pfv, *index0, *index1, *index2;
1132
// int lnumtriangles;
1135
// pfv = r_affinetridesc.pfinalverts;
1136
movl C(r_affinetridesc)+atd_pfinalverts,%edi
1138
// for (i=0 ; i<lnumtriangles ; i++)
1143
// index0 = pfv + ptri[i].vertindex[0];
1144
// index1 = pfv + ptri[i].vertindex[1];
1145
// index2 = pfv + ptri[i].vertindex[2];
1146
movl mtri_vertindex-16+0(%ebx,%ebp,),%ecx
1147
movl mtri_vertindex-16+4(%ebx,%ebp,),%esi
1149
shll $(fv_shift),%ecx
1150
movl mtri_vertindex-16+8(%ebx,%ebp,),%edx
1152
shll $(fv_shift),%esi
1155
shll $(fv_shift),%edx
1160
// if (((index0->v[1]-index1->v[1]) *
1161
// (index0->v[0]-index2->v[0]) -
1162
// (index0->v[0]-index1->v[0])*(index0->v[1]-index2->v[1])) >= 0)
1167
// d_pcolormap = &((byte *)acolormap)[index0->v[4] & 0xFF00];
1168
fildl fv_v+4(%ecx) // i0v1
1169
fildl fv_v+4(%esi) // i1v1 | i0v1
1170
fildl fv_v+0(%ecx) // i0v0 | i1v1 | i0v1
1171
fildl fv_v+0(%edx) // i2v0 | i0v0 | i1v1 | i0v1
1172
fxch %st(2) // i1v1 | i0v0 | i2v0 | i0v1
1173
fsubr %st(3),%st(0) // i0v1-i1v1 | i0v0 | i2v0 | i0v1
1174
fildl fv_v+0(%esi) // i1v0 | i0v1-i1v1 | i0v0 | i2v0 | i0v1
1175
fxch %st(2) // i0v0 | i0v1-i1v1 | i1v0 | i2v0 | i0v1
1176
fsub %st(0),%st(3) // i0v0 | i0v1-i1v1 | i1v0 | i0v0-i2v0 | i0v1
1177
fildl fv_v+4(%edx) // i2v1 | i0v0 | i0v1-i1v1 | i1v0 | i0v0-i2v0| i0v1
1178
fxch %st(1) // i0v0 | i2v1 | i0v1-i1v1 | i1v0 | i0v0-i2v0| i0v1
1179
fsubp %st(0),%st(3) // i2v1 | i0v1-i1v1 | i0v0-i1v0 | i0v0-i2v0 | i0v1
1180
fxch %st(1) // i0v1-i1v1 | i2v1 | i0v0-i1v0 | i0v0-i2v0 | i0v1
1181
fmulp %st(0),%st(3) // i2v1 | i0v0-i1v0 | i0v1-i1v1*i0v0-i2v0 | i0v1
1182
fsubrp %st(0),%st(3) // i0v0-i1v0 | i0v1-i1v1*i0v0-i2v0 | i0v1-i2v1
1183
movl fv_v+16(%ecx),%eax
1185
fmulp %st(0),%st(2) // i0v1-i1v1*i0v0-i2v0 | i0v0-i1v0*i0v1-i2v1
1186
addl C(acolormap),%eax
1187
fsubp %st(0),%st(1) // (i0v1-i1v1)*(i0v0-i2v0)-(i0v0-i1v0)*(i0v1-i2v1)
1188
movl %eax,C(d_pcolormap)
1191
subl $0x80000001,%eax
1194
// if (ptri[i].facesfront)
1196
// D_PolysetRecursiveTriangle(index0->v, index1->v, index2->v);
1197
movl mtri_facesfront-16(%ebx,%ebp,),%eax
1204
call C(D_PolysetRecursiveTriangle)
1215
// s0 = index0->v[2];
1216
// s1 = index1->v[2];
1217
// s2 = index2->v[2];
1218
movl fv_v+8(%ecx),%eax
1220
movl fv_v+8(%esi),%eax
1222
movl fv_v+8(%edx),%eax
1227
// if (index0->flags & ALIAS_ONSEAM)
1228
// index0->v[2] += r_affinetridesc.seamfixupX16;
1229
movl C(r_affinetridesc)+atd_seamfixupX16,%eax
1230
testl $(ALIAS_ONSEAM),fv_flags(%ecx)
1232
addl %eax,fv_v+8(%ecx)
1235
// if (index1->flags & ALIAS_ONSEAM)
1236
// index1->v[2] += r_affinetridesc.seamfixupX16;
1237
testl $(ALIAS_ONSEAM),fv_flags(%esi)
1239
addl %eax,fv_v+8(%esi)
1242
// if (index2->flags & ALIAS_ONSEAM)
1243
// index2->v[2] += r_affinetridesc.seamfixupX16;
1244
testl $(ALIAS_ONSEAM),fv_flags(%edx)
1246
addl %eax,fv_v+8(%edx)
1249
// D_PolysetRecursiveTriangle(index0->v, index1->v, index2->v);
1253
call C(D_PolysetRecursiveTriangle)
1255
// index0->v[2] = s0;
1256
// index1->v[2] = s1;
1257
// index2->v[2] = s2;
1261
movl %eax,fv_v+8(%edx)
1263
movl %eax,fv_v+8(%esi)
1265
movl %eax,fv_v+8(%ecx)
1274
popl %edi // restore the caller's stack frame
1276
popl %esi // restore register variables
1279
addl $(SPAN_SIZE),%esp
1284
//----------------------------------------------------------------------
1285
// Alias model triangle left-edge scanning code
1286
//----------------------------------------------------------------------
1290
.globl C(D_PolysetScanLeftEdge)
1291
C(D_PolysetScanLeftEdge):
1292
pushl %ebp // preserve caller stack frame pointer
1293
pushl %esi // preserve register variables
1297
movl height(%esp),%eax
1298
movl C(d_sfrac),%ecx
1302
movl C(d_pedgespanpackage),%esi
1303
movl C(d_tfrac),%edx
1304
movl C(d_light),%edi
1309
// %ecx: d_sfrac in high word, count in low word
1311
// %esi: d_pedgespanpackage, errorterm, scratch alternately
1320
// d_pedgespanpackage->ptex = ptex;
1321
// d_pedgespanpackage->pdest = d_pdest;
1322
// d_pedgespanpackage->pz = d_pz;
1323
// d_pedgespanpackage->count = d_aspancount;
1324
// d_pedgespanpackage->light = d_light;
1325
// d_pedgespanpackage->zi = d_zi;
1326
// d_pedgespanpackage->sfrac = d_sfrac << 16;
1327
// d_pedgespanpackage->tfrac = d_tfrac << 16;
1328
movl %ebx,spanpackage_t_ptex(%esi)
1329
movl C(d_pdest),%eax
1330
movl %eax,spanpackage_t_pdest(%esi)
1332
movl %eax,spanpackage_t_pz(%esi)
1333
movl C(d_aspancount),%eax
1334
movl %eax,spanpackage_t_count(%esi)
1335
movl %edi,spanpackage_t_light(%esi)
1336
movl %ebp,spanpackage_t_zi(%esi)
1337
movl %ecx,spanpackage_t_sfrac(%esi)
1338
movl %edx,spanpackage_t_tfrac(%esi)
1340
// pretouch the next cache line
1341
movb spanpackage_t_size(%esi),%al
1343
// d_pedgespanpackage++;
1344
addl $(spanpackage_t_size),%esi
1345
movl C(erroradjustup),%eax
1346
movl %esi,C(d_pedgespanpackage)
1348
// errorterm += erroradjustup;
1349
movl C(errorterm),%esi
1351
movl C(d_pdest),%eax
1353
// if (errorterm >= 0)
1355
js LNoLeftEdgeTurnover
1357
// errorterm -= erroradjustdown;
1358
// d_pdest += d_pdestextrastep;
1359
subl C(erroradjustdown),%esi
1360
addl C(d_pdestextrastep),%eax
1361
movl %esi,C(errorterm)
1362
movl %eax,C(d_pdest)
1364
// d_pz += d_pzextrastep;
1365
// d_aspancount += d_countextrastep;
1366
// d_ptex += d_ptexextrastep;
1367
// d_sfrac += d_sfracextrastep;
1368
// d_ptex += d_sfrac >> 16;
1369
// d_sfrac &= 0xFFFF;
1370
// d_tfrac += d_tfracextrastep;
1372
movl C(d_aspancount),%esi
1373
addl C(d_pzextrastep),%eax
1374
addl C(d_sfracextrastep),%ecx
1375
adcl C(d_ptexextrastep),%ebx
1376
addl C(d_countextrastep),%esi
1378
movl C(d_tfracextrastep),%eax
1379
movl %esi,C(d_aspancount)
1382
// if (d_tfrac & 0x10000)
1386
// d_ptex += r_affinetridesc.skinwidth;
1387
// d_tfrac &= 0xFFFF;
1388
addl C(r_affinetridesc)+atd_skinwidth,%ebx
1394
// d_light += d_lightextrastep;
1395
// d_zi += d_ziextrastep;
1396
addl C(d_lightextrastep),%edi
1397
addl C(d_ziextrastep),%ebp
1400
movl C(d_pedgespanpackage),%esi
1414
LNoLeftEdgeTurnover:
1415
movl %esi,C(errorterm)
1417
// d_pdest += d_pdestbasestep;
1418
addl C(d_pdestbasestep),%eax
1419
movl %eax,C(d_pdest)
1421
// d_pz += d_pzbasestep;
1422
// d_aspancount += ubasestep;
1423
// d_ptex += d_ptexbasestep;
1424
// d_sfrac += d_sfracbasestep;
1425
// d_ptex += d_sfrac >> 16;
1426
// d_sfrac &= 0xFFFF;
1428
movl C(d_aspancount),%esi
1429
addl C(d_pzbasestep),%eax
1430
addl C(d_sfracbasestep),%ecx
1431
adcl C(d_ptexbasestep),%ebx
1432
addl C(ubasestep),%esi
1434
movl %esi,C(d_aspancount)
1436
// d_tfrac += d_tfracbasestep;
1437
movl C(d_tfracbasestep),%esi
1440
// if (d_tfrac & 0x10000)
1444
// d_ptex += r_affinetridesc.skinwidth;
1445
// d_tfrac &= 0xFFFF;
1446
addl C(r_affinetridesc)+atd_skinwidth,%ebx
1452
// d_light += d_lightbasestep;
1453
// d_zi += d_zibasestep;
1454
addl C(d_lightbasestep),%edi
1455
addl C(d_zibasestep),%ebp
1458
// } while (--height);
1459
movl C(d_pedgespanpackage),%esi
1471
//----------------------------------------------------------------------
1472
// Alias model vertex drawing code
1473
//----------------------------------------------------------------------
1476
#define numverts 8+8
1478
.globl C(D_PolysetDrawFinalVerts)
1479
C(D_PolysetDrawFinalVerts):
1480
pushl %ebp // preserve caller stack frame pointer
1486
movl numverts(%esp),%ecx
1489
pushl %esi // preserve register variables
1494
// for (i=0 ; i<numverts ; i++, fv++)
1496
// // valid triangle coordinates for filling can include the bottom and
1497
// // right clip edges, due to the fill rule; these shouldn't be drawn
1498
// if ((fv->v[0] < r_refdef.vrectright) &&
1499
// (fv->v[1] < r_refdef.vrectbottom))
1501
movl fv_v+0(%ebx),%eax
1502
movl C(r_refdef)+rd_vrectright,%edx
1505
movl fv_v+4(%ebx),%esi
1506
movl C(r_refdef)+rd_vrectbottom,%edx
1510
// zbuf = zspantable[fv->v[1]] + fv->v[0];
1511
movl C(zspantable)(,%esi,4),%edi
1513
// z = fv->v[5]>>16;
1514
movl fv_v+20(%ebx),%edx
1520
cmpw (%edi,%eax,2),%dx
1524
movw %dx,(%edi,%eax,2)
1526
// pix = skintable[fv->v[3]>>16][fv->v[2]>>16];
1527
movl fv_v+12(%ebx),%edi
1529
movl C(skintable)(,%edi,4),%edi
1530
movl fv_v+8(%ebx),%edx
1532
movb (%edi,%edx),%dl
1534
// pix = ((byte *)acolormap)[pix + (fv->v[4] & 0xFF00)];
1535
movl fv_v+16(%ebx),%edi
1539
movl C(acolormap),%edx
1540
movb (%edx,%edi,1),%dl
1542
// d_viewbuffer[d_scantable[fv->v[1]] + fv->v[0]] = pix;
1543
movl C(d_scantable)(,%esi,4),%edi
1544
movl C(d_viewbuffer),%esi
1546
movb %dl,(%esi,%edi)
1552
addl $(fv_size),%ebx
1563
//----------------------------------------------------------------------
1564
// Alias model non-subdivided polygon dispatching code
1566
// not C-callable because of stack buffer cleanup
1567
//----------------------------------------------------------------------
1569
.globl C(D_DrawNonSubdiv)
1571
pushl %ebp // preserve caller stack frame pointer
1572
movl C(r_affinetridesc)+atd_numtriangles,%ebp
1574
shll $(mtri_shift),%ebp
1575
pushl %esi // preserve register variables
1576
movl C(r_affinetridesc)+atd_ptriangles,%esi
1579
// mtriangle_t *ptri;
1580
// finalvert_t *pfv, *index0, *index1, *index2;
1582
// int lnumtriangles;
1584
// pfv = r_affinetridesc.pfinalverts;
1585
// ptri = r_affinetridesc.ptriangles;
1586
// lnumtriangles = r_affinetridesc.numtriangles;
1590
// for (i=0 ; i<lnumtriangles ; i++, ptri++)
1592
// index0 = pfv + ptri->vertindex[0];
1593
// index1 = pfv + ptri->vertindex[1];
1594
// index2 = pfv + ptri->vertindex[2];
1595
movl C(r_affinetridesc)+atd_pfinalverts,%edi
1596
movl mtri_vertindex+0-mtri_size(%esi,%ebp,1),%ecx
1597
shll $(fv_shift),%ecx
1598
movl mtri_vertindex+4-mtri_size(%esi,%ebp,1),%edx
1599
shll $(fv_shift),%edx
1600
movl mtri_vertindex+8-mtri_size(%esi,%ebp,1),%ebx
1601
shll $(fv_shift),%ebx
1606
// d_xdenom = (index0->v[1]-index1->v[1]) *
1607
// (index0->v[0]-index2->v[0]) -
1608
// (index0->v[0]-index1->v[0])*(index0->v[1]-index2->v[1]);
1609
movl fv_v+4(%ecx),%eax
1610
movl fv_v+0(%ecx),%esi
1611
subl fv_v+4(%edx),%eax
1612
subl fv_v+0(%ebx),%esi
1614
movl fv_v+0(%ecx),%esi
1615
movl fv_v+4(%ecx),%edi
1616
subl fv_v+0(%edx),%esi
1617
subl fv_v+4(%ebx),%edi
1621
// if (d_xdenom >= 0)
1628
movl %eax,C(d_xdenom)
1631
// r_p0[0] = index0->v[0]; // u
1632
// r_p0[1] = index0->v[1]; // v
1633
// r_p0[2] = index0->v[2]; // s
1634
// r_p0[3] = index0->v[3]; // t
1635
// r_p0[4] = index0->v[4]; // light
1636
// r_p0[5] = index0->v[5]; // iz
1637
movl fv_v+0(%ecx),%eax
1638
movl fv_v+4(%ecx),%esi
1641
movl fv_v+8(%ecx),%eax
1642
movl fv_v+12(%ecx),%esi
1644
movl %esi,C(r_p0)+12
1645
movl fv_v+16(%ecx),%eax
1646
movl fv_v+20(%ecx),%esi
1647
movl %eax,C(r_p0)+16
1648
movl %esi,C(r_p0)+20
1652
// r_p1[0] = index1->v[0];
1653
// r_p1[1] = index1->v[1];
1654
// r_p1[2] = index1->v[2];
1655
// r_p1[3] = index1->v[3];
1656
// r_p1[4] = index1->v[4];
1657
// r_p1[5] = index1->v[5];
1658
movl fv_v+0(%edx),%eax
1659
movl fv_v+4(%edx),%esi
1662
movl fv_v+8(%edx),%eax
1663
movl fv_v+12(%edx),%esi
1665
movl %esi,C(r_p1)+12
1666
movl fv_v+16(%edx),%eax
1667
movl fv_v+20(%edx),%esi
1668
movl %eax,C(r_p1)+16
1669
movl %esi,C(r_p1)+20
1671
// r_p2[0] = index2->v[0];
1672
// r_p2[1] = index2->v[1];
1673
// r_p2[2] = index2->v[2];
1674
// r_p2[3] = index2->v[3];
1675
// r_p2[4] = index2->v[4];
1676
// r_p2[5] = index2->v[5];
1677
movl fv_v+0(%ebx),%eax
1678
movl fv_v+4(%ebx),%esi
1681
movl fv_v+8(%ebx),%eax
1682
movl fv_v+12(%ebx),%esi
1684
movl %esi,C(r_p2)+12
1685
movl fv_v+16(%ebx),%eax
1686
movl fv_v+20(%ebx),%esi
1687
movl %eax,C(r_p2)+16
1688
movl C(r_affinetridesc)+atd_ptriangles,%edi
1689
movl %esi,C(r_p2)+20
1690
movl mtri_facesfront-mtri_size(%edi,%ebp,1),%eax
1692
// if (!ptri->facesfront)
1697
// if (index0->flags & ALIAS_ONSEAM)
1698
// r_p0[2] += r_affinetridesc.seamfixupX16;
1699
movl fv_flags(%ecx),%eax
1700
movl fv_flags(%edx),%esi
1701
movl fv_flags(%ebx),%edi
1702
testl $(ALIAS_ONSEAM),%eax
1703
movl C(r_affinetridesc)+atd_seamfixupX16,%eax
1708
// if (index1->flags & ALIAS_ONSEAM)
1709
// r_p1[2] += r_affinetridesc.seamfixupX16;
1710
testl $(ALIAS_ONSEAM),%esi
1715
// if (index2->flags & ALIAS_ONSEAM)
1716
// r_p2[2] += r_affinetridesc.seamfixupX16;
1717
testl $(ALIAS_ONSEAM),%edi
1728
// D_PolysetSetEdgeTable ();
1729
// D_RasterizeAliasPolySmooth ();
1730
call C(D_PolysetSetEdgeTable)
1731
call C(D_RasterizeAliasPolySmooth)
1734
movl C(r_affinetridesc)+atd_ptriangles,%esi
1744
addl $(SPAN_SIZE),%esp