Reroganize texture cache

This commit is contained in:
mkwong98 2015-05-21 23:11:52 +08:00
parent 8a9dd8a6c1
commit 56e4ab7dfc
3 changed files with 407 additions and 333 deletions

View file

@ -103,6 +103,9 @@ void ppu::runStep(){
if(screenX % 8 == 0){
vid->setBGStripData(screenY, screenX >> 3);
}
else if(screenX == 255 && offsetX != 0){
vid->setBGStripData(screenY, 32);
}
if(screenX == 0){
currentBgTile = 0;
currentBgX = offsetX;
@ -216,6 +219,8 @@ void ppu::runStep(){
if(spFound == 0 && spAddressToEval == 0){
isSp0 = true;
}
spEvalAddressPre[spFound] = ((spAddressToEval >> 2) & 0x00FF);
spEvalIsTopTilePre[spFound] = ((screenY - dataToWriteOAM2) < 8 ? 0 : 1);
++spFound;
}
else{
@ -312,17 +317,18 @@ void ppu::runStep(){
switch(screenX % 8){
case 0:
//start read name table byte
memDat->ppuTranslateNameTableAddress(bgFretchNameTableAddress, bgTableID[bgTileToLoad], bgNameTableAddress[bgTileToLoad], bgAttributeTableAddress[bgTileToLoad]);
break;
case 1:
//finish read name table byte
bgPatternIDFretched[bgTileToLoad] = memDat->ppuBusRead(bgFretchNameTableAddress);
bgPatternIDFretched[bgTileToLoad] = memDat->nameTable[bgTableID[bgTileToLoad]][bgNameTableAddress[bgTileToLoad]] ;
break;
case 2:
//start read attribute table byte
break;
case 3:
//finish read attribute table byte
bgPaletteFretched[bgTileToLoad] = mmc->getTilePalette((bgFretchNameTableAddress >> 10) & 0x0001, (bgFretchNameTableAddress >> 11) & 0x0001, bgFretchNameTableAddress & 0x001F, (bgFretchNameTableAddress >> 5) & 0x001F);
bgPaletteFretched[bgTileToLoad] = memDat->ppuReadAttribute(bgTableID[bgTileToLoad], bgAttributeTableAddress[bgTileToLoad], bgFretchNameTableAddress);
break;
case 4:
//start read tile bitmap A
@ -411,6 +417,8 @@ void ppu::runStep(){
case 5:
//finish read tile bitmap A
//check vertical flip
spEvalAddress[spTileToLoad] = spEvalAddressPre[spTileToLoad];
spEvalIsTopTile[spTileToLoad] = spEvalIsTopTilePre[spTileToLoad];
spRowFretched[spTileToLoad] = ((memDat->sprRAM2[spTileToLoad * 4 + 2] >> 7) != 0 ? sprHeight - 1 - (screenY - memDat->sprRAM2[spTileToLoad * 4]): screenY - memDat->sprRAM2[spTileToLoad * 4]);
mmc->getPattern(getSprPatternAddress(memDat->sprRAM2[spTileToLoad * 4 + 1]), spRowFretched[spTileToLoad], true, spPatternDataFretched[spTileToLoad][0], spAddressFretched[spTileToLoad], spRAMAddress[spTileToLoad]);
break;
@ -584,6 +592,8 @@ Uint8 ppu::read2004(){
void ppu::write2004(Uint8 data){
memDat->sprRAM[reg[3]] = data;
vid->spHDResult[(reg[3] >> 2) & 0x003F] = HD_TILE_NOT_CHECKED;
vid->spHDResult[((reg[3] >> 2) & 0x003F) + 64] = HD_TILE_NOT_CHECKED;
++reg[3];
}
@ -665,6 +675,8 @@ void ppu::transferDMA(Uint8 data){
address = (data << 8);
for(Uint16 i = 0; i < 256; ++i){
memDat->sprRAM[reg[3]] = memDat->cpuBusRead(address);
vid->spHDResult[(reg[3] >> 2) & 0x003F] = HD_TILE_NOT_CHECKED;
vid->spHDResult[((reg[3] >> 2) & 0x003F) + 64] = HD_TILE_NOT_CHECKED;
++reg[3];
++address;
}
@ -688,7 +700,6 @@ void ppu::saveState(fstream* statefile){
statefile->write((char *)(&frameCount), sizeof(Uint32));
statefile->write((char *)(&writeDisabledPeriod), sizeof(unsigned int));
statefile->write((char *)(reg), sizeof(Uint8) * 8);
statefile->write((char *)(spriteList), sizeof(sprite) * 64);
statefile->write((char *)(&baseNameTableAddress), sizeof(Uint8));
statefile->write((char *)(&aIncSize), sizeof(Uint8));
statefile->write((char *)(&sprPatternTable), sizeof(Uint16));
@ -758,7 +769,6 @@ void ppu::loadState(fstream* statefile){
statefile->read((char *)(&frameCount), sizeof(Uint32));
statefile->read((char *)(&writeDisabledPeriod), sizeof(unsigned int));
statefile->read((char *)(reg), sizeof(Uint8) * 8);
statefile->read((char *)(spriteList), sizeof(sprite) * 64);
statefile->read((char *)(&baseNameTableAddress), sizeof(Uint8));
statefile->read((char *)(&aIncSize), sizeof(Uint8));
statefile->read((char *)(&sprPatternTable), sizeof(Uint16));

File diff suppressed because it is too large Load diff

View file

@ -16,8 +16,10 @@
#define HD_TILE_NO_MATCH 0xFFFE
#define HD_TILE_NOT_CHECKED 0xFFFF
#define TEXTURE_CACHE_TILE_COUNT 0x1000 //64 * 64
#define TEXTURE_CACHE_TILE_ROW_COUNT 64
#define TEXTURE_CACHE_TILE_COL_COUNT 64
#define TEXTURE_CACHE_TILE_COL_SHIFT 3 // (y/64) * 8
struct rawPattern{
Uint32 pixStrip1;
@ -101,14 +103,13 @@ union colorCombo{
};
struct patternDat{
Uint8 scale;
Uint32 patternAddress;
colorCombo colors;
rawPattern rawDat;
Uint8 lookupIdx;
Uint16 index;
Uint16 displayID;
GLfloat brightness;
Uint16 hdResult;
};
@ -217,10 +218,12 @@ public:
GLuint uniXOffset;
GLuint uniFlagBG;
GLuint uniTextureSp1;
GLuint uniTextureBaseSp1;
GLuint uniTextureSp2;
GLuint uniTextureSp1Base;
GLuint uniTextureSp2Base;
GLuint uniTextureBaseSp2;
GLuint uniFlagSp1;
GLuint uniFlagSp2;
@ -232,6 +235,7 @@ public:
GLuint atrTextCoordSp2;
GLuint sampler;
GLuint baseSampler;
GLuint xOffsetSampler;
GLuint flagSampler;
@ -270,11 +274,10 @@ public:
std::vector<Uint32> hdList[256];
std::vector<Uint32> baseList[256];
Uint16 bgCounter;
patternDat bgPatternData[BG_PATTERN_SIZE]; //33 * 240 * 4
patternDat spPatternData[SP_PATTERN_SIZE]; //64 * 16 * 4
Uint8 bgPatternInUse[BG_PATTERN_SIZE];
Uint8 spPatternInUse[SP_PATTERN_SIZE];
patternDat hdPatternData[TEXTURE_CACHE_TILE_COUNT];
patternDat basePatternData[TEXTURE_CACHE_TILE_COUNT];
Uint8 hdPatternInUse[TEXTURE_CACHE_TILE_COUNT];
Uint8 basePatternInUse[TEXTURE_CACHE_TILE_COUNT];
Uint16 minHDIdx;
Uint16 minBaseIdx;
Uint16 maxHDIdx;
@ -283,7 +286,7 @@ public:
Uint16 blankBaseIdx;
Uint16 lastPatID;
bool lastIsBg;
bool lastIsHD;
bool capScreenFlag;
@ -355,8 +358,7 @@ public:
void setSPStripData(Uint16 row, Uint16 col, Uint8 spID);
void prepareTileData(bool isBg, Uint32 patternAddress, Uint8 tableID, Uint16 nameTableAddress, Uint8 row,
colorCombo colors, Uint8 patternByte0, Uint8 patternByte1, Uint32 ramAddress,
GLuint& decodedX, GLuint& decodedY, GLuint& patternScale, GLfloat& brightness);
colorCombo colors, Uint32 ramAddress, GLfloat& decodedX, GLfloat& decodedY, bool& isHD, GLfloat& brightness);
void capScreen(bool useNative);
void saveScreenToPath(string path, bool useNative);
@ -384,7 +386,6 @@ public:
void SavePackEditScreenList();
void SaveGraphics(string path);
void SaveBuffers(string path);
void SavePatterns(string path);
void ReadPalette(string path);