1// 2//------------------------------------------------------------ 3// Copyright(c) 2009-2010 by Digital Media Professionals Inc. 4// All rights reserved. 5//------------------------------------------------------------ 6// This source code is the confidential and proprietary 7// of Digital Media Professionals Inc. 8//------------------------------------------------------------ 9// Input registers map 10#define aPosition v0 11#define aColor v1 12#define aTexcoord v2 13#define aNormal v3 14 15// Output registers map 16#define vPosition o0 17#define vQuaternion o1 18#define vView o2 19#define vColor o3 20#define vTexcoord o4 21 22// Constant registers map 23#define MATRIX_Proj c0 24#define MATRIX_Proj0 c0 25#define MATRIX_Proj1 c1 26#define MATRIX_Proj2 c2 27#define MATRIX_Proj3 c3 28 29#define MATRIX_ModelView c4 30#define MATRIX_ModelView0 c4 31#define MATRIX_ModelView00 c4 32#define MATRIX_ModelView01 c5 33#define MATRIX_ModelView02 c6 34#define MATRIX_ModelView03 c7 35 36//------------------------------------------ 37// related cmp 38//------------------------------------------ 39#define CMP_MODE_EQ 0 40#define CMP_MODE_NE 1 41#define CMP_MODE_LT 2 42#define CMP_MODE_LE 3 43#define CMP_MODE_GT 4 44#define CMP_MODE_GE 5 45 46//------------------------------------------ 47// related condition 48//------------------------------------------ 49#define COND_MODE_OR 0 50#define COND_MODE_AND 1 51#define COND_MODE_STA0 2 52#define COND_MODE_STA1 3 53 54#define EQ 0 55 56// Temporary registers map 57#define TEMP_VIEW r15 58#define TEMP_NORM r14 59#define TEMP_POS r12 60 61// Constant registers 62#define CONSTANT c93 63 64def CONSTANT[0], 0.0, 1.0, 2.0, 3.0 65def CONSTANT[1], 0.125, 0.00390625, 0.5, 0.25 66 67#define CONST_0 CONSTANT[0].x 68#define CONST_1 CONSTANT[0].y 69#define CONST_HALF CONSTANT[1].z 70#define CONST_1_0 CONSTANT[0].yx 71 72#pragma bind_symbol(aPosition.xyz,v0,v0) 73#pragma bind_symbol(aColor.xyzw,v1,v1) 74#pragma bind_symbol(aTexcoord.xyz,v2,v2) 75#pragma bind_symbol(aNormal.xyz,v3,v3) 76 77#pragma bind_symbol(uProjection,c0,c3) 78#pragma bind_symbol(uModelView,c4,c7) 79 80#pragma output_map ( position, o0 ) 81#pragma output_map ( quaternion, o1 ) 82#pragma output_map ( view, o2 ) 83#pragma output_map ( color, o3 ) 84#pragma output_map (texture0, o4) 85 86l_position_view_quaternion: 87 m4x4 TEMP_VIEW, aPosition, MATRIX_ModelView 88 // m3x3 is not done on purpuse to prevent stalls in the following cmp instructions. 89 dp3 TEMP_NORM.z, aNormal, MATRIX_ModelView02 90 dp3 TEMP_NORM.x, aNormal, MATRIX_ModelView00 91 dp3 TEMP_NORM.y, aNormal, MATRIX_ModelView01 92 mov vView, -TEMP_VIEW 93 dp4 vPosition.x, TEMP_VIEW, MATRIX_Proj0 94 dp4 vPosition.y, TEMP_VIEW, MATRIX_Proj1 95 cmp EQ, EQ, TEMP_NORM.z, -CONST_1 // compare z component of norm with -1.0 96 add r4, TEMP_NORM.z, CONST_1 // n.z + 1.0 is in r4 97 // m4x4 is not done on purpose to prevent stalls in the following mul instructions . 98 dp4 vPosition.z, TEMP_VIEW, MATRIX_Proj2 99 dp4 vPosition.w, TEMP_VIEW, MATRIX_Proj3 100 mul r4, r4, CONST_HALF // 0.5*(n.z + 1.0) is in r4 101 mov vQuaternion.w, CONST_0 // zero out quat.w component 102 rsq r4, r4.x // 1/sqrt(0.5*(n.z + 1.0)) is in r4 103 mul r5, TEMP_NORM, CONST_HALF // 0.5*n is in r5 104 ifc 0, 1, COND_MODE_STA0 105 rcp vQuaternion.z, r4.x // sqrt(0.5*(n.z + 1.0)) is in quat.z component 106 mul vQuaternion.xy, r5, r4 // 0.5*n*quat.z is in quat.xy 107 else 108 mov vQuaternion.xyz, CONST_1_0 // zero out quat.w component 109 endif 110 nop 111 ret 112 nop 113 114main: 115 call l_position_view_quaternion 116 mov vColor, aColor 117 mov vTexcoord, aTexcoord 118 end 119endmain: 120