refactored to match latest libpacket2 api

This commit is contained in:
h4570
2020-11-21 13:59:56 +01:00
parent 5e811b78cd
commit 82cab6f78b
7 changed files with 59 additions and 46 deletions
+49 -27
View File
@@ -24,13 +24,21 @@ const u32 VU1_PACKET_SIZE = 128;
// Constructors/Destructors
// ----
// VU1 micro program
extern u32 VU1Draw3D_CodeStart __attribute__((section(".vudata")));
extern u32 VU1Draw3D_CodeEnd __attribute__((section(".vudata")));
//
VifSender::VifSender()
{
PRINT_LOG("Initializing VifSender");
PRINT_LOG("VifSender initialized!");
packets[0] = packet2_create_chain(VU1_PACKET_SIZE, P2_TYPE_NORMAL, true);
packets[1] = packet2_create_chain(VU1_PACKET_SIZE, P2_TYPE_NORMAL, true);
matricesPacket = packet2_create_chain(4, P2_TYPE_NORMAL, true);
dma_channel_initialize(DMA_CHANNEL_VIF1, NULL, 0);
dma_channel_fast_waits(DMA_CHANNEL_VIF1);
uploadMicroProgram();
packets[0] = packet2_create(VU1_PACKET_SIZE, P2_TYPE_NORMAL, P2_MODE_CHAIN, true);
packets[1] = packet2_create(VU1_PACKET_SIZE, P2_TYPE_NORMAL, P2_MODE_CHAIN, true);
matricesPacket = packet2_create(4, P2_TYPE_NORMAL, P2_MODE_CHAIN, true);
context = 0;
setDoubleBuffer();
}
@@ -46,6 +54,20 @@ VifSender::~VifSender()
// Methods
// ----
void VifSender::uploadMicroProgram()
{
packet2_t *packet2 = packet2_create(
packet2_vu_get_packet_size_for_program(&VU1Draw3D_CodeStart, &VU1Draw3D_CodeEnd) + 1, // + end tag
P2_TYPE_NORMAL,
P2_MODE_CHAIN,
1);
packet2_vu_add_micro_program(packet2, 0, &VU1Draw3D_CodeStart, &VU1Draw3D_CodeEnd);
packet2_vu_add_end_tag(packet2);
dma_channel_send_packet2(packet2, DMA_CHANNEL_VIF1, 1);
dma_channel_wait(DMA_CHANNEL_VIF1, 0);
packet2_free(packet2);
}
void VifSender::sendMatrices(const RenderData &t_renderData, const Vector3 &t_position, const Vector3 &t_rotation)
{
vec3ToNative(position, t_position, 1.0F);
@@ -53,8 +75,8 @@ void VifSender::sendMatrices(const RenderData &t_renderData, const Vector3 &t_po
create_local_world(localWorld, position, rotation);
create_local_screen(localScreen, localWorld, t_renderData.worldView->data, t_renderData.perspective->data);
packet2_reset(matricesPacket, false);
vu_add_unpack_data(matricesPacket, 0, &localScreen, 8, 0);
vu_add_end_tag(matricesPacket);
packet2_vu_add_unpack_data(matricesPacket, 0, &localScreen, 8, 0);
packet2_vu_add_end_tag(matricesPacket);
dma_channel_send_packet2(matricesPacket, DMA_CHANNEL_VIF1, 1);
dma_channel_wait(DMA_CHANNEL_VIF1, 0);
}
@@ -82,7 +104,7 @@ void VifSender::drawMesh(RenderData *t_renderData, Matrix t_perspective, u32 ver
i += (VU1_PACKAGE_VERTS_PER_BUFF - 1);
i++;
}
vu_add_end_tag(currPacket);
packet2_vu_add_end_tag(currPacket);
dma_channel_send_packet2(currPacket, DMA_CHANNEL_VIF1, 1);
dma_channel_wait(DMA_CHANNEL_VIF1, 0);
context = !context;
@@ -91,9 +113,9 @@ void VifSender::drawMesh(RenderData *t_renderData, Matrix t_perspective, u32 ver
void VifSender::setDoubleBuffer()
{
packet2_t *settings = packet2_create_chain(2, P2_TYPE_NORMAL, true);
vu_add_double_buffer_settings(settings, 8, 496);
vu_add_end_tag(settings);
packet2_t *settings = packet2_create(2, P2_TYPE_NORMAL, P2_MODE_CHAIN, true);
packet2_vu_add_double_buffer_settings(settings, 8, 496);
packet2_vu_add_end_tag(settings);
dma_channel_send_packet2(settings, DMA_CHANNEL_VIF1, 1);
dma_channel_wait(DMA_CHANNEL_VIF1, 0);
packet2_free(settings);
@@ -103,19 +125,19 @@ void VifSender::setDoubleBuffer()
void VifSender::drawVertices(Mesh &t_mesh, u32 t_start, u32 t_end, VECTOR *t_vertices, VECTOR *t_coordinates, prim_t *t_prim, texbuffer_t *textureBuffer)
{
const u32 vertCount = t_end - t_start;
vu_open_unpack(currPacket);
packet2_vu_open_unpack(currPacket);
// TODO get this via screensettings
vu_unpack_add_float(currPacket, 2048.0F); // scale
vu_unpack_add_float(currPacket, 2048.0F); // scale
vu_unpack_add_float(currPacket, ((float)0xFFFFFF) / 32.0F); // scale
vu_unpack_add_u32(currPacket, vertCount); // vertex count
vu_unpack_add_set(currPacket, 1);
vu_unpack_add_lod(currPacket, &t_mesh.lod);
vu_unpack_add_texbuff_clut(currPacket, textureBuffer, &t_mesh.clut);
vu_unpack_add_prim_giftag(currPacket, t_prim, vertCount, DRAW_STQ2_REGLIST, 3, 0);
packet2_vu_unpack_add_float(currPacket, 2048.0F); // scale
packet2_vu_unpack_add_float(currPacket, 2048.0F); // scale
packet2_vu_unpack_add_float(currPacket, ((float)0xFFFFFF) / 32.0F); // scale
packet2_vu_unpack_add_u32(currPacket, vertCount); // vertex count
packet2_vu_unpack_add_set(currPacket, 1);
packet2_vu_unpack_add_lod(currPacket, &t_mesh.lod);
packet2_vu_unpack_add_texbuff_clut(currPacket, textureBuffer, &t_mesh.clut);
packet2_vu_unpack_add_prim_giftag(currPacket, t_prim, vertCount, DRAW_STQ2_REGLIST, 3, 0);
for (u8 j = 0; j < 4; j++)
vu_unpack_add_u32(currPacket, 128);
packet2_vu_unpack_add_u32(currPacket, 128);
// Clipping tests start
@@ -152,14 +174,14 @@ void VifSender::drawVertices(Mesh &t_mesh, u32 t_start, u32 t_end, VECTOR *t_ver
// // vu1.addFloat(1.0F);
// // vu1.addFloat(500.0F); // far
vu_unpack_add_float(currPacket, 0.0F);
vu_unpack_add_float(currPacket, 0.0F);
vu_unpack_add_float(currPacket, 0.0F);
vu_unpack_add_float(currPacket, 0.0F);
packet2_vu_unpack_add_float(currPacket, 0.0F);
packet2_vu_unpack_add_float(currPacket, 0.0F);
packet2_vu_unpack_add_float(currPacket, 0.0F);
packet2_vu_unpack_add_float(currPacket, 0.0F);
//// Clipping tests end
vu_close_unpack(currPacket);
vu_add_unpack_data(currPacket, 0, t_vertices + t_start, 2 * vertCount, 1);
vu_add_unpack_data(currPacket, 0, t_coordinates + t_start, 2 * vertCount, 1);
vu_add_start_program(currPacket, 0);
packet2_vu_close_unpack(currPacket);
packet2_vu_add_unpack_data(currPacket, 0, t_vertices + t_start, 2 * vertCount, 1);
packet2_vu_add_unpack_data(currPacket, 0, t_coordinates + t_start, 2 * vertCount, 1);
packet2_vu_add_start_program(currPacket, 0);
}