Added bilinear filtering to Naomi video emulation. Textures are still a bit crawly since we're always using the lowest MIP level. [MooglyGuy]

This commit is contained in:
Ryan Holtz 2009-05-09 07:09:52 +00:00
parent 09d58a6c7f
commit 5932d858db

View File

@ -50,7 +50,7 @@ static void testdrawscreen(const running_machine *machine,bitmap_t *bitmap,const
typedef struct texinfo {
UINT32 address, vqbase;
int sizex, sizey, sizes, pf, palette, mode, mipmapped, blend_mode;
int sizex, sizey, sizes, pf, palette, mode, mipmapped, blend_mode, filter_mode, flip_u, flip_v;
UINT32 (*r)(struct texinfo *t, float x, float y);
UINT32 (*blend)(UINT32 s, UINT32 d);
@ -98,8 +98,54 @@ typedef struct {
UINT32 depthcomparemode,cullingmode,zwritedisable,cachebypass,dcalcctrl,volumeinstruction,mipmapped,vqcompressed,strideselect,paletteselector;
} pvrta_state;
enum
{
TEX_FILTER_NEAREST = 0,
TEX_FILTER_BILINEAR,
TEX_FILTER_TRILINEAR_A,
TEX_FILTER_TRILINEAR_B
};
static pvrta_state state_ta;
// Perform a standard bilinear filter across four pixels
INLINE INT32 clamp(INT32 in, INT32 min, INT32 max)
{
if(in < min) return min;
if(in > max) return max;
return in;
}
INLINE UINT32 bilinear_filter(UINT32 c0, UINT32 c1, UINT32 c2, UINT32 c3, float u, float v)
{
float u_ratio = (float)((float)u - (int)u);
float v_ratio = (float)((float)v - (int)v);
float u_opposite = 1.0f - u_ratio;
float v_opposite = 1.0f - v_ratio;
UINT32 channel = 0;
UINT32 out = 0;
if(u < 0.0f)
{
u_opposite = 0.0f - u_ratio;
u_ratio = 1.0f + u_ratio;
}
if(v < 0.0f)
{
v_opposite = 0.0f - v_ratio;
v_ratio = 1.0f + v_ratio;
}
for(channel = 0; channel < 4; channel++)
{
INT32 p0 = (c0 >> (channel << 3)) & 0x000000ff;
INT32 p1 = (c1 >> (channel << 3)) & 0x000000ff;
INT32 p2 = (c2 >> (channel << 3)) & 0x000000ff;
INT32 p3 = (c3 >> (channel << 3)) & 0x000000ff;
out |= (UINT8)clamp((p0 * u_opposite + p1 * u_ratio) * v_opposite +
(p3 * u_opposite + p2 * u_ratio) * v_ratio, 0, 255) << (channel << 3);
}
return out;
}
// Multiply with alpha value in bits 31-24
INLINE UINT32 bla(UINT32 c, UINT32 a)
{
@ -566,6 +612,9 @@ static void tex_get_info(texinfo *t, pvrta_state *sa)
t->mipmapped = sa->mipmapped;
t->palette = sa->paletteselector;
t->blend_mode = sa->blend_mode;
t->filter_mode = sa->filtermode;
t->flip_u = (sa->flipuv >> 1) & 1;
t->flip_v = sa->flipuv & 1;
t->r = tex_r_default;
t->cd = dilatechose[t->sizes];
@ -1531,7 +1580,25 @@ void render_hline(bitmap_t *bitmap, texinfo *ti, int y, float xl, float xr, floa
float u = ul/wl;
float v = vl/wl;
/*
if(ti->flip_u)
{
u = ti->sizex - u;
}
if(ti->flip_v)
{
v = ti->sizey - v;
}*/
c = ti->r(ti, u, v);
if(ti->filter_mode == TEX_FILTER_BILINEAR)
{
UINT32 c1 = ti->r(ti, u+1.0, v);
UINT32 c2 = ti->r(ti, u+1.0, v+1.0);
UINT32 c3 = ti->r(ti, u, v+1.0);
c = bilinear_filter(c, c1, c2, c3, u, v);
}
if(c & 0xff000000) {
*tdata = ti->blend(c, *tdata);