Subversion Repositories Kolibri OS

Rev

Rev 8232 | Rev 8719 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
8232 leency 1
ROUND2 equ 10
2
 
3
stencil_tri:
4
;  procedure calculate triangle in stencil buffer
5
;  ----------------in - eax - x1 shl 16 + y1 ----------------------
6
;  -------------------- ebx - x2 shl 16 + y2 ----------------------
7
;  -------------------- ecx - x3 shl 16 + y3 ----------------------
8
;  -------------------- esi - pointer to s-buffer -----------------
9
;  -------------------- xmm0 - lo -> hi z1, z2, z3 as dword float
10
 
11
.x1     equ [ebp-2]
12
.y1     equ [ebp-4]
13
.x2     equ [ebp-6]
14
.y2     equ [ebp-8]
15
.x3     equ [ebp-10]
16
.y3     equ [ebp-12]
17
 
18
.dx12   equ dword[ebp-20]
19
.dx13   equ dword[ebp-24]
20
.dx23   equ dword[ebp-28]
21
.dz12   equ dword[ebp-32]
22
.dz13   equ dword[ebp-36]
23
.dz23   equ dword[ebp-40]
24
.zz2    equ [ebp-44]
25
.zz1    equ [ebp-48]
26
.z3     equ [ebp-56]
27
.z2     equ [ebp-60]
28
.z1     equ [ebp-64]
29
.s_buff equ [ebp-68]
30
 
31
       push    ebp
32
       mov     ebp,esp
33
       sub     esp,128
34
       and     ebp,0xfffffff0
35
      .sort2:
36
        cmp     ax,bx
37
        jle     .sort1
38
        xchg    eax,ebx
39
        shufps  xmm0,xmm0,11100001b
40
      .sort1:
41
        cmp     bx,cx
42
        jle     .sort3
43
        xchg    ebx,ecx
44
        shufps  xmm0,xmm0,11011000b
45
        jmp     .sort2
46
      .sort3:
47
        mov     .y1,eax            ; store triangle coordinates in user friendly variables
48
        mov     .y2,ebx
49
        mov     .y3,ecx
50
 
51
    ;   mov     edx,100.11
52
    ;   movd    xmm0,edx
53
    ;   shufps  xmm0,xmm0,11100000b
54
 
55
        movaps  .z1,xmm0
56
    ;    mov     dword .z1,edx
57
    ;    mov     .z2,edx
58
    ;    mov     .z3,edx
59
        mov     .s_buff,esi
60
 
61
         mov      edx,80008000h  ; eax,ebx,ecx are ANDd together into edx which means that
62
         and      edx,ebx        ; if *all* of them are negative a sign flag is raised
63
         and      edx,ecx
64
         and      edx,eax
65
         test     edx,80008000h  ; Check both X&Y at once
66
         jne      .loop2_end
67
 
68
        mov     bx,.y2       ; calc delta 12
69
        sub     bx,.y1
70
        jnz     .dx12_make
71
        mov     .dx12,0
72
        mov     .dz12,0
73
        jmp     .dx12_done
74
   .dx12_make:
75
        mov     ax,.x2
76
        sub     ax,.x1
77
        cwde
78
        movsx   ebx,bx
79
        shl     eax,ROUND2
80
        cdq
81
        idiv    ebx
82
        mov     .dx12,eax
83
 
84
        movss    xmm1,.z2
85
        cvtsi2ss xmm2,ebx
86
        subss    xmm1,.z1
87
        divss    xmm1,xmm2
88
        movss    .dz12,xmm1
89
     ;  mov      .dz12, dword 0.11
90
 
91
  .dx12_done:
92
        mov     bx,.y3       ; calc delta 13
93
        sub     bx,.y1
94
        jnz     .dx13_make
95
        mov     .dx13,0
96
        mov     .dz13,0
97
        jmp     .dx13_done
98
   .dx13_make:
99
        mov     ax,.x3
100
        sub     ax,.x1
101
        cwde
102
        movsx   ebx,bx
103
        shl     eax,ROUND2
104
        cdq
105
        idiv    ebx
106
        mov     .dx13,eax
107
 
108
        movss    xmm1,.z3
109
        cvtsi2ss xmm2,ebx
110
        subss    xmm1,.z1
111
        divss    xmm1,xmm2
112
        movss    .dz13,xmm1
113
    ;    mov  .dz13, dword 0.11
114
 
115
    .dx13_done:
116
        mov     bx,.y3       ; calc delta 23
117
        sub     bx,.y2
118
        jnz     .dx23_make
119
        mov     .dx23,0
120
        mov     .dz23,0
121
        jmp     .dx23_done
122
   .dx23_make:
123
        mov     ax,.x3
124
        sub     ax,.x2
125
        cwde
126
        movsx   ebx,bx
127
        shl     eax,ROUND2
128
        cdq
129
        idiv    ebx
130
        mov     .dx23,eax
131
 
132
        movss    xmm1,.z3
133
        cvtsi2ss xmm2,ebx
134
        subss    xmm1,.z2
135
        divss    xmm1,xmm2
136
        movss    .dz23,xmm1
137
 
138
    .dx23_done:
139
        mov     edx,.z1
140
 
141
        mov     .zz1,edx
142
        mov     .zz2,edx
143
        movsx   eax,word .x1
144
        shl     eax,ROUND2    ; eax - cur x1
145
        mov     ebx,eax       ; ebx - cur x2
146
 
147
        mov     cx,.y1
