pvr: reset face and offset colors when not set in poly param

Fixes black ice in NHL 2K2 and black players in NHL 2K
Clean up
Don't build soft renderer
This commit is contained in:
Flyinghead 2019-09-21 22:53:09 +02:00
parent 69041912e3
commit 537c2a4ed6
7 changed files with 62 additions and 38 deletions

View File

@ -225,10 +225,6 @@ static NOINLINE void DYNACALL ta_handle_cmd(u32 trans)
ta_fsm_cl=dat->pcw.ListType; ta_fsm_cl=dat->pcw.ListType;
//printf("List %d ended\n",ta_fsm_cl); //printf("List %d ended\n",ta_fsm_cl);
if (ta_fsm_cl==ListType_Translucent)
{
//ta_tad.early=os_GetSeconds();
}
asic_RaiseInterrupt( ListEndInterrupt[ta_fsm_cl]); asic_RaiseInterrupt( ListEndInterrupt[ta_fsm_cl]);
ta_fsm_cl=7; ta_fsm_cl=7;
trans=TAS_NS; trans=TAS_NS;
@ -271,6 +267,7 @@ void ta_vtx_ListCont()
ta_tad.Continue(); ta_tad.Continue();
ta_cur_state=TAS_NS; ta_cur_state=TAS_NS;
ta_fsm_cl = 7;
} }
void ta_vtx_ListInit() void ta_vtx_ListInit()
{ {
@ -278,6 +275,7 @@ void ta_vtx_ListInit()
ta_tad.ClearPartial(); ta_tad.ClearPartial();
ta_cur_state=TAS_NS; ta_cur_state=TAS_NS;
ta_fsm_cl = 7;
} }
void ta_vtx_SoftReset() void ta_vtx_SoftReset()
{ {

View File

@ -118,8 +118,6 @@ struct rend_context
bool isRTT; bool isRTT;
bool isRenderFramebuffer; bool isRenderFramebuffer;
double early;
FB_X_CLIP_type fb_X_CLIP; FB_X_CLIP_type fb_X_CLIP;
FB_Y_CLIP_type fb_Y_CLIP; FB_Y_CLIP_type fb_Y_CLIP;
@ -152,7 +150,14 @@ struct rend_context
Overrun=false; Overrun=false;
fZ_min= 1000000.0f; fZ_min= 1000000.0f;
fZ_max= 1.0f; fZ_max= 1.0f;
isRTT = false;
isRenderFramebuffer = false; isRenderFramebuffer = false;
fb_X_CLIP.min = 0;
fb_X_CLIP.max = 639;
fb_Y_CLIP.min = 0;
fb_Y_CLIP.max = 479;
fog_clamp_min = 0;
fog_clamp_max = 0xffffffff;
} }
}; };

View File

