daedalus/Source/SysPSP/HLEGraphics/ConvertVertices.S
Corn 28b84523de [!] VFPU TnL recoded into one function (with optimizations)
[!] Integrate TnL flags into TnL parameters
[!] small fix to texture UpdateIfNecessary
[!] small optimization to convert vertices 

git-svn-id: https://subversion.assembla.com/svn/Daedalusx64/trunk@504 42e9bfbe-799a-4a2d-bad1-236e862a387a
2011-11-30 22:06:40 +00:00

153 lines
4.4 KiB
ArmAsm

#include "as_reg_compat.h"
.global _ConvertVertice
//.global _ConvertVertices
.global _ConvertVerticesIndexed
.text
.set push
.set noreorder
.set noat
############################
# a0 - Output vertices - DaedalusVtx / stride 24
# a1 - Input vertices - DaedalusVtx4 / must be aligned to 16 bytes, stride 64
#
# The code handles the following:
#
# p_vertices[ i ].Texture = clipped_vertices[ i ].Texture;
# p_vertices[ i ].Colour = c32( clipped_vertices[ i ].Colour );
# p_vertices[ i ].Position.x = clipped_vertices[ i ].TransformedPos.x;
# p_vertices[ i ].Position.y = clipped_vertices[ i ].TransformedPos.y;
# p_vertices[ i ].Position.z = clipped_vertices[ i ].TransformedPos.z;
#
_ConvertVertice:
lw $t0, 0x00( $a1 ) // TransformedPos.x
lw $t1, 0x04( $a1 ) // TransformedPos.y
lw $t2, 0x08( $a1 ) // TransformedPos.z
lv.q R000, 0x20( $a1 ) // Load Colour
lw $t3, 0x30( $a1 ) // Texture.x
lw $t4, 0x34( $a1 ) // Texture.y
sw $t0, 0x0c( $a0 ) // Position.x
sw $t1, 0x10( $a0 ) // Position.y
sw $t2, 0x14( $a0 ) // Position.z
vf2in.q R000, R000, 31 // Scale 255 and round
sw $t3, 0x00( $a0 ) // Texture.x
vi2uc.q S000, R000 // Pack to 8bit RGBA format
sw $t4, 0x04( $a0 ) // Texture.y
jr $ra
sv.s S000, 0x08($a0) // Colour
/*
############################
# a0 - Output vertices - DaedalusVtx / stride 24
# a1 - Input vertices - DaedalusVtx4 / must be aligned to 16 bytes, stride 64
# a2 - num vertices
#
# The code handles the following:
#
# for( u32 i = 0; i < num_vertices; ++i )
# {
# p_vertices[ i ].Texture = clipped_vertices[ i ].Texture;
# p_vertices[ i ].Colour = c32( clipped_vertices[ i ].Colour );
# p_vertices[ i ].Position.x = clipped_vertices[ i ].TransformedPos.x;
# p_vertices[ i ].Position.y = clipped_vertices[ i ].TransformedPos.y;
# p_vertices[ i ].Position.z = clipped_vertices[ i ].TransformedPos.z;
# }
_ConvertVertices:
sll $a2, $a2, 6 // count = count * 64
addu $a2, $a1, $a2 // end_ptr = start_ptr + count * 64
beq $a1, $a2, finished_convert
nop
viim.s S001, 255
next_vertex_convert:
lw $t0, 0x00( $a1 ) // TransformedPos.x
lw $t1, 0x04( $a1 ) // TransformedPos.y
lw $t2, 0x08( $a1 ) // TransformedPos.z
lv.q R000, 0x20( $a1 ) // Load Colour
lw $t3, 0x30( $a1 ) // Texture.x
lw $t4, 0x34( $a1 ) // Texture.y
sw $t0, 0x0c( $a0 ) // Position.x
vsat0.q R000, R000
sw $t1, 0x10( $a0 ) // Position.y
vscl.q R000, R000, S001
sw $t2, 0x14( $a0 ) // Position.z
vf2iz.q R000, R000, 23
sw $t3, 0x00( $a0 ) // Texture.x
vi2uc.q S000, R000 // Pack to 8bit RGBA format
sw $t4, 0x04( $a0 ) // Texture.y
sv.s S000, 0x08($a0) // Colour
# Continue with the next vertex
addiu $a1, $a1, 64 // Next input vertex
bne $a1, $a2, next_vertex_convert
addiu $a0, $a0, 24 // Next output vertex
finished_convert:
jr $ra
nop
*/
############################
# a0 - Output vertices - DaedalusVtx / stride 24
# a1 - Input vertices - DaedalusVtx4 / must be aligned to 16 bytes, stride 64
# a2 - num vertices
# a3 - indices
#
# As above, but vertices are indexed:
#
_ConvertVerticesIndexed:
sll $a2, $a2, 1 // count = count * 2
addu $a2, $a3, $a2 // end_ptr = start_ptr + count * 64
beq $a3, $a2, finished_convert_idx
nop
//viim.s S001, 255
next_vertex_convert_idx:
lhu $at, 0x00( $a3 ) // Load index
sll $at, $at, 6 // offset = index * 64
addu $at, $a1, $at // address = src + index*64
lw $t0, 0x00( $at ) // TransformedPos.x
lw $t1, 0x04( $at ) // TransformedPos.y
lw $t2, 0x08( $at ) // TransformedPos.z
lv.q R000, 0x20( $at ) // Load Colour
lw $t3, 0x30( $at ) // Texture.x
lw $t4, 0x34( $at ) // Texture.y
sw $t0, 0x0c( $a0 ) // Position.x
//vsat0.q R000, R000 // Clamp value 0.0f - 1.0f
sw $t1, 0x10( $a0 ) // Position.y
//vscl.q R000, R000, S001
sw $t2, 0x14( $a0 ) // Position.z
vf2in.q R000, R000, 31 // Scale 255 and round
sw $t3, 0x00( $a0 ) // Texture.x
vi2uc.q S000, R000 // Pack to 8bit RGBA format
sw $t4, 0x04( $a0 ) // Texture.y
sv.s S000, 0x08($a0) // Colour
# Continue with the next vertex
addiu $a3, $a3, 2 // Next input index
bne $a3, $a2, next_vertex_convert_idx
addiu $a0, $a0, 24 // Next output vertex
finished_convert_idx:
jr $ra
nop
.set pop