|
|
1.1 root 1: //
2: // d_polysa.s
3: // x86 assembly-language polygon model drawing code
4: //
5:
6: #include "asm_i386.h"
7: #include "quakeasm.h"
8: #include "asm_draw.h"
9: #include "d_ifacea.h"
10:
11: #if id386
12:
13: // !!! if this is changed, it must be changed in d_polyse.c too !!!
14: #define DPS_MAXSPANS MAXHEIGHT+1
15: // 1 extra for spanpackage that marks end
16:
1.1.1.3 ! root 17: #define SPAN_SIZE (((DPS_MAXSPANS + 1 + ((CACHE_SIZE - 1) / spanpackage_t_size)) + 1) * spanpackage_t_size)
! 18:
1.1 root 19:
20: .data
21:
22: .align 4
23: p10_minus_p20: .single 0
24: p01_minus_p21: .single 0
25: temp0: .single 0
26: temp1: .single 0
27: Ltemp: .single 0
28:
1.1.1.3 ! root 29: aff8entryvec_table: .long LDraw8, LDraw7, LDraw6, LDraw5
1.1 root 30: .long LDraw4, LDraw3, LDraw2, LDraw1
31:
32: lzistepx: .long 0
33:
34:
35: .text
36:
1.1.1.3 ! root 37: #ifndef NeXT
! 38: .extern C(D_PolysetSetEdgeTable)
! 39: .extern C(D_RasterizeAliasPolySmooth)
! 40: #endif
! 41:
1.1 root 42: //----------------------------------------------------------------------
43: // affine triangle gradient calculation code
44: //----------------------------------------------------------------------
45:
46: #define skinwidth 4+0
47:
48: .globl C(D_PolysetCalcGradients)
49: C(D_PolysetCalcGradients):
50:
51: // p00_minus_p20 = r_p0[0] - r_p2[0];
52: // p01_minus_p21 = r_p0[1] - r_p2[1];
53: // p10_minus_p20 = r_p1[0] - r_p2[0];
54: // p11_minus_p21 = r_p1[1] - r_p2[1];
55: //
56: // xstepdenominv = 1.0 / (p10_minus_p20 * p01_minus_p21 -
57: // p00_minus_p20 * p11_minus_p21);
58: //
59: // ystepdenominv = -xstepdenominv;
60:
61: fildl C(r_p0)+0 // r_p0[0]
62: fildl C(r_p2)+0 // r_p2[0] | r_p0[0]
63: fildl C(r_p0)+4 // r_p0[1] | r_p2[0] | r_p0[0]
64: fildl C(r_p2)+4 // r_p2[1] | r_p0[1] | r_p2[0] | r_p0[0]
65: fildl C(r_p1)+0 // r_p1[0] | r_p2[1] | r_p0[1] | r_p2[0] | r_p0[0]
66: fildl C(r_p1)+4 // r_p1[1] | r_p1[0] | r_p2[1] | r_p0[1] |
67: // r_p2[0] | r_p0[0]
68: fxch %st(3) // r_p0[1] | r_p1[0] | r_p2[1] | r_p1[1] |
69: // r_p2[0] | r_p0[0]
1.1.1.3 ! root 70: fsub %st(2),%st(0) // p01_minus_p21 | r_p1[0] | r_p2[1] | r_p1[1] |
1.1 root 71: // r_p2[0] | r_p0[0]
72: fxch %st(1) // r_p1[0] | p01_minus_p21 | r_p2[1] | r_p1[1] |
73: // r_p2[0] | r_p0[0]
1.1.1.3 ! root 74: fsub %st(4),%st(0) // p10_minus_p20 | p01_minus_p21 | r_p2[1] |
1.1 root 75: // r_p1[1] | r_p2[0] | r_p0[0]
76: fxch %st(5) // r_p0[0] | p01_minus_p21 | r_p2[1] |
77: // r_p1[1] | r_p2[0] | p10_minus_p20
78: fsubp %st(0),%st(4) // p01_minus_p21 | r_p2[1] | r_p1[1] |
79: // p00_minus_p20 | p10_minus_p20
80: fxch %st(2) // r_p1[1] | r_p2[1] | p01_minus_p21 |
81: // p00_minus_p20 | p10_minus_p20
82: fsubp %st(0),%st(1) // p11_minus_p21 | p01_minus_p21 |
83: // p00_minus_p20 | p10_minus_p20
84: fxch %st(1) // p01_minus_p21 | p11_minus_p21 |
85: // p00_minus_p20 | p10_minus_p20
86: flds C(d_xdenom) // d_xdenom | p01_minus_p21 | p11_minus_p21 |
87: // p00_minus_p20 | p10_minus_p20
88: fxch %st(4) // p10_minus_p20 | p01_minus_p21 | p11_minus_p21 |
89: // p00_minus_p20 | d_xdenom
90: fstps p10_minus_p20 // p01_minus_p21 | p11_minus_p21 |
91: // p00_minus_p20 | d_xdenom
92: fstps p01_minus_p21 // p11_minus_p21 | p00_minus_p20 | xstepdenominv
93: fxch %st(2) // xstepdenominv | p00_minus_p20 | p11_minus_p21
94:
95: //// ceil () for light so positive steps are exaggerated, negative steps
96: //// diminished, pushing us away from underflow toward overflow. Underflow is
97: //// very visible, overflow is very unlikely, because of ambient lighting
98: // t0 = r_p0[4] - r_p2[4];
99: // t1 = r_p1[4] - r_p2[4];
100:
101: fildl C(r_p2)+16 // r_p2[4] | xstepdenominv | p00_minus_p20 |
102: // p11_minus_p21
103: fildl C(r_p0)+16 // r_p0[4] | r_p2[4] | xstepdenominv |
104: // p00_minus_p20 | p11_minus_p21
105: fildl C(r_p1)+16 // r_p1[4] | r_p0[4] | r_p2[4] | xstepdenominv |
106: // p00_minus_p20 | p11_minus_p21
107: fxch %st(2) // r_p2[4] | r_p0[4] | r_p1[4] | xstepdenominv |
108: // p00_minus_p20 | p11_minus_p21
109: fld %st(0) // r_p2[4] | r_p2[4] | r_p0[4] | r_p1[4] |
110: // xstepdenominv | p00_minus_p20 | p11_minus_p21
111: fsubrp %st(0),%st(2) // r_p2[4] | t0 | r_p1[4] | xstepdenominv |
112: // p00_minus_p20 | p11_minus_p21
113: fsubrp %st(0),%st(2) // t0 | t1 | xstepdenominv | p00_minus_p20 |
114: // p11_minus_p21
115:
116: // r_lstepx = (int)
117: // ceil((t1 * p01_minus_p21 - t0 * p11_minus_p21) * xstepdenominv);
118: // r_lstepy = (int)
119: // ceil((t1 * p00_minus_p20 - t0 * p10_minus_p20) * ystepdenominv);
120:
121: fld %st(0) // t0 | t0 | t1 | xstepdenominv | p00_minus_p20 |
122: // p11_minus_p21
1.1.1.3 ! root 123: fmul %st(5),%st(0) // t0*p11_minus_p21 | t0 | t1 | xstepdenominv |
1.1 root 124: // p00_minus_p20 | p11_minus_p21
125: fxch %st(2) // t1 | t0 | t0*p11_minus_p21 | xstepdenominv |
126: // p00_minus_p20 | p11_minus_p21
127: fld %st(0) // t1 | t1 | t0 | t0*p11_minus_p21 |
128: // xstepdenominv | p00_minus_p20 | p11_minus_p21
129: fmuls p01_minus_p21 // t1*p01_minus_p21 | t1 | t0 | t0*p11_minus_p21 |
130: // xstepdenominv | p00_minus_p20 | p11_minus_p21
131: fxch %st(2) // t0 | t1 | t1*p01_minus_p21 | t0*p11_minus_p21 |
132: // xstepdenominv | p00_minus_p20 | p11_minus_p21
133: fmuls p10_minus_p20 // t0*p10_minus_p20 | t1 | t1*p01_minus_p21 |
134: // t0*p11_minus_p21 | xstepdenominv |
135: // p00_minus_p20 | p11_minus_p21
136: fxch %st(1) // t1 | t0*p10_minus_p20 | t1*p01_minus_p21 |
137: // t0*p11_minus_p21 | xstepdenominv |
138: // p00_minus_p20 | p11_minus_p21
1.1.1.3 ! root 139: fmul %st(5),%st(0) // t1*p00_minus_p20 | t0*p10_minus_p20 |
1.1 root 140: // t1*p01_minus_p21 | t0*p11_minus_p21 |
141: // xstepdenominv | p00_minus_p20 | p11_minus_p21
142: fxch %st(2) // t1*p01_minus_p21 | t0*p10_minus_p20 |
143: // t1*p00_minus_p20 | t0*p11_minus_p21 |
144: // xstepdenominv | p00_minus_p20 | p11_minus_p21
145: fsubp %st(0),%st(3) // t0*p10_minus_p20 | t1*p00_minus_p20 |
146: // t1*p01_minus_p21 - t0*p11_minus_p21 |
147: // xstepdenominv | p00_minus_p20 | p11_minus_p21
148: fsubrp %st(0),%st(1) // t1*p00_minus_p20 - t0*p10_minus_p20 |
149: // t1*p01_minus_p21 - t0*p11_minus_p21 |
150: // xstepdenominv | p00_minus_p20 | p11_minus_p21
151: fld %st(2) // xstepdenominv |
152: // t1*p00_minus_p20 - t0*p10_minus_p20 |
153: // t1*p01_minus_p21 - t0*p11_minus_p21 |
154: // xstepdenominv | p00_minus_p20 | p11_minus_p21
155: fmuls float_minus_1 // ystepdenominv |
156: // t1*p00_minus_p20 - t0*p10_minus_p20 |
157: // t1*p01_minus_p21 - t0*p11_minus_p21 |
158: // xstepdenominv | p00_minus_p20 | p11_minus_p21
159: fxch %st(2) // t1*p01_minus_p21 - t0*p11_minus_p21 |
160: // t1*p00_minus_p20 - t0*p10_minus_p20 |
161: // ystepdenominv | xstepdenominv | p00_minus_p20 |
162: // p11_minus_p21
1.1.1.3 ! root 163: fmul %st(3),%st(0) // (t1*p01_minus_p21 - t0*p11_minus_p21)*
1.1 root 164: // xstepdenominv |
165: // t1*p00_minus_p20 - t0*p10_minus_p20 |
166: // | ystepdenominv | xstepdenominv |
167: // p00_minus_p20 | p11_minus_p21
168: fxch %st(1) // t1*p00_minus_p20 - t0*p10_minus_p20 |
169: // (t1*p01_minus_p21 - t0*p11_minus_p21)*
170: // xstepdenominv | ystepdenominv |
171: // xstepdenominv | p00_minus_p20 | p11_minus_p21
1.1.1.3 ! root 172: fmul %st(2),%st(0) // (t1*p00_minus_p20 - t0*p10_minus_p20)*
1.1 root 173: // ystepdenominv |
174: // (t1*p01_minus_p21 - t0*p11_minus_p21)*
175: // xstepdenominv | ystepdenominv |
176: // xstepdenominv | p00_minus_p20 | p11_minus_p21
177: fldcw ceil_cw
178: fistpl C(r_lstepy) // r_lstepx | ystepdenominv | xstepdenominv |
179: // p00_minus_p20 | p11_minus_p21
180: fistpl C(r_lstepx) // ystepdenominv | xstepdenominv | p00_minus_p20 |
181: // p11_minus_p21
182: fldcw single_cw
183:
184: // t0 = r_p0[2] - r_p2[2];
185: // t1 = r_p1[2] - r_p2[2];
186:
187: fildl C(r_p2)+8 // r_p2[2] | ystepdenominv | xstepdenominv |
188: // p00_minus_p20 | p11_minus_p21
189: fildl C(r_p0)+8 // r_p0[2] | r_p2[2] | ystepdenominv |
190: // xstepdenominv | p00_minus_p20 | p11_minus_p21
191: fildl C(r_p1)+8 // r_p1[2] | r_p0[2] | r_p2[2] | ystepdenominv |
192: // xstepdenominv | p00_minus_p20 | p11_minus_p21
193: fxch %st(2) // r_p2[2] | r_p0[2] | r_p1[2] | ystepdenominv |
194: // xstepdenominv | p00_minus_p20 | p11_minus_p21
195: fld %st(0) // r_p2[2] | r_p2[2] | r_p0[2] | r_p1[2] |
196: // ystepdenominv | xstepdenominv | p00_minus_p20 |
197: // p11_minus_p21
198: fsubrp %st(0),%st(2) // r_p2[2] | t0 | r_p1[2] | ystepdenominv |
199: // xstepdenominv | p00_minus_p20 | p11_minus_p21
200: fsubrp %st(0),%st(2) // t0 | t1 | ystepdenominv | xstepdenominv |
201: // p00_minus_p20 | p11_minus_p21
202:
203: // r_sstepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) *
204: // xstepdenominv);
205: // r_sstepy = (int)((t1 * p00_minus_p20 - t0 * p10_minus_p20) *
206: // ystepdenominv);
207:
208: fld %st(0) // t0 | t0 | t1 | ystepdenominv | xstepdenominv
1.1.1.3 ! root 209: fmul %st(6),%st(0) // t0*p11_minus_p21 | t0 | t1 | ystepdenominv |
1.1 root 210: // xstepdenominv | p00_minus_p20 | p11_minus_p21
211: fxch %st(2) // t1 | t0 | t0*p11_minus_p21 | ystepdenominv |
212: // xstepdenominv | p00_minus_p20 | p11_minus_p21
213: fld %st(0) // t1 | t1 | t0 | t0*p11_minus_p21 |
214: // ystepdenominv | xstepdenominv | p00_minus_p20 |
215: // p11_minus_p21
216: fmuls p01_minus_p21 // t1*p01_minus_p21 | t1 | t0 | t0*p11_minus_p21 |
217: // ystepdenominv | xstepdenominv | p00_minus_p20 |
218: // p11_minus_p21
219: fxch %st(2) // t0 | t1 | t1*p01_minus_p21 | t0*p11_minus_p21 |
220: // ystepdenominv | xstepdenominv | p00_minus_p20 |
221: // p11_minus_p21
222: fmuls p10_minus_p20 // t0*p10_minus_p20 | t1 | t1*p01_minus_p21 |
223: // t0*p11_minus_p21 | ystepdenominv |
224: // xstepdenominv | p00_minus_p20 | p11_minus_p21
225: fxch %st(1) // t1 | t0*p10_minus_p20 | t1*p01_minus_p21 |
226: // t0*p11_minus_p21 | ystepdenominv |
227: // xstepdenominv | p00_minus_p20 | p11_minus_p21
1.1.1.3 ! root 228: fmul %st(6),%st(0) // t1*p00_minus_p20 | t0*p10_minus_p20 |
1.1 root 229: // t1*p01_minus_p21 | t0*p11_minus_p21 |
230: // ystepdenominv | xstepdenominv | p00_minus_p20 |
231: // p11_minus_p21
232: fxch %st(2) // t1*p01_minus_p21 | t0*p10_minus_p20 |
233: // t1*p00_minus_p20 | t0*p11_minus_p21 |
234: // ystepdenominv | xstepdenominv | p00_minus_p20 |
235: // p11_minus_p21
236: fsubp %st(0),%st(3) // t0*p10_minus_p20 | t1*p00_minus_p20 |
237: // t1*p01_minus_p21 - t0*p11_minus_p21 |
238: // ystepdenominv | xstepdenominv | p00_minus_p20 |
239: // p11_minus_p21
240: fsubrp %st(0),%st(1) // t1*p00_minus_p20 - t0*p10_minus_p20 |
241: // t1*p01_minus_p21 - t0*p11_minus_p21 |
242: // ystepdenominv | xstepdenominv | p00_minus_p20 |
243: // p11_minus_p21
1.1.1.3 ! root 244: fmul %st(2),%st(0) // (t1*p00_minus_p20 - t0*p10_minus_p20)*
1.1 root 245: // ystepdenominv |
246: // t1*p01_minus_p21 - t0*p11_minus_p21 |
247: // ystepdenominv | xstepdenominv | p00_minus_p20 |
248: // p11_minus_p21
249: fxch %st(1) // t1*p01_minus_p21 - t0*p11_minus_p21 |
250: // (t1*p00_minus_p20 - t0*p10_minus_p20)*
251: // ystepdenominv | ystepdenominv |
252: // xstepdenominv | p00_minus_p20 | p11_minus_p21
1.1.1.3 ! root 253: fmul %st(3),%st(0) // (t1*p01_minus_p21 - t0*p11_minus_p21)*
1.1 root 254: // xstepdenominv |
255: // (t1*p00_minus_p20 - t0*p10_minus_p20)*
256: // ystepdenominv | ystepdenominv |
257: // xstepdenominv | p00_minus_p20 | p11_minus_p21
258: fxch %st(1) // (t1*p00_minus_p20 - t0*p10_minus_p20)*
259: // ystepdenominv |
260: // (t1*p01_minus_p21 - t0*p11_minus_p21)*
261: // xstepdenominv | ystepdenominv |
262: // xstepdenominv | p00_minus_p20 | p11_minus_p21
263: fistpl C(r_sstepy) // r_sstepx | ystepdenominv | xstepdenominv |
264: // p00_minus_p20 | p11_minus_p21
265: fistpl C(r_sstepx) // ystepdenominv | xstepdenominv | p00_minus_p20 |
266: // p11_minus_p21
267:
268: // t0 = r_p0[3] - r_p2[3];
269: // t1 = r_p1[3] - r_p2[3];
270:
271: fildl C(r_p2)+12 // r_p2[3] | ystepdenominv | xstepdenominv |
272: // p00_minus_p20 | p11_minus_p21
273: fildl C(r_p0)+12 // r_p0[3] | r_p2[3] | ystepdenominv |
274: // xstepdenominv | p00_minus_p20 | p11_minus_p21
275: fildl C(r_p1)+12 // r_p1[3] | r_p0[3] | r_p2[3] | ystepdenominv |
276: // xstepdenominv | p00_minus_p20 | p11_minus_p21
277: fxch %st(2) // r_p2[3] | r_p0[3] | r_p1[3] | ystepdenominv |
278: // xstepdenominv | p00_minus_p20 | p11_minus_p21
279: fld %st(0) // r_p2[3] | r_p2[3] | r_p0[3] | r_p1[3] |
280: // ystepdenominv | xstepdenominv | p00_minus_p20 |
281: // p11_minus_p21
282: fsubrp %st(0),%st(2) // r_p2[3] | t0 | r_p1[3] | ystepdenominv |
283: // xstepdenominv | p00_minus_p20 | p11_minus_p21
284: fsubrp %st(0),%st(2) // t0 | t1 | ystepdenominv | xstepdenominv |
285: // p00_minus_p20 | p11_minus_p21
286:
287: // r_tstepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) *
288: // xstepdenominv);
289: // r_tstepy = (int)((t1 * p00_minus_p20 - t0 * p10_minus_p20) *
290: // ystepdenominv);
291:
292: fld %st(0) // t0 | t0 | t1 | ystepdenominv | xstepdenominv |
293: // p00_minus_p20 | p11_minus_p21
1.1.1.3 ! root 294: fmul %st(6),%st(0) // t0*p11_minus_p21 | t0 | t1 | ystepdenominv |
1.1 root 295: // xstepdenominv | p00_minus_p20 | p11_minus_p21
296: fxch %st(2) // t1 | t0 | t0*p11_minus_p21 | ystepdenominv |
297: // xstepdenominv | p00_minus_p20 | p11_minus_p21
298: fld %st(0) // t1 | t1 | t0 | t0*p11_minus_p21 |
299: // ystepdenominv | xstepdenominv | p00_minus_p20 |
300: // p11_minus_p21
301: fmuls p01_minus_p21 // t1*p01_minus_p21 | t1 | t0 | t0*p11_minus_p21 |
302: // ystepdenominv | xstepdenominv | p00_minus_p20 |
303: // p11_minus_p21
304: fxch %st(2) // t0 | t1 | t1*p01_minus_p21 | t0*p11_minus_p21 |
305: // ystepdenominv | xstepdenominv | p00_minus_p20 |
306: // p11_minus_p21
307: fmuls p10_minus_p20 // t0*p10_minus_p20 | t1 | t1*p01_minus_p21 |
308: // t0*p11_minus_p21 | ystepdenominv |
309: // xstepdenominv | p00_minus_p20 | p11_minus_p21
310: fxch %st(1) // t1 | t0*p10_minus_p20 | t1*p01_minus_p21 |
311: // t0*p11_minus_p21 | ystepdenominv |
312: // xstepdenominv | p00_minus_p20 | p11_minus_p21
1.1.1.3 ! root 313: fmul %st(6),%st(0) // t1*p00_minus_p20 | t0*p10_minus_p20 |
1.1 root 314: // t1*p01_minus_p21 | t0*p11_minus_p21 |
315: // ystepdenominv | xstepdenominv | p00_minus_p20 |
316: // p11_minus_p21
317: fxch %st(2) // t1*p01_minus_p21 | t0*p10_minus_p20 |
318: // t1*p00_minus_p20 | t0*p11_minus_p21 |
319: // ystepdenominv | xstepdenominv | p00_minus_p20 |
320: // p11_minus_p21
321: fsubp %st(0),%st(3) // t0*p10_minus_p20 | t1*p00_minus_p20 |
322: // t1*p01_minus_p21 - t0*p11_minus_p21 |
323: // ystepdenominv | xstepdenominv | p00_minus_p20 |
324: // p11_minus_p21
325: fsubrp %st(0),%st(1) // t1*p00_minus_p20 - t0*p10_minus_p20 |
326: // t1*p01_minus_p21 - t0*p11_minus_p21 |
327: // ystepdenominv | xstepdenominv | p00_minus_p20 |
328: // p11_minus_p21
1.1.1.3 ! root 329: fmul %st(2),%st(0) // (t1*p00_minus_p20 - t0*p10_minus_p20)*
1.1 root 330: // ystepdenominv |
331: // t1*p01_minus_p21 - t0*p11_minus_p21 |
332: // ystepdenominv | xstepdenominv | p00_minus_p20 |
333: // p11_minus_p21
334: fxch %st(1) // t1*p01_minus_p21 - t0*p11_minus_p21 |
335: // (t1*p00_minus_p20 - t0*p10_minus_p20)*
336: // ystepdenominv | ystepdenominv |
337: // xstepdenominv | p00_minus_p20 | p11_minus_p21
1.1.1.3 ! root 338: fmul %st(3),%st(0) // (t1*p01_minus_p21 - t0*p11_minus_p21)*
1.1 root 339: // xstepdenominv |
340: // (t1*p00_minus_p20 - t0*p10_minus_p20)*
341: // ystepdenominv | ystepdenominv |
342: // xstepdenominv | p00_minus_p20 | p11_minus_p21
343: fxch %st(1) // (t1*p00_minus_p20 - t0*p10_minus_p20)*
344: // ystepdenominv |
345: // (t1*p01_minus_p21 - t0*p11_minus_p21)*
346: // xstepdenominv | ystepdenominv |
347: // xstepdenominv | p00_minus_p20 | p11_minus_p21
348: fistpl C(r_tstepy) // r_tstepx | ystepdenominv | xstepdenominv |
349: // p00_minus_p20 | p11_minus_p21
350: fistpl C(r_tstepx) // ystepdenominv | xstepdenominv | p00_minus_p20 |
351: // p11_minus_p21
352:
353: // t0 = r_p0[5] - r_p2[5];
354: // t1 = r_p1[5] - r_p2[5];
355:
356: fildl C(r_p2)+20 // r_p2[5] | ystepdenominv | xstepdenominv |
357: // p00_minus_p20 | p11_minus_p21
358: fildl C(r_p0)+20 // r_p0[5] | r_p2[5] | ystepdenominv |
359: // xstepdenominv | p00_minus_p20 | p11_minus_p21
360: fildl C(r_p1)+20 // r_p1[5] | r_p0[5] | r_p2[5] | ystepdenominv |
361: // xstepdenominv | p00_minus_p20 | p11_minus_p21
362: fxch %st(2) // r_p2[5] | r_p0[5] | r_p1[5] | ystepdenominv |
363: // xstepdenominv | p00_minus_p20 | p11_minus_p21
364: fld %st(0) // r_p2[5] | r_p2[5] | r_p0[5] | r_p1[5] |
365: // ystepdenominv | xstepdenominv | p00_minus_p20 |
366: // p11_minus_p21
367: fsubrp %st(0),%st(2) // r_p2[5] | t0 | r_p1[5] | ystepdenominv |
368: // xstepdenominv | p00_minus_p20 | p11_minus_p21
369: fsubrp %st(0),%st(2) // t0 | t1 | ystepdenominv | xstepdenominv |
370: // p00_minus_p20 | p11_minus_p21
371:
372: // r_zistepx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) *
373: // xstepdenominv);
374: // r_zistepy = (int)((t1 * p00_minus_p20 - t0 * p10_minus_p20) *
375: // ystepdenominv);
376:
377: fld %st(0) // t0 | t0 | t1 | ystepdenominv | xstepdenominv |
378: // p00_minus_p20 | p11_minus_p21
379: fmulp %st(0),%st(6) // t0 | t1 | ystepdenominv | xstepdenominv |
380: // p00_minus_p20 | t0*p11_minus_p21
381: fxch %st(1) // t1 | t0 | ystepdenominv | xstepdenominv |
382: // p00_minus_p20 | t0*p11_minus_p21
383: fld %st(0) // t1 | t1 | t0 | ystepdenominv | xstepdenominv |
384: // p00_minus_p20 | t0*p11_minus_p21
385: fmuls p01_minus_p21 // t1*p01_minus_p21 | t1 | t0 | ystepdenominv |
386: // xstepdenominv | p00_minus_p20 |
387: // t0*p11_minus_p21
388: fxch %st(2) // t0 | t1 | t1*p01_minus_p21 | ystepdenominv |
389: // xstepdenominv | p00_minus_p20 |
390: // t0*p11_minus_p21
391: fmuls p10_minus_p20 // t0*p10_minus_p20 | t1 | t1*p01_minus_p21 |
392: // ystepdenominv | xstepdenominv | p00_minus_p20 |
393: // t0*p11_minus_p21
394: fxch %st(1) // t1 | t0*p10_minus_p20 | t1*p01_minus_p21 |
395: // ystepdenominv | xstepdenominv | p00_minus_p20 |
396: // t0*p11_minus_p21
397: fmulp %st(0),%st(5) // t0*p10_minus_p20 | t1*p01_minus_p21 |
398: // ystepdenominv | xstepdenominv |
399: // t1*p00_minus_p20 | t0*p11_minus_p21
400: fxch %st(5) // t0*p11_minus_p21 | t1*p01_minus_p21 |
401: // ystepdenominv | xstepdenominv |
402: // t1*p00_minus_p20 | t0*p10_minus_p20
403: fsubrp %st(0),%st(1) // t1*p01_minus_p21 - t0*p11_minus_p21 |
404: // ystepdenominv | xstepdenominv |
405: // t1*p00_minus_p20 | t0*p10_minus_p20
406: fxch %st(3) // t1*p00_minus_p20 | ystepdenominv |
407: // xstepdenominv |
408: // t1*p01_minus_p21 - t0*p11_minus_p21 |
409: // t0*p10_minus_p20
410: fsubp %st(0),%st(4) // ystepdenominv | xstepdenominv |
411: // t1*p01_minus_p21 - t0*p11_minus_p21 |
412: // t1*p00_minus_p20 - t0*p10_minus_p20
413: fxch %st(1) // xstepdenominv | ystepdenominv |
414: // t1*p01_minus_p21 - t0*p11_minus_p21 |
415: // t1*p00_minus_p20 - t0*p10_minus_p20
416: fmulp %st(0),%st(2) // ystepdenominv |
417: // (t1*p01_minus_p21 - t0*p11_minus_p21) *
418: // xstepdenominv |
419: // t1*p00_minus_p20 - t0*p10_minus_p20
420: fmulp %st(0),%st(2) // (t1*p01_minus_p21 - t0*p11_minus_p21) *
421: // xstepdenominv |
422: // (t1*p00_minus_p20 - t0*p10_minus_p20) *
423: // ystepdenominv
424: fistpl C(r_zistepx) // (t1*p00_minus_p20 - t0*p10_minus_p20) *
425: // ystepdenominv
426: fistpl C(r_zistepy)
427:
428: // a_sstepxfrac = r_sstepx << 16;
429: // a_tstepxfrac = r_tstepx << 16;
430: //
431: // a_ststepxwhole = r_affinetridesc.skinwidth * (r_tstepx >> 16) +
432: // (r_sstepx >> 16);
433:
434: movl C(r_sstepx),%eax
435: movl C(r_tstepx),%edx
436: shll $16,%eax
437: shll $16,%edx
438: movl %eax,C(a_sstepxfrac)
439: movl %edx,C(a_tstepxfrac)
440:
441: movl C(r_sstepx),%ecx
442: movl C(r_tstepx),%eax
443: sarl $16,%ecx
444: sarl $16,%eax
445: imull skinwidth(%esp)
446: addl %ecx,%eax
447: movl %eax,C(a_ststepxwhole)
448:
449: ret
450:
451:
452: //----------------------------------------------------------------------
453: // recursive subdivision affine triangle drawing code
454: //
455: // not C-callable because of stdcall return
456: //----------------------------------------------------------------------
457:
458: #define lp1 4+16
459: #define lp2 8+16
460: #define lp3 12+16
461:
462: .globl C(D_PolysetRecursiveTriangle)
463: C(D_PolysetRecursiveTriangle):
464: pushl %ebp // preserve caller stack frame pointer
465: pushl %esi // preserve register variables
466: pushl %edi
467: pushl %ebx
468:
469: // int *temp;
470: // int d;
471: // int new[6];
472: // int i;
473: // int z;
474: // short *zbuf;
475: movl lp2(%esp),%esi
476: movl lp1(%esp),%ebx
477: movl lp3(%esp),%edi
478:
479: // d = lp2[0] - lp1[0];
480: // if (d < -1 || d > 1)
481: // goto split;
482: movl 0(%esi),%eax
483:
484: movl 0(%ebx),%edx
485: movl 4(%esi),%ebp
486:
487: subl %edx,%eax
488: movl 4(%ebx),%ecx
489:
490: subl %ecx,%ebp
491: incl %eax
492:
493: cmpl $2,%eax
494: ja LSplit
495:
496: // d = lp2[1] - lp1[1];
497: // if (d < -1 || d > 1)
498: // goto split;
499: movl 0(%edi),%eax
500: incl %ebp
501:
502: cmpl $2,%ebp
503: ja LSplit
504:
505: // d = lp3[0] - lp2[0];
506: // if (d < -1 || d > 1)
507: // goto split2;
508: movl 0(%esi),%edx
509: movl 4(%edi),%ebp
510:
511: subl %edx,%eax
512: movl 4(%esi),%ecx
513:
514: subl %ecx,%ebp
515: incl %eax
516:
517: cmpl $2,%eax
518: ja LSplit2
519:
520: // d = lp3[1] - lp2[1];
521: // if (d < -1 || d > 1)
522: // goto split2;
523: movl 0(%ebx),%eax
524: incl %ebp
525:
526: cmpl $2,%ebp
527: ja LSplit2
528:
529: // d = lp1[0] - lp3[0];
530: // if (d < -1 || d > 1)
531: // goto split3;
532: movl 0(%edi),%edx
533: movl 4(%ebx),%ebp
534:
535: subl %edx,%eax
536: movl 4(%edi),%ecx
537:
538: subl %ecx,%ebp
539: incl %eax
540:
541: incl %ebp
542: movl %ebx,%edx
543:
544: cmpl $2,%eax
545: ja LSplit3
546:
547: // d = lp1[1] - lp3[1];
548: // if (d < -1 || d > 1)
549: // {
550: //split3:
551: // temp = lp1;
552: // lp3 = lp2;
553: // lp1 = lp3;
554: // lp2 = temp;
555: // goto split;
556: // }
557: //
558: // return; // entire tri is filled
559: //
560: cmpl $2,%ebp
561: jna LDone
562:
563: LSplit3:
564: movl %edi,%ebx
565: movl %esi,%edi
566: movl %edx,%esi
567: jmp LSplit
568:
569: //split2:
570: LSplit2:
571:
572: // temp = lp1;
573: // lp1 = lp2;
574: // lp2 = lp3;
575: // lp3 = temp;
576: movl %ebx,%eax
577: movl %esi,%ebx
578: movl %edi,%esi
579: movl %eax,%edi
580:
581: //split:
582: LSplit:
583:
584: subl $24,%esp // allocate space for a new vertex
585:
586: //// split this edge
587: // new[0] = (lp1[0] + lp2[0]) >> 1;
588: // new[1] = (lp1[1] + lp2[1]) >> 1;
589: // new[2] = (lp1[2] + lp2[2]) >> 1;
590: // new[3] = (lp1[3] + lp2[3]) >> 1;
591: // new[5] = (lp1[5] + lp2[5]) >> 1;
592: movl 8(%ebx),%eax
593:
594: movl 8(%esi),%edx
595: movl 12(%ebx),%ecx
596:
597: addl %edx,%eax
598: movl 12(%esi),%edx
599:
600: sarl $1,%eax
601: addl %edx,%ecx
602:
603: movl %eax,8(%esp)
604: movl 20(%ebx),%eax
605:
606: sarl $1,%ecx
607: movl 20(%esi),%edx
608:
609: movl %ecx,12(%esp)
610: addl %edx,%eax
611:
612: movl 0(%ebx),%ecx
613: movl 0(%esi),%edx
614:
615: sarl $1,%eax
616: addl %ecx,%edx
617:
618: movl %eax,20(%esp)
619: movl 4(%ebx),%eax
620:
621: sarl $1,%edx
622: movl 4(%esi),%ebp
623:
624: movl %edx,0(%esp)
625: addl %eax,%ebp
626:
627: sarl $1,%ebp
628: movl %ebp,4(%esp)
629:
630: //// draw the point if splitting a leading edge
631: // if (lp2[1] > lp1[1])
632: // goto nodraw;
633: cmpl %eax,4(%esi)
634: jg LNoDraw
635:
636: // if ((lp2[1] == lp1[1]) && (lp2[0] < lp1[0]))
637: // goto nodraw;
638: movl 0(%esi),%edx
639: jnz LDraw
640:
641: cmpl %ecx,%edx
642: jl LNoDraw
643:
644: LDraw:
645:
646: // z = new[5] >> 16;
647: movl 20(%esp),%edx
648: movl 4(%esp),%ecx
649:
650: sarl $16,%edx
651: movl 0(%esp),%ebp
652:
653: // zbuf = zspantable[new[1]] + new[0];
654: movl C(zspantable)(,%ecx,4),%eax
655:
656: // if (z >= *zbuf)
657: // {
658: cmpw (%eax,%ebp,2),%dx
659: jnge LNoDraw
660:
661: // int pix;
662: //
663: // *zbuf = z;
664: movw %dx,(%eax,%ebp,2)
665:
666: // pix = d_pcolormap[skintable[new[3]>>16][new[2]>>16]];
667: movl 12(%esp),%eax
668:
669: sarl $16,%eax
670: movl 8(%esp),%edx
671:
672: sarl $16,%edx
673: subl %ecx,%ecx
674:
675: movl C(skintable)(,%eax,4),%eax
676: movl 4(%esp),%ebp
677:
678: movb (%eax,%edx,),%cl
679: movl C(d_pcolormap),%edx
680:
681: movb (%edx,%ecx,),%dl
682: movl 0(%esp),%ecx
683:
684: // d_viewbuffer[d_scantable[new[1]] + new[0]] = pix;
685: movl C(d_scantable)(,%ebp,4),%eax
686: addl %eax,%ecx
687: movl C(d_viewbuffer),%eax
688: movb %dl,(%eax,%ecx,1)
689:
690: // }
691: //
692: //nodraw:
693: LNoDraw:
694:
695: //// recursively continue
696: // D_PolysetRecursiveTriangle (lp3, lp1, new);
697: pushl %esp
698: pushl %ebx
699: pushl %edi
700: call C(D_PolysetRecursiveTriangle)
701:
702: // D_PolysetRecursiveTriangle (lp3, new, lp2);
703: movl %esp,%ebx
704: pushl %esi
705: pushl %ebx
706: pushl %edi
707: call C(D_PolysetRecursiveTriangle)
708: addl $24,%esp
709:
710: LDone:
711: popl %ebx // restore register variables
712: popl %edi
713: popl %esi
714: popl %ebp // restore caller stack frame pointer
715: ret $12
716:
717:
718: //----------------------------------------------------------------------
719: // 8-bpp horizontal span drawing code for affine polygons, with smooth
720: // shading and no transparency
721: //----------------------------------------------------------------------
722:
723: #define pspans 4+8
724:
725: .globl C(D_PolysetAff8Start)
726: C(D_PolysetAff8Start):
727:
728: .globl C(D_PolysetDrawSpans8)
729: C(D_PolysetDrawSpans8):
730: pushl %esi // preserve register variables
731: pushl %ebx
732:
733: movl pspans(%esp),%esi // point to the first span descriptor
734: movl C(r_zistepx),%ecx
735:
736: pushl %ebp // preserve caller's stack frame
737: pushl %edi
738:
739: rorl $16,%ecx // put high 16 bits of 1/z step in low word
740: movl spanpackage_t_count(%esi),%edx
741:
742: movl %ecx,lzistepx
743:
744: LSpanLoop:
745:
746: // lcount = d_aspancount - pspanpackage->count;
747: //
748: // errorterm += erroradjustup;
749: // if (errorterm >= 0)
750: // {
751: // d_aspancount += d_countextrastep;
752: // errorterm -= erroradjustdown;
753: // }
754: // else
755: // {
756: // d_aspancount += ubasestep;
757: // }
758: movl C(d_aspancount),%eax
759: subl %edx,%eax
760:
761: movl C(erroradjustup),%edx
762: movl C(errorterm),%ebx
763: addl %edx,%ebx
764: js LNoTurnover
765:
766: movl C(erroradjustdown),%edx
767: movl C(d_countextrastep),%edi
768: subl %edx,%ebx
769: movl C(d_aspancount),%ebp
770: movl %ebx,C(errorterm)
771: addl %edi,%ebp
772: movl %ebp,C(d_aspancount)
773: jmp LRightEdgeStepped
774:
775: LNoTurnover:
776: movl C(d_aspancount),%edi
777: movl C(ubasestep),%edx
778: movl %ebx,C(errorterm)
779: addl %edx,%edi
780: movl %edi,C(d_aspancount)
781:
782: LRightEdgeStepped:
783: cmpl $1,%eax
784:
785: jl LNextSpan
786: jz LExactlyOneLong
787:
788: //
789: // set up advancetable
790: //
791: movl C(a_ststepxwhole),%ecx
792: movl C(r_affinetridesc)+atd_skinwidth,%edx
793:
794: movl %ecx,advancetable+4 // advance base in t
795: addl %edx,%ecx
796:
797: movl %ecx,advancetable // advance extra in t
798: movl C(a_tstepxfrac),%ecx
799:
800: movw C(r_lstepx),%cx
801: movl %eax,%edx // count
802:
803: movl %ecx,tstep
804: addl $7,%edx
805:
806: shrl $3,%edx // count of full and partial loops
807: movl spanpackage_t_sfrac(%esi),%ebx
808:
809: movw %dx,%bx
810: movl spanpackage_t_pz(%esi),%ecx
811:
812: negl %eax
813:
814: movl spanpackage_t_pdest(%esi),%edi
815: andl $7,%eax // 0->0, 1->7, 2->6, ... , 7->1
816:
817: subl %eax,%edi // compensate for hardwired offsets
818: subl %eax,%ecx
819:
820: subl %eax,%ecx
821: movl spanpackage_t_tfrac(%esi),%edx
822:
823: movw spanpackage_t_light(%esi),%dx
824: movl spanpackage_t_zi(%esi),%ebp
825:
826: rorl $16,%ebp // put high 16 bits of 1/z in low word
827: pushl %esi
828:
829: movl spanpackage_t_ptex(%esi),%esi
1.1.1.3 ! root 830: jmp aff8entryvec_table(,%eax,4)
1.1 root 831:
832: // %bx = count of full and partial loops
833: // %ebx high word = sfrac
834: // %ecx = pz
835: // %dx = light
836: // %edx high word = tfrac
837: // %esi = ptex
838: // %edi = pdest
839: // %ebp = 1/z
840: // tstep low word = C(r_lstepx)
841: // tstep high word = C(a_tstepxfrac)
842: // C(a_sstepxfrac) low word = 0
843: // C(a_sstepxfrac) high word = C(a_sstepxfrac)
844:
845: LDrawLoop:
846:
847: // FIXME: do we need to clamp light? We may need at least a buffer bit to
848: // keep it from poking into tfrac and causing problems
849:
850: LDraw8:
851: cmpw (%ecx),%bp
1.1.1.3 ! root 852: jl Lp1
1.1 root 853: xorl %eax,%eax
854: movb %dh,%ah
855: movb (%esi),%al
856: movw %bp,(%ecx)
857: movb 0x12345678(%eax),%al
858: LPatch8:
859: movb %al,(%edi)
1.1.1.3 ! root 860: Lp1:
1.1 root 861: addl tstep,%edx
862: sbbl %eax,%eax
863: addl lzistepx,%ebp
864: adcl $0,%ebp
865: addl C(a_sstepxfrac),%ebx
866: adcl advancetable+4(,%eax,4),%esi
867:
868: LDraw7:
869: cmpw 2(%ecx),%bp
1.1.1.3 ! root 870: jl Lp2
1.1 root 871: xorl %eax,%eax
872: movb %dh,%ah
873: movb (%esi),%al
874: movw %bp,2(%ecx)
875: movb 0x12345678(%eax),%al
876: LPatch7:
877: movb %al,1(%edi)
1.1.1.3 ! root 878: Lp2:
1.1 root 879: addl tstep,%edx
880: sbbl %eax,%eax
881: addl lzistepx,%ebp
882: adcl $0,%ebp
883: addl C(a_sstepxfrac),%ebx
884: adcl advancetable+4(,%eax,4),%esi
885:
886: LDraw6:
887: cmpw 4(%ecx),%bp
1.1.1.3 ! root 888: jl Lp3
1.1 root 889: xorl %eax,%eax
890: movb %dh,%ah
891: movb (%esi),%al
892: movw %bp,4(%ecx)
893: movb 0x12345678(%eax),%al
894: LPatch6:
895: movb %al,2(%edi)
1.1.1.3 ! root 896: Lp3:
1.1 root 897: addl tstep,%edx
898: sbbl %eax,%eax
899: addl lzistepx,%ebp
900: adcl $0,%ebp
901: addl C(a_sstepxfrac),%ebx
902: adcl advancetable+4(,%eax,4),%esi
903:
904: LDraw5:
905: cmpw 6(%ecx),%bp
1.1.1.3 ! root 906: jl Lp4
1.1 root 907: xorl %eax,%eax
908: movb %dh,%ah
909: movb (%esi),%al
910: movw %bp,6(%ecx)
911: movb 0x12345678(%eax),%al
912: LPatch5:
913: movb %al,3(%edi)
1.1.1.3 ! root 914: Lp4:
1.1 root 915: addl tstep,%edx
916: sbbl %eax,%eax
917: addl lzistepx,%ebp
918: adcl $0,%ebp
919: addl C(a_sstepxfrac),%ebx
920: adcl advancetable+4(,%eax,4),%esi
921:
922: LDraw4:
923: cmpw 8(%ecx),%bp
1.1.1.3 ! root 924: jl Lp5
1.1 root 925: xorl %eax,%eax
926: movb %dh,%ah
927: movb (%esi),%al
928: movw %bp,8(%ecx)
929: movb 0x12345678(%eax),%al
930: LPatch4:
931: movb %al,4(%edi)
1.1.1.3 ! root 932: Lp5:
1.1 root 933: addl tstep,%edx
934: sbbl %eax,%eax
935: addl lzistepx,%ebp
936: adcl $0,%ebp
937: addl C(a_sstepxfrac),%ebx
938: adcl advancetable+4(,%eax,4),%esi
939:
940: LDraw3:
941: cmpw 10(%ecx),%bp
1.1.1.3 ! root 942: jl Lp6
1.1 root 943: xorl %eax,%eax
944: movb %dh,%ah
945: movb (%esi),%al
946: movw %bp,10(%ecx)
947: movb 0x12345678(%eax),%al
948: LPatch3:
949: movb %al,5(%edi)
1.1.1.3 ! root 950: Lp6:
1.1 root 951: addl tstep,%edx
952: sbbl %eax,%eax
953: addl lzistepx,%ebp
954: adcl $0,%ebp
955: addl C(a_sstepxfrac),%ebx
956: adcl advancetable+4(,%eax,4),%esi
957:
958: LDraw2:
959: cmpw 12(%ecx),%bp
1.1.1.3 ! root 960: jl Lp7
1.1 root 961: xorl %eax,%eax
962: movb %dh,%ah
963: movb (%esi),%al
964: movw %bp,12(%ecx)
965: movb 0x12345678(%eax),%al
966: LPatch2:
967: movb %al,6(%edi)
1.1.1.3 ! root 968: Lp7:
1.1 root 969: addl tstep,%edx
970: sbbl %eax,%eax
971: addl lzistepx,%ebp
972: adcl $0,%ebp
973: addl C(a_sstepxfrac),%ebx
974: adcl advancetable+4(,%eax,4),%esi
975:
976: LDraw1:
977: cmpw 14(%ecx),%bp
1.1.1.3 ! root 978: jl Lp8
1.1 root 979: xorl %eax,%eax
980: movb %dh,%ah
981: movb (%esi),%al
982: movw %bp,14(%ecx)
983: movb 0x12345678(%eax),%al
984: LPatch1:
985: movb %al,7(%edi)
1.1.1.3 ! root 986: Lp8:
1.1 root 987: addl tstep,%edx
988: sbbl %eax,%eax
989: addl lzistepx,%ebp
990: adcl $0,%ebp
991: addl C(a_sstepxfrac),%ebx
992: adcl advancetable+4(,%eax,4),%esi
993:
994: addl $8,%edi
995: addl $16,%ecx
996:
997: decw %bx
998: jnz LDrawLoop
999:
1000: popl %esi // restore spans pointer
1001: LNextSpan:
1.1.1.3 ! root 1002: addl $(spanpackage_t_size),%esi // point to next span
1.1 root 1003: LNextSpanESISet:
1004: movl spanpackage_t_count(%esi),%edx
1005: cmpl $-999999,%edx // any more spans?
1006: jnz LSpanLoop // yes
1007:
1008: popl %edi
1009: popl %ebp // restore the caller's stack frame
1010: popl %ebx // restore register variables
1011: popl %esi
1012: ret
1013:
1014:
1015: // draw a one-long span
1016:
1017: LExactlyOneLong:
1018:
1019: movl spanpackage_t_pz(%esi),%ecx
1020: movl spanpackage_t_zi(%esi),%ebp
1021:
1022: rorl $16,%ebp // put high 16 bits of 1/z in low word
1023: movl spanpackage_t_ptex(%esi),%ebx
1024:
1025: cmpw (%ecx),%bp
1026: jl LNextSpan
1027: xorl %eax,%eax
1028: movl spanpackage_t_pdest(%esi),%edi
1029: movb spanpackage_t_light+1(%esi),%ah
1.1.1.3 ! root 1030: addl $(spanpackage_t_size),%esi // point to next span
1.1 root 1031: movb (%ebx),%al
1032: movw %bp,(%ecx)
1033: movb 0x12345678(%eax),%al
1034: LPatch9:
1035: movb %al,(%edi)
1036:
1037: jmp LNextSpanESISet
1038:
1039: .globl C(D_PolysetAff8End)
1040: C(D_PolysetAff8End):
1041:
1042:
1043: #define pcolormap 4
1044:
1045: .globl C(D_Aff8Patch)
1046: C(D_Aff8Patch):
1047: movl pcolormap(%esp),%eax
1048: movl %eax,LPatch1-4
1049: movl %eax,LPatch2-4
1050: movl %eax,LPatch3-4
1051: movl %eax,LPatch4-4
1052: movl %eax,LPatch5-4
1053: movl %eax,LPatch6-4
1054: movl %eax,LPatch7-4
1055: movl %eax,LPatch8-4
1056: movl %eax,LPatch9-4
1057:
1058: ret
1059:
1060:
1061: //----------------------------------------------------------------------
1062: // Alias model polygon dispatching code, combined with subdivided affine
1063: // triangle drawing code
1064: //----------------------------------------------------------------------
1065:
1066: .globl C(D_PolysetDraw)
1067: C(D_PolysetDraw):
1068:
1069: // spanpackage_t spans[DPS_MAXSPANS + 1 +
1070: // ((CACHE_SIZE - 1) / sizeof(spanpackage_t)) + 1];
1071: // // one extra because of cache line pretouching
1072: //
1073: // a_spans = (spanpackage_t *)
1074: // (((long)&spans[0] + CACHE_SIZE - 1) & ~(CACHE_SIZE - 1));
1.1.1.3 ! root 1075: subl $(SPAN_SIZE),%esp
1.1 root 1076: movl %esp,%eax
1077: addl $(CACHE_SIZE - 1),%eax
1078: andl $(~(CACHE_SIZE - 1)),%eax
1079: movl %eax,C(a_spans)
1080:
1081: // if (r_affinetridesc.drawtype)
1082: // D_DrawSubdiv ();
1083: // else
1084: // D_DrawNonSubdiv ();
1085: movl C(r_affinetridesc)+atd_drawtype,%eax
1086: testl %eax,%eax
1087: jz C(D_DrawNonSubdiv)
1088:
1089: pushl %ebp // preserve caller stack frame pointer
1090:
1091: // lnumtriangles = r_affinetridesc.numtriangles;
1092: movl C(r_affinetridesc)+atd_numtriangles,%ebp
1093:
1094: pushl %esi // preserve register variables
1095: shll $4,%ebp
1096:
1097: pushl %ebx
1098: // ptri = r_affinetridesc.ptriangles;
1099: movl C(r_affinetridesc)+atd_ptriangles,%ebx
1100:
1101: pushl %edi
1102:
1103: // mtriangle_t *ptri;
1104: // finalvert_t *pfv, *index0, *index1, *index2;
1105: // int i;
1106: // int lnumtriangles;
1107: // int s0, s1, s2;
1108:
1109: // pfv = r_affinetridesc.pfinalverts;
1110: movl C(r_affinetridesc)+atd_pfinalverts,%edi
1111:
1112: // for (i=0 ; i<lnumtriangles ; i++)
1113: // {
1114:
1115: Llooptop:
1116:
1117: // index0 = pfv + ptri[i].vertindex[0];
1118: // index1 = pfv + ptri[i].vertindex[1];
1119: // index2 = pfv + ptri[i].vertindex[2];
1120: movl mtri_vertindex-16+0(%ebx,%ebp,),%ecx
1121: movl mtri_vertindex-16+4(%ebx,%ebp,),%esi
1122:
1.1.1.3 ! root 1123: shll $(fv_shift),%ecx
1.1 root 1124: movl mtri_vertindex-16+8(%ebx,%ebp,),%edx
1125:
1.1.1.3 ! root 1126: shll $(fv_shift),%esi
1.1 root 1127: addl %edi,%ecx
1128:
1.1.1.3 ! root 1129: shll $(fv_shift),%edx
1.1 root 1130: addl %edi,%esi
1131:
1132: addl %edi,%edx
1133:
1134: // if (((index0->v[1]-index1->v[1]) *
1135: // (index0->v[0]-index2->v[0]) -
1136: // (index0->v[0]-index1->v[0])*(index0->v[1]-index2->v[1])) >= 0)
1137: // {
1138: // continue;
1139: // }
1140: //
1141: // d_pcolormap = &((byte *)acolormap)[index0->v[4] & 0xFF00];
1142: fildl fv_v+4(%ecx) // i0v1
1143: fildl fv_v+4(%esi) // i1v1 | i0v1
1144: fildl fv_v+0(%ecx) // i0v0 | i1v1 | i0v1
1145: fildl fv_v+0(%edx) // i2v0 | i0v0 | i1v1 | i0v1
1146: fxch %st(2) // i1v1 | i0v0 | i2v0 | i0v1
1147: fsubr %st(3),%st(0) // i0v1-i1v1 | i0v0 | i2v0 | i0v1
1148: fildl fv_v+0(%esi) // i1v0 | i0v1-i1v1 | i0v0 | i2v0 | i0v1
1149: fxch %st(2) // i0v0 | i0v1-i1v1 | i1v0 | i2v0 | i0v1
1150: fsub %st(0),%st(3) // i0v0 | i0v1-i1v1 | i1v0 | i0v0-i2v0 | i0v1
1151: fildl fv_v+4(%edx) // i2v1 | i0v0 | i0v1-i1v1 | i1v0 | i0v0-i2v0| i0v1
1152: fxch %st(1) // i0v0 | i2v1 | i0v1-i1v1 | i1v0 | i0v0-i2v0| i0v1
1153: fsubp %st(0),%st(3) // i2v1 | i0v1-i1v1 | i0v0-i1v0 | i0v0-i2v0 | i0v1
1154: fxch %st(1) // i0v1-i1v1 | i2v1 | i0v0-i1v0 | i0v0-i2v0 | i0v1
1155: fmulp %st(0),%st(3) // i2v1 | i0v0-i1v0 | i0v1-i1v1*i0v0-i2v0 | i0v1
1156: fsubrp %st(0),%st(3) // i0v0-i1v0 | i0v1-i1v1*i0v0-i2v0 | i0v1-i2v1
1157: movl fv_v+16(%ecx),%eax
1158: andl $0xFF00,%eax
1159: fmulp %st(0),%st(2) // i0v1-i1v1*i0v0-i2v0 | i0v0-i1v0*i0v1-i2v1
1160: addl C(acolormap),%eax
1161: fsubp %st(0),%st(1) // (i0v1-i1v1)*(i0v0-i2v0)-(i0v0-i1v0)*(i0v1-i2v1)
1162: movl %eax,C(d_pcolormap)
1163: fstps Ltemp
1164: movl Ltemp,%eax
1165: subl $0x80000001,%eax
1166: jc Lskip
1167:
1168: // if (ptri[i].facesfront)
1169: // {
1170: // D_PolysetRecursiveTriangle(index0->v, index1->v, index2->v);
1171: movl mtri_facesfront-16(%ebx,%ebp,),%eax
1172: testl %eax,%eax
1173: jz Lfacesback
1174:
1175: pushl %edx
1176: pushl %esi
1177: pushl %ecx
1178: call C(D_PolysetRecursiveTriangle)
1179:
1180: subl $16,%ebp
1181: jnz Llooptop
1.1.1.3 ! root 1182: jmp Ldone2
1.1 root 1183:
1184: // }
1185: // else
1186: // {
1187: Lfacesback:
1188:
1189: // s0 = index0->v[2];
1190: // s1 = index1->v[2];
1191: // s2 = index2->v[2];
1192: movl fv_v+8(%ecx),%eax
1193: pushl %eax
1194: movl fv_v+8(%esi),%eax
1195: pushl %eax
1196: movl fv_v+8(%edx),%eax
1197: pushl %eax
1198: pushl %ecx
1199: pushl %edx
1200:
1201: // if (index0->flags & ALIAS_ONSEAM)
1202: // index0->v[2] += r_affinetridesc.seamfixupX16;
1203: movl C(r_affinetridesc)+atd_seamfixupX16,%eax
1.1.1.3 ! root 1204: testl $(ALIAS_ONSEAM),fv_flags(%ecx)
! 1205: jz Lp11
1.1 root 1206: addl %eax,fv_v+8(%ecx)
1.1.1.3 ! root 1207: Lp11:
1.1 root 1208:
1209: // if (index1->flags & ALIAS_ONSEAM)
1210: // index1->v[2] += r_affinetridesc.seamfixupX16;
1.1.1.3 ! root 1211: testl $(ALIAS_ONSEAM),fv_flags(%esi)
! 1212: jz Lp12
1.1 root 1213: addl %eax,fv_v+8(%esi)
1.1.1.3 ! root 1214: Lp12:
1.1 root 1215:
1216: // if (index2->flags & ALIAS_ONSEAM)
1217: // index2->v[2] += r_affinetridesc.seamfixupX16;
1.1.1.3 ! root 1218: testl $(ALIAS_ONSEAM),fv_flags(%edx)
! 1219: jz Lp13
1.1 root 1220: addl %eax,fv_v+8(%edx)
1.1.1.3 ! root 1221: Lp13:
1.1 root 1222:
1223: // D_PolysetRecursiveTriangle(index0->v, index1->v, index2->v);
1224: pushl %edx
1225: pushl %esi
1226: pushl %ecx
1227: call C(D_PolysetRecursiveTriangle)
1228:
1229: // index0->v[2] = s0;
1230: // index1->v[2] = s1;
1231: // index2->v[2] = s2;
1232: popl %edx
1233: popl %ecx
1234: popl %eax
1235: movl %eax,fv_v+8(%edx)
1236: popl %eax
1237: movl %eax,fv_v+8(%esi)
1238: popl %eax
1239: movl %eax,fv_v+8(%ecx)
1240:
1241: // }
1242: // }
1243: Lskip:
1244: subl $16,%ebp
1245: jnz Llooptop
1246:
1.1.1.3 ! root 1247: Ldone2:
1.1 root 1248: popl %edi // restore the caller's stack frame
1249: popl %ebx
1250: popl %esi // restore register variables
1251: popl %ebp
1252:
1.1.1.3 ! root 1253: addl $(SPAN_SIZE),%esp
1.1 root 1254:
1255: ret
1256:
1257:
1258: //----------------------------------------------------------------------
1259: // Alias model triangle left-edge scanning code
1260: //----------------------------------------------------------------------
1261:
1262: #define height 4+16
1263:
1264: .globl C(D_PolysetScanLeftEdge)
1265: C(D_PolysetScanLeftEdge):
1266: pushl %ebp // preserve caller stack frame pointer
1267: pushl %esi // preserve register variables
1268: pushl %edi
1269: pushl %ebx
1270:
1271: movl height(%esp),%eax
1272: movl C(d_sfrac),%ecx
1273: andl $0xFFFF,%eax
1274: movl C(d_ptex),%ebx
1.1.1.3 ! root 1275: orl %eax,%ecx
1.1 root 1276: movl C(d_pedgespanpackage),%esi
1277: movl C(d_tfrac),%edx
1278: movl C(d_light),%edi
1279: movl C(d_zi),%ebp
1280:
1281: // %eax: scratch
1282: // %ebx: d_ptex
1283: // %ecx: d_sfrac in high word, count in low word
1284: // %edx: d_tfrac
1285: // %esi: d_pedgespanpackage, errorterm, scratch alternately
1286: // %edi: d_light
1287: // %ebp: d_zi
1288:
1289: // do
1290: // {
1291:
1292: LScanLoop:
1293:
1294: // d_pedgespanpackage->ptex = ptex;
1295: // d_pedgespanpackage->pdest = d_pdest;
1296: // d_pedgespanpackage->pz = d_pz;
1297: // d_pedgespanpackage->count = d_aspancount;
1298: // d_pedgespanpackage->light = d_light;
1299: // d_pedgespanpackage->zi = d_zi;
1300: // d_pedgespanpackage->sfrac = d_sfrac << 16;
1301: // d_pedgespanpackage->tfrac = d_tfrac << 16;
1302: movl %ebx,spanpackage_t_ptex(%esi)
1303: movl C(d_pdest),%eax
1304: movl %eax,spanpackage_t_pdest(%esi)
1305: movl C(d_pz),%eax
1306: movl %eax,spanpackage_t_pz(%esi)
1307: movl C(d_aspancount),%eax
1308: movl %eax,spanpackage_t_count(%esi)
1309: movl %edi,spanpackage_t_light(%esi)
1310: movl %ebp,spanpackage_t_zi(%esi)
1311: movl %ecx,spanpackage_t_sfrac(%esi)
1312: movl %edx,spanpackage_t_tfrac(%esi)
1313:
1314: // pretouch the next cache line
1315: movb spanpackage_t_size(%esi),%al
1316:
1317: // d_pedgespanpackage++;
1.1.1.3 ! root 1318: addl $(spanpackage_t_size),%esi
1.1 root 1319: movl C(erroradjustup),%eax
1320: movl %esi,C(d_pedgespanpackage)
1321:
1322: // errorterm += erroradjustup;
1323: movl C(errorterm),%esi
1324: addl %eax,%esi
1325: movl C(d_pdest),%eax
1326:
1327: // if (errorterm >= 0)
1328: // {
1329: js LNoLeftEdgeTurnover
1330:
1331: // errorterm -= erroradjustdown;
1332: // d_pdest += d_pdestextrastep;
1333: subl C(erroradjustdown),%esi
1334: addl C(d_pdestextrastep),%eax
1335: movl %esi,C(errorterm)
1336: movl %eax,C(d_pdest)
1337:
1338: // d_pz += d_pzextrastep;
1339: // d_aspancount += d_countextrastep;
1340: // d_ptex += d_ptexextrastep;
1341: // d_sfrac += d_sfracextrastep;
1342: // d_ptex += d_sfrac >> 16;
1343: // d_sfrac &= 0xFFFF;
1344: // d_tfrac += d_tfracextrastep;
1345: movl C(d_pz),%eax
1346: movl C(d_aspancount),%esi
1347: addl C(d_pzextrastep),%eax
1348: addl C(d_sfracextrastep),%ecx
1349: adcl C(d_ptexextrastep),%ebx
1350: addl C(d_countextrastep),%esi
1351: movl %eax,C(d_pz)
1352: movl C(d_tfracextrastep),%eax
1353: movl %esi,C(d_aspancount)
1354: addl %eax,%edx
1355:
1356: // if (d_tfrac & 0x10000)
1357: // {
1358: jnc LSkip1
1359:
1360: // d_ptex += r_affinetridesc.skinwidth;
1361: // d_tfrac &= 0xFFFF;
1362: addl C(r_affinetridesc)+atd_skinwidth,%ebx
1363:
1364: // }
1365:
1366: LSkip1:
1367:
1368: // d_light += d_lightextrastep;
1369: // d_zi += d_ziextrastep;
1370: addl C(d_lightextrastep),%edi
1371: addl C(d_ziextrastep),%ebp
1372:
1373: // }
1374: movl C(d_pedgespanpackage),%esi
1375: decl %ecx
1376: testl $0xFFFF,%ecx
1377: jnz LScanLoop
1378:
1379: popl %ebx
1380: popl %edi
1381: popl %esi
1382: popl %ebp
1383: ret
1384:
1385: // else
1386: // {
1387:
1388: LNoLeftEdgeTurnover:
1389: movl %esi,C(errorterm)
1390:
1391: // d_pdest += d_pdestbasestep;
1392: addl C(d_pdestbasestep),%eax
1393: movl %eax,C(d_pdest)
1394:
1395: // d_pz += d_pzbasestep;
1396: // d_aspancount += ubasestep;
1397: // d_ptex += d_ptexbasestep;
1398: // d_sfrac += d_sfracbasestep;
1399: // d_ptex += d_sfrac >> 16;
1400: // d_sfrac &= 0xFFFF;
1401: movl C(d_pz),%eax
1402: movl C(d_aspancount),%esi
1403: addl C(d_pzbasestep),%eax
1404: addl C(d_sfracbasestep),%ecx
1405: adcl C(d_ptexbasestep),%ebx
1406: addl C(ubasestep),%esi
1407: movl %eax,C(d_pz)
1408: movl %esi,C(d_aspancount)
1409:
1410: // d_tfrac += d_tfracbasestep;
1411: movl C(d_tfracbasestep),%esi
1412: addl %esi,%edx
1413:
1414: // if (d_tfrac & 0x10000)
1415: // {
1416: jnc LSkip2
1417:
1418: // d_ptex += r_affinetridesc.skinwidth;
1419: // d_tfrac &= 0xFFFF;
1420: addl C(r_affinetridesc)+atd_skinwidth,%ebx
1421:
1422: // }
1423:
1424: LSkip2:
1425:
1426: // d_light += d_lightbasestep;
1427: // d_zi += d_zibasestep;
1428: addl C(d_lightbasestep),%edi
1429: addl C(d_zibasestep),%ebp
1430:
1431: // }
1432: // } while (--height);
1433: movl C(d_pedgespanpackage),%esi
1434: decl %ecx
1435: testl $0xFFFF,%ecx
1436: jnz LScanLoop
1437:
1438: popl %ebx
1439: popl %edi
1440: popl %esi
1441: popl %ebp
1442: ret
1443:
1444:
1445: //----------------------------------------------------------------------
1446: // Alias model vertex drawing code
1447: //----------------------------------------------------------------------
1448:
1449: #define fv 4+8
1450: #define numverts 8+8
1451:
1452: .globl C(D_PolysetDrawFinalVerts)
1453: C(D_PolysetDrawFinalVerts):
1454: pushl %ebp // preserve caller stack frame pointer
1455: pushl %ebx
1456:
1457: // int i, z;
1458: // short *zbuf;
1459:
1460: movl numverts(%esp),%ecx
1461: movl fv(%esp),%ebx
1462:
1463: pushl %esi // preserve register variables
1464: pushl %edi
1465:
1466: LFVLoop:
1467:
1468: // for (i=0 ; i<numverts ; i++, fv++)
1469: // {
1470: // // valid triangle coordinates for filling can include the bottom and
1471: // // right clip edges, due to the fill rule; these shouldn't be drawn
1472: // if ((fv->v[0] < r_refdef.vrectright) &&
1473: // (fv->v[1] < r_refdef.vrectbottom))
1474: // {
1475: movl fv_v+0(%ebx),%eax
1476: movl C(r_refdef)+rd_vrectright,%edx
1477: cmpl %edx,%eax
1478: jge LNextVert
1479: movl fv_v+4(%ebx),%esi
1480: movl C(r_refdef)+rd_vrectbottom,%edx
1481: cmpl %edx,%esi
1482: jge LNextVert
1483:
1484: // zbuf = zspantable[fv->v[1]] + fv->v[0];
1485: movl C(zspantable)(,%esi,4),%edi
1486:
1487: // z = fv->v[5]>>16;
1488: movl fv_v+20(%ebx),%edx
1489: shrl $16,%edx
1490:
1491: // if (z >= *zbuf)
1492: // {
1493: // int pix;
1494: cmpw (%edi,%eax,2),%dx
1495: jl LNextVert
1496:
1497: // *zbuf = z;
1498: movw %dx,(%edi,%eax,2)
1499:
1500: // pix = skintable[fv->v[3]>>16][fv->v[2]>>16];
1501: movl fv_v+12(%ebx),%edi
1502: shrl $16,%edi
1503: movl C(skintable)(,%edi,4),%edi
1504: movl fv_v+8(%ebx),%edx
1505: shrl $16,%edx
1506: movb (%edi,%edx),%dl
1507:
1508: // pix = ((byte *)acolormap)[pix + (fv->v[4] & 0xFF00)];
1509: movl fv_v+16(%ebx),%edi
1510: andl $0xFF00,%edi
1511: andl $0x00FF,%edx
1512: addl %edx,%edi
1513: movl C(acolormap),%edx
1514: movb (%edx,%edi,1),%dl
1515:
1516: // d_viewbuffer[d_scantable[fv->v[1]] + fv->v[0]] = pix;
1517: movl C(d_scantable)(,%esi,4),%edi
1518: movl C(d_viewbuffer),%esi
1519: addl %eax,%edi
1520: movb %dl,(%esi,%edi)
1521:
1522: // }
1523: // }
1524: // }
1525: LNextVert:
1.1.1.3 ! root 1526: addl $(fv_size),%ebx
1.1 root 1527: decl %ecx
1528: jnz LFVLoop
1529:
1530: popl %edi
1531: popl %esi
1532: popl %ebx
1533: popl %ebp
1534: ret
1535:
1536:
1537: //----------------------------------------------------------------------
1538: // Alias model non-subdivided polygon dispatching code
1539: //
1540: // not C-callable because of stack buffer cleanup
1541: //----------------------------------------------------------------------
1542:
1543: .globl C(D_DrawNonSubdiv)
1544: C(D_DrawNonSubdiv):
1545: pushl %ebp // preserve caller stack frame pointer
1546: movl C(r_affinetridesc)+atd_numtriangles,%ebp
1547: pushl %ebx
1.1.1.3 ! root 1548: shll $(mtri_shift),%ebp
1.1 root 1549: pushl %esi // preserve register variables
1550: movl C(r_affinetridesc)+atd_ptriangles,%esi
1551: pushl %edi
1552:
1553: // mtriangle_t *ptri;
1554: // finalvert_t *pfv, *index0, *index1, *index2;
1555: // int i;
1556: // int lnumtriangles;
1557:
1558: // pfv = r_affinetridesc.pfinalverts;
1559: // ptri = r_affinetridesc.ptriangles;
1560: // lnumtriangles = r_affinetridesc.numtriangles;
1561:
1562: LNDLoop:
1563:
1564: // for (i=0 ; i<lnumtriangles ; i++, ptri++)
1565: // {
1566: // index0 = pfv + ptri->vertindex[0];
1567: // index1 = pfv + ptri->vertindex[1];
1568: // index2 = pfv + ptri->vertindex[2];
1569: movl C(r_affinetridesc)+atd_pfinalverts,%edi
1570: movl mtri_vertindex+0-mtri_size(%esi,%ebp,1),%ecx
1.1.1.3 ! root 1571: shll $(fv_shift),%ecx
1.1 root 1572: movl mtri_vertindex+4-mtri_size(%esi,%ebp,1),%edx
1.1.1.3 ! root 1573: shll $(fv_shift),%edx
1.1 root 1574: movl mtri_vertindex+8-mtri_size(%esi,%ebp,1),%ebx
1.1.1.3 ! root 1575: shll $(fv_shift),%ebx
1.1 root 1576: addl %edi,%ecx
1577: addl %edi,%edx
1578: addl %edi,%ebx
1579:
1580: // d_xdenom = (index0->v[1]-index1->v[1]) *
1581: // (index0->v[0]-index2->v[0]) -
1582: // (index0->v[0]-index1->v[0])*(index0->v[1]-index2->v[1]);
1583: movl fv_v+4(%ecx),%eax
1584: movl fv_v+0(%ecx),%esi
1585: subl fv_v+4(%edx),%eax
1586: subl fv_v+0(%ebx),%esi
1.1.1.3 ! root 1587: imull %esi,%eax
1.1 root 1588: movl fv_v+0(%ecx),%esi
1589: movl fv_v+4(%ecx),%edi
1590: subl fv_v+0(%edx),%esi
1591: subl fv_v+4(%ebx),%edi
1.1.1.3 ! root 1592: imull %esi,%edi
1.1 root 1593: subl %edi,%eax
1594:
1595: // if (d_xdenom >= 0)
1596: // {
1597: // continue;
1598: jns LNextTri
1599:
1600: // }
1601:
1602: movl %eax,C(d_xdenom)
1603: fildl C(d_xdenom)
1604:
1605: // r_p0[0] = index0->v[0]; // u
1606: // r_p0[1] = index0->v[1]; // v
1607: // r_p0[2] = index0->v[2]; // s
1608: // r_p0[3] = index0->v[3]; // t
1609: // r_p0[4] = index0->v[4]; // light
1610: // r_p0[5] = index0->v[5]; // iz
1611: movl fv_v+0(%ecx),%eax
1612: movl fv_v+4(%ecx),%esi
1613: movl %eax,C(r_p0)+0
1614: movl %esi,C(r_p0)+4
1615: movl fv_v+8(%ecx),%eax
1616: movl fv_v+12(%ecx),%esi
1617: movl %eax,C(r_p0)+8
1618: movl %esi,C(r_p0)+12
1619: movl fv_v+16(%ecx),%eax
1620: movl fv_v+20(%ecx),%esi
1621: movl %eax,C(r_p0)+16
1622: movl %esi,C(r_p0)+20
1623:
1624: fdivrs float_1
1625:
1626: // r_p1[0] = index1->v[0];
1627: // r_p1[1] = index1->v[1];
1628: // r_p1[2] = index1->v[2];
1629: // r_p1[3] = index1->v[3];
1630: // r_p1[4] = index1->v[4];
1631: // r_p1[5] = index1->v[5];
1632: movl fv_v+0(%edx),%eax
1633: movl fv_v+4(%edx),%esi
1634: movl %eax,C(r_p1)+0
1635: movl %esi,C(r_p1)+4
1636: movl fv_v+8(%edx),%eax
1637: movl fv_v+12(%edx),%esi
1638: movl %eax,C(r_p1)+8
1639: movl %esi,C(r_p1)+12
1640: movl fv_v+16(%edx),%eax
1641: movl fv_v+20(%edx),%esi
1642: movl %eax,C(r_p1)+16
1643: movl %esi,C(r_p1)+20
1644:
1645: // r_p2[0] = index2->v[0];
1646: // r_p2[1] = index2->v[1];
1647: // r_p2[2] = index2->v[2];
1648: // r_p2[3] = index2->v[3];
1649: // r_p2[4] = index2->v[4];
1650: // r_p2[5] = index2->v[5];
1651: movl fv_v+0(%ebx),%eax
1652: movl fv_v+4(%ebx),%esi
1653: movl %eax,C(r_p2)+0
1654: movl %esi,C(r_p2)+4
1655: movl fv_v+8(%ebx),%eax
1656: movl fv_v+12(%ebx),%esi
1657: movl %eax,C(r_p2)+8
1658: movl %esi,C(r_p2)+12
1659: movl fv_v+16(%ebx),%eax
1660: movl fv_v+20(%ebx),%esi
1661: movl %eax,C(r_p2)+16
1662: movl C(r_affinetridesc)+atd_ptriangles,%edi
1663: movl %esi,C(r_p2)+20
1664: movl mtri_facesfront-mtri_size(%edi,%ebp,1),%eax
1665:
1666: // if (!ptri->facesfront)
1667: // {
1668: testl %eax,%eax
1669: jnz LFacesFront
1670:
1671: // if (index0->flags & ALIAS_ONSEAM)
1672: // r_p0[2] += r_affinetridesc.seamfixupX16;
1673: movl fv_flags(%ecx),%eax
1674: movl fv_flags(%edx),%esi
1675: movl fv_flags(%ebx),%edi
1.1.1.3 ! root 1676: testl $(ALIAS_ONSEAM),%eax
1.1 root 1677: movl C(r_affinetridesc)+atd_seamfixupX16,%eax
1678: jz LOnseamDone0
1679: addl %eax,C(r_p0)+8
1680: LOnseamDone0:
1681:
1682: // if (index1->flags & ALIAS_ONSEAM)
1683: // r_p1[2] += r_affinetridesc.seamfixupX16;
1.1.1.3 ! root 1684: testl $(ALIAS_ONSEAM),%esi
1.1 root 1685: jz LOnseamDone1
1686: addl %eax,C(r_p1)+8
1687: LOnseamDone1:
1688:
1689: // if (index2->flags & ALIAS_ONSEAM)
1690: // r_p2[2] += r_affinetridesc.seamfixupX16;
1.1.1.3 ! root 1691: testl $(ALIAS_ONSEAM),%edi
1.1 root 1692: jz LOnseamDone2
1693: addl %eax,C(r_p2)+8
1694: LOnseamDone2:
1695:
1696: // }
1697:
1698: LFacesFront:
1699:
1700: fstps C(d_xdenom)
1701:
1702: // D_PolysetSetEdgeTable ();
1703: // D_RasterizeAliasPolySmooth ();
1704: call C(D_PolysetSetEdgeTable)
1705: call C(D_RasterizeAliasPolySmooth)
1706:
1707: LNextTri:
1708: movl C(r_affinetridesc)+atd_ptriangles,%esi
1709: subl $16,%ebp
1710: jnz LNDLoop
1711: // }
1712:
1713: popl %edi
1714: popl %esi
1715: popl %ebx
1716: popl %ebp
1717:
1.1.1.3 ! root 1718: addl $(SPAN_SIZE),%esp
1.1 root 1719:
1720: ret
1721:
1722:
1723: #endif // id386
1724:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.