@ -82,7 +82,7 @@ typedef void TACALL TaPolyParamFP(void* ptr);
static TaListFP* TaCmd; static TaListFP* TaCmd;
static u32 CurrentList; static u32 CurrentList;
static TaListFP* VerxexDataFP; static TaListFP* VertexDataFP;
static bool ListIsFinished[5]; static bool ListIsFinished[5];
static f32 f16(u16 v) static f32 f16(u16 v)
@ -363,7 +363,7 @@ public:
//printf("End list %X\n",CurrentList); //printf("End list %X\n",CurrentList);
ListIsFinished[CurrentList]=true; ListIsFinished[CurrentList]=true;
CurrentList=ListType_None; CurrentList=ListType_None;
VerxexDataFP=NullVertexData; VertexDataFP = NullVertexData;
data+=SZ32; data+=SZ32;
TA_EOL; TA_EOL;
} }
@ -403,7 +403,7 @@ public:
{ {
//accept mod data //accept mod data
StartModVol((TA_ModVolParam*)data); StartModVol((TA_ModVolParam*)data);
VerxexDataFP=ta_mod_vol_data; VertexDataFP = ta_mod_vol_data;
data+=SZ32; data+=SZ32;
} }
else else
@ -414,7 +414,7 @@ public:
u32 pdid=(u8)(uid); u32 pdid=(u8)(uid);
u32 ppid=(u8)(uid>>8); u32 ppid=(u8)(uid>>8);
VerxexDataFP=ta_poly_data_lut[pdid]; VertexDataFP = ta_poly_data_lut[pdid];
if (data != data_end || psz==1) if (data != data_end || psz==1)
@ -447,7 +447,7 @@ public:
if (CurrentList==ListType_None) if (CurrentList==ListType_None)
ta_list_start(data->pcw.ListType); //start a list ;) ta_list_start(data->pcw.ListType); //start a list ;)
VerxexDataFP=ta_sprite_data; VertexDataFP = ta_sprite_data;
//printf("Sprite \n"); //printf("Sprite \n");
AppendSpriteParam((TA_SpriteParam*)data); AppendSpriteParam((TA_SpriteParam*)data);
data+=SZ32; data+=SZ32;
@ -459,9 +459,9 @@ public:
//log ("vtx"); //log ("vtx");
{ {
//printf("VTX:0x%08X\n",VerxexDataFP); //printf("VTX:0x%08X\n", VertexDataFP);
//verify(VerxexDataFP!=NullVertexData); //verify(VertexDataFP != NullVertexData);
data=VerxexDataFP(data,data_end); data = VertexDataFP(data, data_end);
} }
break; break;
@ -499,7 +499,7 @@ public:
ta_type_lut[i]=rv; ta_type_lut[i]=rv;
} }
VerxexDataFP = NullVertexData; VertexDataFP = NullVertexData;
} }
/* /*
Volume,Col_Type,Texture,Offset,Gouraud,16bit_UV Volume,Col_Type,Texture,Offset,Gouraud,16bit_UV
@ -686,6 +686,16 @@ public:
CurrentList = ListType_None; CurrentList = ListType_None;
ListIsFinished[0] = ListIsFinished[1] = ListIsFinished[2] = ListIsFinished[3] = ListIsFinished[4] = false; ListIsFinished[0] = ListIsFinished[1] = ListIsFinished[2] = ListIsFinished[3] = ListIsFinished[4] = false;
tileclip_val = 0; tileclip_val = 0;
VertexDataFP = NullVertexData;
memset(FaceBaseColor, 0, sizeof(FaceBaseColor));
memset(FaceOffsColor, 0, sizeof(FaceOffsColor));
memset(FaceBaseColor1, 0, sizeof(FaceBaseColor1));
memset(FaceOffsColor1, 0, sizeof(FaceOffsColor1));
SFaceBaseColor = 0;
SFaceOffsColor = 0;
lmr = NULL;
CurrentPP = NULL;
CurrentPPlist = NULL;
} }
__forceinline __forceinline
@ -778,14 +788,20 @@ public:
#define poly_float_color(to,src) \ #define poly_float_color(to,src) \
poly_float_color_(to,pp->src##A,pp->src##R,pp->src##G,pp->src##B) poly_float_color_(to,pp->src##A,pp->src##R,pp->src##G,pp->src##B)
//poly param handling // Poly param handling
// Packed/Floating Color
__forceinline __forceinline
static void TACALL AppendPolyParam0(void* vpp) static void TACALL AppendPolyParam0(void* vpp)
{ {
TA_PolyParam0* pp=(TA_PolyParam0*)vpp; TA_PolyParam0* pp=(TA_PolyParam0*)vpp;
glob_param_bdc(pp); glob_param_bdc(pp);
memset(FaceBaseColor, 0xff, sizeof(FaceBaseColor));
memset(FaceOffsColor, 0xff, sizeof(FaceOffsColor));
} }
// Intensity, no Offset Color
__forceinline __forceinline
static void TACALL AppendPolyParam1(void* vpp) static void TACALL AppendPolyParam1(void* vpp)
{ {
@ -793,7 +809,10 @@ public:
glob_param_bdc(pp); glob_param_bdc(pp);
poly_float_color(FaceBaseColor,FaceColor); poly_float_color(FaceBaseColor,FaceColor);
memset(FaceOffsColor, 0xff, sizeof(FaceOffsColor));
} }
// Intensity, use Offset Color
__forceinline __forceinline
static void TACALL AppendPolyParam2A(void* vpp) static void TACALL AppendPolyParam2A(void* vpp)
{ {
@ -801,6 +820,7 @@ public:
glob_param_bdc(pp); glob_param_bdc(pp);
} }
__forceinline __forceinline
static void TACALL AppendPolyParam2B(void* vpp) static void TACALL AppendPolyParam2B(void* vpp)
{ {
@ -809,18 +829,26 @@ public:
poly_float_color(FaceBaseColor,FaceColor); poly_float_color(FaceBaseColor,FaceColor);
poly_float_color(FaceOffsColor,FaceOffset); poly_float_color(FaceOffsColor,FaceOffset);
} }
// Packed Color, with Two Volumes
__forceinline __forceinline
static void TACALL AppendPolyParam3(void* vpp) static void TACALL AppendPolyParam3(void* vpp)
{ {
TA_PolyParam3* pp=(TA_PolyParam3*)vpp; TA_PolyParam3* pp=(TA_PolyParam3*)vpp;
glob_param_bdc(pp); glob_param_bdc(pp);
memset(FaceBaseColor, 0xff, sizeof(FaceBaseColor));
memset(FaceOffsColor, 0xff, sizeof(FaceOffsColor));
memset(FaceBaseColor1, 0xff, sizeof(FaceBaseColor1));
memset(FaceOffsColor1, 0xff, sizeof(FaceOffsColor1));
CurrentPP->tsp1.full = pp->tsp1.full; CurrentPP->tsp1.full = pp->tsp1.full;
CurrentPP->tcw1.full = pp->tcw1.full; CurrentPP->tcw1.full = pp->tcw1.full;
if (pp->pcw.Texture) if (pp->pcw.Texture)
CurrentPP->texid1 = renderer->GetTexture(pp->tsp1, pp->tcw1); CurrentPP->texid1 = renderer->GetTexture(pp->tsp1, pp->tcw1);
} }
// Intensity, with Two Volumes
__forceinline __forceinline
static void TACALL AppendPolyParam4A(void* vpp) static void TACALL AppendPolyParam4A(void* vpp)
{ {
@ -833,6 +861,7 @@ public:
if (pp->pcw.Texture) if (pp->pcw.Texture)
CurrentPP->texid1 = renderer->GetTexture(pp->tsp1, pp->tcw1); CurrentPP->texid1 = renderer->GetTexture(pp->tsp1, pp->tcw1);
} }
__forceinline __forceinline
static void TACALL AppendPolyParam4B(void* vpp) static void TACALL AppendPolyParam4B(void* vpp)
{ {
@ -840,6 +869,8 @@ public:
poly_float_color(FaceBaseColor, FaceColor0); poly_float_color(FaceBaseColor, FaceColor0);
poly_float_color(FaceBaseColor1, FaceColor1); poly_float_color(FaceBaseColor1, FaceColor1);
memset(FaceOffsColor, 0xff, sizeof(FaceOffsColor));
memset(FaceOffsColor1, 0xff, sizeof(FaceOffsColor1));
} }
//Poly Strip handling //Poly Strip handling

View File

@ -260,7 +260,7 @@ struct TextureCacheData
u32 w,h; //width & height of the texture u32 w,h; //width & height of the texture
u32 size; //size, in bytes, in vram u32 size; //size, in bytes, in vram
PvrTexInfo* tex; const PvrTexInfo* tex;
TexConvFP* texconv; TexConvFP* texconv;
TexConvFP32* texconv32; TexConvFP32* texconv32;

View File

@ -47,7 +47,7 @@ struct PvrTexInfo
TexConvFP32 *VQ32; TexConvFP32 *VQ32;
}; };
PvrTexInfo format[8]= static const PvrTexInfo format[8] =
{ // name bpp GL format Planar Twiddled VQ Planar(32b) Twiddled(32b) VQ (32b) { // name bpp GL format Planar Twiddled VQ Planar(32b) Twiddled(32b) VQ (32b)
{"1555", 16, GL_UNSIGNED_SHORT_5_5_5_1, tex1555_PL, tex1555_TW, tex1555_VQ, tex1555_PL32, tex1555_TW32, tex1555_VQ32 }, //1555 {"1555", 16, GL_UNSIGNED_SHORT_5_5_5_1, tex1555_PL, tex1555_TW, tex1555_VQ, tex1555_PL32, tex1555_TW32, tex1555_VQ32 }, //1555
{"565", 16, GL_UNSIGNED_SHORT_5_6_5, tex565_PL, tex565_TW, tex565_VQ, tex565_PL32, tex565_TW32, tex565_VQ32 }, //565 {"565", 16, GL_UNSIGNED_SHORT_5_6_5, tex565_PL, tex565_TW, tex565_VQ, tex565_PL32, tex565_TW32, tex565_VQ32 }, //565
@ -59,7 +59,7 @@ PvrTexInfo format[8]=
{"ns/1555", 0}, // Not supported (1555) {"ns/1555", 0}, // Not supported (1555)
}; };
const u32 MipPoint[8] = static const u32 MipPoint[8] =
{ {
0x00006,//8 0x00006,//8
0x00016,//16 0x00016,//16
@ -71,10 +71,10 @@ const u32 MipPoint[8] =
0x15556//1024 0x15556//1024
}; };
const GLuint PAL_TYPE[4]= static const GLuint PAL_TYPE[4]=
{GL_UNSIGNED_SHORT_5_5_5_1,GL_UNSIGNED_SHORT_5_6_5,GL_UNSIGNED_SHORT_4_4_4_4, GL_UNSIGNED_BYTE}; {GL_UNSIGNED_SHORT_5_5_5_1,GL_UNSIGNED_SHORT_5_6_5,GL_UNSIGNED_SHORT_4_4_4_4, GL_UNSIGNED_BYTE};
CustomTexture custom_texture; static CustomTexture custom_texture;
static void dumpRtTexture(u32 name, u32 w, u32 h) { static void dumpRtTexture(u32 name, u32 w, u32 h) {
char sname[256]; char sname[256];
@ -470,12 +470,10 @@ bool TextureCacheData::Delete()
return true; return true;
} }
static map<u64,TextureCacheData> TexCache;
#include <map>
map<u64,TextureCacheData> TexCache;
typedef map<u64,TextureCacheData>::iterator TexCacheIter; typedef map<u64,TextureCacheData>::iterator TexCacheIter;
TextureCacheData *getTextureCacheData(TSP tsp, TCW tcw); static TextureCacheData *getTextureCacheData(TSP tsp, TCW tcw);
void BindRTT(u32 addy, u32 fbw, u32 fbh, u32 channels, u32 fmt) void BindRTT(u32 addy, u32 fbw, u32 fbh, u32 channels, u32 fmt)
{ {
@ -704,11 +702,11 @@ static float LastTexCacheStats;
// Only use TexU and TexV from TSP in the cache key // Only use TexU and TexV from TSP in the cache key
// TexV : 7, TexU : 7 // TexV : 7, TexU : 7
const TSP TSPTextureCacheMask = { { 7, 7 } }; static const TSP TSPTextureCacheMask = { { 7, 7 } };
// TexAddr : 0x1FFFFF, Reserved : 0, StrideSel : 0, ScanOrder : 1, PixelFmt : 7, VQ_Comp : 1, MipMapped : 1 // TexAddr : 0x1FFFFF, Reserved : 0, StrideSel : 0, ScanOrder : 1, PixelFmt : 7, VQ_Comp : 1, MipMapped : 1
const TCW TCWTextureCacheMask = { { 0x1FFFFF, 0, 0, 1, 7, 1, 1 } }; static const TCW TCWTextureCacheMask = { { 0x1FFFFF, 0, 0, 1, 7, 1, 1 } };
TextureCacheData *getTextureCacheData(TSP tsp, TCW tcw) { static TextureCacheData *getTextureCacheData(TSP tsp, TCW tcw) {
u64 key = tsp.full & TSPTextureCacheMask.full; u64 key = tsp.full & TSPTextureCacheMask.full;
if (tcw.PixelFmt == PixelPal4 || tcw.PixelFmt == PixelPal8) if (tcw.PixelFmt == PixelPal4 || tcw.PixelFmt == PixelPal8)
// Paletted textures have a palette selection that must be part of the key // Paletted textures have a palette selection that must be part of the key

View File

@ -712,7 +712,6 @@ static bool dc_unserialize_libretro(void **data, unsigned int *total_size)
REICAST_US(i); // SFaceBaseColor REICAST_US(i); // SFaceBaseColor
REICAST_US(i); // SFaceOffsColor REICAST_US(i); // SFaceOffsColor
pal_needs_update = true;
REICAST_US(i); // palette_index REICAST_US(i); // palette_index
REICAST_US(dumbool); // KillTex REICAST_US(dumbool); // KillTex
REICAST_SKIP(4 * 1024); // palette16_ram REICAST_SKIP(4 * 1024); // palette16_ram
@ -720,6 +719,7 @@ static bool dc_unserialize_libretro(void **data, unsigned int *total_size)
REICAST_SKIP(2 * 8 * 4 * 1024); // detwiddle[][] REICAST_SKIP(2 * 8 * 4 * 1024); // detwiddle[][]
REICAST_USA(vram.data, vram.size); REICAST_USA(vram.data, vram.size);
pal_needs_update = true;
REICAST_USA(OnChipRAM.data,OnChipRAM_SIZE); REICAST_USA(OnChipRAM.data,OnChipRAM_SIZE);
register_unserialize(CCN, data, total_size, V7_LIBRETRO) ; register_unserialize(CCN, data, total_size, V7_LIBRETRO) ;
@ -1078,9 +1078,9 @@ bool dc_unserialize(void **data, unsigned int *total_size)
REICAST_SKIP(4); REICAST_SKIP(4);
REICAST_SKIP(4); REICAST_SKIP(4);
} }
pal_needs_update = true;
REICAST_USA(vram.data, vram.size); REICAST_USA(vram.data, vram.size);
pal_needs_update = true;
REICAST_USA(OnChipRAM.data,OnChipRAM_SIZE); REICAST_USA(OnChipRAM.data,OnChipRAM_SIZE);

View File

@ -109,10 +109,6 @@ ifneq (,$(findstring x86,$(platform)))
CFLAGS += -m32 -D TARGET_LINUX_x86 -D TARGET_NO_AREC -fno-builtin-sqrtf CFLAGS += -m32 -D TARGET_LINUX_x86 -D TARGET_NO_AREC -fno-builtin-sqrtf
CXXFLAGS += -fexceptions CXXFLAGS += -fexceptions
ifneq (,$(findstring sse4_1,$(platform)))
HAS_SOFTREND := 1
endif
# Generic 64 bit x86 (a.k.a. x64/AMD64/x86_64/Intel64/EM64T) # Generic 64 bit x86 (a.k.a. x64/AMD64/x86_64/Intel64/EM64T)
else ifneq (,$(findstring x64,$(platform))) else ifneq (,$(findstring x64,$(platform)))
X64_REC := 1 X64_REC := 1
@ -122,10 +118,6 @@ else ifneq (,$(findstring x64,$(platform)))
CXXFLAGS += -fexceptions CXXFLAGS += -fexceptions
LDFLAGS := -no-pie LDFLAGS := -no-pie
ifneq (,$(findstring sse4_1,$(platform)))
HAS_SOFTREND := 1
endif
# Generic 64 bit ARM (armv8) Linux # Generic 64 bit ARM (armv8) Linux
else ifneq (,$(findstring arm64,$(platform))) else ifneq (,$(findstring arm64,$(platform)))
NOT_ARM := 1 NOT_ARM := 1