;----------------------------------------------------------------------------- ; Monolith 15. Gouraud 16 bit Z Buffered (LE or GT) 888 ; ; This monolith selects code to draw either left or right. ; ; Globals (ATTENTION. Need to put in stack memory so can multi-process) ; iZXorMask - Copy of iZXorMask since ebx (pCtx) is used for other ; purposes. ; ; uSpans - Count containing the number of spans. ; StackPos - Saves stack position. ; ; Register Usage: ; ; eax - Number of pixels to draw ; ebx - Zbuffer value / temp to determine Z fail ; ecx - Prim pointer. Same as in non-monolithic loop code. (i.e. C codes pCtx->pPrim) ; edx - Tri Z value in 16 bits. ; esi - Pointer to Z Buffer ; edi - Pointer to Screen Buffer. ; ebp - Rast Span Pointer. Same as in non-monolithic loop code. (i.e. pS in C code) ; mm0 - contains four color components. ; mm1 - contains delta color components. ; mm2 - Lower DWORD stores Delta Z value ; mm3 - Temp for color conversion. ; mm4 - Lower DWORD stores Z value. ; mm5 - temp for color conversion. ; ; Both Left to Right and Right to Left are very similar. ; ; Psuedo Code ; ; loop: ; Do LE/GR Z test (load ebx with Z buffer value, copy mm4 to edx then do aritmetic compare of ebx and edx) ; if (Z test passed) ; { ; Write Z (still in edx) ; copy mm0 to mm5 ; convert mm5 to 888. ; write color ; } ; if (done drawing) {exit loop} (dec eax / jz NoMorePixelsLtoR) ; increment colors (mm0+=mm1) ; increment Z buffer pointer (add esi, 2) ; increment screen pointer (add edi, 4) ; jump to top of loop ; ;----------------------------------------------------------------------------- INCLUDE iammx.inc INCLUDE offs_acp.inc ; Names are read LSB to MSB, so B5G6R5 means five bits of blue starting ; at the LSB, then six bits of green, then five bits of red. ;TBD check to see if this value is correct. COLOR_SHIFT equ 8 .586 .model flat ; Big seperating lines seperate code into span code ; and loop code. If span and loop are not going to ; end up being combined then it will be easy to ; seperate the code. .data ; It would help if these are close together in cache lines. iZXorMask dq ? ; Need externs for all of the variables that are needed for various beads EXTERN MaskRed565to888:MMWORD EXTERN MaskGreen565to888:MMWORD EXTERN MaskBlue565to888:MMWORD EXTERN MaskRed555to888:MMWORD EXTERN MaskGreen555to888:MMWORD EXTERN MaskBlue555to888:MMWORD EXTERN MaskAlpha1555to8888:MMWORD EXTERN MaskRed1555to8888:MMWORD EXTERN MaskGreen1555to8888:MMWORD EXTERN MaskBlue1555to8888:MMWORD ; TBD. I think that I want to do 0xffff instead of 0xff. This will ; have to be checked. There is a value very similiar to this in ; buf write. EXTERN SetAlphato0xffff:MMWORD EXTERN SetAlphato0xff:MMWORD ; TODO This equate are identical to the ones in texread.mas. Maybe they should be in a common .inc file. RedShift565to888 equ 8 GreenShift565to888 equ 5 BlueShift565to888 equ 3 RedShift555to888 equ 9 GreenShift555to888 equ 6 BlueShift555to888 equ 3 AlphaShift1555to8888 equ 16 RedShift1555to8888 equ 9 GreenShift1555to8888 equ 6 BlueShift1555to8888 equ 3 EXTERN Zero:MMWORD EXTERN SetAlphato0xff:MMWORD EXTERN u888to565RedBlueMask:MMWORD EXTERN u888to565GreenMask:MMWORD EXTERN u888to565Multiplier:MMWORD EXTERN uVal0x000007ff03ff07ff:MMWORD EXTERN uVal0x0000078003c00780:MMWORD EXTERN u888to555RedBlueMask:MMWORD EXTERN u888to555GreenMask:MMWORD EXTERN u888to555Multiplier:MMWORD EXTERN uVal0x000007ff07ff07ff:MMWORD EXTERN uVal0x0000078007800780:MMWORD ;----------------------------------------------------------------------------- ; Span Variables StackPos dd ? uSpans dd ? ;----------------------------------------------------------------------------- ;----------------------------------------------------------------------------- ; Loop Variables iSurfaceStep dd ? iZStep dd ? uPix dd ? ;----------------------------------------------------------------------------- .code PUBLIC _MMXMLRast_15 _MMXMLRast_15: push ebp mov StackPos, esp mov eax, esp sub esp, 0Ch ; This will need to change if stack frame size changes. push ebx push esi push edi xor edi, edi ; Put pCtx into ebx mov ebx, [eax+8] ;PD3DI_RASTPRIM pP = pCtx->pPrim; mov ecx, [ebx+RASTCTX_pPrim] ; Need to generate qword iZXorMask since it in pCtx movd mm2, [ebx+RASTCTX_iZXorMask] punpckldq mm2, mm2 movq MMWORD PTR iZXorMask, mm2 ; ebx is free after this since gouraud does not need information from pCtx. ;while (pP) ;{ PrimLoop: cmp ecx, 0 je ExitPrimLoop ;UINT16 uSpans = pP->uSpans; movzx eax, word ptr [ecx+RASTPRIM_uSpans] mov uSpans, eax ;PD3DI_RASTSPAN pS = (PD3DI_RASTSPAN)(pP + 1); mov ebp, ecx add ebp, SIZEOF_RASTPRIM ;while (uSpans-- > 0) ;{ SpanLoop: mov edx, uSpans mov eax, edx dec eax mov uSpans, eax test edx, edx jle ExitSpanLoop mov edi, dword ptr [ebp+RASTSPAN_pSurface] mov esi, [ebp+RASTSPAN_pZ] movzx eax, word ptr [ebp+RASTSPAN_uPix] ;if (pP->uFlags & D3DI_RASTPRIM_X_DEC) ;{ mov edx, [ecx+RASTPRIM_uFlags] and edx, D3DI_RASTPRIM_X_DEC test edx, edx jz LeftToRightSpan ; SCREWED UP RIGHT TO LEFT CASE movq mm0, MMWORD PTR [ebp+RASTSPAN_uB] movd mm4, dword ptr [ebp+RASTSPAN_uZ] movd mm2, dword ptr [ecx+RASTPRIM_iDZDX] movq mm1, MMWORD PTR [ecx+RASTPRIM_iDBDX] beginingpixelsRtoL: ;WritePixel ; Ztestcode ; edx is uZ ; ebx is uZB ; 16 bit unsigned format ;UINT16 uZ = (UINT16)(pS->uZ>>15); ;UINT16 uZB = *((UINT16*)pS->pZ); movd edx, mm4 shr edx, 15 movzx ebx, word ptr [esi] ;pS->uZ += pP->iDZDX; ;if ((pCtx->iZXorMask)^(uZ > uZB)) sub ebx, edx paddd mm4, mm2 xor ebx, dword ptr iZXorMask test ebx, ebx js ZFailLabelRtoL1 mov word ptr [esi], dx ; Convert color. movq mm5, mm0 psrlw mm5, 8 ; Convert color1 from 8.8 two 0.8 packuswb mm5, mm7 ; pack one color1 movd edx, mm5 and edx, 000ffffffh mov [edi], edx ZFailLabelRtoL1: dec eax ; Reduce Pixel count jz NoMorePixelsRtoL sub edi, 4 ; decrease destination pointer sub esi, 2 ; decrease Z Buffer Pointer. ;pS->uB += pP->iDBDX; pS->uG += pP->iDGDX; ;pS->uR += pP->iDRDX; pS->uA += pP->iDADX; paddw mm0, mm1 jmp beginingpixelsRtoL NoMorePixelsRtoL: jmp DoneSpanDirif ;else ;{ LeftToRightSpan: ; NORMAL LEFT TO RIGHT CASE movq mm0, MMWORD PTR [ebp+RASTSPAN_uB] movd mm4, dword ptr [ebp+RASTSPAN_uZ] movd mm2, dword ptr [ecx+RASTPRIM_iDZDX] movq mm1, MMWORD PTR [ecx+RASTPRIM_iDBDX] beginingpixelsLtoR: ;WritePixel ; Ztestcode ; edx is uZ ; ebx is uZB ; 16 bit unsigned format ;UINT16 uZ = (UINT16)(pS->uZ>>15); ;UINT16 uZB = *((UINT16*)pS->pZ); movd edx, mm4 shr edx, 15 movzx ebx, word ptr [esi] ;pS->uZ += pP->iDZDX; ;if ((pCtx->iZXorMask)^(uZ > uZB)) sub ebx, edx paddd mm4, mm2 xor ebx, dword ptr iZXorMask test ebx, ebx js ZFailLabelLtoR1 ; Write Z mov word ptr [esi], dx ; Convert color. movq mm5, mm0 psrlw mm5, 8 ; Convert color1 from 8.8 two 0.8 packuswb mm5, mm7 ; pack one color1 movd edx, mm5 and edx, 000ffffffh mov [edi], edx ZFailLabelLtoR1: dec eax ; Reduce Pixel count jz NoMorePixelsLtoR add edi, 4 ; Increase destination pointer. add esi, 2 ; Increase Z Buffer Pointer. ;pS->uB += pP->iDBDX; pS->uG += pP->iDGDX; ;pS->uR += pP->iDRDX; pS->uA += pP->iDADX; paddw mm0, mm1 jmp beginingpixelsLtoR NoMorePixelsLtoR: ;} DoneSpanDirif: ; Setup Code Ends ; ---------------------------------------------------------------------------------------------------------------- ; Loop Code Begins ExitPixelLoop: ; Loop code ends ;----------------------------------------------------------------------------- ; LoopAny code ends here ;----------------------------------------------------------------------------- ;pS++; add ebp, SIZEOF_RASTSPAN ;} jmp SpanLoop ExitSpanLoop: ;pP = pP->pNext; mov ecx, [ecx+RASTPRIM_pNext] ;} jmp PrimLoop ExitPrimLoop: ;_asm{ emms ;} ;return S_OK; xor eax, eax ;} pop edi pop esi pop ebx mov esp, StackPos pop ebp ret END