mirror of
https://github.com/mkwong98/HDNes.git
synced 2024-05-20 13:07:54 -04:00
Reroganize texture cache
This commit is contained in:
parent
8a9dd8a6c1
commit
56e4ab7dfc
|
@ -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));
|
||||
|
|
695
hdnes/video.cpp
695
hdnes/video.cpp
File diff suppressed because it is too large
Load diff
|
@ -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);
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue