⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hxftransformarm.s

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 S
📖 第 1 页 / 共 4 页
字号:
;/* ************************************************************************ *\
;**    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 + -