migrated VU1 into spacket
This commit is contained in:
@@ -19,17 +19,9 @@
|
|||||||
#include <packet.h>
|
#include <packet.h>
|
||||||
#include <math3d.h>
|
#include <math3d.h>
|
||||||
|
|
||||||
const u32 VIF_BUFFER_SIZE = 48 * 1024;
|
#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)))
|
||||||
typedef struct VU1BuildList
|
#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))
|
||||||
{
|
|
||||||
u8 isBuilding;
|
|
||||||
void *offset;
|
|
||||||
void *kickBuffer;
|
|
||||||
u32 dmaSize;
|
|
||||||
u32 dmaSizeAll;
|
|
||||||
u32 dmaDestination;
|
|
||||||
} VU1BuildList;
|
|
||||||
|
|
||||||
/** Class responsible for managing VU1 micro programs */
|
/** Class responsible for managing VU1 micro programs */
|
||||||
class VU1
|
class VU1
|
||||||
@@ -44,7 +36,7 @@ public:
|
|||||||
void sendSingleRefList(int t_destAddress, void *t_data, int t_quadSize);
|
void sendSingleRefList(int t_destAddress, void *t_data, int t_quadSize);
|
||||||
void addListBeginning();
|
void addListBeginning();
|
||||||
void continueList();
|
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 addFloat(float v);
|
||||||
void add32(u32 v);
|
void add32(u32 v);
|
||||||
void add64(u64 v);
|
void add64(u64 v);
|
||||||
@@ -56,43 +48,14 @@ public:
|
|||||||
void addDoubleBufferSetting();
|
void addDoubleBufferSetting();
|
||||||
void addFlush();
|
void addFlush();
|
||||||
|
|
||||||
private:
|
|
||||||
u8 isDoubleBufferSet;
|
|
||||||
void checkDataAlignment(void *data);
|
|
||||||
VU1BuildList buildList;
|
|
||||||
spacket_t *spackets[2] __attribute__((aligned(16)));
|
|
||||||
spacket_t *currPacket;
|
spacket_t *currPacket;
|
||||||
|
|
||||||
|
private:
|
||||||
|
u32 qwordsInsertedToVU1;
|
||||||
|
u8 isDoubleBufferSet, isBuilding;
|
||||||
|
spacket_t *spackets[2] __attribute__((aligned(16)));
|
||||||
u8 switchPacket;
|
u8 switchPacket;
|
||||||
static u32 countProgramSize(u32 *t_start, u32 *t_end);
|
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
|
#endif
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ void VifSender::drawVertices(const Mesh &t_mesh, u32 t_start, u32 t_end, VECTOR
|
|||||||
t_prim->mapping_type,
|
t_prim->mapping_type,
|
||||||
0, // context
|
0, // context
|
||||||
t_prim->colorfix),
|
t_prim->colorfix),
|
||||||
GS_GIFTAG_PACKED,
|
0, // GIFTAG_PACKED
|
||||||
3), // STQ + RGBA + XYZ
|
3), // STQ + RGBA + XYZ
|
||||||
DRAW_R_STQ_REGLIST);
|
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
|
//// Clipping tests end
|
||||||
|
|
||||||
vu1.addListEnding();
|
vu1.addListEnding();
|
||||||
vu1.addReferenceList(0, t_vertices + t_start, 2 * vertCount, 1);
|
vu1.addReferenceList(t_vertices + t_start, 2 * vertCount, 1);
|
||||||
vu1.addReferenceList(0, t_coordinates + t_start, 2 * vertCount, 1);
|
vu1.addReferenceList(t_coordinates + t_start, 2 * vertCount, 1);
|
||||||
vu1.addStartProgram();
|
vu1.addStartProgram();
|
||||||
}
|
}
|
||||||
|
|||||||
+19
-44
@@ -39,14 +39,12 @@ VU1::~VU1() {}
|
|||||||
void VU1::createList()
|
void VU1::createList()
|
||||||
{
|
{
|
||||||
switchPacket = !switchPacket;
|
switchPacket = !switchPacket;
|
||||||
memset((char *)&buildList, 0, sizeof(buildList));
|
qwordsInsertedToVU1 = 0;
|
||||||
|
|
||||||
if (switchPacket)
|
if (switchPacket)
|
||||||
currPacket = spackets[0];
|
currPacket = spackets[0];
|
||||||
else
|
else
|
||||||
currPacket = spackets[1];
|
currPacket = spackets[1];
|
||||||
spacket_reset(currPacket, false);
|
spacket_reset(currPacket, false);
|
||||||
buildList.kickBuffer = currPacket;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Add reference list and send via VIF1
|
/** 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_t *spacket = spacket_create(2, SPACKET_NORMAL);
|
||||||
spacket_ref(spacket, t_data, t_quadSize, 0, 0, 0, true);
|
spacket_ref(spacket, t_data, t_quadSize, 0, 0, 0, true);
|
||||||
spacket_vif_stcycl(spacket, 0, 0x0101, 0);
|
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_close_unpack(spacket, t_quadSize);
|
||||||
spacket_chain_open_end(spacket, 0, 0, true);
|
spacket_chain_open_end(spacket, 0, 0, true);
|
||||||
spacket_vif_nop(spacket, 0);
|
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 */
|
/** Add list beginning, set's double buffer if not set */
|
||||||
void VU1::addListBeginning()
|
void VU1::addListBeginning()
|
||||||
{
|
{
|
||||||
if (buildList.isBuilding == 1)
|
if (isBuilding)
|
||||||
PRINT_ERR("Please end current list list before adding new one!");
|
PRINT_ERR("Please end current list list before adding new one!");
|
||||||
|
|
||||||
if (isDoubleBufferSet == 0)
|
if (isDoubleBufferSet == 0)
|
||||||
@@ -78,47 +76,43 @@ void VU1::addListBeginning()
|
|||||||
else
|
else
|
||||||
addFlush();
|
addFlush();
|
||||||
|
|
||||||
buildList.dmaSizeAll += buildList.dmaSize;
|
qwordsInsertedToVU1 = 0;
|
||||||
buildList.dmaSize = 0;
|
|
||||||
buildList.offset = currPacket;
|
|
||||||
spacket_chain_open_cnt(currPacket, 0, 0, 0, true);
|
spacket_chain_open_cnt(currPacket, 0, 0, 0, true);
|
||||||
spacket_vif_stcycl(currPacket, 0, 0x0101, 0);
|
spacket_vif_stcycl(currPacket, 0, 0x0101, 0);
|
||||||
spacket_open_unpack(currPacket, V4_32, 0, 1, 0, 0, 0);
|
spacket_open_unpack(currPacket, V4_32, 0, 1, 0, 1, 0);
|
||||||
buildList.isBuilding = 1;
|
isBuilding = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Add list ending and fix unpack size */
|
/** Add list ending and fix unpack size */
|
||||||
void VU1::addListEnding()
|
void VU1::addListEnding()
|
||||||
{
|
{
|
||||||
if (buildList.isBuilding == 0)
|
if (!isBuilding)
|
||||||
{
|
{
|
||||||
PRINT_ERR("Please add list beginning first. Nothing to end!");
|
PRINT_ERR("Please add list beginning first. Nothing to end!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
spacket_align_to_qw(currPacket);
|
spacket_align_to_qw(currPacket);
|
||||||
spacket_chain_close_tag(currPacket);
|
spacket_chain_close_tag(currPacket);
|
||||||
spacket_close_unpack(currPacket, ((u32)currPacket->next - (u32)currPacket->unpackOpenedAt) >> 4);
|
spacket_close_unpack(currPacket, qwordsInsertedToVU1 >> 4);
|
||||||
buildList.isBuilding = 0;
|
isBuilding = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Add list which will load data from given pointer
|
/** Add list which will load data from given pointer
|
||||||
* A lot faster than standard list.
|
* 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 data data pointer
|
||||||
* @param size in quadwords
|
* @param size in quadwords
|
||||||
* @param useTops when true, data will be loaded at the beginning of buffer (BASE+OFFSET)
|
* @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 (isBuilding)
|
||||||
if (buildList.isBuilding == 1)
|
|
||||||
PRINT_ERR("Please end current list list before adding new one!");
|
PRINT_ERR("Please end current list list before adding new one!");
|
||||||
spacket_ref(currPacket, t_data, t_size, 0, 0, 0, 1);
|
spacket_ref(currPacket, t_data, t_size, 0, 0, 0, 1);
|
||||||
spacket_vif_stcycl(currPacket, 0, 0x0101, 0);
|
spacket_vif_stcycl(currPacket, 0, 0x0101, 0);
|
||||||
spacket_open_unpack(currPacket, V4_32, 0, t_useTops, 0, 0, 0);
|
spacket_open_unpack(currPacket, V4_32, qwordsInsertedToVU1 >> 4, t_useTops, 0, 1, 0);
|
||||||
spacket_close_unpack(currPacket, t_useTops ? ((u32)currPacket->next - (u32)currPacket->unpackOpenedAt) >> 4 : t_offset >> 4);
|
spacket_close_unpack(currPacket, t_size);
|
||||||
buildList.dmaSize += t_size * 8;
|
qwordsInsertedToVU1 += t_size * 8;
|
||||||
buildList.dmaSizeAll += buildList.dmaSize;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Start VU1 program */
|
/** Start VU1 program */
|
||||||
@@ -146,7 +140,6 @@ void VU1::sendList()
|
|||||||
spacket_vif_nop(currPacket, 0);
|
spacket_vif_nop(currPacket, 0);
|
||||||
spacket_vif_nop(currPacket, 0);
|
spacket_vif_nop(currPacket, 0);
|
||||||
spacket_chain_close_tag(currPacket);
|
spacket_chain_close_tag(currPacket);
|
||||||
printf("QWS:%d\n", spacket_get_qw_count(currPacket));
|
|
||||||
spacket_send_chain(currPacket, DMA_CHANNEL_VIF1, true, true, true);
|
spacket_send_chain(currPacket, DMA_CHANNEL_VIF1, true, true, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -167,51 +160,33 @@ void VU1::addFlush()
|
|||||||
spacket_chain_close_tag(currPacket);
|
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
|
// List adding
|
||||||
// ----
|
// ----
|
||||||
|
|
||||||
void VU1::add128(u64 v1, u64 v2)
|
void VU1::add128(u64 v1, u64 v2)
|
||||||
{
|
{
|
||||||
checkList();
|
|
||||||
spacket_add_u64(currPacket, v1);
|
spacket_add_u64(currPacket, v1);
|
||||||
spacket_add_u64(currPacket, v2);
|
spacket_add_u64(currPacket, v2);
|
||||||
buildList.dmaSize += 16;
|
qwordsInsertedToVU1 += 16;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VU1::add64(u64 v)
|
void VU1::add64(u64 v)
|
||||||
{
|
{
|
||||||
checkList();
|
|
||||||
spacket_add_u64(currPacket, v);
|
spacket_add_u64(currPacket, v);
|
||||||
buildList.dmaSize += 8;
|
qwordsInsertedToVU1 += 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VU1::add32(u32 v)
|
void VU1::add32(u32 v)
|
||||||
{
|
{
|
||||||
checkList();
|
|
||||||
spacket_add_u32(currPacket, v);
|
spacket_add_u32(currPacket, v);
|
||||||
buildList.dmaSize += 4;
|
qwordsInsertedToVU1 += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VU1::addFloat(float v)
|
void VU1::addFloat(float v)
|
||||||
{
|
{
|
||||||
checkList();
|
|
||||||
spacket_add_float(currPacket, v);
|
spacket_add_float(currPacket, v);
|
||||||
buildList.dmaSize += 4;
|
qwordsInsertedToVU1 += 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!");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----
|
// ----
|
||||||
|
|||||||
Reference in New Issue
Block a user