* fix build error

* make betterer polygon splitting an option
* add GL_LEQUAL depth test for 'equal' mode, might help
This commit is contained in:
Arisotura 2020-08-24 19:32:07 +02:00
parent abccc44eec
commit e7025abcdc
9 changed files with 47 additions and 12 deletions

View File

@ -37,6 +37,8 @@ char DSiBIOS7Path[1024];
char DSiFirmwarePath[1024]; char DSiFirmwarePath[1024];
char DSiNANDPath[1024]; char DSiNANDPath[1024];
int RandomizeMAC;
#ifdef JIT_ENABLED #ifdef JIT_ENABLED
int JIT_Enable = false; int JIT_Enable = false;
int JIT_MaxBlockSize = 32; int JIT_MaxBlockSize = 32;

View File

@ -79,6 +79,7 @@ typedef struct
bool Soft_Threaded; bool Soft_Threaded;
int GL_ScaleFactor; int GL_ScaleFactor;
bool GL_BetterPolygons;
} RenderSettings; } RenderSettings;

View File

@ -113,7 +113,7 @@ GLuint TexMemID;
GLuint TexPalMemID; GLuint TexPalMemID;
int ScaleFactor; int ScaleFactor;
bool Antialias; bool BetterPolygons;
int ScreenW, ScreenH; int ScreenW, ScreenH;
GLuint FramebufferTex[8]; GLuint FramebufferTex[8];
@ -405,6 +405,7 @@ void SetRenderSettings(GPU::RenderSettings& settings)
int scale = settings.GL_ScaleFactor; int scale = settings.GL_ScaleFactor;
ScaleFactor = scale; ScaleFactor = scale;
BetterPolygons = settings.GL_BetterPolygons;
ScreenW = 256 * scale; ScreenW = 256 * scale;
ScreenH = 192 * scale; ScreenH = 192 * scale;
@ -635,7 +636,7 @@ void BuildPolygons(RendererPolygon* polygons, int npolys)
{ {
rp->PrimType = GL_TRIANGLES; rp->PrimType = GL_TRIANGLES;
if (false) if (!BetterPolygons)
{ {
// regular triangle-splitting // regular triangle-splitting
@ -835,6 +836,10 @@ void RenderSceneChunk(int y, int h)
GLboolean fogenable = (RenderDispCnt & (1<<7)) ? GL_TRUE : GL_FALSE; GLboolean fogenable = (RenderDispCnt & (1<<7)) ? GL_TRUE : GL_FALSE;
// TODO: proper 'equal' depth test!
// (has margin of +-0x200 in Z-buffer mode, +-0xFF in W-buffer mode)
// for now we're using GL_LEQUAL to make it work to some extent
// pass 1: opaque pixels // pass 1: opaque pixels
UseRenderShader(flags); UseRenderShader(flags);
@ -853,8 +858,10 @@ void RenderSceneChunk(int y, int h)
if (rp->PolyData->IsShadowMask) { i++; continue; } if (rp->PolyData->IsShadowMask) { i++; continue; }
// zorp if (rp->PolyData->Attr & (1<<14))
glDepthFunc(GL_LESS); glDepthFunc(GL_LEQUAL);
else
glDepthFunc(GL_LESS);
u32 polyattr = rp->PolyData->Attr; u32 polyattr = rp->PolyData->Attr;
u32 polyid = (polyattr >> 24) & 0x3F; u32 polyid = (polyattr >> 24) & 0x3F;
@ -939,8 +946,10 @@ void RenderSceneChunk(int y, int h)
{ {
UseRenderShader(flags | RenderFlag_Trans); UseRenderShader(flags | RenderFlag_Trans);
// zorp if (rp->PolyData->Attr & (1<<14))
glDepthFunc(GL_LESS); glDepthFunc(GL_LEQUAL);
else
glDepthFunc(GL_LESS);
u32 polyattr = rp->PolyData->Attr; u32 polyattr = rp->PolyData->Attr;
u32 polyid = (polyattr >> 24) & 0x3F; u32 polyid = (polyattr >> 24) & 0x3F;
@ -1030,8 +1039,10 @@ void RenderSceneChunk(int y, int h)
if (!(polyattr & (1<<15))) transfog = fogenable; if (!(polyattr & (1<<15))) transfog = fogenable;
else transfog = GL_FALSE; else transfog = GL_FALSE;
// zorp if (rp->PolyData->Attr & (1<<14))
glDepthFunc(GL_LESS); glDepthFunc(GL_LEQUAL);
else
glDepthFunc(GL_LESS);
if (rp->PolyData->IsShadow) if (rp->PolyData->IsShadow)
{ {

View File

@ -51,7 +51,7 @@ int _3DRenderer;
int Threaded3D; int Threaded3D;
int GL_ScaleFactor; int GL_ScaleFactor;
int GL_Antialias; int GL_BetterPolygons;
int LimitFPS; int LimitFPS;
int AudioSync; int AudioSync;
@ -143,7 +143,7 @@ ConfigEntry PlatformConfigFile[] =
{"Threaded3D", 0, &Threaded3D, 1, NULL, 0}, {"Threaded3D", 0, &Threaded3D, 1, NULL, 0},
{"GL_ScaleFactor", 0, &GL_ScaleFactor, 1, NULL, 0}, {"GL_ScaleFactor", 0, &GL_ScaleFactor, 1, NULL, 0},
{"GL_Antialias", 0, &GL_Antialias, 0, NULL, 0}, {"GL_BetterPolygons", 0, &GL_BetterPolygons, 0, NULL, 0},
{"LimitFPS", 0, &LimitFPS, 0, NULL, 0}, {"LimitFPS", 0, &LimitFPS, 0, NULL, 0},
{"AudioSync", 0, &AudioSync, 1, NULL, 0}, {"AudioSync", 0, &AudioSync, 1, NULL, 0},

View File

@ -64,7 +64,7 @@ extern int _3DRenderer;
extern int Threaded3D; extern int Threaded3D;
extern int GL_ScaleFactor; extern int GL_ScaleFactor;
extern int GL_Antialias; extern int GL_BetterPolygons;
extern int LimitFPS; extern int LimitFPS;
extern int AudioSync; extern int AudioSync;

View File

@ -167,3 +167,10 @@ void VideoSettingsDialog::on_cbxGLResolution_currentIndexChanged(int idx)
emit updateVideoSettings(false); emit updateVideoSettings(false);
} }
void VideoSettingsDialog::on_cbBetterPolygons_stateChanged(int state)
{
Config::GL_BetterPolygons = (state != 0);
emit updateVideoSettings(false);
}

View File

@ -64,6 +64,7 @@ private slots:
void on_sbVSyncInterval_valueChanged(int val); void on_sbVSyncInterval_valueChanged(int val);
void on_cbxGLResolution_currentIndexChanged(int idx); void on_cbxGLResolution_currentIndexChanged(int idx);
void on_cbBetterPolygons_stateChanged(int state);
void on_cbSoftwareThreaded_stateChanged(int state); void on_cbSoftwareThreaded_stateChanged(int state);

View File

@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>482</width> <width>482</width>
<height>237</height> <height>244</height>
</rect> </rect>
</property> </property>
<property name="sizePolicy"> <property name="sizePolicy">
@ -43,6 +43,16 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="0">
<widget class="QCheckBox" name="cbBetterPolygons">
<property name="whatsThis">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enabling this may help reduce distortion on quads and more complex polygons, but may also reduce performance.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="text">
<string>Improved polygon splitting</string>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>

View File

@ -405,8 +405,11 @@ void EmuThread::run()
videoRenderer = hasOGL ? Config::_3DRenderer : 0; videoRenderer = hasOGL ? Config::_3DRenderer : 0;
videoSettingsDirty = false; videoSettingsDirty = false;
videoSettings.Soft_Threaded = Config::Threaded3D != 0; videoSettings.Soft_Threaded = Config::Threaded3D != 0;
videoSettings.GL_ScaleFactor = Config::GL_ScaleFactor; videoSettings.GL_ScaleFactor = Config::GL_ScaleFactor;
videoSettings.GL_BetterPolygons = Config::GL_BetterPolygons;
GPU::SetRenderSettings(videoRenderer, videoSettings); GPU::SetRenderSettings(videoRenderer, videoSettings);
} }