From 3c04e8f4c7a26f698a72303952b9a364f7f34758 Mon Sep 17 00:00:00 2001 From: rogerman Date: Fri, 6 May 2022 18:23:52 -0700 Subject: [PATCH] Cocoa Port (OpenEmu Plug-in): Add OpenGL as an option for the emulated GPU rendering engine. - Now that we can use OpenGL, we can increase the 3D render scaling to up to 8x for machines that can handle it. - Also add the Fragment Sampling Hack option for SoftRasterizer for certain games that need it to 'fix' texture rendering. - Also add the Smooth Textures option for OpenGL for games that can benefit from it. --- desmume/src/frontend/cocoa/cocoa_GPU.mm | 9 +- .../src/frontend/cocoa/openemu/NDSGameCore.h | 32 +++- .../src/frontend/cocoa/openemu/NDSGameCore.mm | 146 ++++++++++++------ 3 files changed, 139 insertions(+), 48 deletions(-) diff --git a/desmume/src/frontend/cocoa/cocoa_GPU.mm b/desmume/src/frontend/cocoa/cocoa_GPU.mm index aef354793..bc253f35a 100644 --- a/desmume/src/frontend/cocoa/cocoa_GPU.mm +++ b/desmume/src/frontend/cocoa/cocoa_GPU.mm @@ -172,7 +172,6 @@ GPU3DInterface *core3DList[GPU_3D_RENDERER_COUNT+1] = { bool isTempContextCreated = OSXOpenGLRendererInit(); if (isTempContextCreated) { - CGLContextObj prevContext = CGLGetCurrentContext(); OSXOpenGLRendererBegin(); GLint maxSamplesOGL = 0; @@ -187,7 +186,6 @@ GPU3DInterface *core3DList[GPU_3D_RENDERER_COUNT+1] = { OSXOpenGLRendererEnd(); DestroyOpenGLRenderer(); - CGLSetCurrentContext(prevContext); } return self; @@ -1817,6 +1815,7 @@ bool GPUEventHandlerAsync::GetRender3DNeedsFinish() #pragma mark - CGLContextObj OSXOpenGLRendererContext = NULL; +CGLContextObj OSXOpenGLRendererContextPrev = NULL; SILENCE_DEPRECATION_MACOS_10_7( CGLPBufferObj OSXOpenGLRendererPBuffer = NULL ); bool OSXOpenGLRendererInit() @@ -1832,6 +1831,7 @@ bool OSXOpenGLRendererInit() bool OSXOpenGLRendererBegin() { + OSXOpenGLRendererContextPrev = CGLGetCurrentContext(); CGLSetCurrentContext(OSXOpenGLRendererContext); return true; @@ -1839,7 +1839,7 @@ bool OSXOpenGLRendererBegin() void OSXOpenGLRendererEnd() { - + CGLSetCurrentContext(OSXOpenGLRendererContextPrev); } bool OSXOpenGLRendererFramebufferDidResize(const bool isFBOSupported, size_t w, size_t h) @@ -1944,11 +1944,14 @@ void DestroyOpenGLRenderer() return; } + OSXOpenGLRendererEnd(); + SILENCE_DEPRECATION_MACOS_10_7( CGLReleasePBuffer(OSXOpenGLRendererPBuffer) ); OSXOpenGLRendererPBuffer = NULL; CGLReleaseContext(OSXOpenGLRendererContext); OSXOpenGLRendererContext = NULL; + OSXOpenGLRendererContextPrev = NULL; } void RequestOpenGLRenderer_3_2(bool request_3_2) diff --git a/desmume/src/frontend/cocoa/openemu/NDSGameCore.h b/desmume/src/frontend/cocoa/openemu/NDSGameCore.h index 4801ca831..3c23cd2b1 100644 --- a/desmume/src/frontend/cocoa/openemu/NDSGameCore.h +++ b/desmume/src/frontend/cocoa/openemu/NDSGameCore.h @@ -88,14 +88,24 @@ class OE_OGLDisplayPresenter; #define NDSDISPLAYMODE_NAMEKEY_HUD_REALTIMECLOCK "Real-Time Clock" #define NDSDISPLAYMODE_NAMEKEY_HUD_INPUT "Input" +#define NDSDISPLAYMODE_NAMEKEY_GPU_ENGINE_SOFTWARE "Use SoftRasterizer Engine" +#define NDSDISPLAYMODE_NAMEKEY_GPU_ENGINE_OPENGL "Use OpenGL Engine" + #define NDSDISPLAYMODE_NAMEKEY_3D_RENDERSCALING_1X "1x Native Resolution" #define NDSDISPLAYMODE_NAMEKEY_3D_RENDERSCALING_2X "2x Resolution" #define NDSDISPLAYMODE_NAMEKEY_3D_RENDERSCALING_3X "3x Resolution" #define NDSDISPLAYMODE_NAMEKEY_3D_RENDERSCALING_4X "4x Resolution" +#define NDSDISPLAYMODE_NAMEKEY_3D_RENDERSCALING_5X "5x Resolution" +#define NDSDISPLAYMODE_NAMEKEY_3D_RENDERSCALING_6X "6x Resolution" +#define NDSDISPLAYMODE_NAMEKEY_3D_RENDERSCALING_7X "7x Resolution" +#define NDSDISPLAYMODE_NAMEKEY_3D_RENDERSCALING_8X "8x Resolution" #define NDSDISPLAYMODE_NAMEKEY_3D_TEXTURESCALING_1X "1x Native Texture" #define NDSDISPLAYMODE_NAMEKEY_3D_TEXTURESCALING_2X "2x Texture Upscaling" #define NDSDISPLAYMODE_NAMEKEY_3D_TEXTURESCALING_4X "4x Texture Upscaling" + +#define NDSDISPLAYMODE_NAMEKEY_GPU_SOFTWARE_FRAGMENTSAMPLINGHACK "Fragment Sampling Hack" +#define NDSDISPLAYMODE_NAMEKEY_GPU_OPENGL_SMOOTHTEXTURES "Smooth Textures" #define NDSDISPLAYMODE_PREFKEY_DISPLAYMODE "displayMode" #define NDSDISPLAYMODE_PREFKEY_LAYOUT "layout" @@ -113,6 +123,9 @@ class OE_OGLDisplayPresenter; #define NDSDISPLAYMODE_PREFKEY_HUD_CPULOADAVERAGE "hud_cpuloadaverage" #define NDSDISPLAYMODE_PREFKEY_HUD_REALTIMECLOCK "hud_realtimeclock" #define NDSDISPLAYMODE_PREFKEY_HUD_INPUT "hud_input" +#define NDSDISPLAYMODE_PREFKEY_GPU_ENGINE "gpu_engine" +#define NDSDISPLAYMODE_PREFKEY_GPU_SOFTWARE_FRAGMENTSAMPLINGHACK "gpu_software_fragmentsamplinghack" +#define NDSDISPLAYMODE_PREFKEY_GPU_OPENGL_SMOOTHTEXTURES "gpu_opengl_smoothtextures" #define NDSDISPLAYMODE_PREFKEY_3D_RENDERSCALING "3D_renderscaling" #define NDSDISPLAYMODE_PREFKEY_3D_TEXTURESCALING "3D_texturescaling" @@ -164,10 +177,20 @@ enum NDSDisplayOptionID NDSDisplayOptionID_HUD_RealTimeClock, NDSDisplayOptionID_HUD_Input, + NDSDisplayOptionID_GPU_Engine_Software, + NDSDisplayOptionID_GPU_Engine_OpenGL, + + NDSDisplayOptionID_GPU_Software_FragmentSamplingHack, + NDSDisplayOptionID_GPU_OpenGL_SmoothTextures, + NDSDisplayOptionID_3D_RenderScaling_1x, NDSDisplayOptionID_3D_RenderScaling_2x, NDSDisplayOptionID_3D_RenderScaling_3x, NDSDisplayOptionID_3D_RenderScaling_4x, + NDSDisplayOptionID_3D_RenderScaling_5x, + NDSDisplayOptionID_3D_RenderScaling_6x, + NDSDisplayOptionID_3D_RenderScaling_7x, + NDSDisplayOptionID_3D_RenderScaling_8x, NDSDisplayOptionID_3D_TextureScaling_1x, NDSDisplayOptionID_3D_TextureScaling_2x, @@ -211,10 +234,17 @@ enum NDSDisplayOptionID (1ULL << NDSDisplayOptionID_VideoSourceTouch_ForceMain) | \ (1ULL << NDSDisplayOptionID_VideoSourceTouch_ForceSub)) +#define NDSDISPLAYMODE_GROUPBITMASK_GPUENGINE ((1ULL << NDSDisplayOptionID_GPU_Engine_Software) | \ + (1ULL << NDSDisplayOptionID_GPU_Engine_OpenGL)) + #define NDSDISPLAYMODE_GROUPBITMASK_RENDERSCALING ((1ULL << NDSDisplayOptionID_3D_RenderScaling_1x) | \ (1ULL << NDSDisplayOptionID_3D_RenderScaling_2x) | \ (1ULL << NDSDisplayOptionID_3D_RenderScaling_3x) | \ - (1ULL << NDSDisplayOptionID_3D_RenderScaling_4x)) + (1ULL << NDSDisplayOptionID_3D_RenderScaling_4x) | \ + (1ULL << NDSDisplayOptionID_3D_RenderScaling_5x) | \ + (1ULL << NDSDisplayOptionID_3D_RenderScaling_6x) | \ + (1ULL << NDSDisplayOptionID_3D_RenderScaling_7x) | \ + (1ULL << NDSDisplayOptionID_3D_RenderScaling_8x)) #define NDSDISPLAYMODE_GROUPBITMASK_TEXTURESCALING ((1ULL << NDSDisplayOptionID_3D_TextureScaling_1x) | \ (1ULL << NDSDisplayOptionID_3D_TextureScaling_2x) | \ diff --git a/desmume/src/frontend/cocoa/openemu/NDSGameCore.mm b/desmume/src/frontend/cocoa/openemu/NDSGameCore.mm index 97f51a6a7..166a488c4 100644 --- a/desmume/src/frontend/cocoa/openemu/NDSGameCore.mm +++ b/desmume/src/frontend/cocoa/openemu/NDSGameCore.mm @@ -85,10 +85,20 @@ static const OEMenuItemDesc kDisplayModeItem[NDSDisplayOptionID_Count] = { { @NDSDISPLAYMODE_NAMEKEY_HUD_REALTIMECLOCK, @NDSDISPLAYMODE_PREFKEY_HUD_REALTIMECLOCK, 0, nil }, { @NDSDISPLAYMODE_NAMEKEY_HUD_INPUT, @NDSDISPLAYMODE_PREFKEY_HUD_INPUT, 0, nil }, + { @NDSDISPLAYMODE_NAMEKEY_GPU_ENGINE_SOFTWARE, @NDSDISPLAYMODE_PREFKEY_GPU_ENGINE, NDSDISPLAYMODE_GROUPBITMASK_GPUENGINE, nil }, + { @NDSDISPLAYMODE_NAMEKEY_GPU_ENGINE_OPENGL, @NDSDISPLAYMODE_PREFKEY_GPU_ENGINE, NDSDISPLAYMODE_GROUPBITMASK_GPUENGINE, nil }, + + { @NDSDISPLAYMODE_NAMEKEY_GPU_SOFTWARE_FRAGMENTSAMPLINGHACK, @NDSDISPLAYMODE_PREFKEY_GPU_SOFTWARE_FRAGMENTSAMPLINGHACK, 0, nil }, + { @NDSDISPLAYMODE_NAMEKEY_GPU_OPENGL_SMOOTHTEXTURES, @NDSDISPLAYMODE_PREFKEY_GPU_OPENGL_SMOOTHTEXTURES, 0, nil }, + { @NDSDISPLAYMODE_NAMEKEY_3D_RENDERSCALING_1X, @NDSDISPLAYMODE_PREFKEY_3D_RENDERSCALING, NDSDISPLAYMODE_GROUPBITMASK_RENDERSCALING, nil }, { @NDSDISPLAYMODE_NAMEKEY_3D_RENDERSCALING_2X, @NDSDISPLAYMODE_PREFKEY_3D_RENDERSCALING, NDSDISPLAYMODE_GROUPBITMASK_RENDERSCALING, nil }, { @NDSDISPLAYMODE_NAMEKEY_3D_RENDERSCALING_3X, @NDSDISPLAYMODE_PREFKEY_3D_RENDERSCALING, NDSDISPLAYMODE_GROUPBITMASK_RENDERSCALING, nil }, { @NDSDISPLAYMODE_NAMEKEY_3D_RENDERSCALING_4X, @NDSDISPLAYMODE_PREFKEY_3D_RENDERSCALING, NDSDISPLAYMODE_GROUPBITMASK_RENDERSCALING, nil }, + { @NDSDISPLAYMODE_NAMEKEY_3D_RENDERSCALING_5X, @NDSDISPLAYMODE_PREFKEY_3D_RENDERSCALING, NDSDISPLAYMODE_GROUPBITMASK_RENDERSCALING, nil }, + { @NDSDISPLAYMODE_NAMEKEY_3D_RENDERSCALING_6X, @NDSDISPLAYMODE_PREFKEY_3D_RENDERSCALING, NDSDISPLAYMODE_GROUPBITMASK_RENDERSCALING, nil }, + { @NDSDISPLAYMODE_NAMEKEY_3D_RENDERSCALING_7X, @NDSDISPLAYMODE_PREFKEY_3D_RENDERSCALING, NDSDISPLAYMODE_GROUPBITMASK_RENDERSCALING, nil }, + { @NDSDISPLAYMODE_NAMEKEY_3D_RENDERSCALING_8X, @NDSDISPLAYMODE_PREFKEY_3D_RENDERSCALING, NDSDISPLAYMODE_GROUPBITMASK_RENDERSCALING, nil }, { @NDSDISPLAYMODE_NAMEKEY_3D_TEXTURESCALING_1X, @NDSDISPLAYMODE_PREFKEY_3D_TEXTURESCALING, NDSDISPLAYMODE_GROUPBITMASK_TEXTURESCALING, nil }, { @NDSDISPLAYMODE_NAMEKEY_3D_TEXTURESCALING_2X, @NDSDISPLAYMODE_PREFKEY_3D_TEXTURESCALING, NDSDISPLAYMODE_GROUPBITMASK_TEXTURESCALING, nil }, @@ -104,6 +114,7 @@ static const uint64_t kDisplayModeStatesDefault = (1LLU << NDSDisplayOptionID_Mo (1LLU << NDSDisplayOptionID_VideoSourceTouch_NDS) | (1LLU << NDSDisplayOptionID_HUD_ExecutionSpeed) | (1LLU << NDSDisplayOptionID_HUD_VideoFPS) | + (1LLU << NDSDisplayOptionID_GPU_Engine_Software) | (1LLU << NDSDisplayOptionID_3D_RenderScaling_1x) | (1LLU << NDSDisplayOptionID_3D_TextureScaling_1x); @@ -272,10 +283,20 @@ volatile bool execute = true; [NSNumber numberWithInteger:NDSDisplayOptionID_HUD_RealTimeClock], kDisplayModeItem[NDSDisplayOptionID_HUD_RealTimeClock].nameKey, [NSNumber numberWithInteger:NDSDisplayOptionID_HUD_Input], kDisplayModeItem[NDSDisplayOptionID_HUD_Input].nameKey, + [NSNumber numberWithInteger:NDSDisplayOptionID_GPU_Engine_Software], kDisplayModeItem[NDSDisplayOptionID_GPU_Engine_Software].nameKey, + [NSNumber numberWithInteger:NDSDisplayOptionID_GPU_Engine_OpenGL], kDisplayModeItem[NDSDisplayOptionID_GPU_Engine_OpenGL].nameKey, + + [NSNumber numberWithInteger:NDSDisplayOptionID_GPU_Software_FragmentSamplingHack], kDisplayModeItem[NDSDisplayOptionID_GPU_Software_FragmentSamplingHack].nameKey, + [NSNumber numberWithInteger:NDSDisplayOptionID_GPU_OpenGL_SmoothTextures], kDisplayModeItem[NDSDisplayOptionID_GPU_OpenGL_SmoothTextures].nameKey, + [NSNumber numberWithInteger:NDSDisplayOptionID_3D_RenderScaling_1x], kDisplayModeItem[NDSDisplayOptionID_3D_RenderScaling_1x].nameKey, [NSNumber numberWithInteger:NDSDisplayOptionID_3D_RenderScaling_2x], kDisplayModeItem[NDSDisplayOptionID_3D_RenderScaling_2x].nameKey, [NSNumber numberWithInteger:NDSDisplayOptionID_3D_RenderScaling_3x], kDisplayModeItem[NDSDisplayOptionID_3D_RenderScaling_3x].nameKey, [NSNumber numberWithInteger:NDSDisplayOptionID_3D_RenderScaling_4x], kDisplayModeItem[NDSDisplayOptionID_3D_RenderScaling_4x].nameKey, + [NSNumber numberWithInteger:NDSDisplayOptionID_3D_RenderScaling_5x], kDisplayModeItem[NDSDisplayOptionID_3D_RenderScaling_5x].nameKey, + [NSNumber numberWithInteger:NDSDisplayOptionID_3D_RenderScaling_6x], kDisplayModeItem[NDSDisplayOptionID_3D_RenderScaling_6x].nameKey, + [NSNumber numberWithInteger:NDSDisplayOptionID_3D_RenderScaling_7x], kDisplayModeItem[NDSDisplayOptionID_3D_RenderScaling_7x].nameKey, + [NSNumber numberWithInteger:NDSDisplayOptionID_3D_RenderScaling_8x], kDisplayModeItem[NDSDisplayOptionID_3D_RenderScaling_8x].nameKey, [NSNumber numberWithInteger:NDSDisplayOptionID_3D_TextureScaling_1x], kDisplayModeItem[NDSDisplayOptionID_3D_TextureScaling_1x].nameKey, [NSNumber numberWithInteger:NDSDisplayOptionID_3D_TextureScaling_2x], kDisplayModeItem[NDSDisplayOptionID_3D_TextureScaling_2x].nameKey, @@ -328,6 +349,8 @@ volatile bool execute = true; cdsGPU = [[CocoaDSGPU alloc] init]; [cdsGPU setRender3DThreads:0]; // Pass 0 to automatically set the number of rendering threads [cdsGPU setRender3DRenderingEngine:CORE3DLIST_SWRASTERIZE]; + [cdsGPU setRender3DFragmentSamplingHack:NO]; + [cdsGPU setRender3DTextureSmoothing:NO]; [cdsGPU setRender3DTextureScalingFactor:1]; [cdsGPU setGpuScale:1]; [cdsGPU setGpuColorFormat:NDSColorFormat_BGR666_Rev]; @@ -471,6 +494,10 @@ void UpdateDisplayPropertiesFromStates(uint64_t displayModeStates, ClientDisplay else if ( DISPLAYMODE_STATEBIT_CHECK(displayModeStates, NDSDisplayOptionID_3D_RenderScaling_2x) ) _selectedRenderScaling = 2; else if ( DISPLAYMODE_STATEBIT_CHECK(displayModeStates, NDSDisplayOptionID_3D_RenderScaling_3x) ) _selectedRenderScaling = 3; else if ( DISPLAYMODE_STATEBIT_CHECK(displayModeStates, NDSDisplayOptionID_3D_RenderScaling_4x) ) _selectedRenderScaling = 4; + else if ( DISPLAYMODE_STATEBIT_CHECK(displayModeStates, NDSDisplayOptionID_3D_RenderScaling_5x) ) _selectedRenderScaling = 5; + else if ( DISPLAYMODE_STATEBIT_CHECK(displayModeStates, NDSDisplayOptionID_3D_RenderScaling_6x) ) _selectedRenderScaling = 6; + else if ( DISPLAYMODE_STATEBIT_CHECK(displayModeStates, NDSDisplayOptionID_3D_RenderScaling_7x) ) _selectedRenderScaling = 7; + else if ( DISPLAYMODE_STATEBIT_CHECK(displayModeStates, NDSDisplayOptionID_3D_RenderScaling_8x) ) _selectedRenderScaling = 8; if ( DISPLAYMODE_STATEBIT_CHECK(displayModeStates, NDSDisplayOptionID_3D_TextureScaling_1x) ) _selectedTextureScaling = 1; else if ( DISPLAYMODE_STATEBIT_CHECK(displayModeStates, NDSDisplayOptionID_3D_TextureScaling_2x) ) _selectedTextureScaling = 2; @@ -611,6 +638,19 @@ void UpdateDisplayPropertiesFromStates(uint64_t displayModeStates, ClientDisplay _cdp->CommitPresenterProperties(newProps); _cdp->SetupPresenterProperties(); + if ( DISPLAYMODE_STATEBIT_CHECK(appliedState, NDSDisplayOptionID_GPU_Engine_Software) ) + { + [cdsGPU setRender3DRenderingEngine:CORE3DLIST_SWRASTERIZE]; + [cdsGPU setGpuColorFormat:NDSColorFormat_BGR666_Rev]; + } + else if ( DISPLAYMODE_STATEBIT_CHECK(appliedState, NDSDisplayOptionID_GPU_Engine_OpenGL) ) + { + [cdsGPU setRender3DRenderingEngine:CORE3DLIST_OPENGL]; + [cdsGPU setGpuColorFormat:NDSColorFormat_BGR888_Rev]; + } + + [cdsGPU setRender3DFragmentSamplingHack:(DISPLAYMODE_STATEBIT_CHECK(appliedState, NDSDisplayOptionID_GPU_Software_FragmentSamplingHack)) ? YES : NO]; + [cdsGPU setRender3DTextureSmoothing:(DISPLAYMODE_STATEBIT_CHECK(appliedState, NDSDisplayOptionID_GPU_OpenGL_SmoothTextures)) ? YES : NO]; [cdsGPU setGpuScale:_selectedRenderScaling]; [cdsGPU setRender3DTextureScalingFactor:_selectedTextureScaling]; @@ -682,6 +722,7 @@ void UpdateDisplayPropertiesFromStates(uint64_t displayModeStates, ClientDisplay s = [self switchDisplayModeState:s nameKey:[userDefaultsDisplayMode objectForKey:@NDSDISPLAYMODE_PREFKEY_SEPARATION]]; s = [self switchDisplayModeState:s nameKey:[userDefaultsDisplayMode objectForKey:@NDSDISPLAYMODE_PREFKEY_VIDEOSOURCE_MAIN]]; s = [self switchDisplayModeState:s nameKey:[userDefaultsDisplayMode objectForKey:@NDSDISPLAYMODE_PREFKEY_VIDEOSOURCE_TOUCH]]; + s = [self switchDisplayModeState:s nameKey:[userDefaultsDisplayMode objectForKey:@NDSDISPLAYMODE_PREFKEY_GPU_ENGINE]]; s = [self switchDisplayModeState:s nameKey:[userDefaultsDisplayMode objectForKey:@NDSDISPLAYMODE_PREFKEY_3D_RENDERSCALING]]; s = [self switchDisplayModeState:s nameKey:[userDefaultsDisplayMode objectForKey:@NDSDISPLAYMODE_PREFKEY_3D_TEXTURESCALING]]; @@ -695,6 +736,9 @@ void UpdateDisplayPropertiesFromStates(uint64_t displayModeStates, ClientDisplay s = [self setDisplayModeState:s optionID:NDSDisplayOptionID_HUD_RealTimeClock state:[userDefaultsDisplayMode objectForKey:@NDSDISPLAYMODE_PREFKEY_HUD_REALTIMECLOCK]]; s = [self setDisplayModeState:s optionID:NDSDisplayOptionID_HUD_Input state:[userDefaultsDisplayMode objectForKey:@NDSDISPLAYMODE_PREFKEY_HUD_INPUT]]; + s = [self setDisplayModeState:s optionID:NDSDisplayOptionID_GPU_Software_FragmentSamplingHack state:[userDefaultsDisplayMode objectForKey:@NDSDISPLAYMODE_PREFKEY_GPU_SOFTWARE_FRAGMENTSAMPLINGHACK]]; + s = [self setDisplayModeState:s optionID:NDSDisplayOptionID_GPU_OpenGL_SmoothTextures state:[userDefaultsDisplayMode objectForKey:@NDSDISPLAYMODE_PREFKEY_GPU_OPENGL_SMOOTHTEXTURES]]; + [self setNdsDisplayMode:s]; _displayModeStatesApplied = _displayModeStatesPending; @@ -1192,85 +1236,98 @@ void UpdateDisplayPropertiesFromStates(uint64_t displayModeStates, ClientDisplay - (NSArray *> *) displayModes { - const uint64_t currentDisplayMode = _displayModeStatesPending; + const uint64_t s = _displayModeStatesPending; // Generate each display option submenu. NSArray< NSDictionary *> *displayModeMenu = [NSArray arrayWithObjects: - [self generateDisplayModeItemByID:NDSDisplayOptionID_Mode_DualScreen states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_Mode_Main states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_Mode_Touch states:currentDisplayMode], + [self generateDisplayModeItemByID:NDSDisplayOptionID_Mode_DualScreen states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_Mode_Main states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_Mode_Touch states:s], nil]; NSArray< NSDictionary *> *displayRotationMenu = [NSArray arrayWithObjects: - [self generateDisplayModeItemByID:NDSDisplayOptionID_Rotation_0 states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_Rotation_90 states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_Rotation_180 states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_Rotation_270 states:currentDisplayMode], + [self generateDisplayModeItemByID:NDSDisplayOptionID_Rotation_0 states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_Rotation_90 states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_Rotation_180 states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_Rotation_270 states:s], nil]; NSArray< NSDictionary *> *displayLayoutMenu = [NSArray arrayWithObjects: - [self generateDisplayModeItemByID:NDSDisplayOptionID_Layout_Vertical states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_Layout_Horizontal states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_Layout_Hybrid_2_1 states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_Layout_Hybrid_16_9 states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_Layout_Hybrid_16_10 states:currentDisplayMode], + [self generateDisplayModeItemByID:NDSDisplayOptionID_Layout_Vertical states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_Layout_Horizontal states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_Layout_Hybrid_2_1 states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_Layout_Hybrid_16_9 states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_Layout_Hybrid_16_10 states:s], nil]; NSArray< NSDictionary *> *displayOrderMenu = [NSArray arrayWithObjects: - [self generateDisplayModeItemByID:NDSDisplayOptionID_Order_MainFirst states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_Order_TouchFirst states:currentDisplayMode], + [self generateDisplayModeItemByID:NDSDisplayOptionID_Order_MainFirst states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_Order_TouchFirst states:s], nil]; NSArray< NSDictionary *> *displaySeparationMenu = [NSArray arrayWithObjects: - [self generateDisplayModeItemByID:NDSDisplayOptionID_Separation_0 states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_Separation_50 states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_Separation_100 states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_Separation_150 states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_Separation_200 states:currentDisplayMode], + [self generateDisplayModeItemByID:NDSDisplayOptionID_Separation_0 states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_Separation_50 states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_Separation_100 states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_Separation_150 states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_Separation_200 states:s], nil]; NSArray< NSDictionary *> *displayVideoSourceMenu = [NSArray arrayWithObjects: - [self generateDisplayModeItemByID:NDSDisplayOptionID_VideoSourceMain_None states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_VideoSourceMain_NDS states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_VideoSourceMain_ForceMain states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_VideoSourceMain_ForceSub states:currentDisplayMode], + [self generateDisplayModeItemByID:NDSDisplayOptionID_VideoSourceMain_None states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_VideoSourceMain_NDS states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_VideoSourceMain_ForceMain states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_VideoSourceMain_ForceSub states:s], [NSDictionary dictionaryWithObjectsAndKeys:@"---", OEGameCoreDisplayModeSeparatorItemKey, nil], - [self generateDisplayModeItemByID:NDSDisplayOptionID_VideoSourceTouch_None states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_VideoSourceTouch_NDS states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_VideoSourceTouch_ForceMain states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_VideoSourceTouch_ForceSub states:currentDisplayMode], + [self generateDisplayModeItemByID:NDSDisplayOptionID_VideoSourceTouch_None states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_VideoSourceTouch_NDS states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_VideoSourceTouch_ForceMain states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_VideoSourceTouch_ForceSub states:s], nil]; NSArray< NSDictionary *> *displayHUDMenu = [NSArray arrayWithObjects: - [self generateDisplayModeItemByID:NDSDisplayOptionID_HUD_Enable states:currentDisplayMode], + [self generateDisplayModeItemByID:NDSDisplayOptionID_HUD_Enable states:s], [NSDictionary dictionaryWithObjectsAndKeys:@"---", OEGameCoreDisplayModeSeparatorItemKey, nil], - [self generateDisplayModeItemByID:NDSDisplayOptionID_HUD_ExecutionSpeed states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_HUD_VideoFPS states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_HUD_3DRendererFPS states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_HUD_FrameIndex states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_HUD_LagFrameCounter states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_HUD_CPULoadAverage states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_HUD_RealTimeClock states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_HUD_Input states:currentDisplayMode], + [self generateDisplayModeItemByID:NDSDisplayOptionID_HUD_ExecutionSpeed states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_HUD_VideoFPS states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_HUD_3DRendererFPS states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_HUD_FrameIndex states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_HUD_LagFrameCounter states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_HUD_CPULoadAverage states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_HUD_RealTimeClock states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_HUD_Input states:s], + nil]; + + NSArray< NSDictionary *> *displayGPUEmulationMenu = + [NSArray arrayWithObjects: + [self generateDisplayModeItemByID:NDSDisplayOptionID_GPU_Engine_Software states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_GPU_Software_FragmentSamplingHack states:s], + [NSDictionary dictionaryWithObjectsAndKeys:@"---", OEGameCoreDisplayModeSeparatorItemKey, nil], + [self generateDisplayModeItemByID:NDSDisplayOptionID_GPU_Engine_OpenGL states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_GPU_OpenGL_SmoothTextures states:s], nil]; NSArray< NSDictionary *> *display3DRenderingMenu = [NSArray arrayWithObjects: - [self generateDisplayModeItemByID:NDSDisplayOptionID_3D_RenderScaling_1x states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_3D_RenderScaling_2x states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_3D_RenderScaling_3x states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_3D_RenderScaling_4x states:currentDisplayMode], + [self generateDisplayModeItemByID:NDSDisplayOptionID_3D_RenderScaling_1x states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_3D_RenderScaling_2x states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_3D_RenderScaling_3x states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_3D_RenderScaling_4x states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_3D_RenderScaling_5x states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_3D_RenderScaling_6x states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_3D_RenderScaling_7x states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_3D_RenderScaling_8x states:s], [NSDictionary dictionaryWithObjectsAndKeys:@"---", OEGameCoreDisplayModeSeparatorItemKey, nil], - [self generateDisplayModeItemByID:NDSDisplayOptionID_3D_TextureScaling_1x states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_3D_TextureScaling_2x states:currentDisplayMode], - [self generateDisplayModeItemByID:NDSDisplayOptionID_3D_TextureScaling_4x states:currentDisplayMode], + [self generateDisplayModeItemByID:NDSDisplayOptionID_3D_TextureScaling_1x states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_3D_TextureScaling_2x states:s], + [self generateDisplayModeItemByID:NDSDisplayOptionID_3D_TextureScaling_4x states:s], nil]; // Add each submenu to the menu descriptor. @@ -1300,6 +1357,7 @@ void UpdateDisplayPropertiesFromStates(uint64_t displayModeStates, ClientDisplay [NSDictionary dictionaryWithObjectsAndKeys:@"---", OEGameCoreDisplayModeSeparatorItemKey, nil], [NSDictionary dictionaryWithObjectsAndKeys: @"Heads-Up Display", OEGameCoreDisplayModeGroupNameKey, displayHUDMenu, OEGameCoreDisplayModeGroupItemsKey, nil], [NSDictionary dictionaryWithObjectsAndKeys:@"---", OEGameCoreDisplayModeSeparatorItemKey, nil], + [NSDictionary dictionaryWithObjectsAndKeys: @"GPU Emulation", OEGameCoreDisplayModeGroupNameKey, displayGPUEmulationMenu, OEGameCoreDisplayModeGroupItemsKey, nil], [NSDictionary dictionaryWithObjectsAndKeys: @"3D Rendering", OEGameCoreDisplayModeGroupNameKey, display3DRenderingMenu, OEGameCoreDisplayModeGroupItemsKey, nil], nil];