win32-support ogl 3.2 and oglOld driver choices independently, and fallback to oglOld when ogl3.2 cant initialize

This commit is contained in:
zeromus 2013-02-05 00:35:57 +00:00
parent f09aaa3205
commit 98f9f0b64e
11 changed files with 108 additions and 15 deletions

View File

@ -486,6 +486,7 @@ static void texDeleteCallback(TexCacheItem *item)
_OGLRenderer->DeleteTexture(item);
}
template<bool require_profile, bool enable_3_2>
static char OGLInit(void)
{
char result = 0;
@ -528,10 +529,19 @@ static char OGLInit(void)
}
// Create new OpenGL rendering object
if (OGLLoadEntryPoints_3_2_Func != NULL && OGLCreateRenderer_3_2_Func != NULL)
if(enable_3_2)
{
OGLLoadEntryPoints_3_2_Func();
OGLCreateRenderer_3_2_Func(&_OGLRenderer);
if (OGLLoadEntryPoints_3_2_Func != NULL && OGLCreateRenderer_3_2_Func != NULL)
{
OGLLoadEntryPoints_3_2_Func();
OGLLoadEntryPoints_Legacy(); //zero 04-feb-2013 - this seems to be necessary as well
OGLCreateRenderer_3_2_Func(&_OGLRenderer);
}
else
{
if(require_profile)
return 0;
}
}
// If the renderer doesn't initialize with OpenGL v3.2 or higher, fall back
@ -667,9 +677,32 @@ static void OGLRenderFinish()
ENDGL();
}
//automatically select 3.2 or old profile depending on whether 3.2 is available
GPU3DInterface gpu3Dgl = {
"OpenGL",
OGLInit,
OGLInit<false,false>,
OGLReset,
OGLClose,
OGLRender,
OGLRenderFinish,
OGLVramReconfigureSignal
};
//forcibly use old profile
GPU3DInterface gpu3DglOld = {
"OpenGL",
OGLInit<true,false>,
OGLReset,
OGLClose,
OGLRender,
OGLRenderFinish,
OGLVramReconfigureSignal
};
//forcibly use new profile
GPU3DInterface gpu3Dgl_3_2 = {
"OpenGL 3.2",
OGLInit<true,true>,
OGLReset,
OGLClose,
OGLRender,

View File

@ -355,6 +355,8 @@ class TexCacheItem;
class OpenGLRenderer;
extern GPU3DInterface gpu3Dgl;
extern GPU3DInterface gpu3DglOld;
extern GPU3DInterface gpu3Dgl_3_2;
//This is called by OGLRender whenever it initializes.
//Platforms, please be sure to set this up.

View File

@ -2768,6 +2768,14 @@
RelativePath="..\OGLRender.h"
>
</File>
<File
RelativePath="..\OGLRender_3_2.cpp"
>
</File>
<File
RelativePath="..\OGLRender_3_2.h"
>
</File>
<File
RelativePath="..\path.cpp"
>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9,00"
Version="9.00"
Name="DeSmuME_VS2008"
ProjectGUID="{9F5F72A1-D3A5-4918-B460-E076B16D10A9}"
RootNamespace="DeSmuME"
@ -862,6 +862,14 @@
RelativePath="..\OGLRender.h"
>
</File>
<File
RelativePath="..\OGLRender_3_2.cpp"
>
</File>
<File
RelativePath="..\OGLRender_3_2.h"
>
</File>
<File
RelativePath="..\path.cpp"
>

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
@ -432,6 +432,7 @@
<ClCompile Include="..\movie.cpp" />
<ClCompile Include="..\NDSSystem.cpp" />
<ClCompile Include="..\OGLRender.cpp" />
<ClCompile Include="..\OGLRender_3_2.cpp" />
<ClCompile Include="..\path.cpp" />
<ClCompile Include="..\rasterize.cpp" />
<ClCompile Include="..\readwrite.cpp" />
@ -710,6 +711,7 @@
<ClInclude Include="..\movie.h" />
<ClInclude Include="..\NDSSystem.h" />
<ClInclude Include="..\OGLRender.h" />
<ClInclude Include="..\OGLRender_3_2.h" />
<ClInclude Include="..\path.h" />
<ClInclude Include="..\rasterize.h" />
<ClInclude Include="..\readwrite.h" />

View File

@ -774,6 +774,9 @@
<ClCompile Include="..\utils\AsmJit\x86\x86util.cpp">
<Filter>Core\utils\AsmJit\x86</Filter>
</ClCompile>
<ClCompile Include="..\OGLRender_3_2.cpp">
<Filter>Core</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\addons.h">
@ -1494,6 +1497,9 @@
<ClInclude Include="..\utils\AsmJit\x86\x86util.h">
<Filter>Core\utils\AsmJit\x86</Filter>
</ClInclude>
<ClInclude Include="..\OGLRender_3_2.h">
<Filter>Core</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="..\instruction_tabdef.inc">

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
@ -406,6 +406,7 @@
<ClCompile Include="..\movie.cpp" />
<ClCompile Include="..\NDSSystem.cpp" />
<ClCompile Include="..\OGLRender.cpp" />
<ClCompile Include="..\OGLRender_3_2.cpp" />
<ClCompile Include="..\path.cpp" />
<ClCompile Include="..\rasterize.cpp" />
<ClCompile Include="..\readwrite.cpp" />
@ -650,6 +651,7 @@
<ClInclude Include="..\movie.h" />
<ClInclude Include="..\NDSSystem.h" />
<ClInclude Include="..\OGLRender.h" />
<ClInclude Include="..\OGLRender_3_2.h" />
<ClInclude Include="..\path.h" />
<ClInclude Include="..\rasterize.h" />
<ClInclude Include="..\readwrite.h" />

View File

@ -762,6 +762,9 @@
<ClCompile Include="tileView.cpp">
<Filter>Windows\tools</Filter>
</ClCompile>
<ClCompile Include="..\OGLRender_3_2.cpp">
<Filter>Core</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\addons.h">
@ -1283,6 +1286,9 @@
<ClInclude Include="tileView.h">
<Filter>Windows\tools</Filter>
</ClInclude>
<ClInclude Include="..\OGLRender_3_2.h">
<Filter>Core</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="..\instruction_tabdef.inc">

View File

@ -451,9 +451,9 @@ void HK_FrameAdvanceKeyDown(int, bool justPressed) { FrameAdvance(true); }
void HK_FrameAdvanceKeyUp(int) { FrameAdvance(false); }
void HK_ToggleRasterizer(int, bool justPressed) {
if(cur3DCore == GPU3D_OPENGL)
if(cur3DCore == GPU3D_OPENGL_OLD || cur3DCore == GPU3D_OPENGL_3_2)
cur3DCore = GPU3D_SWRAST;
else cur3DCore = GPU3D_OPENGL;
else cur3DCore = GPU3D_OPENGL_3_2;
Change3DCoreWithFallbackAndSave(cur3DCore);
}

View File

@ -48,6 +48,7 @@
#include "../addons.h"
#include "../GPU_osd.h"
#include "../OGLRender.h"
#include "../OGLRender_3_2.h"
#include "../rasterize.h"
#include "../gfx3d.h"
#include "../render3D.h"
@ -466,8 +467,9 @@ SoundInterface_struct *SNDCoreList[] = {
GPU3DInterface *core3DList[] = {
&gpu3DNull,
&gpu3Dgl,
&gpu3Dgl_3_2,
&gpu3DRasterize,
&gpu3DglOld,
NULL
};
@ -2766,6 +2768,11 @@ int _main()
dwMainThread = GetCurrentThreadId();
//enable opengl 3.2 driver in this port
OGLLoadEntryPoints_3_2_Func = OGLLoadEntryPoints_3_2;
OGLCreateRenderer_3_2_Func = OGLCreateRenderer_3_2;
#ifdef HAVE_WX
wxInitialize();
#endif
@ -5949,13 +5956,31 @@ DOKEYDOWN:
return DefWindowProc (hwnd, message, wParam, lParam);
}
void Change3DCoreWithFallbackAndSave(int newCore, int fallbackCore)
void Change3DCoreWithFallbackAndSave(int newCore)
{
if(!NDS_3D_ChangeCore(newCore) && newCore != fallbackCore)
NDS_3D_ChangeCore(fallbackCore);
if(newCore == GPU3D_OPENGL_OLD)
goto TRY_OGL;
if(newCore == GPU3D_SWRAST)
goto TRY_SWRAST;
if(!NDS_3D_ChangeCore(GPU3D_OPENGL_3_2))
goto TRY_OGL;
goto DONE;
TRY_OGL:
if(!NDS_3D_ChangeCore(GPU3D_OPENGL_OLD))
goto TRY_SWRAST;
goto DONE;
TRY_SWRAST:
NDS_3D_ChangeCore(GPU3D_SWRAST);
DONE:
int gpu3dSaveValue = ((cur3DCore != GPU3D_NULL) ? cur3DCore : GPU3D_NULL_SAVED);
WritePrivateProfileInt("3D", "Renderer", gpu3dSaveValue, IniName);
}
LRESULT CALLBACK HUDFontSettingsDlgProc(HWND hw, UINT msg, WPARAM wp, LPARAM lp)
{
switch(msg)

View File

@ -48,8 +48,9 @@ extern bool FpsDisplay;
extern bool ShowLagFrameCounter;
#define GPU3D_NULL 0
#define GPU3D_OPENGL 1
#define GPU3D_OPENGL_3_2 1
#define GPU3D_SWRAST 2
#define GPU3D_OPENGL_OLD 3
static const int LANGUAGE_ENGLISH = 0;
static const int LANGUAGE_FRENCH = 1;
@ -60,7 +61,7 @@ static const int LANGUAGE_SPANISH = 6;
static const int LANGUAGE_KOREAN = 7;
static const int LANGUAGE_BRAZILIAN = 8;
extern void Change3DCoreWithFallbackAndSave(int newCore, int fallbackCore=GPU3D_SWRAST);
extern void Change3DCoreWithFallbackAndSave(int newCore);
extern int backupmemorytype;
extern u32 backupmemorysize;