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

Add support for non-gsSPTextureRectangle.

This commit is contained in:
Sergey Lipskiy 2014-12-12 15:41:37 +06:00
parent 90020ee4bf
commit 625e439992

95
RDP.cpp
View File

@ -1,3 +1,4 @@
#include <assert.h>
#include <memory.h>
#include "N64.h"
#include "RSP.h"
@ -223,52 +224,84 @@ void RDP_LoadSync( u32 w0, u32 w1 )
gDPLoadSync();
}
void RDP_TexRectFlip( u32 w0, u32 w1 )
static
void _getTexRectParams(u32 & w2, u32 & w3)
{
u32 w2, w3;
if (RSP.bLLE) {
w2 = RDP.w2;
w3 = RDP.w3;
} else {
return;
}
enum {
gspTexRect,
gdpTexRect,
halfTexRect
} texRectMode = gdpTexRect;
const u32 cmd1 = (*(u32*)&RDRAM[RSP.PC[RSP.PCi] + 0]) >> 24;
const u32 cmd2 = (*(u32*)&RDRAM[RSP.PC[RSP.PCi] + 8]) >> 24;
if (cmd1 == G_RDPHALF_1) {
if (cmd2 == G_RDPHALF_2)
texRectMode = gspTexRect;
} else if (cmd1 == 0xB3) {
if (cmd2 == 0xB2)
texRectMode = gspTexRect;
else
texRectMode = halfTexRect;
}
switch (texRectMode) {
case gspTexRect:
w2 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4];
RSP.PC[RSP.PCi] += 8;
w3 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4];
RSP.PC[RSP.PCi] += 8;
break;
case gdpTexRect:
w2 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 0];
w3 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4];
RSP.PC[RSP.PCi] += 8;
break;
case halfTexRect:
w2 = 0;
w3 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4];
RSP.PC[RSP.PCi] += 8;
break;
default:
assert(false && "Unknown texrect mode");
}
gDPTextureRectangleFlip( _FIXED2FLOAT( _SHIFTR( w1, 12, 12 ), 2 ), // ulx
_FIXED2FLOAT( _SHIFTR( w1, 0, 12 ), 2 ), // uly
_FIXED2FLOAT( _SHIFTR( w0, 12, 12 ), 2 ), // lrx
_FIXED2FLOAT( _SHIFTR( w0, 0, 12 ), 2 ), // lry
_SHIFTR( w1, 24, 3 ), // tile
_FIXED2FLOAT( (s16)_SHIFTR( w2, 16, 16 ), 5 ), // s
_FIXED2FLOAT( (s16)_SHIFTR( w2, 0, 16 ), 5 ), // t
_FIXED2FLOAT( (s16)_SHIFTR( w3, 16, 16 ), 10 ), // dsdx
_FIXED2FLOAT( (s16)_SHIFTR( w3, 0, 16 ), 10 ) ); // dsdy
}
void RDP_TexRectFlip( u32 w0, u32 w1 )
{
u32 w2, w3;
_getTexRectParams(w2, w3);
gDPTextureRectangleFlip(_FIXED2FLOAT(_SHIFTR(w1, 12, 12), 2),// ulx
_FIXED2FLOAT(_SHIFTR(w1, 0, 12), 2), // uly
_FIXED2FLOAT(_SHIFTR(w0, 12, 12), 2), // lrx
_FIXED2FLOAT(_SHIFTR(w0, 0, 12), 2), // lry
_SHIFTR(w1, 24, 3), // tile
_FIXED2FLOAT((s16)_SHIFTR(w2, 16, 16), 5), // s
_FIXED2FLOAT((s16)_SHIFTR(w2, 0, 16), 5), // t
_FIXED2FLOAT((s16)_SHIFTR(w3, 16, 16), 10), // dsdx
_FIXED2FLOAT((s16)_SHIFTR(w3, 0, 16), 10)); // dsdy
}
void RDP_TexRect( u32 w0, u32 w1 )
{
u32 w2, w3;
if (RSP.bLLE) {
w2 = RDP.w2;
w3 = RDP.w3;
} else {
w2 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4];
RSP.PC[RSP.PCi] += 8;
w3 = *(u32*)&RDRAM[RSP.PC[RSP.PCi] + 4];
RSP.PC[RSP.PCi] += 8;
}
gDPTextureRectangle( _FIXED2FLOAT( _SHIFTR( w1, 12, 12 ), 2 ), // ulx
_FIXED2FLOAT( _SHIFTR( w1, 0, 12 ), 2 ), // uly
_FIXED2FLOAT( _SHIFTR( w0, 12, 12 ), 2 ), // lrx
_FIXED2FLOAT( _SHIFTR( w0, 0, 12 ), 2 ), // lry
_SHIFTR( w1, 24, 3 ), // tile
_FIXED2FLOAT( (s16)_SHIFTR( w2, 16, 16 ), 5 ), // s
_FIXED2FLOAT( (s16)_SHIFTR( w2, 0, 16 ), 5 ), // t
_FIXED2FLOAT( (s16)_SHIFTR( w3, 16, 16 ), 10 ), // dsdx
_FIXED2FLOAT( (s16)_SHIFTR( w3, 0, 16 ), 10 ) ); // dsdy
_getTexRectParams(w2, w3);
gDPTextureRectangle(_FIXED2FLOAT(_SHIFTR(w1, 12, 12), 2),// ulx
_FIXED2FLOAT(_SHIFTR(w1, 0, 12), 2), // uly
_FIXED2FLOAT(_SHIFTR(w0, 12, 12), 2), // lrx
_FIXED2FLOAT(_SHIFTR(w0, 0, 12), 2), // lry
_SHIFTR(w1, 24, 3), // tile
_FIXED2FLOAT((s16)_SHIFTR(w2, 16, 16), 5), // s
_FIXED2FLOAT((s16)_SHIFTR(w2, 0, 16), 5), // t
_FIXED2FLOAT((s16)_SHIFTR(w3, 16, 16), 10), // dsdx
_FIXED2FLOAT((s16)_SHIFTR(w3, 0, 16), 10)); // dsdy
}
void RDP_TriFill( u32 _w0, u32 _w1 )