1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-02 09:03:37 +00:00

Implement load texture by dma offset.

Fixed menu in JFG.
This commit is contained in:
Sergey Lipskiy 2014-10-10 22:04:08 +07:00
parent a22483bc2f
commit 268278a6b0
8 changed files with 43 additions and 6 deletions

View File

@ -84,6 +84,11 @@ void F3DDKR_DMA_Offsets( u32 w0, u32 w1 )
gSPSetDMAOffsets( _SHIFTR( w0, 0, 24 ), _SHIFTR( w1, 0, 24 ) );
}
void F3DDKR_DMA_Tex_Offset(u32 w0, u32 w1)
{
gSPSetDMATexOffset(w1);
}
void F3DDKR_MoveWord( u32 w0, u32 w1 )
{
switch (_SHIFTR( w0, 0, 8 ))
@ -111,6 +116,7 @@ void F3DDKR_Init()
// GBI Command Command Value Command Function
GBI_SetGBI( G_SPNOOP, F3D_SPNOOP, F3D_SPNoOp );
GBI_SetGBI( G_DMA_MTX, F3DDKR_DMA_MTX, F3DDKR_DMA_Mtx );
GBI_SetGBI( G_DMA_TEX_OFFSET, F3DDKR_DMA_TEX_OFFSET, F3DDKR_DMA_Tex_Offset );
GBI_SetGBI( G_MOVEMEM, F3D_MOVEMEM, F3D_MoveMem );
GBI_SetGBI( G_DMA_VTX, F3DDKR_DMA_VTX, F3DDKR_DMA_Vtx );
GBI_SetGBI( G_DL, F3D_DL, F3D_DList );

View File

@ -4,6 +4,7 @@
#define F3DDKR_VTX_APPEND 0x00010000
#define F3DDKR_DMA_MTX 0x01
#define F3DDKR_DMA_TEX_OFFSET 0x02
#define F3DDKR_DMA_VTX 0x04
#define F3DDKR_DMA_TRI 0x05
#define F3DDKR_DMA_DL 0x07

View File

@ -47,7 +47,7 @@ u32 G_MOVEMEM, G_MOVEWORD;
u32 G_MTX, G_POPMTX;
u32 G_GEOMETRYMODE, G_SETGEOMETRYMODE, G_CLEARGEOMETRYMODE;
u32 G_TEXTURE;
u32 G_DMA_IO, G_DMA_DL, G_DMA_TRI, G_DMA_MTX, G_DMA_VTX, G_DMA_OFFSETS;
u32 G_DMA_IO, G_DMA_DL, G_DMA_TRI, G_DMA_MTX, G_DMA_VTX, G_DMA_TEX_OFFSET, G_DMA_OFFSETS;
u32 G_SPECIAL_1, G_SPECIAL_2, G_SPECIAL_3;
u32 G_VTX, G_MODIFYVTX, G_VTXCOLORBASE;
u32 G_TRI1, G_TRI2, G_TRI4;

2
GBI.h
View File

@ -575,7 +575,7 @@ extern u32 G_MOVEMEM, G_MOVEWORD;
extern u32 G_MTX, G_POPMTX;
extern u32 G_GEOMETRYMODE, G_SETGEOMETRYMODE, G_CLEARGEOMETRYMODE;
extern u32 G_TEXTURE;
extern u32 G_DMA_IO, G_DMA_DL, G_DMA_TRI, G_DMA_MTX, G_DMA_VTX, G_DMA_OFFSETS;
extern u32 G_DMA_IO, G_DMA_DL, G_DMA_TRI, G_DMA_MTX, G_DMA_VTX, G_DMA_TEX_OFFSET, G_DMA_OFFSETS;
extern u32 G_SPECIAL_1, G_SPECIAL_2, G_SPECIAL_3;
extern u32 G_VTX, G_MODIFYVTX, G_VTXCOLORBASE;
extern u32 G_TRI1, G_TRI2, G_TRI4;

View File

@ -263,6 +263,8 @@ void RSP_Init()
RSP.uc_start = RSP.uc_dstart = 0;
RSP.bLLE = false;
memset(&gSP, 0, sizeof(gSPInfo));
gDP.loadTile = &gDP.tiles[7];
gSP.textureTile[0] = &gDP.tiles[0];
gSP.textureTile[1] = &gDP.tiles[1];

26
gDP.cpp
View File

@ -303,14 +303,24 @@ void gDPSetColorImage( u32 format, u32 size, u32 width, u32 address )
#endif
}
void gDPSetTextureImage( u32 format, u32 size, u32 width, u32 address )
void gDPSetTextureImage(u32 format, u32 size, u32 width, u32 address)
{
gDP.textureImage.format = format;
gDP.textureImage.size = size;
gDP.textureImage.width = width;
gDP.textureImage.address = RSP_SegmentToPhysical( address );
gDP.textureImage.address = RSP_SegmentToPhysical(address);
gDP.textureImage.bpl = gDP.textureImage.width << gDP.textureImage.size >> 1;
if (gSP.DMAOffsets.tex_offset != 0) {
if (format == G_IM_FMT_RGBA) {
u16 * t = (u16*)(RDRAM + gSP.DMAOffsets.tex_offset);
gSP.DMAOffsets.tex_shift = t[gSP.DMAOffsets.tex_count ^ 1];
gDP.textureImage.address += gSP.DMAOffsets.tex_shift;
} else {
gSP.DMAOffsets.tex_offset = 0;
gSP.DMAOffsets.tex_shift = 0;
gSP.DMAOffsets.tex_count = 0;
}
}
#ifdef DEBUG
DebugMsg( DEBUG_HIGH | DEBUG_HANDLED | DEBUG_TEXTURE, "gDPSetTextureImage( %s, %s, %i, 0x%08X );\n",
ImageFormatText[gDP.textureImage.format],
@ -622,6 +632,16 @@ void gDPLoadBlock( u32 tile, u32 uls, u32 ult, u32 lrs, u32 dxt )
gDPSetTileSize( tile, uls, ult, lrs, dxt );
gDP.loadTile = &gDP.tiles[tile];
gDP.loadTile->loadType = LOADTYPE_BLOCK;
if (gSP.DMAOffsets.tex_offset != 0) {
if (gSP.DMAOffsets.tex_shift % (((lrs>>2) + 1) << 3)) {
gDP.textureImage.address -= gSP.DMAOffsets.tex_shift;
gSP.DMAOffsets.tex_offset = 0;
gSP.DMAOffsets.tex_shift = 0;
gSP.DMAOffsets.tex_count = 0;
} else
++gSP.DMAOffsets.tex_count;
}
gDP.loadTile->imageAddress = gDP.textureImage.address;
u32 bytes = (lrs + 1) << gDP.loadTile->size >> 1;

View File

@ -967,6 +967,13 @@ void gSPSetDMAOffsets( u32 mtxoffset, u32 vtxoffset )
#endif
}
void gSPSetDMATexOffset(u32 _addr)
{
gSP.DMAOffsets.tex_offset = RSP_SegmentToPhysical(_addr);
gSP.DMAOffsets.tex_shift = 0;
gSP.DMAOffsets.tex_count = 0;
}
void gSPSetVertexColorBase( u32 base )
{
gSP.vertexColorBase = RSP_SegmentToPhysical( base );

3
gSP.h
View File

@ -143,7 +143,7 @@ struct gSPInfo
struct
{
u32 vtx, mtx;
u32 vtx, mtx, tex_offset, tex_shift, tex_count;
} DMAOffsets;
};
@ -196,6 +196,7 @@ void gSPBgRectCopy( u32 bg );
void gSPObjMatrix( u32 mtx );
void gSPObjSubMatrix( u32 mtx );
void gSPSetDMAOffsets( u32 mtxoffset, u32 vtxoffset );
void gSPSetDMATexOffset(u32 _addr);
void gSPSetVertexColorBase( u32 base );
void gSPProcessVertex(u32 v);