From 268278a6b07c0e1e34c0938f21da9fb168784d3c Mon Sep 17 00:00:00 2001 From: Sergey Lipskiy Date: Fri, 10 Oct 2014 22:04:08 +0700 Subject: [PATCH] Implement load texture by dma offset. Fixed menu in JFG. --- F3DDKR.cpp | 6 ++++++ F3DDKR.h | 1 + GBI.cpp | 2 +- GBI.h | 2 +- RSP.cpp | 2 ++ gDP.cpp | 26 +++++++++++++++++++++++--- gSP.cpp | 7 +++++++ gSP.h | 3 ++- 8 files changed, 43 insertions(+), 6 deletions(-) diff --git a/F3DDKR.cpp b/F3DDKR.cpp index 6f7f1446..af783624 100644 --- a/F3DDKR.cpp +++ b/F3DDKR.cpp @@ -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 ); diff --git a/F3DDKR.h b/F3DDKR.h index e6381170..a4b8cf30 100644 --- a/F3DDKR.h +++ b/F3DDKR.h @@ -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 diff --git a/GBI.cpp b/GBI.cpp index 909cbe36..d9e611cd 100644 --- a/GBI.cpp +++ b/GBI.cpp @@ -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; diff --git a/GBI.h b/GBI.h index a8f64600..c0973ad7 100644 --- a/GBI.h +++ b/GBI.h @@ -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; diff --git a/RSP.cpp b/RSP.cpp index eefe5365..2efbb791 100644 --- a/RSP.cpp +++ b/RSP.cpp @@ -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]; diff --git a/gDP.cpp b/gDP.cpp index 89a5f774..688c70f1 100644 --- a/gDP.cpp +++ b/gDP.cpp @@ -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; diff --git a/gSP.cpp b/gSP.cpp index 9b6cedfa..f35915a1 100644 --- a/gSP.cpp +++ b/gSP.cpp @@ -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 ); diff --git a/gSP.h b/gSP.h index 0e219e89..b3357951 100644 --- a/gSP.h +++ b/gSP.h @@ -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);