mirror of
https://github.com/dolphin-emu/fifoplayer.git
synced 2026-01-31 01:05:16 +01:00
159 lines
2.7 KiB
C
159 lines
2.7 KiB
C
#ifndef FIFOPLAYER_DFFFILE_H
|
|
#define FIFOPLAYER_DFFFILE_H
|
|
|
|
#include "CommonTypes.h"
|
|
#include "endian_conv.h"
|
|
|
|
#pragma pack(push, 4)
|
|
|
|
union DffFileHeader {
|
|
struct {
|
|
// Version 1 data
|
|
u32 fileId;
|
|
u32 file_version;
|
|
u32 min_loader_version;
|
|
u64 bpMemOffset;
|
|
u32 bpMemSize;
|
|
u64 cpMemOffset;
|
|
u32 cpMemSize;
|
|
u64 xfMemOffset;
|
|
u32 xfMemSize;
|
|
u64 xfRegsOffset;
|
|
u32 xfRegsSize;
|
|
u64 frameListOffset;
|
|
u32 frameCount;
|
|
u32 flags;
|
|
|
|
// Version 2 data
|
|
u32 viMemOffset;
|
|
u32 viMemSize;
|
|
};
|
|
u32 rawData[32];
|
|
|
|
void FixEndianness()
|
|
{
|
|
fileId = le32toh(fileId);
|
|
file_version = le32toh(file_version);
|
|
min_loader_version = le32toh(min_loader_version);
|
|
bpMemOffset = le64toh(bpMemOffset);
|
|
bpMemSize = le32toh(bpMemSize);
|
|
cpMemOffset = le64toh(cpMemOffset);
|
|
cpMemSize = le32toh(cpMemSize);
|
|
xfMemOffset = le64toh(xfMemOffset);
|
|
xfMemSize = le32toh(xfMemSize);
|
|
xfRegsOffset = le64toh(xfRegsOffset);
|
|
xfRegsSize = le32toh(xfRegsSize);
|
|
frameListOffset = le64toh(frameListOffset);
|
|
frameCount = le32toh(frameCount);
|
|
flags = le32toh(flags);
|
|
viMemOffset = le32toh(viMemOffset);
|
|
viMemSize = le32toh(viMemSize);
|
|
}
|
|
};
|
|
|
|
union DffFrameInfo
|
|
{
|
|
struct
|
|
{
|
|
// Version 1 data
|
|
u64 fifoDataOffset;
|
|
u32 fifoDataSize;
|
|
u32 fifoStart;
|
|
u32 fifoEnd;
|
|
u64 memoryUpdatesOffset;
|
|
u32 numMemoryUpdates;
|
|
|
|
// Version 2 data
|
|
u64 asyncEventsOffset;
|
|
u32 numAsyncEvents;
|
|
};
|
|
u32 rawData[16];
|
|
|
|
void FixEndianness()
|
|
{
|
|
fifoDataOffset = le64toh(fifoDataOffset);
|
|
fifoDataSize = le32toh(fifoDataSize);
|
|
fifoStart = le32toh(fifoStart);
|
|
fifoEnd = le32toh(fifoEnd);
|
|
memoryUpdatesOffset = le64toh(memoryUpdatesOffset);
|
|
numMemoryUpdates = le32toh(numMemoryUpdates);
|
|
asyncEventsOffset = le64toh(asyncEventsOffset);
|
|
numAsyncEvents = le32toh(numAsyncEvents);
|
|
}
|
|
};
|
|
|
|
struct DffMemoryUpdate
|
|
{
|
|
enum Type
|
|
{
|
|
TEXTURE_MAP = 0x01,
|
|
XF_DATA = 0x02,
|
|
VERTEX_STREAM = 0x04,
|
|
TMEM = 0x08,
|
|
};
|
|
|
|
u32 fifoPosition;
|
|
u32 address;
|
|
u64 dataOffset;
|
|
u32 dataSize;
|
|
u8 type;
|
|
|
|
void FixEndianness()
|
|
{
|
|
fifoPosition = le32toh(fifoPosition);
|
|
address = le32toh(address);
|
|
dataOffset = le64toh(dataOffset);
|
|
dataSize = le32toh(dataSize);
|
|
}
|
|
};
|
|
|
|
struct DffAsyncEvent
|
|
{
|
|
enum Type
|
|
{
|
|
VI_WRITE16 = 0x00,
|
|
VI_WRITE32 = 0x01,
|
|
};
|
|
|
|
u32 fifoPosition;
|
|
u8 type;
|
|
|
|
union
|
|
{
|
|
struct
|
|
{
|
|
u32 addr;
|
|
u16 data;
|
|
} vi_write16;
|
|
|
|
struct
|
|
{
|
|
u32 addr;
|
|
u32 data;
|
|
} vi_write32;
|
|
|
|
u32 data[2];
|
|
};
|
|
|
|
void FixEndianness()
|
|
{
|
|
fifoPosition = le32toh(fifoPosition);
|
|
|
|
if (type == VI_WRITE16)
|
|
{
|
|
vi_write16.addr = le32toh(vi_write16.addr);
|
|
vi_write16.data = le16toh(vi_write16.data);
|
|
}
|
|
else if (type == VI_WRITE32)
|
|
{
|
|
vi_write32.addr = le32toh(vi_write32.addr);
|
|
vi_write32.data = le32toh(vi_write32.data);
|
|
}
|
|
}
|
|
};
|
|
|
|
|
|
#pragma pack(pop)
|
|
|
|
#endif // FIFOPLAYER_DFFFILE_H
|