148
        cmp     cx,.y2
149
        jge     .loop1_end
150
     .loop1:
151
 
152
        pushad
153
        sar     ebx,ROUND2
154
        sar     eax,ROUND2
155
     ;   movq    xmm0,.zz1
156
        movlps  xmm0,.zz1
157
   ;     mov     edx,0.11
158
   ;     movd    xmm0,edx
159
   ;     shufps  xmm0,xmm0,11100000b
160
        mov     esi,.s_buff
161
 
162
        call    stencil_line
163
 
164
        popad
165
        add     eax,.dx13
166
        add     ebx,.dx12
167
 
168
        movss   xmm1,.zz1
169
        movss   xmm2,.zz2
170
        addss   xmm1,.dz13
171
        addss   xmm2,.dz12
172
        movss   .zz1,xmm1
173
        movss   .zz2,xmm2
174
 
175
        add     cx,1
176
        cmp     cx,.y2
177
        jl      .loop1
178
 
179
    .loop1_end:
180
 
181
        mov     edx,.z2
182
        mov     .zz2,edx
183
        movsx   ebx,word .x2
184
        shl     ebx,ROUND2
185
 
186
        mov     cx,.y2
187
        cmp     cx,.y3
188
        jge     .loop2_end
189
     .loop2:
190
        pushad
191
 
192
        sar     ebx,ROUND2
193
        sar     eax,ROUND2
194
        movlps  xmm0,.zz1
195
        mov     esi,.s_buff
196
 
197
 
198
        call    stencil_line
199
 
200
        popad
201
 
202
        add     eax,.dx13
203
        add     ebx,.dx23
204
 
205
        movss   xmm1,.zz1
206
        movss   xmm2,.zz2
207
        addss   xmm1,.dz13
208
        addss   xmm2,.dz23
209
        movss   .zz1,xmm1
210
        movss   .zz2,xmm2
211
 
212
 
213
        add     cx,1
214
        cmp     cx,.y3
215
        jl      .loop2
216
     .loop2_end:
217
 
218
        add  esp,128
219
        pop  ebp
220
 
221
ret
222
 
223
stencil_line:
224
;----------------------------------------------------
225
;-------------in xmm0 - lo -> hi z1, z2
226
;--------------- eax - x1 ---------------------------
227
;--------------- ebx - x2 ---------------------------
228
;--------------- ecx - y-----------------------------
229
;--------------- esi - pointer to s-buffer
230
 
231
 
232
.dz equ  [ebp-4]
233
.z2 equ  [ebp-8]
234
.z1 equ  [ebp-12]
235
.x2 equ  [ebp-16]
236
.x1 equ  [ebp-20]
237
.s_buf  equ [ebp-24]
238
;     cmp        eax,ebx
239
;     je  @f
240
;     int3
241
;   @@:
242
     push       ebp
243
     mov        ebp,esp
244
     sub        esp,64
245
  ;   cmp        eax,0
246
  ;   jg         @f
247
  ;
248
  ; @@:
249
     or         cx,cx
250
     jle        .l_quit
251
 
252
     cmp        cx,[size_y_var]
253
     jge        .l_quit
254
 
255
     movzx      ecx,cx
256
     mov        .s_buf,esi
257
     cmp        eax,ebx
258
     je         .l_quit
259
     jl         .l_ok
260
 
261
     xchg       eax,ebx
262
     shufps     xmm0,xmm0,11100001b
263
   .l_ok:
264
 
265
     cmp        ax,[size_x_var]
266
     jge        .l_quit
267
     cmp        bx,0
268
     jle        .l_quit
269
 
270
     movlps     .z1,xmm0
271
     mov        .x1,eax
272
     mov        .x2,ebx
273
 
274
     sub        ebx,eax
275
     movss      xmm0,.z2
276
     cvtsi2ss   xmm1,ebx
277
     subss      xmm0,.z1
278
     divss      xmm0,xmm1
279
     movss      .dz,xmm0
280
 
281
     movzx      edx,word[size_x_var]
282
     cmp        eax,1
283
     jge        @f
284
     mov        eax,.x1
285
     neg        eax
286
     cvtsi2ss   xmm2,eax
287
     mulss      xmm2,.dz
288
     addss      xmm2,.z1
289
     movss      .z1,xmm2
290
     mov        dword .x1,0
291
     movzx      edx,word[size_x_var]
292
     sub        edx,1
293
   @@:
294
     cmp        .x2,edx
295
     jl         @f
296
     mov        .x2,edx
297
 
298
    @@:
299
 ;   mov         eax,.x1
300
 ;   cmp         .x2,eax
301
 ;   je          .l_quit
302
     movzx      edx,word[size_x_var]
303
     mov        esi,.s_buf
304
     mov        eax,ecx  ; y
305
     mul        edx
306
     add        eax,.x1
307
 
308
     shl        eax,2
309
     add        esi,eax
310
 
311
     mov        ecx,.x2
312
     sub        ecx,.x1
313
     movss      xmm2,.z1   ; cz
314
   .ccalc:
8666 dunkaist 315
   ;  movss     xmm1,xmm2
316
     comiss   xmm2,dword[esi]
317
     jg        @f
8232 leency 318
     movss     dword[esi],xmm2
319
    @@:
320
     add       esi,4
321
     addss     xmm2,.dz
322
     sub       ecx,1
323
     jnz       .ccalc
324
  .l_quit:
325
     mov       esp,ebp
326
     pop       ebp
327
ret