preparing for graphic context checks

fixed jmp errors
This commit is contained in:
koolsmoky
2003-09-12 05:11:45 +00:00
parent 89ff5c6968
commit 095bb6777a
2 changed files with 269 additions and 175 deletions

View File

@@ -19,6 +19,9 @@
;; $Header$
;; $Revision$
;; $Log$
;; Revision 1.1.8.7 2003/07/07 23:29:06 koolsmoky
;; cleaned logs
;;
;;
;; Revision 1.1 2000/06/15 00:27:43 joseph
;; Initial checkin into SourceForge.
@@ -270,7 +273,7 @@ PROC_TYPE clip_cull_invalid
%undef GLIDE_VALIDATE_STATE
endp
ALIGN 32
PROC_TYPE clip_cull_valid
@@ -289,7 +292,7 @@ PROC_TYPE clip_cull_valid
%undef GLIDE_VALIDATE_STATE
endp
ALIGN 32
PROC_TYPE clip_nocull_valid
@@ -392,6 +395,19 @@ proc _trisetup_clip_coor_thunk, 12
%define procPtr eax
%define vPtr ecx
%define gc edx ; Current graphics context passed implicitly through edx
%IFDEF GLIDE_ALT_TAB
test gc, gc
je .__contextLost
; mov eax, [gc + windowed]
; test eax, 1
; jnz .pastContextTest
mov eax, DWORD [gc+lostContext]
mov ecx, [eax]
test ecx, 1
jnz .__contextLost
;.pastContextTest:
%ENDIF
;; Call through to the gc->curArchProcs.drawTrianglesProc w/o
;; adding extra stuff to the stack. I wish we could actually
@@ -410,6 +426,9 @@ __clipSpace:
invoke procPtr, 1, 3, vPtr ; (*gc->curArchProcs.drawTrianglesProc)(grDrawVertexArray, 3, vPtr)
%IFDEF GLIDE_ALT_TAB
.__contextLost:
%ENDIF
ret ; pop 3 dwords (vertex addrs) and return
endp
@@ -422,6 +441,19 @@ proc _trisetup_SSE_clip_coor_thunk, 12
%define procPtr eax
%define vPtr ecx
%define gc edx ; Current graphics context passed implicitly through edx
%IFDEF GLIDE_ALT_TAB
test gc, gc
je .__contextLost
; mov eax, [gc + windowed]
; test eax, 1
; jnz .pastContextTest
mov eax, DWORD [gc+lostContext]
mov ecx, [eax]
test ecx, 1
jnz .__contextLost
;.pastContextTest:
%ENDIF
;; Call through to the gc->curArchProcs.drawTrianglesProc w/o
;; adding extra stuff to the stack. I wish we could actually
@@ -440,6 +472,9 @@ __clipSpace:
invoke procPtr, 1, 3, vPtr ; (*gc->curArchProcs.drawTrianglesProc)(grDrawVertexArray, 3, vPtr)
%IFDEF GLIDE_ALT_TAB
.__contextLost:
%ENDIF
ret ; pop 3 dwords (vertex addrs) and return
endp

View File

