Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

280 lines
7.2 KiB

;-----------------------------------------------------------------------------
;
; This file contains x86 assembly edge walkers.
;
; Copyright (C) Microsoft Corporation, 1997.
;
; WARNING WARNING WARNING
; This assembly file generated from mas file.
; EDIT THE MAS FILE.
; I warned you.
; WARNING WARNING WARNING
;
;-----------------------------------------------------------------------------
include(`m4hdr.mh')dnl
include(`attrsx86.mh')dnl
.386p
.MODEL FLAT
INCLUDE offs_acp.inc
INCLUDE profile.inc
ALLOC_SPANS EQU ?AllocSpans@PrimProcessor@@QAEJPAIPAPAUtagD3DI_RASTSPAN@@@Z
FREE_SPANS EQU ?FreeSpans@PrimProcessor@@QAEXI@Z
EXTERN ALLOC_SPANS:NEAR
EXTERN FREE_SPANS:NEAR
.CODE
dnl
dnl d_WalkTrapSpans
dnl
dnl Generates a complete monolithic trapezoid edge walker.
dnl
dnl $1 is one of Z_Diff, Z_Diff_Spec, Z_Diff_Tex, Z_Diff_Spec_Tex,
dnl Z_Tex1_Tex, Z_DIdx, Z_DIdx_Tex.
dnl $2 is one of Float Fixed.
dnl
define(`d_WalkTrapSpans', `
ifelse($2, `Fixed',
`IFDEF STEP_FIXED
')dnl
@WalkTrap$2Spans_$1_NoClip@16 PROC SYSCALL PUBLIC USES ebx esi edi,
pStpCtx:DWORD, bAdvanceLast:DWORD
LOCAL uSpansAvail:DWORD, cPix:DWORD
LOCAL pSpan:DWORD, pXOther:DWORD
LOCAL pXLeft:DWORD, pXRight:DWORD
ifelse(eval((d_index(`$1', `Diff') >= 0 || d_index(`$1', `Spec') >= 0) &&
d_index(`$2', `Float') == 0), `1',
` LOCAL iVal:DWORD
')dnl
PROF_ENTRY
; Initialize values:
; ebx will always contain the SETUPCTX.
; edi will always contain the number of available spans.
;
; esi will always contain the number of spans to go processed
; with bAdvance spans so that bAdvanceLast doesnt need to
; be checked. The span count is doubled and !bAdvanceLast
; is subtracted from it so esi = uSpans * 2 - !bAdvanceLast
; (bAdvanceLast is assumed to be one or zero).
; Both exit checks decrement esi so if bAdvanceLast is FALSE
; the first exit check will hit zero since one was subtracted.
; Otherwise the second one will hit zero.
mov ebx, pStpCtx
mov esi, ecx
shl esi, 1
mov eax, bAdvanceLast
mov ecx, [ebx+SCTX_uFlags]
xor edi, edi
xor eax, 1
sub esi, eax
test ecx, TRIF_X_DEC
mov pXOther, edx
; Clear PWL flags.
mov [ebx+SCTX_uPwlFlags], edi
jnz L_XDec
; X increments.
lea eax, [ebx+SCTX_X20]
jmp L_StoreEdges
L_XDec:
mov eax, edx
lea edx, [ebx+SCTX_X20]
L_StoreEdges:
mov pXLeft, eax
mov pXRight, edx
jmp L_SpanLoopEdges
L_SpanLoop:
mov eax, pXLeft
mov edx, pXRight
L_SpanLoopEdges:
; If the right edge is less than or equal to the left edge
; there are no pixels to draw.
mov eax, [eax+ICV_iV]
mov edx, [edx+ICV_iV]
sub edx, eax
jle L_NoPixels
; Check for available spans.
test edi, edi
mov cPix, edx
jz L_NoSpansAvail
; Increment span pointer.
mov edx, pSpan
add edx, SIZEOF_RASTSPAN
mov pSpan, edx
jmp L_ConsumeSpan
L_NoSpansAvail:
; Try to alloc the remaining number of spans.
mov ecx, esi
inc ecx
lea eax, pSpan
shr ecx, 1
mov uSpansAvail, ecx
push eax
lea edx, uSpansAvail
push edx
mov ecx, [ebx+SCTX_PrimProcessor]
call ALLOC_SPANS
test eax, eax
jnz L_Exit
; Reload count of available spans and load span pointer into edx.
mov edi, uSpansAvail
mov edx, pSpan
L_ConsumeSpan:
; Decrement count of available spans and increment
; RASTPRIM span count.
mov ecx, [ebx+SCTX_pPrim]
dec edi
mov eax, [ecx+RASTPRIM_uSpans]
; Assumes uSpans will never overflow 16 bits.
inc eax
mov [ecx+RASTPRIM_uSpans], eax
; Set uPix for span. Relies on being able to set 32 bits
; even though uPix is a UINT16.
mov eax, cPix
mov [edx+RASTSPAN_uPix], eax
; Set uX and uY for span.
; Relies on uX and uY both being UINT16 in that order and
; that both require no masking.
mov eax, [ebx+SCTX_X20+ICV_iV]
mov ecx, [ebx+SCTX_iY]
shl ecx, 16
or eax, ecx
mov [edx+RASTSPAN_uX], eax
lea ecx, [ebx+SCTX_Attr]
; Fill RASTSPAN attributes. edx is already set to the span.
d_FillSpan$2AttrsBody(`$1')dnl
L_NoPixels:
; Decrement the span count and check for exit.
dec esi
jz L_Success
;
; Advance long edge and all attributes.
;
; Increment iY and add X20 fraction.
mov eax, [ebx+SCTX_iY]
mov ecx, [ebx+SCTX_X20+ICV_iFrac]
inc eax
add ecx, [ebx+SCTX_X20+ICV_iDFrac]
mov [ebx+SCTX_iY], eax
js L_X20Carry
; No-carry step. Put DAttrNC in edx.
mov [ebx+SCTX_X20+ICV_iFrac], ecx
mov eax, [ebx+SCTX_X20+ICV_iV]
lea edx, [ebx+SCTX_DAttrNC]
mov ecx, [ebx+SCTX_X20+ICV_iNC]
jmp L_AddAttrs
L_X20Carry:
; Carry step. Put DAttrCY in edx.
and ecx, 07fffffffh
mov eax, [ebx+SCTX_X20+ICV_iV]
lea edx, [ebx+SCTX_DAttrCY]
mov [ebx+SCTX_X20+ICV_iFrac], ecx
mov ecx, [ebx+SCTX_X20+ICV_iCY]
L_AddAttrs:
; Store results and add attributes. pDelta is already in edx.
add eax, ecx
lea ecx, [ebx+SCTX_Attr]
mov [ebx+SCTX_X20+ICV_iV], eax
d_Add$2AttrsBody(`$1')dnl
; Long edge updating is done so check for exit again.
dec esi
jz L_Success
; Update short edge.
mov edx, pXOther
mov eax, [edx+ICV_iFrac]
mov ecx, [edx+ICV_iV]
add eax, [edx+ICV_iDFrac]
js L_XOtherCarry
; No-carry step.
add ecx, [edx+ICV_iNC]
mov [edx+ICV_iFrac], eax
mov [edx+ICV_iV], ecx
jmp L_SpanLoop
L_XOtherCarry:
; Carry step.
and eax, 07fffffffh
add ecx, [edx+ICV_iCY]
mov [edx+ICV_iFrac], eax
mov [edx+ICV_iV], ecx
jmp L_SpanLoop
L_Success:
; Set DD_OK
xor eax, eax
L_Exit:
test edi, edi
; Temporarily keep return code in esi.
mov esi, eax
jz L_NoUnusedSpans
mov ecx, [ebx+SCTX_PrimProcessor]
push edi
call FREE_SPANS
L_NoUnusedSpans:
mov eax, esi
ret 8
@WalkTrap$2Spans_$1_NoClip@16 ENDP
ifelse($2, `Fixed',
`ENDIF
')dnl
')dnl
dnl
d_RepStr(`d_RepStr(`d_WalkTrapSpans(AA, BB)',
`AA', `Z_Diff', `Z_Diff_Spec', `Z_Diff_Tex', `Z_Diff_Spec_Tex',
`Z_Tex', `Z_DIdx', `Z_DIdx_Tex')',
`BB', `Float', `Fixed')dnl
END