- [Psy-X] reduce draw calls with subsequent DrawPrim calls

- [Psy-X] store DrawPrim state in split
This commit is contained in:
Ilya Shurumov 2021-05-16 16:14:17 +06:00 committed by InspirationByte
parent 9d97cefb90
commit d50eb36a37
4 changed files with 16 additions and 11 deletions

View File

@ -763,8 +763,7 @@ void ControlCopDetection(void)
int dx, dz;
CAR_DATA *cp;
VECTOR vec;
int ccx;
int ccz;
int ccx, ccz;
vec.vx = player[0].pos[0];
vec.vy = player[0].pos[1];

View File

@ -123,6 +123,7 @@ void FadeGameScreen(int flag)
DrawPrim(&poly);
#ifndef PSX
DrawSync(0);
PsyX_EndScene();
#endif
}
@ -344,6 +345,8 @@ void CloseShutters(int speed, int width, int height)
DrawPrim(&poly[0]);
DrawPrim(&poly[1]);
DrawSync(0); // [A] added to avoid rendering bugs
#ifndef PSX
VSync(0);
PsyX_EndScene();

View File

@ -31,6 +31,7 @@ OT_TAG prim_terminator = { -1, 0 }; // P_TAG with zero length
DISPENV activeDispEnv;
DRAWENV activeDrawEnv;
int g_GPUDisabledState = 0;
int g_DrawPrimMode = 0;
struct GPUDrawSplit
{
@ -42,6 +43,8 @@ struct GPUDrawSplit
TexFormat texFormat;
TextureID textureId;
int drawPrimMode;
u_short startVertex;
u_short numVerts;
};
@ -675,6 +678,7 @@ void AddSplit(bool semiTrans, TextureID textureId)
if (curSplit.blendMode == blendMode &&
curSplit.texFormat == texFormat &&
curSplit.textureId == textureId &&
curSplit.drawPrimMode == g_DrawPrimMode &&
curSplit.drawenv.clip.x == activeDrawEnv.clip.x &&
curSplit.drawenv.clip.y == activeDrawEnv.clip.y &&
curSplit.drawenv.clip.w == activeDrawEnv.clip.w &&
@ -691,6 +695,7 @@ void AddSplit(bool semiTrans, TextureID textureId)
split.blendMode = blendMode;
split.texFormat = texFormat;
split.textureId = textureId;
split.drawPrimMode = g_DrawPrimMode;
split.drawenv = activeDrawEnv;
split.dispenv = activeDispEnv;
@ -700,6 +705,8 @@ void AddSplit(bool semiTrans, TextureID textureId)
void DrawSplit(const GPUDrawSplit& split)
{
GR_SetStencilMode(split.drawPrimMode); // draw with mask 0x16
GR_SetTexture(split.textureId, split.texFormat);
GR_SetupClipMode(&split.drawenv.clip, split.drawenv.dfe);
@ -764,6 +771,9 @@ void ParsePrimitivesToSplits(u_long* p, int singlePrimitive)
if (!p)
return;
// setup single primitive flag (needed for AddSplits)
g_DrawPrimMode = singlePrimitive;
if (singlePrimitive)
{
#if defined(USE_PGXP) && defined(USE_EXTENDED_PRIM_POINTERS)

View File

@ -43,10 +43,10 @@ int DrawSync(int mode)
GR_UpdateVRAM();
GR_ReadFramebufferDataToVRAM();
if (g_splitIndex > 0) // don't do flips if nothing to draw.
if (g_splitIndex > 0)// && g_GPUDisabledState == 0) // don't do flips if nothing to draw.
{
DrawAllSplits();
PsyX_EndScene();
//PsyX_EndScene();
}
if (drawsync_callback != NULL)
@ -418,10 +418,7 @@ void DrawOTag(u_long* p)
ParsePrimitivesToSplits(p, 0);
GR_SetStencilMode(0);
DrawAllSplits();
} while (g_emulatorPaused);
}
@ -449,10 +446,6 @@ void DrawPrim(void* p)
ClearImage(&activeDrawEnv.clip, activeDrawEnv.r0, activeDrawEnv.g0, activeDrawEnv.b0);
ParsePrimitivesToSplits((u_long*)p, 1);
// draw with mask 0x16
GR_SetStencilMode(1);
DrawAllSplits();
}
void SetSprt16(SPRT_16* p)