@@ -20,6 +20,9 @@
;; $Header$
;; $Revision$
;; $Log$
;; Revision 1.1.8.6 2003/07/07 23:29:06 koolsmoky
;; cleaned logs
;;
;;
;; Revision 1.1 2000/06/15 00:27:43 joseph
;; Initial checkin into SourceForge.
@@ -56,7 +59,7 @@
%define zdyBC One+14h
%define zculltest One+18h
%define gc esi ; points to graphics context
%define gc esi ; points to graphics context ;; ZZZ double defined?
%ifdef GL_AMD3D
@@ -77,7 +80,7 @@
xor eax, eax
mov [eax], eax
%ENDIF
%ELSE
%ELSE ; !GLIDE_CLIP_COORDS
%IF GLIDE_CULLING
%define fa eax ; vtx a from caller
%define fb ebx ; vtx b from caller
@@ -95,36 +98,49 @@
mov fb, [esp + _vb$ - 4] ; get base address of vertex B
push ebp ; save frame pointer
%if GLIDE_CLIP_COORDS
mov esi, [gc+CoordinateSpace] ; which coord. space (clip/window)?
%endif
%IFDEF GLIDE_ALT_TAB
test gc, gc
je .__contextLost
; mov edx, [gc + windowed]
; test edx, 1
; jnz .pastContextTest
mov edx, DWORD [gc+lostContext]
mov ebx, [edx]
test ebx, 1
jnz .__contextLost
;.pastContextTest:
%ENDIF
;;%if GLIDE_CLIP_COORDS ;; this is never used
;; mov esi, [gc+CoordinateSpace] ; which coord. space (clip/window)?
;;%endif
%if GLIDE_VALIDATE_STATE
mov ebp, [gc + invalid] ; state validated?
%endif
%if GLIDE_CLIP_COORDS
lea eax, [esp+ _va$] ; pointer to vertex pointers
test esi, esi ; window coordinates ?
jz win_coordinates ; yup
invoke _grDrawTriangles, 1, 3, eax; draw the triangle in clip coordinate space
pop ebp ; restore frame pointer
pop ebx ; restore caller's register variable
pop esi ; restore caller's register variable
pop edi ; restore caller's register variable
ret ; return, pop 3 DWORD arguments off stack
win_coordinates:
%endif ; GLIDE_CLIP_COORDS
;;%if GLIDE_CLIP_COORDS ;; this is never used
;; lea eax, [esp+ _va$] ; pointer to vertex pointers
;; test esi, esi ; window coordinates ?
;;
;; jz win_coordinates ; yup
;;
;; invoke _grDrawTriangles, 1, 3, eax; draw the triangle in clip coordinate space
;;
;; pop ebp ; restore frame pointer
;; pop ebx ; restore caller's register variable
;;
;; pop esi ; restore caller's register variable
;; pop edi ; restore caller's register variable
;;
;; ret ; return, pop 3 DWORD arguments off stack
;;
;;win_coordinates:
;;%endif ; GLIDE_CLIP_COORDS
%if GLIDE_VALIDATE_STATE
test ebp, ebp ; does state need validation?
jz no_validation ; valid, don't need to validate
jz .no_validation ; valid, don't need to validate
invoke _grValidateState ; validate state
@@ -219,42 +235,55 @@ win_coordinates:
push ebp ; save frame pointer
%if GLIDE_CLIP_COORDS
mov edx, [gc+CoordinateSpace]; window coordinates or clip coordinates ?
%endif
%IFDEF GLIDE_ALT_TAB
test gc, gc
je .__contextLost
; mov edx, [gc + windowed]
; test edx, 1
; jnz .pastContextTest
mov edx, DWORD [gc+lostContext]
mov ebx, [edx]
test ebx, 1
jnz .__contextLost
;.pastContextTest:
%ENDIF
;;%if GLIDE_CLIP_COORDS ;; this is never used
;; mov edx, [gc+CoordinateSpace]; window coordinates or clip coordinates ?
;;%endif
%if GLIDE_VALIDATE_STATE
mov ebp, [gc + invalid] ; state validated?
%endif
%if GLIDE_CLIP_COORDS
lea eax, [esp+ _va$] ; pointer to vertex pointers
test edx, edx ; window coordinates ?
jz win_coordinates ; yup
invoke _grDrawTriangles, 1, 3, eax; draw the triangle in coordinate space
pop ebp ; restore frame pointer
pop ebx ; restore caller's register variable
pop esi ; restore caller's register variable
pop edi ; restore caller's register variable
ret ; return, pop 3 DWORD arguments off stack
ALIGN 16
win_coordinates:
%endif
;;%if GLIDE_CLIP_COORDS ;; this is never used
;; lea eax, [esp+ _va$] ; pointer to vertex pointers
;; test edx, edx ; window coordinates ?
;;
;; jz win_coordinates ; yup
;;
;; invoke _grDrawTriangles, 1, 3, eax; draw the triangle in coordinate space
;;
;; pop ebp ; restore frame pointer
;; pop ebx ; restore caller's register variable
;;
;; pop esi ; restore caller's register variable
;; pop edi ; restore caller's register variable
;;
;; ret ; return, pop 3 DWORD arguments off stack
;;
;; ALIGN 16
;;win_coordinates:
;;
;;%endif
%if GLIDE_VALIDATE_STATE
test ebp, ebp ; does state need validation?
jz no_validation ; valid, don't need to validate
jz .no_validation ; valid, don't need to validate
invoke _grValidateState ; validate state
no_validation:
.no_validation:
%endif
@@ -270,7 +299,7 @@ no_validation:
invoke _grCommandTransportMakeRoom, tempVal, 0, __LINE__; note: updates fifoPtr
jmp .__triBegin ; large distance due to alignment
%endif ; GLIDE_CULLING
%ENDIF ; GLIDE_CULLING
%define dlp ebx ; points to dataList structure
@@ -567,6 +596,19 @@ no_validation:
ret ; return to caller
%IFDEF GLIDE_ALT_TAB
.__contextLost:
inc esi ; _GlideRoot.stats.trisProcessed++
pop ebp ; restore frame pointer
mov [gc + trisProcessed], esi ;
pop ebx ; restore caller's register variable
pop esi ; restore caller's register variable
pop edi ; restore caller's register variable
ret ; return to caller
%ENDIF
%IF GLIDE_CULLING
.__cullFail:
@@ -617,7 +659,7 @@ no_validation:
xor eax, eax
mov [eax], eax
%ENDIF
%ELSE
%ELSE ; !GLIDE_CLIP_COORDS
%IF GLIDE_CULLING
%define fa eax ; vtx a from caller
%define fb ebx ; vtx b from caller
@@ -635,36 +677,49 @@ no_validation:
mov fb, [esp + _vb$ - 4] ; get base address of vertex B
push ebp ; save frame pointer
%if GLIDE_CLIP_COORDS
mov esi, [gc+CoordinateSpace] ; which coord. space (clip/window)?
%endif
%IFDEF GLIDE_ALT_TAB
test gc, gc
je .__contextLost
; mov edx, [gc + windowed]
; test edx, 1
; jnz .pastContextTest
mov edx, DWORD [gc+lostContext]
mov ebx, [edx]
test ebx, 1
jnz .__contextLost
;.pastContextTest:
%ENDIF
;;%if GLIDE_CLIP_COORDS ;; this is never used
;; mov esi, [gc+CoordinateSpace] ; which coord. space (clip/window)?
;;%endif
%if GLIDE_VALIDATE_STATE
mov ebp, [gc + invalid] ; state validated?
%endif
%if GLIDE_CLIP_COORDS
lea eax, [esp+ _va$] ; pointer to vertex pointers
test esi, esi ; window coordinates ?
jz win_coordinates ; yup
invoke _grDrawTriangles, 1, 3, eax; draw the triangle in clip coordinate space
pop ebp ; restore frame pointer
pop ebx ; restore caller's register variable
pop esi ; restore caller's register variable
pop edi ; restore caller's register variable
ret ; return, pop 3 DWORD arguments off stack
win_coordinates:
%endif ; GLIDE_CLIP_COORDS
;;%if GLIDE_CLIP_COORDS ;; this is never used
;; lea eax, [esp+ _va$] ; pointer to vertex pointers
;; test esi, esi ; window coordinates ?
;;
;; jz win_coordinates ; yup
;;
;; invoke _grDrawTriangles, 1, 3, eax; draw the triangle in clip coordinate space
;;
;; pop ebp ; restore frame pointer
;; pop ebx ; restore caller's register variable
;;
;; pop esi ; restore caller's register variable
;; pop edi ; restore caller's register variable
;;
;; ret ; return, pop 3 DWORD arguments off stack
;;
;;win_coordinates:
;;%endif ; GLIDE_CLIP_COORDS
%if GLIDE_VALIDATE_STATE
test ebp, ebp ; does state need validation?
jz no_validation ; valid, don't need to validate
jz .no_validation ; valid, don't need to validate
invoke _grValidateState ; validate state
@@ -680,15 +735,6 @@ win_coordinates:
ALIGN 16
xorps xmm0,xmm0 ; clear SIMD register
xorps xmm1,xmm1
xorps xmm2,xmm2
xorps xmm3,xmm3
xorps xmm4,xmm4
xorps xmm5,xmm5
xorps xmm6,xmm6
xorps xmm7,xmm7
test cull, cull ; culling enabled ?
mov tempVal, [gc + curTriSize]
@@ -697,36 +743,31 @@ win_coordinates:
jz .nocull ; nope, no culling
mov fa, [esp + _va$] ; get base address of vertex A
movlps xmm2,[fc + X] ; yc | xc
movlps xmm2,[fc + X] ; 0 | 0 | yc | xc
shl cull, 31 ; culltest << 31
movlps xmm1,[fb + X] ; yb | xb
movlps xmm1,[fb + X] ; 0 | 0 | yb | xb
add tempVal, 4 ; space required in fifo
movlps xmm0,[fa + X] ; ya | xa
movlps xmm0,[fa + X] ; 0 | 0 | ya | xa
mov ebx, [gc + fifoRoom] ; space available in fifo
;; Area_Computation
movaps xmm5,xmm1 ;
subps xmm5,xmm2 ;
movaps xmm2,xmm5 ; dyBC | dxBC
subps xmm0,xmm1 ; dyAB | dxAB
subps xmm0,xmm1 ; 0 | 0 | dyAB | dxAB
subps xmm1,xmm2 ; 0 | 0 | dyBC | dxBC
movaps xmm5,xmm2 ; dyBC | dxBC
unpcklps xmm2,xmm2 ;
movhlps xmm2,xmm2 ; dyBC | dyBC
unpcklps xmm0,xmm3 ; 0 | dyAB | 0 | dxAB
movhlps xmm3,xmm0 ; 0 | 0 | 0 | dyAB
unpcklps xmm1,xmm2 ; yc | dyBC | xc | dxBC
movhlps xmm2,xmm1 ; 0 | 0 | yc | dyBC
movaps xmm4,xmm0 ; dyAB | dxAB
unpcklps xmm0,xmm0
movhlps xmm0,xmm0 ; dyAB | dyAB
mulss xmm0,xmm2 ; 0 | 0 | 0 | dxAB*dyBC
mulss xmm1,xmm3 ; 0 | 0 | 0 | dyAB*dxBC
mulss xmm5,xmm0 ; dyAB*dxBC
mulss xmm4,xmm2 ; dxAB*dyBC
subss xmm0,xmm1 ; 0 | 0 | 0 | dxAB*dyBC - dxBC*dyAB
subss xmm4,xmm5 ; dxAB*dyBC - dxBC*dyAB
movss [zArea],xmm4
movss [zArea],xmm0 ; dxAB*dyBC - dxBC*dyAB
mov intArea,[zArea] ; vectored !
; Zero Area Triangle Check
@@ -771,42 +812,55 @@ win_coordinates:
push ebp ; save frame pointer
%if GLIDE_CLIP_COORDS
mov edx, [gc+CoordinateSpace]; window coordinates or clip coordinates ?
%endif
%IFDEF GLIDE_ALT_TAB
test gc, gc
je .__contextLost
; mov edx, [gc + windowed]
; test edx, 1
; jnz .pastContextTest
mov edx, DWORD [gc+lostContext]
mov ebx, [edx]
test ebx, 1
jnz .__contextLost
;.pastContextTest:
%ENDIF
;;%if GLIDE_CLIP_COORDS ;; this is never used
;; mov edx, [gc+CoordinateSpace]; window coordinates or clip coordinates ?
;;%endif
%if GLIDE_VALIDATE_STATE
mov ebp, [gc + invalid] ; state validated?
%endif
%if GLIDE_CLIP_COORDS
lea eax, [esp+ _va$] ; pointer to vertex pointers
test edx, edx ; window coordinates ?
jz win_coordinates ; yup
invoke _grDrawTriangles, 1, 3, eax; draw the triangle in coordinate space
pop ebp ; restore frame pointer
pop ebx ; restore caller's register variable
pop esi ; restore caller's register variable
pop edi ; restore caller's register variable
ret ; return, pop 3 DWORD arguments off stack
ALIGN 16
win_coordinates:
%endif
;;%if GLIDE_CLIP_COORDS ;; this is never used
;; lea eax, [esp+ _va$] ; pointer to vertex pointers
;; test edx, edx ; window coordinates ?
;;
;; jz win_coordinates ; yup
;;
;; invoke _grDrawTriangles, 1, 3, eax; draw the triangle in coordinate space
;;
;; pop ebp ; restore frame pointer
;; pop ebx ; restore caller's register variable
;;
;; pop esi ; restore caller's register variable
;; pop edi ; restore caller's register variable
;;
;; ret ; return, pop 3 DWORD arguments off stack
;;
;; ALIGN 16
;;win_coordinates:
;;
;;%endif
%if GLIDE_VALIDATE_STATE
test ebp, ebp ; does state need validation?
jz no_validation ; valid, don't need to validate
jz .no_validation ; valid, don't need to validate
invoke _grValidateState ; validate state
no_validation:
.no_validation:
%endif
@@ -814,22 +868,13 @@ no_validation:
add tempVal, 4 ; fifo space needed (include 4-byte header)
mov ebx, [gc + fifoRoom] ; fifo space available
xorps xmm0,xmm0 ; clear SIMD register
xorps xmm1,xmm1
xorps xmm2,xmm2
xorps xmm3,xmm3
xorps xmm4,xmm4
xorps xmm5,xmm5
xorps xmm6,xmm6
xorps xmm7,xmm7
cmp ebx, tempVal ; fifo spce available >= space needed ?
jge .__triBegin ; yup, ready to draw triangle
invoke _grCommandTransportMakeRoom, tempVal, 0, __LINE__; note: updates fifoPtr
jmp .__triBegin ; large distance due to alignment
%endif ; GLIDE_CULLING
%ENDIF ; GLIDE_CULLING
%define dlp ebx ; points to dataList structure
@@ -849,7 +894,7 @@ no_validation:
test fifo, 4 ; is fifo pointer qword aligned ?
jz .__fifo_aligned ; yes, it is qword aligned
movlps xmm1,[vertex+X] ; y | x
movlps xmm1,[vertex+X] ; 0 | 0 | y | x
GR_FIFO_WRITE fifo, 0, eax ; write header to fifo; now qword aligned
add fifo, 12 ; fifoPtr += 3*sizeof(FxU32)
@@ -865,19 +910,19 @@ no_validation:
jz .__paramLoopDoneWBzero1; yes, "write buffer" empty
.__paramLoop1a:
movss xmm1,[eax+vertex] ; get next parameter
movss xmm1,[eax+vertex] ; 0 | 0 | 0 | get next parameter
mov eax, [dlp] ; offset = *(dlp + 1)
test eax, eax ; at end of offset list (offset == 0) ?
jz .__paramLoopDoneWBone1; exit, write buffer contains one DWORD
movss xmm2,[eax+vertex] ; get next parameter
movss xmm2,[eax+vertex] ; 0 | 0 | 0 | get next parameter
add dlp, 8 ; dlp += 2
mov eax, [dlp-4] ; offset = *(dlp + 1)
add fifo, 8 ; fifoPtr += 2*sizeof(FxU32)
unpcklps xmm1,xmm2 ; current param | previous param
unpcklps xmm1,xmm2 ; 0 | 0 | current param | previous param
test eax, eax ; at end of offset list (offset == 0) ?
WRITE_MM1_FIFO_ALIGNED -8 ; PCI write current param | previous param
@@ -886,14 +931,14 @@ no_validation:
jmp .__paramLoopDoneWBzero1; write buffer empty
.__fifo_aligned:
movss xmm2,[vertex+X] ; 0 | x of vertex A
movss xmm2,[vertex+X] ; 0 | 0 | 0 | x of vertex A
GR_FIFO_WRITE fifo, 0, eax ; write header to fifo
add fifo, 8 ; fifoPtr += 2*sizeof(FxU32)
movss [fifo-4],xmm2 ; PCI write x - not CSIM compatible!!!!
movss xmm1,[vertex+Y] ; 0 | y of vertex A
movss xmm1,[vertex+Y] ; 0 | 0 | 0 | y of vertex A
mov eax, [dlp] ; get first offset from the data list
add dlp, 4 ; dlp++
@@ -902,19 +947,19 @@ no_validation:
jz .__paramLoopDoneWBone1; yes, "write buffer" has y data
.__paramLoop1b:
movss xmm2,[eax+vertex] ; get next parameter
movss xmm2,[eax+vertex] ; 0 | 0 | 0 | get next parameter
add fifo, 8 ; fifoPtr += 2*sizeof(FxU32)
mov eax, [dlp] ; offset = *(dlp + 1)
add dlp, 8 ; dlp += 2
unpcklps xmm1,xmm2 ; current param | previous param
unpcklps xmm1,xmm2 ; 0 | 0 | current param | previous param
test eax, eax ; at end of offset list (offset == 0) ?
WRITE_MM1_FIFO_ALIGNED -8 ; PCI write current param | previous param
jz .__paramLoopDoneWBzero1; exit, "write buffer" empty
movss xmm1,[eax+vertex] ; get next parameter
movss xmm1,[eax+vertex] ; 0 | 0 | 0 | get next parameter
mov eax, [dlp-4] ; offset = *(dlp + 1)
test eax, eax ; at end of offset list (offset == 0) ?
@@ -927,13 +972,13 @@ no_validation:
mov dlp, dlpstrt ; reset the dataList
mov vertex, [esp + _vb$] ; Current vertex = B
movss xmm2,[vertex+X] ; 0 | x if vertex B
unpcklps xmm1,xmm2 ; x | old param
movss xmm2,[vertex+X] ; 0 | 0 | 0 | x if vertex B
unpcklps xmm1,xmm2 ; 0 | 0 | x | old param
WRITE_MM1_FIFO_ALIGNED 0 ; PCI write: x | old param
add fifo, 8 ; fifoPtr += 2*sizeof(FxU32)
movss xmm1,[vertex+Y] ; 0 | y of vertex B
movss xmm1,[vertex+Y] ; 0 | 0 | 0 | y of vertex B
mov eax, [dlp] ; get first offset from the data list
add dlp, 4 ; dlp++
@@ -942,19 +987,19 @@ no_validation:
jz .__paramLoopDoneWBone2; yes, "write buffer" has y data
.__paramLoop2b:
movss xmm2,[eax+vertex] ; get next parameter
movss xmm2,[eax+vertex] ; 0 | 0 | 0 | get next parameter
add fifo, 8 ; fifoPtr += 2*sizeof(FxU32)
mov eax, [dlp] ; offset = *(dlp + 1)
add dlp, 8 ; dlp += 2
unpcklps xmm1,xmm2 ; current param | previous param
unpcklps xmm1,xmm2 ; 0 | 0 | current param | previous param
cmp eax, 0 ; at end of offset list (offset == 0) ?
WRITE_MM1_FIFO_ALIGNED -8 ; PCI write current param | previous param
WRITE_MM1_FIFO_ALIGNED -8 ; 0 | 0 | PCI write current param | previous param
jz .__paramLoopDoneWBzero2; exit, "write buffer" empty
movss xmm1,[eax+vertex] ; get next parameter
movss xmm1,[eax+vertex] ; 0 | 0 | 0 | get next parameter
mov eax, [dlp-4] ; offset = *(dlp + 1)
test eax, eax ; at end of offset list (offset == 0) ?
@@ -967,7 +1012,7 @@ no_validation:
mov vertex, [esp + _vb$] ; Current vertex = B
mov dlp, dlpstrt ; Reset the dataList
movlps xmm1,[vertex+X] ; y | x of vertex B
movlps xmm1,[vertex+X] ; 0 | 0 | y | x of vertex B
add fifo, 8 ; fifoPtr += 2*sizeof(FxU32)
WRITE_MM1_FIFO_ALIGNED -8 ; PCI write y | x of vertex B
@@ -982,19 +1027,19 @@ no_validation:
jz .__paramLoopDoneWBzero2; yes, "write buffer" empty
.__paramLoop2a:
movss xmm1,[eax+vertex] ; get next parameter
movss xmm1,[eax+vertex] ; 0 | 0 | 0 | get next parameter
mov eax, [dlp] ; offset = *(dlp + 1)
cmp eax, 0 ; at end of offset list (offset == 0) ?
jz .__paramLoopDoneWBone2; exit, write buffer contains one DWORD
movss xmm2,[eax+vertex] ; get next parameter
movss xmm2,[eax+vertex] ; 0 | 0 | 0 | get next parameter
add dlp, 8 ; dlp += 2
mov eax, [dlp-4] ; offset = *(dlp + 1)
add fifo, 8 ; fifoPtr += 2*sizeof(FxU32)
unpcklps xmm1,xmm2 ; current param | previous param
unpcklps xmm1,xmm2 ; 0 | 0 | current param | previous param
test eax, eax ; at end of offset list (offset == 0) ?
WRITE_MM1_FIFO_ALIGNED -8 ; PCI write current param | previous param
@@ -1005,7 +1050,7 @@ no_validation:
mov vertex, [esp + _vc$] ; Current vertex = C
mov dlp, dlpstrt ; Reset the dataList
movlps xmm1,[vertex+X] ; y | x of vertex C
movlps xmm1,[vertex+X] ; 0 | 0 | y | x of vertex C
add fifo, 8 ; fifoPtr += 2*sizeof(FxU32)
WRITE_MM1_FIFO_ALIGNED -8 ; PCI write y | x of vertex C
@@ -1019,19 +1064,19 @@ no_validation:
jz .__paramLoopDoneWBzero3; yes, "write buffer" empty
.__paramLoop3a:
movss xmm1,[eax+vertex] ; get next parameter
movss xmm1,[eax+vertex] ; 0 | 0 | 0 | get next parameter
mov eax, [dlp] ; offset = *(dlp + 1)
test eax, eax ; at end of offset list (offset == 0) ?
jz .__paramLoopDoneWBone3; exit, write buffer contains one DWORD
movss xmm2,[eax+vertex] ; get next parameter
movss xmm2,[eax+vertex] ; 0 | 0 | 0 | get next parameter
add dlp, 8 ; dlp += 2
mov eax, [dlp-4] ; offset = *(dlp + 1)
add fifo, 8 ; fifoPtr += 2*sizeof(FxU32)
unpcklps xmm1,xmm2 ; current param | previous param
unpcklps xmm1,xmm2 ; 0 | 0 | current param | previous param
test eax, eax ; at end of offset list (offset == 0) ?
WRITE_MM1_FIFO_ALIGNED -8 ; PCI write current param | previous param
@@ -1046,13 +1091,13 @@ no_validation:
mov vertex, [esp + _vc$] ; Current vertex = C
mov dlp, dlpstrt ; reset the dataList
movss xmm2,[vertex+X] ; 0 | x if vertex C
unpcklps xmm1,xmm2 ; x | old param
movss xmm2,[vertex+X] ; 0 | 0 | 0 | x if vertex C
unpcklps xmm1,xmm2 ; 0 | 0 | x | old param
WRITE_MM1_FIFO_ALIGNED 0 ; PCI write: x | old param
add fifo, 8 ; fifoPtr += 2*sizeof(FxU32)
movss xmm1,[vertex+Y] ; 0 | y of vertex C
movss xmm1,[vertex+Y] ; 0 | 0 | 0 | y of vertex C
nop ; filler
mov eax, [dlp] ; get first offset from the data list
@@ -1062,19 +1107,19 @@ no_validation:
jz .__paramLoopDoneWBone3; yes, "write buffer" has y data
.__paramLoop3b:
movss xmm2,[eax+vertex] ; get next parameter
movss xmm2,[eax+vertex] ; 0 | 0 | 0 | get next parameter
add fifo, 8 ; fifoPtr += 2*sizeof(FxU32)
mov eax, [dlp] ; offset = *(dlp + 1)
add dlp, 8 ; dlp += 2
unpcklps xmm1,xmm2 ; current param | previous param
unpcklps xmm1,xmm2 ; 0 | 0 | current param | previous param
test eax, eax ; at end of offset list (offset == 0) ?
WRITE_MM1_FIFO_ALIGNED -8 ; PCI write current param | previous param
jz .__paramLoopDoneWBzero3; exit, "write buffer" empty
movss xmm1,[eax+vertex] ; get next parameter
movss xmm1,[eax+vertex] ; 0 | 0 | 0 | get next parameter
mov eax, [dlp-4] ; offset = *(dlp + 1)
test eax, eax ; at end of offset list (offset == 0) ?
@@ -1124,6 +1169,19 @@ no_validation:
ret ; return to caller
%IFDEF GLIDE_ALT_TAB
.__contextLost:
inc esi ; _GlideRoot.stats.trisProcessed++
pop ebp ; restore frame pointer
mov [gc + trisProcessed], esi ;
pop ebx ; restore caller's register variable
pop esi ; restore caller's register variable
pop edi ; restore caller's register variable
ret ; return to caller
%ENDIF
%IF GLIDE_CULLING
.__cullFail:
@@ -1167,7 +1225,7 @@ no_validation:
xor eax, eax
mov [eax], eax
%ENDIF
%ELSE
%ELSE ; !GLIDE_CLIP_COORDS
;; Prologue stuff
push esi
push edi
@@ -1196,19 +1254,20 @@ no_validation:
%ELSE
mov gc, edx
%ENDIF
%IFDEF GLIDE_ALT_TAB
test gc, gc
je .__triDone
mov edx, [gc + windowed]
test edx, 1
jnz .pastContextTest ;
; mov edx, [gc + windowed]
; test edx, 1
; jnz .pastContextTest ;
mov edx, DWORD [gc+lostContext]
mov ebx, [edx]
mov ebx, [edx]
test ebx, 1
jnz .__triDone
.pastContextTest:
;.pastContextTest:
%ENDIF
align 4
%IF GLIDE_VALIDATE_STATE
;;; GR_FLUSH_STATE()
@@ -1397,6 +1456,6 @@ no_validation:
pop esi
ret
%ENDIF ; !GLIDE_CLIP_COOR
%ENDIF ; !GLIDE_CLIP_COORD
%ENDIF ; !GL_SSE
%ENDIF ; !GL_AMD3D