📄 hxftransformarm.s
字号:
;/* ************************************************************************ *\
;** INTEL Corporation Proprietary Information
;**
;** This listing is supplied under the terms of a license
;** agreement with INTEL Corporation and may not be copied
;** nor disclosed except in accordance with the terms of
;** that agreement.
;**
;** Copyright (c) 2003 Intel Corporation.
;** All Rights Reserved.
;**
;** ************************************************************************ **
;** FILE: HXFTransformARM.s
;** DESCRIPTION:
;**
;** AUTHOR: Cian Montgomery
;** CREATED: July 31, 2003
;**
; * $Date: 6/01/04 5:00p $ $Revision: 30 $
; * $Log: /Intel_Development/Drivers/Marathon/WinCE42/opengles/HXFTransformARM.s $
; *
; * 30 6/01/04 5:00p Clmontgo
; * Remove Broken Extended z Pres code.
; *
; * 29 5/27/04 5:17p Clmontgo
; * Extend ZPresicion
; *
; * 28 5/21/04 11:32a Clmontgo
; * Convert W to 16.16 for save.
; *
; * 27 5/21/04 9:59a Clmontgo
; *
; * 26 5/19/04 5:06p Clmontgo
; * Change H Clip space to 0-1 coords
; *
; * 25 5/19/04 9:23a Clmontgo
; * Potential Fix for Clipping
; *
; * 24 5/16/04 12:53p Clmontgo
; *
; * 23 3/25/04 1:27p Clmontgo
; * Optimization of Clip flag generation and VP XForm. Fix for Clipping
; * issue observed in previous version.
; *
; * 22 3/19/04 2:11p Clmontgo
; * Moved VP xform to after clip and 1/w
; *
; * 21 3/18/04 10:37p Clmontgo
; * Fixes for Clipping and SP clean up
; *
; * 20 3/14/04 7:57p Clmontgo
; * Missed TexXform Fixes.
; *
; * 19 3/14/04 7:53p Clmontgo
; * Fixes for Clipping, Tex Coords, Slaveport optimizations, Clip Flag
; * Generation , and Float To Fixed Conversions.
; *
; * 18 3/09/04 3:02p Cmdoan
; *
; * 17 3/04/04 2:34p Clmontgo
; * Fix For Color Order RGBA vs ABGR
; *
; * 16 2/20/04 11:30a Clmontgo
; * Delayed state validation update.
; *
; * 15 2/19/04 11:31a Clmontgo
; * Fix for Texture transform and TwoSided Lighting.
; *
; * 14 2/18/04 4:48p Clmontgo
; *
; * 13 2/05/04 6:00p Cmdoan
; * fixed bad clamp code (wrong word on textrc)
; *
; * 12 2/05/04 12:28p Clmontgo
; * Added Exp lookup table for fogging calculations.
; *
; * 11 2/04/04 9:45p Cmdoan
; * added clamp mechanisms prior to broadcasts in wMMX
; *
; * 10 2/04/04 11:01a Clmontgo
; * Initial Change of Lighting to 0.16 format.
; *
; * 9 1/19/04 5:35p Clmontgo
; * Added Fog Functionality
; *
; *8 12/31/03 2:08p Clmontgo
; *Fixes for screen rotation and Near Clip plane problem
; *
; *7 12/21/03 1:46p Clmontgo
;
; 6 12/17/03 9:22a Clmontgo
; Added Version ID and log to file headers
;\* ************************************************************************ */
INCLUDE HXFState.inc ; Definitions of the HXFState Structure
;** ************************************************************************ **
;** CONSTANTS
;** ************************************************************************ **
HXF_TNL_VTX_PREFETCH_DISTANCE EQU (2)
DIVIDE_EPSILON EQU (0x00000010 ) ; 16 = 1/4096
;** ************************************************************************ **
;** IMPORTS
;** ************************************************************************ **
IMPORT |HXFLightVertex|
IMPORT |g_HXFExpTable|
;** ************************************************************************ **
;** EXPORTS
;** ************************************************************************ **
EXPORT |HXFTransformVertices|
EXPORT |HXFLoadPositionsFIXED2Proc|
EXPORT |HXFLoadPositionsFIXED3Proc|
EXPORT |HXFLoadPositionsFIXED4Proc|
EXPORT |HXFLoadPositionsINT82Proc|
EXPORT |HXFLoadPositionsINT83Proc|
EXPORT |HXFLoadPositionsINT84Proc|
EXPORT |HXFLoadPositionsINT162Proc|
EXPORT |HXFLoadPositionsINT163Proc|
EXPORT |HXFLoadPositionsINT164Proc|
EXPORT |HXFCopyPACKEDColorProc|
EXPORT |HXFCopyUINT8ColorProc|
EXPORT |HXFCopyFIXEDColorProc|
EXPORT |HXFFogLinearProc|
EXPORT |HXFFogExpProc|
EXPORT |HXFFogExp2Proc|
EXPORT |HXFCopyTexCoordFIXED2Proc|
EXPORT |HXFCopyTexCoordINT82Proc|
EXPORT |HXFCopyTexCoordINT162Proc|
EXPORT |HXFTransformTexCoordFIXED2Proc|
EXPORT |HXFTransformTexCoordFIXED3Proc|
EXPORT |HXFTransformTexCoordFIXED4Proc|
EXPORT |HXFTransformTexCoordINT82Proc|
EXPORT |HXFTransformTexCoordINT83Proc|
EXPORT |HXFTransformTexCoordINT84Proc|
EXPORT |HXFTransformTexCoordINT162Proc|
EXPORT |HXFTransformTexCoordINT163Proc|
EXPORT |HXFTransformTexCoordINT164Proc|
;** ************************************************************************ **
;** VARIABLES
;** ************************************************************************ **
;** ************************************************************************ **
;** MACROS
;** ************************************************************************ **
;** Resets a pointer to its original location
; NOTE: $reg1 must be an even register and $reg2 must be the following
; odd register. The pointer offset must be DWORD aligned (8 byte)
; assumes the pointer to HXFState is in r0
MACRO
HXF_RESET_POINTER $pointer, $reg1, $reg2, $tmp, $numsteps
ldrd $reg1, [r0, #$pointer]
mul $tmp, $reg2, $numsteps ; calculate how far we incremented the pointer
sub $reg1, $reg1, $tmp ; reset the pointer
str $reg1, [r0, #$pointer]
MEND
;** ************************************************************************ **
;** FUNCTIONS
;** ************************************************************************ **
AREA HXFTRANSFORM, CODE, READONLY
;** ************************************************************************ **
;** Position Load Procs
;** ************************************************************************ **
; ---------------------------------------------------------------------- --
; Register Map - Position Load Procs
; ---------------------------------------------------------------------- --
; r0 = pState r4 = z(out) r8 = r12 = pOutVtx
; r1 = flags r5 = w(out) r9 = r13 = sp
; r2 = x(out) r6 = pInPos r10 = r14 =
; r3 = y(out) r7 = r11 = r15 = pc
; ---------------------------------------------------------------------- --
; wr0 = wr4 = wr8 = wr12 = 0xFFFF0000 0xFFFF0000
; wr1 = wr5 = wr9 = wr13 =
; wr2 = wr6 = wr10 = wr14 = Zero
; wr3 = wr7 = wr11 = 0x04040404wr15 =
; wcgr0 = 16 wcgr1 = 12 wcgr2 = 8 wcgr3 = 32
; ---------------------------------------------------------------------- --
;** ************************************************************************ **
|HXFLoadPositionsFIXED2Proc| PROC
ldr r2, [r6] ; load x
ldr r3, [r6, #4]; load y
mov r4, #0 ; set z if 2 input position elements
mov r5, #HFX_ONE ; set w if 2 input position elements
mov pc, lr
ENDP
|HXFLoadPositionsFIXED3Proc| PROC
ldr r2, [r6] ; load x
ldr r3, [r6, #4]; load y
ldr r4, [r6, #8] ; load z if 3 input position elements
mov r5, #HFX_ONE ; set w if 2 input position elements
mov pc, lr
ENDP
|HXFLoadPositionsFIXED4Proc| PROC
ldr r2, [r6] ; load x
ldr r3, [r6, #4]; load y
ldr r4, [r6, #8] ; load z if 3 input position elements
ldr r5, [r6, #12] ; load w if 3 input position elements
mov pc, lr
ENDP
|HXFLoadPositionsINT82Proc| PROC
ldrsb r2, [r6]
ldrsb r3, [r6, #1]
mov r4, #0 ; set z if 2 input position elements
mov r5, #HFX_ONE ; set w to fixed point one if 2 or 3 input position elements.
mov r2, r2, lsl #16 ; convert [x] to fixed point
mov r3, r3, lsl #16 ; convert [y] to fixed point
mov pc, lr
ENDP
|HXFLoadPositionsINT83Proc| PROC
ldrsb r2, [r6]
ldrsb r3, [r6, #1]
ldrsb r4, [r6, #2]
mov r5, #HFX_ONE ; set w to fixed point one if 2 or 3 input position elements.
mov r2, r2, lsl #16 ; convert [x] to fixed point
mov r3, r3, lsl #16 ; convert [y] to fixed point
mov r4, r4, lsl #16 ; convert [z] to fixed point
mov pc, lr
ENDP
|HXFLoadPositionsINT84Proc| PROC
ldrsb r2, [r6]
ldrsb r3, [r6, #1]
ldrsb r4, [r6, #2]
ldrsb r5, [r6, #3]
mov r2, r2, lsl #16 ; convert [x] to fixed point
mov r3, r3, lsl #16 ; convert [y] to fixed point
mov r4, r4, lsl #16 ; convert [z] to fixed point
mov r5, r5, lsl #16 ; convert [w] to fixed point
mov pc, lr
ENDP
|HXFLoadPositionsINT162Proc| PROC
ldrsh r2, [r6]
ldrsh r3, [r6, #2]
mov r4, #0 ; set z if 2 input position elements
mov r5, #HFX_ONE ; set w to fixed point one if 2 or 3 input position elements.
mov r2, r2, lsl #16 ; convert [x] to fixed point
mov r3, r3, lsl #16 ; convert [y] to fixed point
mov pc, lr
ENDP
|HXFLoadPositionsINT163Proc| PROC
ldrsh r2, [r6]
ldrsh r3, [r6, #2]
ldrsh r4, [r6, #4]
mov r5, #HFX_ONE ; set w to fixed point one if 2 or 3 input position elements.
mov r2, r2, lsl #16 ; convert [x] to fixed point
mov r3, r3, lsl #16 ; convert [y] to fixed point
mov r4, r4, lsl #16 ; convert [z] to fixed point
mov pc, lr
ENDP
|HXFLoadPositionsINT164Proc| PROC
ldrsh r2, [r6]
ldrsh r3, [r6, #2]
ldrsh r4, [r6, #4]
ldrsh r5, [r6, #6]
mov r2, r2, lsl #16 ; convert [x] to fixed point
mov r3, r3, lsl #16 ; convert [y] to fixed point
mov r4, r4, lsl #16 ; convert [z] to fixed point
mov r5, r5, lsl #16 ; convert [w] to fixed point
mov pc, lr
ENDP
;** ************************************************************************ **
; Name: TransformPosition
; Description:
; Input Arguments: r0 - HXFState* pState
; Output Argument: r9, r10, r11, r12 - Transformed position (x, y, z, w)
; ---------------------------------------------------------------------- --
; Register Map -
; ---------------------------------------------------------------------- --
; r0 = pState r4 = z(in) r8 = r12 = pOutVtx
; r1 = flags r5 = w(in) r9 = r13 = sp
; r2 = x(in) r6 = pInPos r10 = r14 =
; r3 = y(in) r7 = r11 = r15 = pc
; ---------------------------------------------------------------------- --
; wr0 = wr4 = wr8 = wr12 = 0xFFFF0000
; wr1 = wr5 = wr9 = wr13 =
; wr2 = wr6 = wr10 = wr14 = Zero
; wr3 = wr7 = wr11 = 0x04040404wr15 =
; wcgr0 = 16 wcgr1 = 12 wcgr2 = 8 wcgr3 = 32
; ---------------------------------------------------------------------- --
; Prototype in C: N/A
; ---------------------------------------------------------------------- --
;** ************************************************************************ **
|TransformPosition| PROC
; *** Store the positions
strd r2, [r0, #HXFSTATE_OFFSET_STORAGE_VTXPOSITION_X]
strd r4, [r0, #HXFSTATE_OFFSET_STORAGE_VTXPOSITION_Z]
; *** Load the base pointer of the transform matrix.
ldr r10, [r0, #HXFSTATE_OFFSET_PTRANFORMMATRIX]
; ---------------------------------------------------------------------- --
; Register Map -
; ---------------------------------------------------------------------- --
; r0 = pState r4 = z(in) r8 = r12 = pOutVtx
; r1 = flags r5 = w(in) r9 = r13 = sp
; r2 = x(in) r6 = pInPos r10 = r14 =
; r3 = y(in) r7 = r11 = r15 = pc
; ---------------------------------------------------------------------- --
; wr0 = r.x wr4 = wr8 = wr12 = 0xFFFF0000
; wr1 = r.y wr5 = wr9 = wr13 =
; wr2 = r.z wr6 = wr10 = wr14 = Zero
; wr3 = r.w wr7 = wr11 = 0x04040404wr15 =
; wcgr0 = 16 wcgr1 = 12 wcgr2 = 8 wcgr3 = 32
; ---------------------------------------------------------------------- --
ldrd r6, [r10] ; Load M_11 & M_12
ldrd r8, [r10, #8] ; Load M_13 & M_14
wzero wr0 ; r.x = 0
tmia wr0, r2, r6 ; r.x += v1.x * M_11
wzero wr1 ; r.y = 0
tmia wr1, r2, r7 ; r.y += v1.x * M_12
wzero wr2 ; r.z = 0
tmia wr2, r2, r8 ; r.z += v1.x * M_13
wzero wr3 ; r.w = 0
tmia wr3, r2, r9 ; r.w += v1.x * M_14
ldrd r6, [r10, #16] ; Load M_21 & M_22
ldrd r8, [r10, #24] ; Load M_23 & M_24
tmia wr0, r3, r6 ; r.x += v1.y * M_21
tmia wr1, r3, r7 ; r.y += v1.y * M_22
tmia wr2, r3, r8 ; r.z += v1.y * M_23
tmia wr3, r3, r9 ; r.w += v1.y * M_24
ldrd r6, [r10, #32] ; Load M_31 & M_32
ldrd r8, [r10, #40] ; Load M_33 & M_34
tmia wr0, r4, r6 ; r.x += v1.z * M_31
tmia wr1, r4, r7 ; r.y += v1.z * M_32
tmia wr2, r4, r8 ; r.z += v1.z * M_33
tmia wr3, r4, r9 ; r.w += v1.z * M_34
ldrd r6, [r10, #48] ; Load M_41 & M_42
ldrd r8, [r10, #56] ; Load M_43 & M_44
tmia wr0, r5, r6 ; r.x += v1.w * M_41
tmia wr1, r5, r7 ; r.y += v1.w * M_42
tmia wr2, r5, r8 ; r.z += v1.w * M_43
tmia wr3, r5, r9 ; r.w += v1.w * M_44
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -