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

📄 hxfcliparm.s

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 S
📖 第 1 页 / 共 2 页
字号:
	rsblt r10, r10, #0
	rsblt r11, r11, #0
	sub r6, r10, r6				; out.y - in.y
	sub r7, r11, r7				; out.z - in.z
	
; now, do a TMIA to scale the out-in results and stick it in wMMX space...
	tmia wr4, r4, r8			; x

; FIXME:  Add ClipSegment offsets into HXFState.inc
	ldr r4, [r3, #0]		; ClipSegment->pVtx

	tmia wr5, r6, r8			; y
	tmia wr6, r7, r8			; z
	tmia wr7, r9, r8			; w

	tbcsth wr12, r8				; set up register for alpha scale
	mov r9, #4					; FIXME Move to begining of proc
	tmcr wcgr0, r9
	wsrlhg wr12, wr12, wcgr0

	; shift all the new wMMX bits right 16...	
	mov r10, #16
	tinsrw wr9, r10, #0

	wrord wr4, wr4, wr9
	wrord wr5, wr5, wr9
	wrord wr6, wr6, wr9
	wrord wr7, wr7, wr9

	; so now we can just add the stuff together!
	waddw wr0, wr0, wr4
	waddw wr1, wr1, wr5
	waddw wr2, wr2, wr6
	waddw wr3, wr3, wr7

	; Store r5 as the newPos.v[index]
	mov r12, r12, lsl #2		; r12 should be index

	; Store whole vector first, then overwrite with desired clamped value
	wstrw wr0, [r4, #0]
	wstrw wr1, [r4, #4]
	wstrw wr2, [r4, #8]
	wstrw wr3, [r4, #12]

;FIXME CLAMP GONE ARY	str r5, [r4, r12]

; Compute clipflags here!!!

;	ldrd r10, [r0, #HXFSTATE_OFFSET_VIEWPORT_X1]
	
	textrmuw r6, wr0, #0

	cmp r6, r10
	orrlt r12, r12, #HXF_VTX_CLIP_FLAG_NEG_X
	subgts r6, r6, r11
	orrgt r12, r12, #HXF_VTX_CLIP_FLAG_POS_X

;	ldrd r10, [r0, #HXFSTATE_OFFSET_VIEWPORT_Y1]
	textrmuw r6, wr1, #0

	cmp r6, r10
	orrlt r12, r12, #HXF_VTX_CLIP_FLAG_NEG_Y
	subgts r6, r6, r11
	orrgt r12, r12, #HXF_VTX_CLIP_FLAG_POS_Y
	
;	ldrd r10, [r0, #HXFSTATE_OFFSET_VIEWPORT_Z1]
	textrmuw r6, wr2, #0

	cmp r6, r10
	orrlt r12, r12, #HXF_VTX_CLIP_FLAG_NEG_Z
	subgts r6, r6, r11

	orrgt r12, r12, #HXF_VTX_CLIP_FLAG_POS_Z

	; flags in r12, now just stuff it in!
	strb r12, [r3, #4]

	; Load Output offsets
	ldr r6, [r0, #HXFSTATE_OFFSET_OUTDIFFUSEOFFSET]
	ldr r7, [r0, #HXFSTATE_OFFSET_OUTSPECULAROFFSET]
	ldr r9, [r0, #HXFSTATE_OFFSET_OUTTEX1OFFSET]
	ldr r10, [r0, #HXFSTATE_OFFSET_OUTTEX2OFFSET]

	; ---------------------------------------------------------------------- --
	; Register Map - 
	; ---------------------------------------------------------------------- --
	; r0 =	pState      r4 = pNewVtx     r8 = alpha      r12 =                 
	; r1 =  pInPos      r5 =             r9 = Tex1 Off   r13 = sp
	; r2 =  pOutPos     r6 = Diff Off    r10 = Tex2 Off  r14 = 
	; r3 =  pNewSeg     r7 = Spec Off    r11 = 		     r15 = pc
	; ---------------------------------------------------------------------- --
	; wr0 = inPos.x     wr4 = OutPos.y   wr8 =            wr12 =         
	; wr1 = inPos.y     wr5 = OutPos.x   wr9 =            wr13 = VP[boundary]
	; wr2 = inPos.z     wr6 = OutPos.z   wr10 =           wr14 = inPos[idx]
	; wr3 = outPos.x    wr7 =            wr11 =			  wr15 = outPos.idx
	; wcgr0 =           wcgr1 =          wcgr2 =          wcgr3 =  
	; ---------------------------------------------------------------------- --
DiffuseInterp
	cmp r6, #0
	beq SpecularInterp

	;	Pull color from in & out, then unpack as 16 bit values into WMMX.
	add r11, r1, r6
	wldrw wr0, [r11]			; #0x10 = pState->OutDiffuseOffset
	add r11, r2, r6
	wldrw wr1, [r11]

	wunpckelub	wr4, wr0		; all 4 color values of in now in wr4 as 8.8!
	wunpckelub  wr5, wr1		; same for out

	; load alpha into wMMX
	; broadcast this value into 16 bits all over the place
	; (already done)

	wsubhss wr6, wr5, wr4			; out - in
	wsllhg wr6, wr6, wcgr0
	wmulsm wr6, wr6, wr12			; (out - in) * alpha
	waddhss wr6, wr6, wr4			; all that + in
	wpackhus wr7, wr6, wr6			; pack color into 8888
	
	add r11, r4, r6
	wstrw wr7, [r11]

	; ---------------------------------------------------------------------- --
	; Register Map - 
	; ---------------------------------------------------------------------- --
	; r0 =	pState      r4 = pNewVtx     r8 = alpha      r12 =                 
	; r1 =  pInPos      r5 =             r9 = Tex1 Off   r13 = sp
	; r2 =  pOutPos     r6 = Diff Off    r10 = Tex2 Off  r14 = 
	; r3 =  pNewSeg     r7 = Spec Off    r11 = 		     r15 = pc
	; ---------------------------------------------------------------------- --
	; wr0 = inPos.x     wr4 = OutPos.y   wr8 =            wr12 =         
	; wr1 = inPos.y     wr5 = OutPos.x   wr9 =            wr13 = VP[boundary]
	; wr2 = inPos.z     wr6 = OutPos.z   wr10 =           wr14 = inPos[idx]
	; wr3 = outPos.x    wr7 =            wr11 =			  wr15 = outPos.idx
	; wcgr0 =           wcgr1 =          wcgr2 =          wcgr3 =  
	; ---------------------------------------------------------------------- --
SpecularInterp
	cmp r7, #0
	beq Texture1Interp
	
	add r11, r1, r7
	wldrw wr0, [r11]		
	add r11, r2, r7
	wldrw wr1, [r11]
	wunpckelub	wr4, wr0		; all 4 color values of in now in wr4 as 8.8!
	wunpckelub  wr5, wr1		; same for out

	; load alpha into wMMX
	; broadcast this value into 16 bits all over the place
	; (already done)

	wsubhss wr6, wr5, wr4			; out - in
	wsllhg wr6, wr6, wcgr0
	wmulsm wr6, wr6, wr12			; (out - in) * alpha
	waddhss wr6, wr6, wr4			; all that + in
	wpackhus wr7, wr6, wr6			; pack color into 8888
	
	add r11, r4, r7
	wstrw wr7, [r11]

	; ---------------------------------------------------------------------- --
	; Register Map - 
	; ---------------------------------------------------------------------- --
	; r0 =	pState      r4 = pNewVtx     r8 = alpha      r12 =                 
	; r1 =  pInPos      r5 =             r9 = Tex1 Off   r13 = sp
	; r2 =  pOutPos     r6 = Diff Off    r10 = Tex2 Off  r14 = 
	; r3 =  pNewSeg     r7 = Spec Off    r11 = 		     r15 = pc
	; ---------------------------------------------------------------------- --
	; wr0 = inPos.x     wr4 = OutPos.y   wr8 =            wr12 =         
	; wr1 = inPos.y     wr5 = OutPos.x   wr9 =            wr13 = VP[boundary]
	; wr2 = inPos.z     wr6 = OutPos.z   wr10 =           wr14 = inPos[idx]
	; wr3 = outPos.x    wr7 =            wr11 =			  wr15 = outPos.idx
	; wcgr0 =           wcgr1 =          wcgr2 =          wcgr3 =  
	; ---------------------------------------------------------------------- --
Texture1Interp
	cmp r9, #0		; TexCoord1 offset
	beq Texture2Interp

	add r1, r1, r9		; Compute pInVtx.Tex Offset
	add r2, r2, r9		; Compute pOutVtx.Tex Offset

	ldr r5, [r1, #0]	; in.u
	ldr r6, [r1, #4]	; in.v

	ldr r7, [r2, #0]	; out.u
	ldr r9, [r2, #4]	; out.v

	sub r7, r7, r5
	sub r9, r9, r6

	tinsrw wr0, r5, #0			; insert "in" into wMMX unpacked!
	tinsrw wr1, r6, #0

	wzero wr4
	wzero wr5

	; now, do a TMIA to scale the out-in results and stick it in wMMX space...
	tmia wr4, r7, r8			; x
	tmia wr5, r9, r8			; y

	; rotate over 16 bits...	
	wrord wr4, wr4, wr9
	wrord wr5, wr5, wr9

	; so now we can just add the stuff together!
	waddw wr0, wr0, wr4
	waddw wr1, wr1, wr5

	; and store
	add r1, r4, r9
	wstrw wr0, [r1, #0]
	wstrw wr1, [r1, #4]
	
	; ---------------------------------------------------------------------- --
	; Register Map - 
	; ---------------------------------------------------------------------- --
	; r0 =	pState      r4 = pNewVtx     r8 = alpha      r12 =                 
	; r1 =  pInPos      r5 =             r9 = Tex1 Off   r13 = sp
	; r2 =  pOutPos     r6 = Diff Off    r10 = Tex2 Off  r14 = 
	; r3 =  pNewSeg     r7 = Spec Off    r11 = 		     r15 = pc
	; ---------------------------------------------------------------------- --
	; wr0 = inPos.x     wr4 = OutPos.y   wr8 =            wr12 =         
	; wr1 = inPos.y     wr5 = OutPos.x   wr9 =            wr13 = VP[boundary]
	; wr2 = inPos.z     wr6 = OutPos.z   wr10 =           wr14 = inPos[idx]
	; wr3 = outPos.x    wr7 =            wr11 =			  wr15 = outPos.idx
	; wcgr0 =           wcgr1 =          wcgr2 =          wcgr3 =  
	; ---------------------------------------------------------------------- --
Texture2Interp
	cmp		r10, #0
	ldmfdeq	sp!, { r4-r11, pc }

	add r1, r1, r10
	add r2, r2, r10

	ldr r5, [r1, #0]	; in.u
	ldr r6, [r1, #4]	; in.v

	ldr r7, [r2, #0]	; out.u
	ldr r9, [r2, #4]	; out.v

	sub r7, r7, r5
	sub r9, r9, r6

	tinsrw wr0, r5, #0			; insert "in" into wMMX unpacked!
	tinsrw wr1, r6, #0

	wzero wr4
	wzero wr5

	; now, do a TMIA to scale the out-in results and stick it in wMMX space...
	tmia wr4, r7, r8			; x
	tmia wr5, r9, r8			; y

	; rotate over 16 bits...	
	wrord wr4, wr4, wr9
	wrord wr5, wr5, wr9

	; so now we can just add the stuff together!
	waddw wr0, wr0, wr4
	waddw wr1, wr1, wr5

	; and store
	add r1, r4, r10
	wstrw wr0, [r1, #0]
	wstrw wr1, [r1, #4]

	ldmfd sp!, { r4-r11, pc }
	ENDP

;** ************************************************************************ **
	END

;/* ************************************************************************ *\
;** ************************************************************************ **	
;** EOF
;** ************************************************************************ **		
;\* ************************************************************************ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -