mirror of
https://github.com/blawar/GLideN64.git
synced 2024-07-01 00:33:20 +00:00
expand tmem
This commit is contained in:
parent
0b4909721c
commit
746be9cfa1
|
@ -5,7 +5,7 @@ u8* HEADER;
|
||||||
u8 *DMEM;
|
u8 *DMEM;
|
||||||
u8 *IMEM;
|
u8 *IMEM;
|
||||||
#endif
|
#endif
|
||||||
u64 TMEM[512];
|
u64 TMEM[TMEM_SIZE];
|
||||||
#ifndef NATIVE
|
#ifndef NATIVE
|
||||||
u8 *RDRAM;
|
u8 *RDRAM;
|
||||||
#endif
|
#endif
|
||||||
|
|
12
src/N64.h
12
src/N64.h
|
@ -3,13 +3,9 @@
|
||||||
|
|
||||||
#include "Types.h"
|
#include "Types.h"
|
||||||
|
|
||||||
/*
|
#define TMEM_SIZE (1024 * 1024 * 4)
|
||||||
#ifdef NATIVE
|
#define LOAD_BLOCK32_MAX (0x0400 * 16)
|
||||||
#define RDRAM_PTR(a) ((u8*)a)
|
#define LOAD_BLOCK32_MASK ((0x0400 * 16) - 1)
|
||||||
#else
|
|
||||||
#define RDRAM_PTR(a) RDRAM[a]
|
|
||||||
#endif
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define MI_INTR_DP 0x20 // Bit 5: DP intr
|
#define MI_INTR_DP 0x20 // Bit 5: DP intr
|
||||||
|
|
||||||
|
@ -59,7 +55,7 @@ extern u8 *DMEM;
|
||||||
extern u8 *IMEM;
|
extern u8 *IMEM;
|
||||||
extern u8 *RDRAM;
|
extern u8 *RDRAM;
|
||||||
#endif
|
#endif
|
||||||
extern u64 TMEM[512];
|
extern u64 TMEM[TMEM_SIZE];
|
||||||
extern word RDRAMSize;
|
extern word RDRAMSize;
|
||||||
extern bool ConfigOpen;
|
extern bool ConfigOpen;
|
||||||
|
|
||||||
|
|
29
src/RDP.cpp
29
src/RDP.cpp
|
@ -131,13 +131,18 @@ void RDP_SetTile( const Gwords words )
|
||||||
_SHIFTR( words.w1, 0, 4 ) ); // shifts
|
_SHIFTR( words.w1, 0, 4 ) ); // shifts
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define LRS_UPPER_VALUE (_SHIFTR(words.w1, 27, 5) << 12)
|
||||||
|
#define TILE_VALUE _SHIFTR(words.w1, 24, 3)
|
||||||
|
#define LRS_VALUE _SHIFTR(words.w1, 12, 12)
|
||||||
|
#define LRT_VALUE _SHIFTR(words.w1, 0, 12)
|
||||||
|
|
||||||
void RDP_LoadTile( const Gwords words )
|
void RDP_LoadTile( const Gwords words )
|
||||||
{
|
{
|
||||||
gDPLoadTile( _SHIFTR( words.w1, 24, 3 ), // tile
|
gDPLoadTile( TILE_VALUE, // tile
|
||||||
_SHIFTR( words.w0, 12, 12 ), // uls
|
_SHIFTR( words.w0, 12, 12 ), // uls
|
||||||
_SHIFTR( words.w0, 0, 12 ), // ult
|
_SHIFTR( words.w0, 0, 12 ), // ult
|
||||||
_SHIFTR( words.w1, 12, 12 ), // lrs
|
LRS_VALUE | LRS_UPPER_VALUE, // lrs
|
||||||
_SHIFTR( words.w1, 0, 12 ) ); // lrt
|
LRT_VALUE ); // lrt
|
||||||
}
|
}
|
||||||
|
|
||||||
static u32 lbw0, lbw1;
|
static u32 lbw0, lbw1;
|
||||||
|
@ -145,11 +150,11 @@ void RDP_LoadBlock( const Gwords words )
|
||||||
{
|
{
|
||||||
lbw0 = words.w0;
|
lbw0 = words.w0;
|
||||||
lbw1 = words.w1;
|
lbw1 = words.w1;
|
||||||
gDPLoadBlock( _SHIFTR( words.w1, 24, 3 ), // tile
|
gDPLoadBlock( TILE_VALUE, // tile
|
||||||
_SHIFTR( words.w0, 12, 12 ), // uls
|
_SHIFTR( words.w0, 12, 12 ), // uls
|
||||||
_SHIFTR( words.w0, 0, 12 ), // ult
|
_SHIFTR( words.w0, 0, 12 ), // ult
|
||||||
_SHIFTR( words.w1, 12, 12 ), // lrs
|
LRS_VALUE | LRS_UPPER_VALUE, // lrs
|
||||||
_SHIFTR( words.w1, 0, 12 ) ); // dxt
|
LRT_VALUE ); // dxt
|
||||||
}
|
}
|
||||||
|
|
||||||
void RDP_RepeatLastLoadBlock()
|
void RDP_RepeatLastLoadBlock()
|
||||||
|
@ -159,20 +164,20 @@ void RDP_RepeatLastLoadBlock()
|
||||||
|
|
||||||
void RDP_SetTileSize( const Gwords words )
|
void RDP_SetTileSize( const Gwords words )
|
||||||
{
|
{
|
||||||
gDPSetTileSize( _SHIFTR( words.w1, 24, 3 ), // tile
|
gDPSetTileSize( TILE_VALUE, // tile
|
||||||
_SHIFTR( words.w0, 12, 12 ), // uls
|
_SHIFTR( words.w0, 12, 12 ), // uls
|
||||||
_SHIFTR( words.w0, 0, 12 ), // ult
|
_SHIFTR( words.w0, 0, 12 ), // ult
|
||||||
_SHIFTR( words.w1, 12, 12 ), // lrs
|
LRS_VALUE | LRS_UPPER_VALUE, // lrs
|
||||||
_SHIFTR( words.w1, 0, 12 ) ); // lrt
|
LRT_VALUE ); // lrt
|
||||||
}
|
}
|
||||||
|
|
||||||
void RDP_LoadTLUT( const Gwords words )
|
void RDP_LoadTLUT( const Gwords words )
|
||||||
{
|
{
|
||||||
gDPLoadTLUT( _SHIFTR( words.w1, 24, 3 ), // tile
|
gDPLoadTLUT( TILE_VALUE, // tile
|
||||||
_SHIFTR( words.w0, 12, 12 ), // uls
|
_SHIFTR( words.w0, 12, 12 ), // uls
|
||||||
_SHIFTR( words.w0, 0, 12 ), // ult
|
_SHIFTR( words.w0, 0, 12 ), // ult
|
||||||
_SHIFTR( words.w1, 12, 12 ), // lrs
|
LRS_VALUE | LRS_UPPER_VALUE, // lrs
|
||||||
_SHIFTR( words.w1, 0, 12 ) ); // lrt
|
LRT_VALUE ); // lrt
|
||||||
}
|
}
|
||||||
|
|
||||||
void RDP_SetOtherMode( const Gwords words )
|
void RDP_SetOtherMode( const Gwords words )
|
||||||
|
|
|
@ -251,7 +251,7 @@ u32 GetIA88_RGBA4444(u16 offset, u16 x, u16 i, u8 palette)
|
||||||
inline u32 Get32BitColor(u16 offset, u16 x, u16 i)
|
inline u32 Get32BitColor(u16 offset, u16 x, u16 i)
|
||||||
{
|
{
|
||||||
u32* tmem32 = reinterpret_cast<u32*>(TMEM);
|
u32* tmem32 = reinterpret_cast<u32*>(TMEM);
|
||||||
return tmem32[((offset << 1) + (x ^ i)) & 0x3FF];
|
return tmem32[((offset << 1) + (x ^ i)) & LOAD_BLOCK32_MASK];
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 GetRGBA8888_RGBA8888(u16 offset, u16 x, u16 i, u8 palette)
|
u32 GetRGBA8888_RGBA8888(u16 offset, u16 x, u16 i, u8 palette)
|
||||||
|
@ -865,8 +865,8 @@ void _calcTileSizes(u32 _t, TileSizes & _sizes, gDPTile * _pLoadTile)
|
||||||
pTile->masks = pTile->originalMaskS;
|
pTile->masks = pTile->originalMaskS;
|
||||||
pTile->maskt = pTile->originalMaskT;
|
pTile->maskt = pTile->originalMaskT;
|
||||||
|
|
||||||
u32 tileWidth = ((pTile->lrs - pTile->uls) & 0x03FF) + 1;
|
u32 tileWidth = ((pTile->lrs - pTile->uls) & LOAD_BLOCK32_MASK) + 1;
|
||||||
u32 tileHeight = ((pTile->lrt - pTile->ult) & 0x03FF) + 1;
|
u32 tileHeight = ((pTile->lrt - pTile->ult) & LOAD_BLOCK32_MASK) + 1;
|
||||||
|
|
||||||
const u32 tMemMask = gDP.otherMode.textureLUT == G_TT_NONE ? 0x1FF : 0xFF;
|
const u32 tMemMask = gDP.otherMode.textureLUT == G_TT_NONE ? 0x1FF : 0xFF;
|
||||||
gDPLoadTileInfo &info = gDP.loadInfo[pTile->tmem & tMemMask];
|
gDPLoadTileInfo &info = gDP.loadInfo[pTile->tmem & tMemMask];
|
||||||
|
@ -1332,13 +1332,13 @@ void TextureCache::_getTextureDestData(CachedTexture& tmptex,
|
||||||
for (x = 0; x < tmptex.width; ++x) {
|
for (x = 0; x < tmptex.width; ++x) {
|
||||||
tx = min(x, clampSClamp) & maskSMask;
|
tx = min(x, clampSClamp) & maskSMask;
|
||||||
|
|
||||||
u32 taddr = ((tline + tx) ^ xorval) & 0x3ff;
|
u32 taddr = ((tline + tx) ^ xorval) & LOAD_BLOCK32_MASK;
|
||||||
#ifdef NATIVE
|
#ifdef NATIVE
|
||||||
gr = tmem16[taddr];
|
gr = tmem16[taddr];
|
||||||
ab = tmem16[taddr | 0x400];
|
ab = tmem16[taddr | LOAD_BLOCK32_MAX];
|
||||||
#else
|
#else
|
||||||
gr = swapword(tmem16[taddr]);
|
gr = swapword(tmem16[taddr]);
|
||||||
ab = swapword(tmem16[taddr | 0x400]);
|
ab = swapword(tmem16[taddr | LOAD_BLOCK32_MAX]);
|
||||||
#endif
|
#endif
|
||||||
pDest[j++] = (ab << 16) | gr;
|
pDest[j++] = (ab << 16) | gr;
|
||||||
}
|
}
|
||||||
|
|
56
src/gDP.cpp
56
src/gDP.cpp
|
@ -352,7 +352,7 @@ void gDPSetTileSize( u32 tile, u32 uls, u32 ult, u32 lrs, u32 lrt )
|
||||||
{
|
{
|
||||||
gDP.tiles[tile].uls = _SHIFTR( uls, 2, 10 );
|
gDP.tiles[tile].uls = _SHIFTR( uls, 2, 10 );
|
||||||
gDP.tiles[tile].ult = _SHIFTR( ult, 2, 10 );
|
gDP.tiles[tile].ult = _SHIFTR( ult, 2, 10 );
|
||||||
gDP.tiles[tile].lrs = _SHIFTR( lrs, 2, 10 );
|
gDP.tiles[tile].lrs = _SHIFTR( lrs, 2, 15 );
|
||||||
gDP.tiles[tile].lrt = _SHIFTR( lrt, 2, 10 );
|
gDP.tiles[tile].lrt = _SHIFTR( lrt, 2, 10 );
|
||||||
|
|
||||||
gDP.tiles[tile].fuls = _FIXED2FLOAT( uls, 2 );
|
gDP.tiles[tile].fuls = _FIXED2FLOAT( uls, 2 );
|
||||||
|
@ -478,13 +478,13 @@ void gDPLoadTile32b(u32 uls, u32 ult, u32 lrs, u32 lrt)
|
||||||
xorval = (j & 1) ? 3 : 1;
|
xorval = (j & 1) ? 3 : 1;
|
||||||
for (u32 i = 0; i < width; ++i) {
|
for (u32 i = 0; i < width; ++i) {
|
||||||
c = src[addr + s + i];
|
c = src[addr + s + i];
|
||||||
ptr = ((tline + i) ^ xorval) & 0x3ff;
|
ptr = ((tline + i) ^ xorval) & LOAD_BLOCK32_MASK;
|
||||||
#ifdef NATIVE
|
#ifdef NATIVE
|
||||||
tmem16[ptr | 0x400] = c >> 16;
|
tmem16[ptr | LOAD_BLOCK32_MAX] = c >> 16;
|
||||||
tmem16[ptr] = c & 0xffff;
|
tmem16[ptr] = c & 0xffff;
|
||||||
#else
|
#else
|
||||||
tmem16[ptr] = c >> 16;
|
tmem16[ptr] = c >> 16;
|
||||||
tmem16[ptr | 0x400] = c & 0xffff;
|
tmem16[ptr | LOAD_BLOCK32_MAX] = c & 0xffff;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -501,8 +501,8 @@ void gDPLoadTile(u32 tile, u32 uls, u32 ult, u32 lrs, u32 lrt)
|
||||||
if (gDP.loadTile->lrs < gDP.loadTile->uls || gDP.loadTile->lrt < gDP.loadTile->ult)
|
if (gDP.loadTile->lrs < gDP.loadTile->uls || gDP.loadTile->lrt < gDP.loadTile->ult)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const u32 width = (gDP.loadTile->lrs - gDP.loadTile->uls + 1) & 0x03FF;
|
const u32 width = (gDP.loadTile->lrs - gDP.loadTile->uls + 1) & LOAD_BLOCK32_MASK;
|
||||||
const u32 height = (gDP.loadTile->lrt - gDP.loadTile->ult + 1) & 0x03FF;
|
const u32 height = (gDP.loadTile->lrt - gDP.loadTile->ult + 1) & LOAD_BLOCK32_MASK;
|
||||||
const u32 bpl = gDP.loadTile->line << 3;
|
const u32 bpl = gDP.loadTile->line << 3;
|
||||||
|
|
||||||
u32 alignedWidth = width;
|
u32 alignedWidth = width;
|
||||||
|
@ -572,9 +572,9 @@ void gDPLoadTile(u32 tile, u32 uls, u32 ult, u32 lrs, u32 lrt)
|
||||||
if (address + bpl > RDRAMSize)
|
if (address + bpl > RDRAMSize)
|
||||||
UnswapCopyWrap(RDRAM, address, reinterpret_cast<u8*>(TMEM), tmemAddr << 3, 0xFFF, RDRAMSize - address);
|
UnswapCopyWrap(RDRAM, address, reinterpret_cast<u8*>(TMEM), tmemAddr << 3, 0xFFF, RDRAMSize - address);
|
||||||
else
|
else
|
||||||
UnswapCopyWrap(RDRAM, address, reinterpret_cast<u8*>(TMEM), tmemAddr << 3, 0xFFF, bpr);
|
UnswapCopyWrap(RDRAM, address, reinterpret_cast<u8*>(TMEM), tmemAddr << 3, (0x1000 * 8 - 1), bpr);
|
||||||
if (y & 1)
|
if (y & 1)
|
||||||
DWordInterleaveWrap(reinterpret_cast<u32*>(TMEM), tmemAddr << 1, 0x3FF, qwpr);
|
DWordInterleaveWrap(reinterpret_cast<u32*>(TMEM), tmemAddr << 1, LOAD_BLOCK32_MASK, qwpr);
|
||||||
|
|
||||||
address += gDP.textureImage.bpl;
|
address += gDP.textureImage.bpl;
|
||||||
if (address >= RDRAMSize)
|
if (address >= RDRAMSize)
|
||||||
|
@ -602,8 +602,10 @@ void gDPLoadBlock32(u32 uls,u32 lrs, u32 dxt)
|
||||||
u32 width = (lrs - uls + 1) << 2;
|
u32 width = (lrs - uls + 1) << 2;
|
||||||
if (width == 4) // lr_s == 0, 1x1 texture
|
if (width == 4) // lr_s == 0, 1x1 texture
|
||||||
width = 1;
|
width = 1;
|
||||||
else if (width & 7)
|
else if(width & 7)
|
||||||
width = (width & (~7U)) + 8;
|
{
|
||||||
|
//width = (width & (~7U)) + 8;
|
||||||
|
}
|
||||||
|
|
||||||
if (dxt != 0) {
|
if (dxt != 0) {
|
||||||
u32 j = 0;
|
u32 j = 0;
|
||||||
|
@ -617,36 +619,36 @@ void gDPLoadBlock32(u32 uls,u32 lrs, u32 dxt)
|
||||||
t = ((j >> 11) & 1) ? 3 : 1;
|
t = ((j >> 11) & 1) ? 3 : 1;
|
||||||
if (t != oldt)
|
if (t != oldt)
|
||||||
i += line;
|
i += line;
|
||||||
ptr = ((tb + i) ^ t) & 0x3ff;
|
ptr = ((tb + i) ^ t) & LOAD_BLOCK32_MASK;
|
||||||
c = src[addr + i];
|
c = src[addr + i];
|
||||||
#ifdef NATIVE
|
#ifdef NATIVE
|
||||||
tmem16[ptr | 0x400] = c >> 16;
|
tmem16[ptr | LOAD_BLOCK32_MAX] = c >> 16;
|
||||||
tmem16[ptr] = c & 0xffff;
|
tmem16[ptr] = c & 0xffff;
|
||||||
ptr = ((tb + i + 1) ^ t) & 0x3ff;
|
ptr = ((tb + i + 1) ^ t) & LOAD_BLOCK32_MASK;
|
||||||
c = src[addr + i + 1];
|
c = src[addr + i + 1];
|
||||||
tmem16[ptr | 0x400] = c >> 16;
|
tmem16[ptr | LOAD_BLOCK32_MAX] = c >> 16;
|
||||||
tmem16[ptr] = c & 0xffff;
|
tmem16[ptr] = c & 0xffff;
|
||||||
#else
|
#else
|
||||||
tmem16[ptr] = c >> 16;
|
tmem16[ptr] = c >> 16;
|
||||||
tmem16[ptr | 0x400] = c & 0xffff;
|
tmem16[ptr | LOAD_BLOCK32_MAX] = c & 0xffff;
|
||||||
ptr = ((tb + i + 1) ^ t) & 0x3ff;
|
ptr = ((tb + i + 1) ^ t) & LOAD_BLOCK32_MASK;
|
||||||
c = src[addr + i + 1];
|
c = src[addr + i + 1];
|
||||||
tmem16[ptr] = c >> 16;
|
tmem16[ptr] = c >> 16;
|
||||||
tmem16[ptr | 0x400] = c & 0xffff;
|
tmem16[ptr | LOAD_BLOCK32_MAX] = c & 0xffff;
|
||||||
#endif
|
#endif
|
||||||
j += dxt;
|
j += dxt;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
u32 c, ptr;
|
u32 c, ptr;
|
||||||
for (u32 i = 0; i < width; i++) {
|
for (u32 i = 0; i < width; i++) {
|
||||||
ptr = ((tb + i) ^ 1) & 0x3ff;
|
ptr = ((tb + i) ^ 1) & LOAD_BLOCK32_MASK;
|
||||||
c = src[addr + i];
|
c = src[addr + i];
|
||||||
#ifdef NATIVE
|
#ifdef NATIVE
|
||||||
tmem16[ptr | 0x400] = c >> 16;
|
tmem16[ptr | LOAD_BLOCK32_MAX] = c >> 16;
|
||||||
tmem16[ptr] = c & 0xffff;
|
tmem16[ptr] = c & 0xffff;
|
||||||
#else
|
#else
|
||||||
tmem16[ptr] = c >> 16;
|
tmem16[ptr] = c >> 16;
|
||||||
tmem16[ptr | 0x400] = c & 0xffff;
|
tmem16[ptr | LOAD_BLOCK32_MAX] = c & 0xffff;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -681,10 +683,10 @@ void gDPLoadBlock(u32 tile, u32 uls, u32 ult, u32 lrs, u32 dxt)
|
||||||
info.size = static_cast<u8>(gDP.textureImage.size);
|
info.size = static_cast<u8>(gDP.textureImage.size);
|
||||||
info.loadType = LOADTYPE_BLOCK;
|
info.loadType = LOADTYPE_BLOCK;
|
||||||
|
|
||||||
const u32 width = (lrs - uls + 1) & 0x0FFF;
|
const u32 width = (lrs - uls + 1);// & (0x1000 - 1);
|
||||||
u32 bytes = width << gDP.loadTile->size >> 1;
|
u32 bytes = width << gDP.loadTile->size >> 1;
|
||||||
if ((bytes & 7) != 0)
|
//if ((bytes & 7) != 0)
|
||||||
bytes = (bytes & (~7U)) + 8;
|
// bytes = (bytes & (~7U)) + 8;
|
||||||
|
|
||||||
info.bytes = bytes;
|
info.bytes = bytes;
|
||||||
word address = gDP.textureImage.address + ult * gDP.textureImage.bpl + (uls << gDP.textureImage.size >> 1);
|
word address = gDP.textureImage.address + ult * gDP.textureImage.bpl + (uls << gDP.textureImage.size >> 1);
|
||||||
|
@ -740,12 +742,12 @@ void gDPLoadBlock(u32 tile, u32 uls, u32 ult, u32 lrs, u32 dxt)
|
||||||
goto end_dxt_test;
|
goto end_dxt_test;
|
||||||
dxtCounter += dxt;
|
dxtCounter += dxt;
|
||||||
} while ((dxtCounter & 0x800) != 0);
|
} while ((dxtCounter & 0x800) != 0);
|
||||||
DWordInterleaveWrap(reinterpret_cast<u32*>(TMEM), tmemAddr << 1, 0x3FF, line);
|
DWordInterleaveWrap(reinterpret_cast<u32*>(TMEM), tmemAddr << 1, LOAD_BLOCK32_MASK, line);
|
||||||
tmemAddr += line;
|
tmemAddr += line;
|
||||||
line = 0;
|
line = 0;
|
||||||
}
|
}
|
||||||
end_dxt_test:
|
end_dxt_test:
|
||||||
DWordInterleaveWrap(reinterpret_cast<u32*>(TMEM), tmemAddr << 1, 0x3FF, line);
|
DWordInterleaveWrap(reinterpret_cast<u32*>(TMEM), tmemAddr << 1, LOAD_BLOCK32_MASK, line);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -769,10 +771,10 @@ void gDPLoadTLUT( u32 tile, u32 uls, u32 ult, u32 lrs, u32 lrt )
|
||||||
while (i < count) {
|
while (i < count) {
|
||||||
for (u16 j = 0; (j < 16) && (i < count); ++j, ++i) {
|
for (u16 j = 0; (j < 16) && (i < count); ++j, ++i) {
|
||||||
#ifdef NATIVE
|
#ifdef NATIVE
|
||||||
//dest[(destIdx | 0x0400) & 0x07FF] = *reinterpret_cast<u16*>(RDRAM + (address ^ 2));
|
//dest[(destIdx | LOAD_BLOCK32_MAX) & 0x07FF] = *reinterpret_cast<u16*>(RDRAM + (address ^ 2));
|
||||||
dest[(destIdx) & 0x07FF] = *reinterpret_cast<u16*>(RDRAM + (address));
|
dest[(destIdx) & 0x07FF] = *reinterpret_cast<u16*>(RDRAM + (address));
|
||||||
#else
|
#else
|
||||||
dest[(destIdx | 0x0400) & 0x07FF] = swapword(*reinterpret_cast<u16*>(RDRAM + (address ^ 2)));
|
dest[(destIdx | LOAD_BLOCK32_MAX) & 0x07FF] = swapword(*reinterpret_cast<u16*>(RDRAM + (address ^ 2)));
|
||||||
#endif
|
#endif
|
||||||
address += 2;
|
address += 2;
|
||||||
destIdx += 4;
|
destIdx += 4;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user