From 8a3485e671c336183318745bbcfd327c77e3a727 Mon Sep 17 00:00:00 2001 From: h4570 Date: Tue, 17 Nov 2020 17:33:30 +0100 Subject: [PATCH] migrated VU1 into spacket --- src/engine/include/modules/vu1.hpp | 55 +++++--------------------- src/engine/modules/vif_sender.cpp | 6 +-- src/engine/modules/vu1.cpp | 63 +++++++++--------------------- 3 files changed, 31 insertions(+), 93 deletions(-) diff --git a/src/engine/include/modules/vu1.hpp b/src/engine/include/modules/vu1.hpp index 3bb9407..3707f8b 100644 --- a/src/engine/include/modules/vu1.hpp +++ b/src/engine/include/modules/vu1.hpp @@ -19,17 +19,9 @@ #include #include -const u32 VIF_BUFFER_SIZE = 48 * 1024; - -typedef struct VU1BuildList -{ - u8 isBuilding; - void *offset; - void *kickBuffer; - u32 dmaSize; - u32 dmaSizeAll; - u32 dmaDestination; -} VU1BuildList; +#define V4_32 0xC +#define GS_PRIM(PRIM, IIP, TME, FGE, ABE, AA1, FST, CTXT, FIX) (u128)(((FIX << 10) | (CTXT << 9) | (FST << 8) | (AA1 << 7) | (ABE << 6) | (FGE << 5) | (TME << 4) | (IIP << 3) | (PRIM))) +#define GS_GIFTAG(NLOOP, EOP, PRE, PRIM, FLG, NREG) (((u64)(NREG) << 60) | ((u64)(FLG) << 58) | ((u64)(PRIM) << 47) | ((u64)(PRE) << 46) | (EOP << 15) | (NLOOP << 0)) /** Class responsible for managing VU1 micro programs */ class VU1 @@ -44,7 +36,7 @@ public: void sendSingleRefList(int t_destAddress, void *t_data, int t_quadSize); void addListBeginning(); void continueList(); - void addReferenceList(u32 t_offset, void *t_data, u32 t_size, u8 t_useTops); + void addReferenceList(void *t_data, u32 t_size, u8 t_useTops); void addFloat(float v); void add32(u32 v); void add64(u64 v); @@ -56,43 +48,14 @@ public: void addDoubleBufferSetting(); void addFlush(); -private: - u8 isDoubleBufferSet; - void checkDataAlignment(void *data); - VU1BuildList buildList; - spacket_t *spackets[2] __attribute__((aligned(16))); spacket_t *currPacket; + +private: + u32 qwordsInsertedToVU1; + u8 isDoubleBufferSet, isBuilding; + spacket_t *spackets[2] __attribute__((aligned(16))); u8 switchPacket; static u32 countProgramSize(u32 *t_start, u32 *t_end); - void checkList(); - inline s32 AddUnpack(int format, int addr, int num, int usetops = 0, int nosign = 1, int masking = 0) - { - return (s32)((0x60 << 24) + (format << 24) + (masking << 28) + (usetops << 15) + - (nosign << 14) + (num << 16) + addr); - } }; -#define DMA_REF_TAG(ADDR, COUNT) ((((unsigned long)ADDR) << 32) | (0x3 << 28) | COUNT) -#define DMA_CNT_TAG(COUNT) (((unsigned long)(0x1) << 28) | COUNT) -#define DMA_END_TAG(COUNT) (((unsigned long)(0x7) << 28) | COUNT) -#define VIF_NOP 0x00 -#define VIF_STCYL 0x01 -#define VIF_OFFSET 0x02 -#define VIF_BASE 0x03 -#define VIF_FLUSH 0x11 -#define VIF_MSCAL 0x14 -#define VIF_MSCNT 0x17 -#define VIF_MPG 0x4A -#define V4_32 0xC -#define VIF_UNPACK 0x60 -#define U128(n) ((u128)(n)) -#define VIF_UNPACK_V4_32 (VIF_UNPACK | V4_32) -#define VIF_CODE(CMD, NUM, IMMEDIATE) ((((unsigned int)(CMD)) << 24) | \ - (((unsigned int)(NUM)) << 16) | \ - ((unsigned int)(IMMEDIATE))) -#define GS_PRIM(PRIM, IIP, TME, FGE, ABE, AA1, FST, CTXT, FIX) U128((FIX << 10) | (CTXT << 9) | (FST << 8) | (AA1 << 7) | (ABE << 6) | (FGE << 5) | (TME << 4) | (IIP << 3) | (PRIM)) -#define GS_GIFTAG(NLOOP, EOP, PRE, PRIM, FLG, NREG) (((u64)(NREG) << 60) | ((u64)(FLG) << 58) | ((u64)(PRIM) << 47) | ((u64)(PRE) << 46) | (EOP << 15) | (NLOOP << 0)) -#define VU1_DMA_CHAN_TIMEOUT -1 -#define GS_GIFTAG_PACKED 0 - #endif diff --git a/src/engine/modules/vif_sender.cpp b/src/engine/modules/vif_sender.cpp index 929808a..67e6772 100644 --- a/src/engine/modules/vif_sender.cpp +++ b/src/engine/modules/vif_sender.cpp @@ -130,7 +130,7 @@ void VifSender::drawVertices(const Mesh &t_mesh, u32 t_start, u32 t_end, VECTOR t_prim->mapping_type, 0, // context t_prim->colorfix), - GS_GIFTAG_PACKED, + 0, // GIFTAG_PACKED 3), // STQ + RGBA + XYZ DRAW_R_STQ_REGLIST); @@ -180,7 +180,7 @@ void VifSender::drawVertices(const Mesh &t_mesh, u32 t_start, u32 t_end, VECTOR //// Clipping tests end vu1.addListEnding(); - vu1.addReferenceList(0, t_vertices + t_start, 2 * vertCount, 1); - vu1.addReferenceList(0, t_coordinates + t_start, 2 * vertCount, 1); + vu1.addReferenceList(t_vertices + t_start, 2 * vertCount, 1); + vu1.addReferenceList(t_coordinates + t_start, 2 * vertCount, 1); vu1.addStartProgram(); } diff --git a/src/engine/modules/vu1.cpp b/src/engine/modules/vu1.cpp index 1aad7a6..1254065 100644 --- a/src/engine/modules/vu1.cpp +++ b/src/engine/modules/vu1.cpp @@ -39,14 +39,12 @@ VU1::~VU1() {} void VU1::createList() { switchPacket = !switchPacket; - memset((char *)&buildList, 0, sizeof(buildList)); - + qwordsInsertedToVU1 = 0; if (switchPacket) currPacket = spackets[0]; else currPacket = spackets[1]; spacket_reset(currPacket, false); - buildList.kickBuffer = currPacket; } /** Add reference list and send via VIF1 @@ -58,7 +56,7 @@ void VU1::sendSingleRefList(int t_destAddress, void *t_data, int t_quadSize) spacket_t *spacket = spacket_create(2, SPACKET_NORMAL); spacket_ref(spacket, t_data, t_quadSize, 0, 0, 0, true); spacket_vif_stcycl(spacket, 0, 0x0101, 0); - spacket_open_unpack(spacket, VIF_UNPACK_V4_32, t_destAddress, 0, 0, 0, 0); + spacket_open_unpack(spacket, V4_32, t_destAddress, 0, 0, 0, 0); spacket_close_unpack(spacket, t_quadSize); spacket_chain_open_end(spacket, 0, 0, true); spacket_vif_nop(spacket, 0); @@ -70,7 +68,7 @@ void VU1::sendSingleRefList(int t_destAddress, void *t_data, int t_quadSize) /** Add list beginning, set's double buffer if not set */ void VU1::addListBeginning() { - if (buildList.isBuilding == 1) + if (isBuilding) PRINT_ERR("Please end current list list before adding new one!"); if (isDoubleBufferSet == 0) @@ -78,47 +76,43 @@ void VU1::addListBeginning() else addFlush(); - buildList.dmaSizeAll += buildList.dmaSize; - buildList.dmaSize = 0; - buildList.offset = currPacket; + qwordsInsertedToVU1 = 0; spacket_chain_open_cnt(currPacket, 0, 0, 0, true); spacket_vif_stcycl(currPacket, 0, 0x0101, 0); - spacket_open_unpack(currPacket, V4_32, 0, 1, 0, 0, 0); - buildList.isBuilding = 1; + spacket_open_unpack(currPacket, V4_32, 0, 1, 0, 1, 0); + isBuilding = true; } /** Add list ending and fix unpack size */ void VU1::addListEnding() { - if (buildList.isBuilding == 0) + if (!isBuilding) { PRINT_ERR("Please add list beginning first. Nothing to end!"); return; } spacket_align_to_qw(currPacket); spacket_chain_close_tag(currPacket); - spacket_close_unpack(currPacket, ((u32)currPacket->next - (u32)currPacket->unpackOpenedAt) >> 4); - buildList.isBuilding = 0; + spacket_close_unpack(currPacket, qwordsInsertedToVU1 >> 4); + isBuilding = 0; } /** Add list which will load data from given pointer * A lot faster than standard list. - * @param offset offset before data in quadwords + * @param offset offset before data in quadwords. * @param data data pointer * @param size in quadwords * @param useTops when true, data will be loaded at the beginning of buffer (BASE+OFFSET) */ -void VU1::addReferenceList(u32 t_offset, void *t_data, u32 t_size, u8 t_useTops) +void VU1::addReferenceList(void *t_data, u32 t_size, u8 t_useTops) { - checkDataAlignment(t_data); - if (buildList.isBuilding == 1) + if (isBuilding) PRINT_ERR("Please end current list list before adding new one!"); spacket_ref(currPacket, t_data, t_size, 0, 0, 0, 1); spacket_vif_stcycl(currPacket, 0, 0x0101, 0); - spacket_open_unpack(currPacket, V4_32, 0, t_useTops, 0, 0, 0); - spacket_close_unpack(currPacket, t_useTops ? ((u32)currPacket->next - (u32)currPacket->unpackOpenedAt) >> 4 : t_offset >> 4); - buildList.dmaSize += t_size * 8; - buildList.dmaSizeAll += buildList.dmaSize; + spacket_open_unpack(currPacket, V4_32, qwordsInsertedToVU1 >> 4, t_useTops, 0, 1, 0); + spacket_close_unpack(currPacket, t_size); + qwordsInsertedToVU1 += t_size * 8; } /** Start VU1 program */ @@ -146,7 +140,6 @@ void VU1::sendList() spacket_vif_nop(currPacket, 0); spacket_vif_nop(currPacket, 0); spacket_chain_close_tag(currPacket); - printf("QWS:%d\n", spacket_get_qw_count(currPacket)); spacket_send_chain(currPacket, DMA_CHANNEL_VIF1, true, true, true); } @@ -167,51 +160,33 @@ void VU1::addFlush() spacket_chain_close_tag(currPacket); } -void VU1::checkDataAlignment(void *t_data) -{ - if (((u32)t_data & 0xF)) - PRINT_ERR("data is not 16 byte aligned!"); -} - // ---- // List adding // ---- void VU1::add128(u64 v1, u64 v2) { - checkList(); spacket_add_u64(currPacket, v1); spacket_add_u64(currPacket, v2); - buildList.dmaSize += 16; + qwordsInsertedToVU1 += 16; } void VU1::add64(u64 v) { - checkList(); spacket_add_u64(currPacket, v); - buildList.dmaSize += 8; + qwordsInsertedToVU1 += 8; } void VU1::add32(u32 v) { - checkList(); spacket_add_u32(currPacket, v); - buildList.dmaSize += 4; + qwordsInsertedToVU1 += 4; } void VU1::addFloat(float v) { - checkList(); spacket_add_float(currPacket, v); - buildList.dmaSize += 4; -} - -void VU1::checkList() -{ - if (buildList.isBuilding == 0) - PRINT_ERR("Please add list beginning before adding data!"); - // if (buildList.dmaSizeAll > VIF_BUFFER_SIZE) - // PRINT_ERR("Buffer size exceed!"); + qwordsInsertedToVU1 += 4; } // ----