Remove hacks, it finally makes sense.

This commit is contained in:
neobrain
2013-05-13 20:11:46 +02:00
parent 8b163e69de
commit f301f1bb0e
5 changed files with 38 additions and 45 deletions

View File

@@ -55,10 +55,25 @@ enum
#pragma pack(4)
union TVtxDesc
{
// TODO: Bit order?
u64 Hex;
struct
struct
{
// Reversed
#if BYTE_ORDER == BIG_ENDIAN
u32 :31;
u32 Tex7Coord : 2;
u32 Tex6Coord : 2;
u32 Tex5Coord : 2;
u32 Tex4Coord : 2;
u32 Tex3Coord : 2;
u32 Tex2Coord : 2;
u32 Tex1Coord : 2;
u32 Tex0Coord : 2;
u32 Color1 : 2;
u32 Color0 : 2;
u32 Normal : 2;
u32 Position : 2;
u32 Tex7MatIdx : 1;
u32 Tex6MatIdx : 1;
u32 Tex5MatIdx : 1;
u32 Tex4MatIdx : 1;
@@ -67,29 +82,7 @@ union TVtxDesc
u32 Tex1MatIdx : 1;
u32 Tex0MatIdx : 1;
u32 PosMatIdx : 1;
u32 Color1 : 1; // TODO
u32 Color0 : 2;
u32 Normal : 2;
u32 Position : 2;
u32 Tex7MatIdx : 1;
u32 Tex3Coord : 1; // TODO
u32 Tex2Coord : 2;
u32 Tex1Coord : 2;
u32 Tex0Coord : 2;
u32 Color1b : 1;
u32 Tex7Coord : 1; // TODO
u32 Tex6Coord : 2;
u32 Tex5Coord : 2;
u32 Tex4Coord : 2;
u32 Tex3Coordb : 1;
u32 :31;
u32 Tex7Coordb : 1;
#if 0
#elif BYTE_ORDER == LITTLE_ENDIAN
u32 PosMatIdx : 1;
u32 Tex0MatIdx : 1;
u32 Tex1MatIdx : 1;
@@ -113,6 +106,8 @@ union TVtxDesc
u32 Tex6Coord : 2;
u32 Tex7Coord : 2;
u32 :31;
#else
#error endianness not defined
#endif
};
@@ -126,7 +121,7 @@ union TVtxDesc
union UVAT_group0
{
u32 Hex;
struct
struct
{
// TODO: Is it necessary to reverse the bitfield order? oO
#if BYTE_ORDER == BIG_ENDIAN

View File

@@ -91,40 +91,36 @@ void LoadCPReg(u32 subCmd, u32 value, CPMemory &cpMem)
switch (subCmd & 0xF0)
{
case 0x50:
// TODO: 0x50 and 0x60 still look wrong, they only have bitfields per byte reversed (not in the whole structure)
cpMem.vtxDesc.Hex &= ~le64toh(0x1FFFF); // keep the Upper bits
cpMem.vtxDesc.Hex |= le64toh(value);
cpMem.vtxDesc.Hex &= ~0x1FFFF; // keep the Upper bits
cpMem.vtxDesc.Hex |= value;
break;
case 0x60:
cpMem.vtxDesc.Hex &= le64toh(0x1FFFF); // keep the lower 17Bits
cpMem.vtxDesc.Hex |= le64toh((u64)value * 131072);
cpMem.vtxDesc.Hex &= 0x1FFFF; // keep the lower 17Bits
cpMem.vtxDesc.Hex |= (u64)value * 131072;
break;
case 0x70:
// _assert_((subCmd & 0x0F) < 8);
cpMem.vtxAttr[subCmd & 7].g0.Hex = /*le32toh(*/value/*)*/;
cpMem.vtxAttr[subCmd & 7].g0.Hex = value;
break;
case 0x80:
// _assert_((subCmd & 0x0F) < 8);
cpMem.vtxAttr[subCmd & 7].g1.Hex = /*le32toh(*/value/*)*/;
cpMem.vtxAttr[subCmd & 7].g1.Hex = value;
break;
case 0x90:
// _assert_((subCmd & 0x0F) < 8);
cpMem.vtxAttr[subCmd & 7].g2.Hex = /*le32toh(*/value/*)*/;
cpMem.vtxAttr[subCmd & 7].g2.Hex = value;
break;
case 0xA0:
// TODO: Endianness?
cpMem.arrayBases[subCmd & 0xF] = le32toh(value);
cpMem.arrayBases[subCmd & 0xF] = value;
break;
case 0xB0:
// TODO: Endianness?
cpMem.arrayStrides[subCmd & 0xF] = le32toh(value & 0xFF);
printf("Be careful :p\n");
cpMem.arrayStrides[subCmd & 0xF] = value & 0xFF;
break;
}
}
@@ -140,14 +136,14 @@ void CalculateVertexElementSizes(int sizes[], int vatIndex, const CPMemory &cpMe
const u32 tcElements[8] =
{
vtxAttr.g0.Tex0CoordElements, vtxAttr.g1.Tex1CoordElements, vtxAttr.g1.Tex2CoordElements,
vtxAttr.g0.Tex0CoordElements, vtxAttr.g1.Tex1CoordElements, vtxAttr.g1.Tex2CoordElements,
vtxAttr.g1.Tex3CoordElements, vtxAttr.g1.Tex4CoordElements, vtxAttr.g2.Tex5CoordElements,
vtxAttr.g2.Tex6CoordElements, vtxAttr.g2.Tex7CoordElements
};
const u32 tcFormat[8] =
{
vtxAttr.g0.Tex0CoordFormat, vtxAttr.g1.Tex1CoordFormat, vtxAttr.g1.Tex2CoordFormat,
vtxAttr.g0.Tex0CoordFormat, vtxAttr.g1.Tex1CoordFormat, vtxAttr.g1.Tex2CoordFormat,
vtxAttr.g1.Tex3CoordFormat, vtxAttr.g1.Tex4CoordFormat, vtxAttr.g2.Tex5CoordFormat,
vtxAttr.g2.Tex6CoordFormat, vtxAttr.g2.Tex7CoordFormat
};

1
source/data_3.h Normal file

File diff suppressed because one or more lines are too long

View File

@@ -10,7 +10,7 @@ typedef uint64_t u64;
typedef uint32_t u32;
typedef uint8_t u8;
#include "data.h"
#include "data_3.h"
std::map<u32, std::vector<u8> > memory_map; // map of memory chunks (indexed by starting address)
@@ -236,7 +236,7 @@ struct FifoFrameData
std::vector<MemoryUpdate> memoryUpdates;
};
#define ENABLE_CONSOLE 1
#define ENABLE_CONSOLE 0
struct FifoData
{
std::vector<FifoFrameData> frames;
@@ -377,6 +377,8 @@ struct AnalyzedFrameInfo
#include "BPMemory.h"
#include "FifoAnalyzer.h"
#include <unistd.h>
class FifoDataAnalyzer
{
public:
@@ -514,6 +516,7 @@ public:
else
{
printf("Invalid fifo command 0x%x\n", cmd);
sleep(1);
}
break;
}
@@ -535,8 +538,6 @@ GXRModeObj *rmode;
u32 fb = 0;
u32 first_frame = 1;
#include <unistd.h>
void Init()
{
VIDEO_Init();