diff --git a/desmume/src/frontend/cocoa/ClientDisplayView.cpp b/desmume/src/frontend/cocoa/ClientDisplayView.cpp index 88af3f3a2..3edd585d1 100644 --- a/desmume/src/frontend/cocoa/ClientDisplayView.cpp +++ b/desmume/src/frontend/cocoa/ClientDisplayView.cpp @@ -45,8 +45,13 @@ ClientDisplayView::ClientDisplayView(const ClientDisplayViewProperties &props) ClientDisplayView::~ClientDisplayView() { delete _initialTouchInMajorDisplay; + _initialTouchInMajorDisplay = NULL; - FT_Done_FreeType(this->_ftLibrary); + if (this->_ftLibrary != NULL) + { + FT_Done_FreeType(this->_ftLibrary); + this->_ftLibrary = NULL; + } } void ClientDisplayView::__InstanceInit(const ClientDisplayViewProperties &props) @@ -318,6 +323,11 @@ void ClientDisplayView::SetPixelScaler(const VideoFilterTypeID filterID) // HUD appearance void ClientDisplayView::SetHUDFontUsingPath(const char *filePath) { + if (filePath == NULL) + { + return; + } + FT_Face fontFace; FT_Error error = FT_Err_Ok; diff --git a/desmume/src/frontend/cocoa/ClientDisplayView.h b/desmume/src/frontend/cocoa/ClientDisplayView.h index 7b28b3159..686e0d210 100644 --- a/desmume/src/frontend/cocoa/ClientDisplayView.h +++ b/desmume/src/frontend/cocoa/ClientDisplayView.h @@ -182,7 +182,7 @@ public: virtual void SetPixelScaler(const VideoFilterTypeID filterID); // HUD appearance - void SetHUDFontUsingPath(const char *filePath); + virtual void SetHUDFontUsingPath(const char *filePath); virtual void CopyHUDFont(const FT_Face &fontFace, const size_t glyphSize, const size_t glyphTileSize, GlyphInfo *glyphInfo); virtual void SetHUDInfo(const NDSFrameInfo &frameInfo); @@ -267,7 +267,7 @@ public: void SetHUDTextureCoordinates(float *texCoordBufferPtr); void SetScreenVertices(float *vtxBufferPtr); void SetScreenTextureCoordinates(float w0, float h0, float w1, float h1, float *texCoordBufferPtr); - + virtual void UpdateView() = 0; }; diff --git a/desmume/src/frontend/cocoa/DeSmuME (Latest).xcodeproj/project.pbxproj b/desmume/src/frontend/cocoa/DeSmuME (Latest).xcodeproj/project.pbxproj index 2874a4020..fe823a416 100644 --- a/desmume/src/frontend/cocoa/DeSmuME (Latest).xcodeproj/project.pbxproj +++ b/desmume/src/frontend/cocoa/DeSmuME (Latest).xcodeproj/project.pbxproj @@ -137,6 +137,9 @@ AB3ACC4014C24D5400D7D192 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3A14C24D5400D7D192 /* COPYING */; }; AB3ACC4114C24D5400D7D192 /* README in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3B14C24D5400D7D192 /* README */; }; AB3ACC4314C24D5400D7D192 /* README.MAC in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3D14C24D5400D7D192 /* README.MAC */; }; + AB3BF4021E22FE01003E2B24 /* MacOGLDisplayView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3BF4011E22FE01003E2B24 /* MacOGLDisplayView.mm */; }; + AB3BF4031E22FE01003E2B24 /* MacOGLDisplayView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3BF4011E22FE01003E2B24 /* MacOGLDisplayView.mm */; }; + AB3BF4041E22FE01003E2B24 /* MacOGLDisplayView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3BF4011E22FE01003E2B24 /* MacOGLDisplayView.mm */; }; AB3E34C9134AF4500056477A /* cocoa_output.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E34C8134AF4500056477A /* cocoa_output.mm */; }; AB40562A169F5DBB0016AC3E /* assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405600169F5DBB0016AC3E /* assembler.cpp */; }; AB40562B169F5DBB0016AC3E /* assembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB405600169F5DBB0016AC3E /* assembler.cpp */; }; @@ -1347,6 +1350,8 @@ AB3ACC3A14C24D5400D7D192 /* COPYING */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = COPYING; path = ../../../COPYING; sourceTree = SOURCE_ROOT; }; AB3ACC3B14C24D5400D7D192 /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README; path = ../../../README; sourceTree = SOURCE_ROOT; }; AB3ACC3D14C24D5400D7D192 /* README.MAC */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README.MAC; path = ../../../README.MAC; sourceTree = SOURCE_ROOT; }; + AB3BF4011E22FE01003E2B24 /* MacOGLDisplayView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MacOGLDisplayView.mm; sourceTree = ""; }; + AB3BF4051E22FEA8003E2B24 /* MacOGLDisplayView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MacOGLDisplayView.h; sourceTree = ""; }; AB3E34C7134AF4500056477A /* cocoa_output.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_output.h; sourceTree = ""; }; AB3E34C8134AF4500056477A /* cocoa_output.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_output.mm; sourceTree = ""; }; AB4055ED169F59380016AC3E /* AsmJit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AsmJit.h; sourceTree = ""; }; @@ -2370,6 +2375,7 @@ AB29B32F16D4BEBF000EF671 /* InputManager.h */, AB3ACB6E14C2361100D7D192 /* inputPrefsView.h */, AB01005C170D07AF00D70FBE /* InputProfileController.h */, + AB3BF4051E22FEA8003E2B24 /* MacOGLDisplayView.h */, AB3ACB7014C2361100D7D192 /* preferencesWindowDelegate.h */, ABAF0A3F1A96E67200B95B75 /* RomInfoPanel.h */, AB564902186E6EBC002740F4 /* Slot2WindowDelegate.h */, @@ -2382,6 +2388,7 @@ AB29B33016D4BEBF000EF671 /* InputManager.mm */, AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */, AB01005D170D07B000D70FBE /* InputProfileController.mm */, + AB3BF4011E22FE01003E2B24 /* MacOGLDisplayView.mm */, AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */, ABAF0A401A96E67200B95B75 /* RomInfoPanel.mm */, AB564903186E6EBC002740F4 /* Slot2WindowDelegate.mm */, @@ -3839,6 +3846,7 @@ ABA6574B14511EC90077E5E9 /* cocoa_cheat.mm in Sources */, ABD1041D1346652500AF11D1 /* cocoa_core.mm in Sources */, AB58F32D1364F44B0074C376 /* cocoa_file.mm in Sources */, + AB3BF4041E22FE01003E2B24 /* MacOGLDisplayView.mm in Sources */, ABE7F53E13EE1C7900FD3A71 /* cocoa_firmware.mm in Sources */, ABD1041C1346652500AF11D1 /* cocoa_input.mm in Sources */, AB3E34C9134AF4500056477A /* cocoa_output.mm in Sources */, @@ -3983,6 +3991,7 @@ AB796D0F15CDCBA200C59155 /* GPU.cpp in Sources */, ABADF11B1DEA4CF700A142B1 /* features_cpu.c in Sources */, AB9038AF17C5ED2200F410BD /* slot1_retail_auto.cpp in Sources */, + AB3BF4021E22FE01003E2B24 /* MacOGLDisplayView.mm in Sources */, AB796D1115CDCBA200C59155 /* guid.cpp in Sources */, ABFEA8191BB4EC1000B08C25 /* ftfntfmt.c in Sources */, AB796D1215CDCBA200C59155 /* header.cpp in Sources */, @@ -4183,6 +4192,7 @@ ABA7316D1BB51FDC00B26147 /* psaux.c in Sources */, AB8F3C7E1A53AC2600A80BF6 /* cpu_detect_x86_gcc.cpp in Sources */, AB8F3C7F1A53AC2600A80BF6 /* crc.cpp in Sources */, + AB3BF4031E22FE01003E2B24 /* MacOGLDisplayView.mm in Sources */, AB8F3C801A53AC2600A80BF6 /* datetime.cpp in Sources */, AB8F3C811A53AC2600A80BF6 /* debug.cpp in Sources */, AB8F3C821A53AC2600A80BF6 /* decrypt.cpp in Sources */, diff --git a/desmume/src/frontend/cocoa/DeSmuME (XCode 3).xcodeproj/project.pbxproj b/desmume/src/frontend/cocoa/DeSmuME (XCode 3).xcodeproj/project.pbxproj index 52abb1722..324ccf3a8 100644 --- a/desmume/src/frontend/cocoa/DeSmuME (XCode 3).xcodeproj/project.pbxproj +++ b/desmume/src/frontend/cocoa/DeSmuME (XCode 3).xcodeproj/project.pbxproj @@ -757,6 +757,11 @@ AB3ACC4614C24D5400D7D192 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3A14C24D5400D7D192 /* COPYING */; }; AB3ACC4714C24D5400D7D192 /* README in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3B14C24D5400D7D192 /* README */; }; AB3ACC4914C24D5400D7D192 /* README.MAC in Resources */ = {isa = PBXBuildFile; fileRef = AB3ACC3D14C24D5400D7D192 /* README.MAC */; }; + AB3E69101E231E9900D4CC75 /* MacOGLDisplayView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E690F1E231E9900D4CC75 /* MacOGLDisplayView.mm */; }; + AB3E69111E231E9900D4CC75 /* MacOGLDisplayView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E690F1E231E9900D4CC75 /* MacOGLDisplayView.mm */; }; + AB3E69121E231E9900D4CC75 /* MacOGLDisplayView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E690F1E231E9900D4CC75 /* MacOGLDisplayView.mm */; }; + AB3E69131E231E9900D4CC75 /* MacOGLDisplayView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E690F1E231E9900D4CC75 /* MacOGLDisplayView.mm */; }; + AB3E69141E231E9900D4CC75 /* MacOGLDisplayView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB3E690F1E231E9900D4CC75 /* MacOGLDisplayView.mm */; }; AB43527217D5BA5E007417C8 /* slot1_retail_mcrom_debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB43527117D5BA5E007417C8 /* slot1_retail_mcrom_debug.cpp */; }; AB43527317D5BA5E007417C8 /* slot1_retail_mcrom_debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB43527117D5BA5E007417C8 /* slot1_retail_mcrom_debug.cpp */; }; AB43527417D5BA5E007417C8 /* slot1_retail_mcrom_debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AB43527117D5BA5E007417C8 /* slot1_retail_mcrom_debug.cpp */; }; @@ -1874,6 +1879,8 @@ AB3ACC3D14C24D5400D7D192 /* README.MAC */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README.MAC; path = ../../../README.MAC; sourceTree = SOURCE_ROOT; }; AB3E34C7134AF4500056477A /* cocoa_output.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cocoa_output.h; sourceTree = ""; }; AB3E34C8134AF4500056477A /* cocoa_output.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = cocoa_output.mm; sourceTree = ""; }; + AB3E690E1E231E9900D4CC75 /* MacOGLDisplayView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MacOGLDisplayView.h; sourceTree = ""; }; + AB3E690F1E231E9900D4CC75 /* MacOGLDisplayView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MacOGLDisplayView.mm; sourceTree = ""; }; AB43527117D5BA5E007417C8 /* slot1_retail_mcrom_debug.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = slot1_retail_mcrom_debug.cpp; sourceTree = ""; }; AB43528517D5BA95007417C8 /* fsnitro.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fsnitro.h; sourceTree = ""; }; AB43528617D5BA95007417C8 /* fsnitro.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fsnitro.cpp; sourceTree = ""; }; @@ -2947,6 +2954,7 @@ AB5A795616D5A56000ED84B7 /* InputManager.h */, AB3ACB6E14C2361100D7D192 /* inputPrefsView.h */, AB213D43170CB141006DDB0F /* InputProfileController.h */, + AB3E690E1E231E9900D4CC75 /* MacOGLDisplayView.h */, AB3ACB7014C2361100D7D192 /* preferencesWindowDelegate.h */, ABC3DEBB1A96EA96009EC345 /* RomInfoPanel.h */, ABAE2F7918682B6C00C92F4F /* Slot2WindowDelegate.h */, @@ -2959,6 +2967,7 @@ AB5A795716D5A56000ED84B7 /* InputManager.mm */, AB3ACB6F14C2361100D7D192 /* inputPrefsView.mm */, AB213D44170CB141006DDB0F /* InputProfileController.mm */, + AB3E690F1E231E9900D4CC75 /* MacOGLDisplayView.mm */, AB3ACB7114C2361100D7D192 /* preferencesWindowDelegate.mm */, ABC3DEBC1A96EA96009EC345 /* RomInfoPanel.mm */, ABAE2F7A18682B6C00C92F4F /* Slot2WindowDelegate.mm */, @@ -4539,6 +4548,7 @@ ABD21B631DE9010B001D2DFA /* features_cpu.c in Sources */, AB2C25081DEBFBD400706BFC /* encoding_utf.c in Sources */, AB0F13931E1B7C320075684F /* ClientDisplayView.cpp in Sources */, + AB3E69111E231E9900D4CC75 /* MacOGLDisplayView.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4721,6 +4731,7 @@ ABD21B641DE9010B001D2DFA /* features_cpu.c in Sources */, AB2C25091DEBFBD400706BFC /* encoding_utf.c in Sources */, AB0F13941E1B7C320075684F /* ClientDisplayView.cpp in Sources */, + AB3E69121E231E9900D4CC75 /* MacOGLDisplayView.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4933,6 +4944,7 @@ ABD21B621DE9010B001D2DFA /* features_cpu.c in Sources */, AB2C25071DEBFBD400706BFC /* encoding_utf.c in Sources */, AB0F13921E1B7C320075684F /* ClientDisplayView.cpp in Sources */, + AB3E69101E231E9900D4CC75 /* MacOGLDisplayView.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -5145,6 +5157,7 @@ ABD21B661DE9010B001D2DFA /* features_cpu.c in Sources */, AB2C250B1DEBFBD400706BFC /* encoding_utf.c in Sources */, AB0F13961E1B7C320075684F /* ClientDisplayView.cpp in Sources */, + AB3E69141E231E9900D4CC75 /* MacOGLDisplayView.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -5327,6 +5340,7 @@ ABD21B651DE9010B001D2DFA /* features_cpu.c in Sources */, AB2C250A1DEBFBD400706BFC /* encoding_utf.c in Sources */, AB0F13951E1B7C320075684F /* ClientDisplayView.cpp in Sources */, + AB3E69131E231E9900D4CC75 /* MacOGLDisplayView.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/desmume/src/frontend/cocoa/OGLDisplayOutput.cpp b/desmume/src/frontend/cocoa/OGLDisplayOutput.cpp index 0a863945c..bfe0098d3 100644 --- a/desmume/src/frontend/cocoa/OGLDisplayOutput.cpp +++ b/desmume/src/frontend/cocoa/OGLDisplayOutput.cpp @@ -4917,13 +4917,19 @@ OGLVideoOutput::OGLVideoOutput() OGLVideoOutput::~OGLVideoOutput() { - for (size_t i = 0; i < _layerList->size(); i++) + if (this->_layerList != NULL) { - delete (*_layerList)[i]; + for (size_t i = 0; i < _layerList->size(); i++) + { + delete (*this->_layerList)[i]; + } + + delete this->_layerList; + this->_layerList = NULL; } - delete _layerList; - delete _info; + delete this->_info; + this->_info = NULL; } void OGLVideoOutput::_UpdateNormalSize() @@ -6449,8 +6455,11 @@ void OGLHUDLayer::_UpdateVerticesOGL() void OGLHUDLayer::UpdateViewportOGL() { - glUseProgram(this->_program->GetProgramID()); - glUniform2f(this->_uniformViewSize, this->_output->GetViewProperties().clientWidth, this->_output->GetViewProperties().clientHeight); + if (this->_output->GetInfo()->IsShaderSupported()) + { + glUseProgram(this->_program->GetProgramID()); + glUniform2f(this->_uniformViewSize, this->_output->GetViewProperties().clientWidth, this->_output->GetViewProperties().clientHeight); + } this->_needUpdateVertices = true; }; @@ -7671,197 +7680,3 @@ void OGLDisplayLayer::FinishOGL() glFinishObjectAPPLE(GL_TEXTURE_RECTANGLE_ARB, (isUsingCPUPixelScaler) ? this->_texCPUFilterDstID[0] : ( (this->_isTexVideoInputDataNative[0]) ? this->_texVideoInputDataNativeID[0] : this->_texVideoInputDataCustomID[0]) ); glFinishObjectAPPLE(GL_TEXTURE_RECTANGLE_ARB, (isUsingCPUPixelScaler) ? this->_texCPUFilterDstID[1] : ( (this->_isTexVideoInputDataNative[1]) ? this->_texVideoInputDataNativeID[1] : this->_texVideoInputDataCustomID[1]) ); } - -#pragma mark - - -MacOGLDisplayView::MacOGLDisplayView(CGLContextObj context) -{ - this->_context = context; -} - -void MacOGLDisplayView::_FrameRenderAndFlush() -{ - this->FrameRender(); - CGLFlushDrawable(this->_context); -} - -CGLContextObj MacOGLDisplayView::GetContext() const -{ - return this->_context; -} - -void MacOGLDisplayView::SetContext(CGLContextObj context) -{ - this->_context = context; -} - -void MacOGLDisplayView::SetVideoBuffers(const uint32_t colorFormat, - const void *videoBufferHead, - const void *nativeBuffer0, - const void *nativeBuffer1, - const void *customBuffer0, const size_t customWidth0, const size_t customHeight0, - const void *customBuffer1, const size_t customWidth1, const size_t customHeight1) -{ - CGLLockContext(this->_context); - CGLSetCurrentContext(this->_context); - - this->OGLVideoOutput::SetVideoBuffers(colorFormat, - videoBufferHead, - nativeBuffer0, - nativeBuffer1, - customBuffer0, customWidth0, customHeight0, - customBuffer1, customWidth1, customHeight1); - - CGLUnlockContext(this->_context); -} - -void MacOGLDisplayView::SetUseVerticalSync(const bool useVerticalSync) -{ - const GLint swapInt = (useVerticalSync) ? 1 : 0; - - CGLLockContext(this->_context); - CGLSetCurrentContext(this->_context); - CGLSetParameter(this->_context, kCGLCPSwapInterval, &swapInt); - this->OGLVideoOutput::SetUseVerticalSync(useVerticalSync); - CGLUnlockContext(this->_context); -} - -void MacOGLDisplayView::SetScaleFactor(const double scaleFactor) -{ - CGLLockContext(this->_context); - CGLSetCurrentContext(this->_context); - this->OGLVideoOutput::SetScaleFactor(scaleFactor); - CGLUnlockContext(this->_context); -} - -void MacOGLDisplayView::SetupViewProperties() -{ - CGLLockContext(this->_context); - CGLSetCurrentContext(this->_context); - this->OGLVideoOutput::SetupViewProperties(); - this->_FrameRenderAndFlush(); - CGLUnlockContext(this->_context); -} - -void MacOGLDisplayView::SetFiltersPreferGPU(const bool preferGPU) -{ - CGLLockContext(this->_context); - CGLSetCurrentContext(this->_context); - this->OGLVideoOutput::SetFiltersPreferGPU(preferGPU); - CGLUnlockContext(this->_context); -} - -void MacOGLDisplayView::SetOutputFilter(const OutputFilterTypeID filterID) -{ - CGLLockContext(this->_context); - CGLSetCurrentContext(this->_context); - this->OGLVideoOutput::SetOutputFilter(filterID); - CGLUnlockContext(this->_context); -} - -void MacOGLDisplayView::SetPixelScaler(const VideoFilterTypeID filterID) -{ - CGLLockContext(this->_context); - CGLSetCurrentContext(this->_context); - this->OGLVideoOutput::SetPixelScaler(filterID); - CGLUnlockContext(this->_context); -} - -void MacOGLDisplayView::SetHUDVisibility(const bool visibleState) -{ - CGLLockContext(this->_context); - CGLSetCurrentContext(this->_context); - this->OGLVideoOutput::SetHUDVisibility(visibleState); - this->_FrameRenderAndFlush(); - CGLUnlockContext(this->_context); -} - -void MacOGLDisplayView::SetHUDShowVideoFPS(const bool visibleState) -{ - CGLLockContext(this->_context); - CGLSetCurrentContext(this->_context); - this->OGLVideoOutput::SetHUDShowVideoFPS(visibleState); - this->_FrameRenderAndFlush(); - CGLUnlockContext(this->_context); -} - -void MacOGLDisplayView::SetHUDShowRender3DFPS(const bool visibleState) -{ - CGLLockContext(this->_context); - CGLSetCurrentContext(this->_context); - this->OGLVideoOutput::SetHUDShowRender3DFPS(visibleState); - this->_FrameRenderAndFlush(); - CGLUnlockContext(this->_context); -} - -void MacOGLDisplayView::SetHUDShowFrameIndex(const bool visibleState) -{ - CGLLockContext(this->_context); - CGLSetCurrentContext(this->_context); - this->OGLVideoOutput::SetHUDShowFrameIndex(visibleState); - this->_FrameRenderAndFlush(); - CGLUnlockContext(this->_context); -} - -void MacOGLDisplayView::SetHUDShowLagFrameCount(const bool visibleState) -{ - CGLLockContext(this->_context); - CGLSetCurrentContext(this->_context); - this->OGLVideoOutput::SetHUDShowLagFrameCount(visibleState); - this->_FrameRenderAndFlush(); - CGLUnlockContext(this->_context); -} - -void MacOGLDisplayView::SetHUDShowCPULoadAverage(const bool visibleState) -{ - CGLLockContext(this->_context); - CGLSetCurrentContext(this->_context); - this->OGLVideoOutput::SetHUDShowCPULoadAverage(visibleState); - this->_FrameRenderAndFlush(); - CGLUnlockContext(this->_context); -} - -void MacOGLDisplayView::SetHUDShowRTC(const bool visibleState) -{ - CGLLockContext(this->_context); - CGLSetCurrentContext(this->_context); - this->OGLVideoOutput::SetHUDShowRTC(visibleState); - this->_FrameRenderAndFlush(); - CGLUnlockContext(this->_context); -} - -void MacOGLDisplayView::FrameFinish() -{ - CGLLockContext(this->_context); - CGLSetCurrentContext(this->_context); - this->OGLVideoOutput::FrameFinish(); - CGLUnlockContext(this->_context); -} - -void MacOGLDisplayView::HandleGPUFrameEndEvent(const bool isMainSizeNative, const bool isTouchSizeNative) -{ - CGLLockContext(this->_context); - CGLSetCurrentContext(this->_context); - this->FrameLoadGPU(isMainSizeNative, isTouchSizeNative); - this->FrameProcessGPU(); - CGLUnlockContext(this->_context); -} - -void MacOGLDisplayView::HandleEmulatorFrameEndEvent(const NDSFrameInfo &frameInfo) -{ - this->SetHUDInfo(frameInfo); - - CGLLockContext(this->_context); - CGLSetCurrentContext(this->_context); - this->FrameProcessHUD(); - this->_FrameRenderAndFlush(); - CGLUnlockContext(this->_context); -} - -void MacOGLDisplayView::UpdateView() -{ - CGLLockContext(this->_context); - CGLSetCurrentContext(this->_context); - this->_FrameRenderAndFlush(); - CGLUnlockContext(this->_context); -} diff --git a/desmume/src/frontend/cocoa/OGLDisplayOutput.h b/desmume/src/frontend/cocoa/OGLDisplayOutput.h index b681b70ce..bec6d4a0d 100644 --- a/desmume/src/frontend/cocoa/OGLDisplayOutput.h +++ b/desmume/src/frontend/cocoa/OGLDisplayOutput.h @@ -437,50 +437,6 @@ public: virtual void FrameFinish(); }; -class MacOGLDisplayView : public OGLVideoOutput -{ -protected: - CGLContextObj _context; - - void _FrameRenderAndFlush(); - -public: - MacOGLDisplayView(CGLContextObj context); - - CGLContextObj GetContext() const; - void SetContext(CGLContextObj context); - - virtual void SetVideoBuffers(const uint32_t colorFormat, - const void *videoBufferHead, - const void *nativeBuffer0, - const void *nativeBuffer1, - const void *customBuffer0, const size_t customWidth0, const size_t customHeight0, - const void *customBuffer1, const size_t customWidth1, const size_t customHeight1); - - virtual void SetUseVerticalSync(const bool useVerticalSync); - virtual void SetScaleFactor(const double scaleFactor); - - virtual void SetupViewProperties(); - - virtual void SetFiltersPreferGPU(const bool preferGPU); - virtual void SetOutputFilter(const OutputFilterTypeID filterID); - virtual void SetPixelScaler(const VideoFilterTypeID filterID); - - virtual void SetHUDVisibility(const bool visibleState); - virtual void SetHUDShowVideoFPS(const bool visibleState); - virtual void SetHUDShowRender3DFPS(const bool visibleState); - virtual void SetHUDShowFrameIndex(const bool visibleState); - virtual void SetHUDShowLagFrameCount(const bool visibleState); - virtual void SetHUDShowCPULoadAverage(const bool visibleState); - virtual void SetHUDShowRTC(const bool visibleState); - - virtual void FrameFinish(); - virtual void HandleGPUFrameEndEvent(const bool isMainSizeNative, const bool isTouchSizeNative); - virtual void HandleEmulatorFrameEndEvent(const NDSFrameInfo &frameInfo); - - virtual void UpdateView(); -}; - OGLInfo* OGLInfoCreate_Legacy(); extern OGLInfo* (*OGLInfoCreate_Func)(); diff --git a/desmume/src/frontend/cocoa/cocoa_globals.h b/desmume/src/frontend/cocoa/cocoa_globals.h index 13adf2ede..614f841be 100644 --- a/desmume/src/frontend/cocoa/cocoa_globals.h +++ b/desmume/src/frontend/cocoa/cocoa_globals.h @@ -407,7 +407,7 @@ enum MESSAGE_RECEIVE_GPU_FRAME, MESSAGE_CHANGE_VIEW_PROPERTIES, MESSAGE_REDRAW_VIEW, - MESSAGE_RELOAD_AND_REDRAW, + MESSAGE_RELOAD_REPROCESS_REDRAW, MESSAGE_REPROCESS_AND_REDRAW, MESSAGE_SET_GPU_STATE_FLAGS, MESSAGE_SET_RENDER3D_METHOD, diff --git a/desmume/src/frontend/cocoa/cocoa_output.h b/desmume/src/frontend/cocoa/cocoa_output.h index 99062a575..9abc3271d 100644 --- a/desmume/src/frontend/cocoa/cocoa_output.h +++ b/desmume/src/frontend/cocoa/cocoa_output.h @@ -95,45 +95,11 @@ struct NDSFrameInfo; @class CocoaVideoFilter; -@protocol CocoaDSDisplayDelegate - -@required -- (void) doFinishFrame; -- (void) doViewPropertiesChanged; - -@end - -@protocol CocoaDSDisplayVideoDelegate - -@required -- (void) doInitVideoOutput:(NSDictionary *)properties; - -- (void) doSetVideoBuffersUsingFormat:(const uint32_t)colorFormat - bufferHead:(const void *)videoBufferHead - nativeBuffer0:(const void *)nativeBuffer0 - nativeBuffer1:(const void *)nativeBuffer1 - customBuffer0:(const void *)customBuffer0 - customWidth0:(const size_t)customWidth0 - customHeight0:(const size_t)customHeight0 - customBuffer1:(const void *)customBuffer1 - customWidth1:(const size_t)customWidth1 - customHeight1:(const size_t)customHeight1; - -- (void) doLoadVideoFrameWithMainSizeNative:(bool)isMainSizeNative touchSizeNative:(bool)isTouchSizeNative; - -- (void) doProcessVideoFrameWithInfo:(const NDSFrameInfo &)frameInfo; - -@optional -- (void) doRedraw; - -@end - - @interface CocoaDSDisplay : CocoaDSOutput { - id delegate; + ClientDisplay3DView *_cdv; + ClientDisplayViewProperties _intermediateViewProps; NSSize displaySize; - ClientDisplayMode displayMode; uint32_t _receivedFrameIndex; uint32_t _currentReceivedFrameIndex; @@ -142,17 +108,19 @@ struct NDSFrameInfo; uint32_t _cpuLoadAvgARM9; uint32_t _cpuLoadAvgARM7; - OSSpinLock spinlockDisplayType; OSSpinLock spinlockReceivedFrameIndex; OSSpinLock spinlockCPULoadAverage; + OSSpinLock spinlockViewProperties; } -@property (retain) id delegate; +@property (assign, nonatomic) ClientDisplay3DView *clientDisplayView; @property (readonly) NSSize displaySize; -@property (assign) ClientDisplayMode displayMode; + +- (void) commitViewProperties:(const ClientDisplayViewProperties &)viewProps; - (void) doReceiveGPUFrame; - (void) handleReceiveGPUFrame; +- (void) handleChangeViewProperties; - (void) handleRequestScreenshot:(NSData *)fileURLStringData fileTypeData:(NSData *)fileTypeData; - (void) handleCopyToPasteboard; @@ -169,13 +137,35 @@ struct NDSFrameInfo; void *_videoBuffer; void *_nativeBuffer[2]; void *_customBuffer[2]; + + OSSpinLock spinlockIsHUDVisible; + OSSpinLock spinlockUseVerticalSync; + OSSpinLock spinlockVideoFiltersPreferGPU; + OSSpinLock spinlockOutputFilter; + OSSpinLock spinlockSourceDeposterize; + OSSpinLock spinlockPixelScaler; } +@property (readonly) BOOL canFilterOnGPU; +@property (assign) BOOL isHUDVisible; +@property (assign) BOOL isHUDVideoFPSVisible; +@property (assign) BOOL isHUDRender3DFPSVisible; +@property (assign) BOOL isHUDFrameIndexVisible; +@property (assign) BOOL isHUDLagFrameCountVisible; +@property (assign) BOOL isHUDCPULoadAverageVisible; +@property (assign) BOOL isHUDRealTimeClockVisible; +@property (assign) BOOL useVerticalSync; +@property (assign) BOOL videoFiltersPreferGPU; +@property (assign) BOOL sourceDeposterize; +@property (assign) NSInteger outputFilter; +@property (assign) NSInteger pixelScaler; + - (void) handleReceiveGPUFrame; - (void) handleRedrawView; - (void) handleReloadAndRedraw; - (void) handleReprocessAndRedraw; - (void) resetVideoBuffers; +- (void) setScaleFactor:(float)theScaleFactor; @end diff --git a/desmume/src/frontend/cocoa/cocoa_output.mm b/desmume/src/frontend/cocoa/cocoa_output.mm index b1ea3c92a..6b157233f 100644 --- a/desmume/src/frontend/cocoa/cocoa_output.mm +++ b/desmume/src/frontend/cocoa/cocoa_output.mm @@ -501,10 +501,8 @@ @implementation CocoaDSDisplay -@synthesize delegate; +@dynamic clientDisplayView; @dynamic displaySize; -@dynamic displayMode; - - (id)init { @@ -514,12 +512,11 @@ return self; } - spinlockDisplayType = OS_SPINLOCK_INIT; spinlockReceivedFrameIndex = OS_SPINLOCK_INIT; spinlockCPULoadAverage = OS_SPINLOCK_INIT; + spinlockViewProperties = OS_SPINLOCK_INIT; - delegate = nil; - displayMode = ClientDisplayMode_Dual; + _cdv = NULL; _receivedFrameIndex = 0; _currentReceivedFrameIndex = 0; @@ -527,68 +524,43 @@ _cpuLoadAvgARM9 = 0; _cpuLoadAvgARM7 = 0; - - [property setValue:[NSNumber numberWithInteger:displayMode] forKey:@"displayMode"]; - [property setValue:NSSTRING_DISPLAYMODE_MAIN forKey:@"displayModeString"]; - + return self; } - (void)dealloc { - [self setDelegate:nil]; - [super dealloc]; } +- (void) setClientDisplayView:(ClientDisplay3DView *)clientDisplayView +{ + _cdv = clientDisplayView; +} + +- (ClientDisplay3DView *) clientDisplayView +{ + return _cdv; +} + +- (void) commitViewProperties:(const ClientDisplayViewProperties &)viewProps +{ + OSSpinLockLock(&spinlockViewProperties); + _intermediateViewProps = viewProps; + OSSpinLockUnlock(&spinlockViewProperties); + + [CocoaDSUtil messageSendOneWay:[self receivePort] msgID:MESSAGE_CHANGE_VIEW_PROPERTIES]; +} + - (NSSize) displaySize { pthread_rwlock_rdlock(self.rwlockProducer); - NSSize size = NSMakeSize((CGFloat)GPU->GetCustomFramebufferWidth(), (displayMode == ClientDisplayMode_Dual) ? (CGFloat)(GPU->GetCustomFramebufferHeight() * 2): (CGFloat)GPU->GetCustomFramebufferHeight()); + NSSize size = NSMakeSize((CGFloat)GPU->GetCustomFramebufferWidth(), (_cdv->GetMode() == ClientDisplayMode_Dual) ? (CGFloat)(GPU->GetCustomFramebufferHeight() * 2): (CGFloat)GPU->GetCustomFramebufferHeight()); pthread_rwlock_unlock(self.rwlockProducer); return size; } -- (void) setDisplayMode:(ClientDisplayMode)displayModeID -{ - NSString *newDispString = nil; - - switch (displayModeID) - { - case ClientDisplayMode_Main: - newDispString = NSSTRING_DISPLAYMODE_MAIN; - break; - - case ClientDisplayMode_Touch: - newDispString = NSSTRING_DISPLAYMODE_TOUCH; - break; - - case ClientDisplayMode_Dual: - newDispString = NSSTRING_DISPLAYMODE_DUAL; - break; - - default: - return; - break; - } - - OSSpinLockLock(&spinlockDisplayType); - displayMode = displayModeID; - [property setValue:[NSNumber numberWithInteger:displayModeID] forKey:@"displayMode"]; - [property setValue:newDispString forKey:@"displayModeString"]; - OSSpinLockUnlock(&spinlockDisplayType); -} - -- (ClientDisplayMode) displayMode -{ - OSSpinLockLock(&spinlockDisplayType); - ClientDisplayMode displayModeID = displayMode; - OSSpinLockUnlock(&spinlockDisplayType); - - return displayModeID; -} - - (void) doReceiveGPUFrame { [CocoaDSUtil messageSendOneWay:self.receivePort msgID:MESSAGE_RECEIVE_GPU_FRAME]; @@ -632,7 +604,11 @@ - (void) handleChangeViewProperties { - [(id)delegate doViewPropertiesChanged]; + OSSpinLockLock(&spinlockViewProperties); + _cdv->CommitViewProperties(_intermediateViewProps); + OSSpinLockUnlock(&spinlockViewProperties); + + _cdv->SetupViewProperties(); } - (void) handleRequestScreenshot:(NSData *)fileURLStringData fileTypeData:(NSData *)fileTypeData @@ -668,7 +644,7 @@ - (void) finishFrame { - [(id)delegate doFinishFrame]; + _cdv->FrameFinish(); } - (void) takeFrameCount @@ -713,10 +689,8 @@ - (NSBitmapImageRep *) bitmapImageRep { const NDSDisplayInfo &dispInfo = GPU->GetDisplayInfo(); - const NSInteger dispMode = [self displayMode]; - NSUInteger w = (NSUInteger)dispInfo.customWidth; - NSUInteger h = (dispMode == ClientDisplayMode_Dual) ? (NSUInteger)(dispInfo.customHeight * 2) : (NSUInteger)dispInfo.customHeight; + NSUInteger h = (_cdv->GetMode() == ClientDisplayMode_Dual) ? (NSUInteger)(dispInfo.customHeight * 2) : (NSUInteger)dispInfo.customHeight; NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:NULL pixelsWide:w @@ -768,6 +742,20 @@ @implementation CocoaDSDisplayVideo +@dynamic canFilterOnGPU; +@dynamic isHUDVisible; +@dynamic isHUDVideoFPSVisible; +@dynamic isHUDRender3DFPSVisible; +@dynamic isHUDFrameIndexVisible; +@dynamic isHUDLagFrameCountVisible; +@dynamic isHUDCPULoadAverageVisible; +@dynamic isHUDRealTimeClockVisible; +@dynamic useVerticalSync; +@dynamic videoFiltersPreferGPU; +@dynamic sourceDeposterize; +@dynamic outputFilter; +@dynamic pixelScaler; + - (id)init { self = [super init]; @@ -781,11 +769,14 @@ _nativeBuffer[NDSDisplayID_Touch] = NULL; _customBuffer[NDSDisplayID_Main] = NULL; _customBuffer[NDSDisplayID_Touch] = NULL; - [self resetVideoBuffers]; - - [property setValue:[NSNumber numberWithInteger:(NSInteger)VideoFilterTypeID_None] forKey:@"videoFilterType"]; - [property setValue:[CocoaVideoFilter typeStringByID:VideoFilterTypeID_None] forKey:@"videoFilterTypeString"]; + spinlockIsHUDVisible = OS_SPINLOCK_INIT; + spinlockUseVerticalSync = OS_SPINLOCK_INIT; + spinlockVideoFiltersPreferGPU = OS_SPINLOCK_INIT; + spinlockOutputFilter = OS_SPINLOCK_INIT; + spinlockSourceDeposterize = OS_SPINLOCK_INIT; + spinlockPixelScaler = OS_SPINLOCK_INIT; + return self; } @@ -800,13 +791,201 @@ [super dealloc]; } -- (void) runThread:(id)object +- (BOOL) canFilterOnGPU { - NSAutoreleasePool *tempPool = [[NSAutoreleasePool alloc] init]; - [(id)delegate doInitVideoOutput:self.property]; - [tempPool release]; + return (_cdv->CanFilterOnGPU()) ? YES : NO; +} + +- (void) setIsHUDVisible:(BOOL)theState +{ + OSSpinLockLock(&spinlockIsHUDVisible); + _cdv->SetHUDVisibility((theState) ? true : false); + OSSpinLockUnlock(&spinlockIsHUDVisible); +} + +- (BOOL) isHUDVisible +{ + OSSpinLockLock(&spinlockIsHUDVisible); + const BOOL theState = (_cdv->GetHUDVisibility()) ? YES : NO; + OSSpinLockUnlock(&spinlockIsHUDVisible); - [super runThread:object]; + return theState; +} + +- (void) setIsHUDVideoFPSVisible:(BOOL)theState +{ + OSSpinLockLock(&spinlockIsHUDVisible); + _cdv->SetHUDShowVideoFPS((theState) ? true : false); + OSSpinLockUnlock(&spinlockIsHUDVisible); +} + +- (BOOL) isHUDVideoFPSVisible +{ + OSSpinLockLock(&spinlockIsHUDVisible); + const BOOL theState = (_cdv->GetHUDShowVideoFPS()) ? YES : NO; + OSSpinLockUnlock(&spinlockIsHUDVisible); + + return theState; +} + +- (void) setIsHUDRender3DFPSVisible:(BOOL)theState +{ + OSSpinLockLock(&spinlockIsHUDVisible); + _cdv->SetHUDShowRender3DFPS((theState) ? true : false); + OSSpinLockUnlock(&spinlockIsHUDVisible); +} + +- (BOOL) isHUDRender3DFPSVisible +{ + OSSpinLockLock(&spinlockIsHUDVisible); + const BOOL theState = (_cdv->GetHUDShowRender3DFPS()) ? YES : NO; + OSSpinLockUnlock(&spinlockIsHUDVisible); + + return theState; +} + +- (void) setIsHUDFrameIndexVisible:(BOOL)theState +{ + OSSpinLockLock(&spinlockIsHUDVisible); + _cdv->SetHUDShowFrameIndex((theState) ? true : false); + OSSpinLockUnlock(&spinlockIsHUDVisible); +} + +- (BOOL) isHUDFrameIndexVisible +{ + OSSpinLockLock(&spinlockIsHUDVisible); + const BOOL theState = (_cdv->GetHUDShowFrameIndex()) ? YES : NO; + OSSpinLockUnlock(&spinlockIsHUDVisible); + + return theState; +} + +- (void) setIsHUDLagFrameCountVisible:(BOOL)theState +{ + OSSpinLockLock(&spinlockIsHUDVisible); + _cdv->SetHUDShowLagFrameCount((theState) ? true : false); + OSSpinLockUnlock(&spinlockIsHUDVisible); +} + +- (BOOL) isHUDLagFrameCountVisible +{ + OSSpinLockLock(&spinlockIsHUDVisible); + const BOOL theState = (_cdv->GetHUDShowLagFrameCount()) ? YES : NO; + OSSpinLockUnlock(&spinlockIsHUDVisible); + + return theState; +} + +- (void) setIsHUDCPULoadAverageVisible:(BOOL)theState +{ + OSSpinLockLock(&spinlockIsHUDVisible); + _cdv->SetHUDShowCPULoadAverage((theState) ? true : false); + OSSpinLockUnlock(&spinlockIsHUDVisible); +} + +- (BOOL) isHUDCPULoadAverageVisible +{ + OSSpinLockLock(&spinlockIsHUDVisible); + const BOOL theState = (_cdv->GetHUDShowCPULoadAverage()) ? YES : NO; + OSSpinLockUnlock(&spinlockIsHUDVisible); + + return theState; +} + +- (void) setIsHUDRealTimeClockVisible:(BOOL)theState +{ + OSSpinLockLock(&spinlockIsHUDVisible); + _cdv->SetHUDShowRTC((theState) ? true : false); + OSSpinLockUnlock(&spinlockIsHUDVisible); +} + +- (BOOL) isHUDRealTimeClockVisible +{ + OSSpinLockLock(&spinlockIsHUDVisible); + const BOOL theState = (_cdv->GetHUDShowRTC()) ? YES : NO; + OSSpinLockUnlock(&spinlockIsHUDVisible); + + return theState; +} + +- (void) setUseVerticalSync:(BOOL)theState +{ + OSSpinLockLock(&spinlockUseVerticalSync); + _cdv->SetUseVerticalSync((theState) ? true : false); + OSSpinLockUnlock(&spinlockUseVerticalSync); +} + +- (BOOL) useVerticalSync +{ + OSSpinLockLock(&spinlockUseVerticalSync); + const BOOL theState = (_cdv->GetUseVerticalSync()) ? YES : NO; + OSSpinLockUnlock(&spinlockUseVerticalSync); + + return theState; +} + +- (void) setVideoFiltersPreferGPU:(BOOL)theState +{ + OSSpinLockLock(&spinlockVideoFiltersPreferGPU); + _cdv->SetFiltersPreferGPU((theState) ? true : false); + OSSpinLockUnlock(&spinlockVideoFiltersPreferGPU); +} + +- (BOOL) videoFiltersPreferGPU +{ + OSSpinLockLock(&spinlockVideoFiltersPreferGPU); + const BOOL theState = (_cdv->GetFiltersPreferGPU()) ? YES : NO; + OSSpinLockUnlock(&spinlockVideoFiltersPreferGPU); + + return theState; +} + +- (void) setSourceDeposterize:(BOOL)theState +{ + OSSpinLockLock(&spinlockSourceDeposterize); + _cdv->SetSourceDeposterize((theState) ? true : false); + OSSpinLockUnlock(&spinlockSourceDeposterize); +} + +- (BOOL) sourceDeposterize +{ + OSSpinLockLock(&spinlockSourceDeposterize); + const BOOL theState = (_cdv->GetSourceDeposterize()) ? YES : NO; + OSSpinLockUnlock(&spinlockSourceDeposterize); + + return theState; +} + +- (void) setOutputFilter:(NSInteger)filterID +{ + OSSpinLockLock(&spinlockOutputFilter); + _cdv->SetOutputFilter((OutputFilterTypeID)filterID); + OSSpinLockUnlock(&spinlockOutputFilter); +} + +- (NSInteger) outputFilter +{ + OSSpinLockLock(&spinlockOutputFilter); + const NSInteger filterID = _cdv->GetOutputFilter(); + OSSpinLockUnlock(&spinlockOutputFilter); + + return filterID; +} + +- (void) setPixelScaler:(NSInteger)filterID +{ + OSSpinLockLock(&spinlockPixelScaler); + _cdv->SetPixelScaler((VideoFilterTypeID)filterID); + OSSpinLockUnlock(&spinlockPixelScaler); +} + +- (NSInteger) pixelScaler +{ + OSSpinLockLock(&spinlockPixelScaler); + const NSInteger filterID = _cdv->GetPixelScaler(); + OSSpinLockUnlock(&spinlockPixelScaler); + + return filterID; } - (void)handlePortMessage:(NSPortMessage *)portMessage @@ -815,7 +994,7 @@ switch (message) { - case MESSAGE_RELOAD_AND_REDRAW: + case MESSAGE_RELOAD_REPROCESS_REDRAW: [self handleReloadAndRedraw]; break; @@ -853,7 +1032,7 @@ rtcGetTimeAsString(frameInfo.rtcString); - [(id)delegate doProcessVideoFrameWithInfo:frameInfo]; + _cdv->HandleEmulatorFrameEndEvent(frameInfo); } - (void) handleReceiveGPUFrame @@ -891,17 +1070,12 @@ pthread_rwlock_unlock(self.rwlockProducer); - [(id)delegate doLoadVideoFrameWithMainSizeNative:isMainSizeNative touchSizeNative:isTouchSizeNative]; + _cdv->HandleGPUFrameEndEvent(isMainSizeNative, isTouchSizeNative); } - (void) handleRedrawView { - if (delegate == nil || ![delegate respondsToSelector:@selector(doRedraw)]) - { - return; - } - - [(id)delegate doRedraw]; + _cdv->UpdateView(); } - (void) handleReloadAndRedraw @@ -922,16 +1096,16 @@ void *oldVideoBuffer = _videoBuffer; uint8_t *newVideoBuffer = (uint8_t *)malloc_alignedCacheLine( ((GPU_FRAMEBUFFER_NATIVE_WIDTH * GPU_FRAMEBUFFER_NATIVE_HEIGHT) + (dispInfo.customWidth * dispInfo.customHeight)) * 2 * dispInfo.pixelBytes ); - [(id)delegate doSetVideoBuffersUsingFormat:dispInfo.colorFormat - bufferHead:newVideoBuffer - nativeBuffer0:newVideoBuffer - nativeBuffer1:newVideoBuffer + (GPU_FRAMEBUFFER_NATIVE_WIDTH * GPU_FRAMEBUFFER_NATIVE_HEIGHT * dispInfo.pixelBytes) - customBuffer0:newVideoBuffer + (GPU_FRAMEBUFFER_NATIVE_WIDTH * GPU_FRAMEBUFFER_NATIVE_HEIGHT * 2 * dispInfo.pixelBytes) - customWidth0:dispInfo.customWidth - customHeight0:dispInfo.customHeight - customBuffer1:newVideoBuffer + (GPU_FRAMEBUFFER_NATIVE_WIDTH * GPU_FRAMEBUFFER_NATIVE_HEIGHT * 2 * dispInfo.pixelBytes) + (dispInfo.customWidth * dispInfo.customHeight * dispInfo.pixelBytes) - customWidth1:dispInfo.customWidth - customHeight1:dispInfo.customHeight]; + _cdv->SetVideoBuffers(dispInfo.colorFormat, + newVideoBuffer, + newVideoBuffer, + newVideoBuffer + (GPU_FRAMEBUFFER_NATIVE_WIDTH * GPU_FRAMEBUFFER_NATIVE_HEIGHT * dispInfo.pixelBytes), + newVideoBuffer + (GPU_FRAMEBUFFER_NATIVE_WIDTH * GPU_FRAMEBUFFER_NATIVE_HEIGHT * 2 * dispInfo.pixelBytes), + dispInfo.customWidth, + dispInfo.customHeight, + newVideoBuffer + (GPU_FRAMEBUFFER_NATIVE_WIDTH * GPU_FRAMEBUFFER_NATIVE_HEIGHT * 2 * dispInfo.pixelBytes) + (dispInfo.customWidth * dispInfo.customHeight * dispInfo.pixelBytes), + dispInfo.customWidth, + dispInfo.customHeight); _videoBuffer = newVideoBuffer; _nativeBuffer[NDSDisplayID_Main] = newVideoBuffer; @@ -942,4 +1116,11 @@ free_aligned(oldVideoBuffer); } +- (void) setScaleFactor:(float)theScaleFactor +{ + OSSpinLockLock(&spinlockIsHUDVisible); + _cdv->SetScaleFactor(theScaleFactor); + OSSpinLockUnlock(&spinlockIsHUDVisible); +} + @end diff --git a/desmume/src/frontend/cocoa/userinterface/DisplayWindowController.h b/desmume/src/frontend/cocoa/userinterface/DisplayWindowController.h index 0b6f23644..450cc199a 100644 --- a/desmume/src/frontend/cocoa/userinterface/DisplayWindowController.h +++ b/desmume/src/frontend/cocoa/userinterface/DisplayWindowController.h @@ -35,27 +35,18 @@ class OGLVideoOutput; { } @end -@interface DisplayView : NSView +@interface DisplayView : NSView { InputManager *inputManager; + CocoaDSDisplayVideo *cdsVideoOutput; ClientDisplay3DView *_cdv; - ClientDisplayViewProperties _intermediateViewProps; - - OSSpinLock spinlockIsHUDVisible; - OSSpinLock spinlockUseVerticalSync; - OSSpinLock spinlockVideoFiltersPreferGPU; - OSSpinLock spinlockOutputFilter; - OSSpinLock spinlockSourceDeposterize; - OSSpinLock spinlockPixelScaler; - OSSpinLock spinlockViewProperties; - - // OpenGL context - NSOpenGLContext *context; - CGLContextObj cglDisplayContext; + NSOpenGLContext *localContext; } @property (retain) InputManager *inputManager; +@property (retain) CocoaDSDisplayVideo *cdsVideoOutput; +@property (readonly, nonatomic) ClientDisplay3DView *clientDisplay3DView; @property (readonly) BOOL canUseShaderBasedFilters; @property (assign) BOOL isHUDVisible; @property (assign) BOOL isHUDVideoFPSVisible; @@ -70,8 +61,6 @@ class OGLVideoOutput; @property (assign) NSInteger outputFilter; @property (assign) NSInteger pixelScaler; -- (void) setScaleFactor:(float)theScaleFactor; -- (void) commitViewProperties:(const ClientDisplayViewProperties &)viewProps; - (BOOL) handleKeyPress:(NSEvent *)theEvent keyPressed:(BOOL)keyPressed; - (BOOL) handleMouseButton:(NSEvent *)theEvent buttonPressed:(BOOL)buttonPressed; - (void) requestScreenshot:(NSURL *)fileURL fileType:(NSBitmapImageFileType)fileType; @@ -127,7 +116,7 @@ class OGLVideoOutput; @property (readonly) IBOutlet NSButton *microphoneMuteButton; @property (retain) EmuControllerDelegate *emuControl; -@property (assign) CocoaDSDisplayVideo *cdsVideoOutput; +@property (retain) CocoaDSDisplayVideo *cdsVideoOutput; @property (assign) NSScreen *assignedScreen; @property (retain) NSWindow *masterWindow; diff --git a/desmume/src/frontend/cocoa/userinterface/DisplayWindowController.mm b/desmume/src/frontend/cocoa/userinterface/DisplayWindowController.mm index 448f3bf9d..2b0b1e96b 100644 --- a/desmume/src/frontend/cocoa/userinterface/DisplayWindowController.mm +++ b/desmume/src/frontend/cocoa/userinterface/DisplayWindowController.mm @@ -26,11 +26,7 @@ #import "cocoa_videofilter.h" #import "cocoa_util.h" -#ifdef MAC_OS_X_VERSION_10_7 -#include "OGLDisplayOutput_3_2.h" -#else -#include "OGLDisplayOutput.h" -#endif +#include "MacOGLDisplayView.h" #include @@ -140,6 +136,7 @@ static std::unordered_map _screenMap; // [self setEmuControl:nil]; [self setAssignedScreen:nil]; [self setMasterWindow:nil]; + [self setCdsVideoOutput:nil]; [super dealloc]; } @@ -194,7 +191,7 @@ static std::unordered_map _screenMap; // if ([self isFullScreen]) { - [view commitViewProperties:_localViewProps]; + [[self cdsVideoOutput] commitViewProperties:_localViewProps]; } else { @@ -209,7 +206,7 @@ static std::unordered_map _screenMap; // // display view to update itself. if (oldBounds.width == newBounds.width && oldBounds.height == newBounds.height) { - [view commitViewProperties:_localViewProps]; + [[self cdsVideoOutput] commitViewProperties:_localViewProps]; } } } @@ -234,7 +231,7 @@ static std::unordered_map _screenMap; // } else { - [view commitViewProperties:_localViewProps]; + [[self cdsVideoOutput] commitViewProperties:_localViewProps]; } } @@ -254,7 +251,7 @@ static std::unordered_map _screenMap; // { if ([self isFullScreen]) { - [view commitViewProperties:_localViewProps]; + [[self cdsVideoOutput] commitViewProperties:_localViewProps]; } else { @@ -271,7 +268,7 @@ static std::unordered_map _screenMap; // - (void) setDisplayOrder:(NSInteger)theOrder { _localViewProps.order = (ClientDisplayOrder)theOrder; - [view commitViewProperties:_localViewProps]; + [[self cdsVideoOutput] commitViewProperties:_localViewProps]; } - (NSInteger) displayOrder @@ -298,7 +295,7 @@ static std::unordered_map _screenMap; // case ClientDisplayLayout_Hybrid_16_9: case ClientDisplayLayout_Hybrid_16_10: default: - [view commitViewProperties:_localViewProps]; + [[self cdsVideoOutput] commitViewProperties:_localViewProps]; break; } } @@ -308,7 +305,7 @@ static std::unordered_map _screenMap; // { case ClientDisplayLayout_Hybrid_16_9: case ClientDisplayLayout_Hybrid_16_10: - [view commitViewProperties:_localViewProps]; + [[self cdsVideoOutput] commitViewProperties:_localViewProps]; break; case ClientDisplayLayout_Horizontal: @@ -331,7 +328,7 @@ static std::unordered_map _screenMap; // - (void) setVideoFiltersPreferGPU:(BOOL)theState { [[self view] setVideoFiltersPreferGPU:theState]; - [CocoaDSUtil messageSendOneWay:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_RELOAD_AND_REDRAW]; + [CocoaDSUtil messageSendOneWay:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_RELOAD_REPROCESS_REDRAW]; } - (BOOL) videoFiltersPreferGPU @@ -342,7 +339,7 @@ static std::unordered_map _screenMap; // - (void) setVideoSourceDeposterize:(BOOL)theState { [[self view] setSourceDeposterize:theState]; - [CocoaDSUtil messageSendOneWay:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_RELOAD_AND_REDRAW]; + [CocoaDSUtil messageSendOneWay:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_RELOAD_REPROCESS_REDRAW]; } - (BOOL) videoSourceDeposterize @@ -364,7 +361,7 @@ static std::unordered_map _screenMap; // - (void) setVideoPixelScaler:(NSInteger)filterID { [[self view] setPixelScaler:filterID]; - [CocoaDSUtil messageSendOneWay:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_RELOAD_AND_REDRAW]; + [CocoaDSUtil messageSendOneWay:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_RELOAD_REPROCESS_REDRAW]; } - (NSInteger) videoPixelScaler @@ -504,7 +501,7 @@ static std::unordered_map _screenMap; // // window size changed or not. if (oldBounds.width == newBounds.width && oldBounds.height == newBounds.height) { - [view commitViewProperties:_localViewProps]; + [[self cdsVideoOutput] commitViewProperties:_localViewProps]; } } @@ -1276,22 +1273,24 @@ static std::unordered_map _screenMap; // scaleFactor = [[self window] backingScaleFactor]; } #endif - [view setScaleFactor:scaleFactor]; // Set up some custom UI elements. [microphoneGainMenuItem setView:microphoneGainControlView]; [outputVolumeMenuItem setView:outputVolumeControlView]; // Set up the video output thread. - cdsVideoOutput = [[CocoaDSDisplayVideo alloc] init]; - [cdsVideoOutput setDelegate:view]; - [cdsVideoOutput resetVideoBuffers]; + CocoaDSDisplayVideo *newDisplayOutput = [[CocoaDSDisplayVideo alloc] init]; + [newDisplayOutput setClientDisplayView:[view clientDisplay3DView]]; + [newDisplayOutput setScaleFactor:scaleFactor]; + [newDisplayOutput resetVideoBuffers]; + [self setCdsVideoOutput:newDisplayOutput]; + [view setCdsVideoOutput:newDisplayOutput]; // Add the video thread to the output list. - [emuControl addOutputToCore:cdsVideoOutput]; + [emuControl addOutputToCore:newDisplayOutput]; - [NSThread detachNewThreadSelector:@selector(runThread:) toTarget:cdsVideoOutput withObject:nil]; - while ([cdsVideoOutput thread] == nil) + [NSThread detachNewThreadSelector:@selector(runThread:) toTarget:newDisplayOutput withObject:nil]; + while ([newDisplayOutput thread] == nil) { [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]; } @@ -1375,8 +1374,7 @@ static std::unordered_map _screenMap; // const NSRect frameRect = newFrame; const NSRect contentRect = [window contentRectForFrameRect:frameRect]; - // Find the maximum scalar we can use for the display view, bounded by the - // content Rect. + // Find the maximum scalar we can use for the display view, bounded by the content Rect. double checkWidth = _localViewProps.normalWidth; double checkHeight = _localViewProps.normalHeight; ClientDisplayView::ConvertNormalToTransformedBounds(1.0, _localViewProps.rotation, checkWidth, checkHeight); @@ -1576,6 +1574,8 @@ static std::unordered_map _screenMap; // @implementation DisplayView @synthesize inputManager; +@synthesize cdsVideoOutput; +@dynamic clientDisplay3DView; @dynamic canUseShaderBasedFilters; @dynamic isHUDVisible; @dynamic isHUDVideoFPSVisible; @@ -1606,295 +1606,161 @@ static std::unordered_map _screenMap; // #endif inputManager = nil; + cdsVideoOutput = nil; - // Initialize the OpenGL context - NSOpenGLPixelFormatAttribute attributes[] = { - NSOpenGLPFAColorSize, (NSOpenGLPixelFormatAttribute)24, - NSOpenGLPFAAlphaSize, (NSOpenGLPixelFormatAttribute)8, - NSOpenGLPFADepthSize, (NSOpenGLPixelFormatAttribute)0, - NSOpenGLPFAStencilSize, (NSOpenGLPixelFormatAttribute)0, - NSOpenGLPFADoubleBuffer, - (NSOpenGLPixelFormatAttribute)0, (NSOpenGLPixelFormatAttribute)0, - (NSOpenGLPixelFormatAttribute)0 }; - -#ifdef _OGLDISPLAYOUTPUT_3_2_H_ - // If we can support a 3.2 Core Profile context, then request that in our - // pixel format attributes. - if (IsOSXVersionSupported(10, 7, 0)) - { - attributes[9] = NSOpenGLPFAOpenGLProfile; - attributes[10] = NSOpenGLProfileVersion3_2Core; - OGLInfoCreate_Func = &OGLInfoCreate_3_2; - } -#endif - - NSOpenGLPixelFormat *format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes]; - if (format == nil) - { - // If we can't get a 3.2 Core Profile context, then switch to using a - // legacy context instead. - attributes[9] = (NSOpenGLPixelFormatAttribute)0; - attributes[10] = (NSOpenGLPixelFormatAttribute)0; - OGLInfoCreate_Func = &OGLInfoCreate_Legacy; - format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes]; - } - - context = [[NSOpenGLContext alloc] initWithFormat:format shareContext:nil]; - [format release]; - cglDisplayContext = (CGLContextObj)[context CGLContextObj]; - - CGLContextObj prevContext = CGLGetCurrentContext(); - CGLSetCurrentContext(cglDisplayContext); - _cdv = new MacOGLDisplayView(cglDisplayContext); + _cdv = new MacOGLDisplayView(); _cdv->Init(); NSString *fontPath = [[NSBundle mainBundle] pathForResource:@"SourceSansPro-Bold" ofType:@"otf"]; _cdv->SetHUDFontUsingPath([fontPath cStringUsingEncoding:NSUTF8StringEncoding]); - CGLSetCurrentContext(prevContext); - - spinlockIsHUDVisible = OS_SPINLOCK_INIT; - spinlockUseVerticalSync = OS_SPINLOCK_INIT; - spinlockVideoFiltersPreferGPU = OS_SPINLOCK_INIT; - spinlockOutputFilter = OS_SPINLOCK_INIT; - spinlockSourceDeposterize = OS_SPINLOCK_INIT; - spinlockPixelScaler = OS_SPINLOCK_INIT; - - spinlockViewProperties = OS_SPINLOCK_INIT; + localContext = [[NSOpenGLContext alloc] initWithCGLContextObj:((MacOGLDisplayView *)_cdv)->GetContext()]; return self; } - (void)dealloc { - CGLContextObj prevContext = CGLGetCurrentContext(); - CGLSetCurrentContext(cglDisplayContext); - delete _cdv; - CGLSetCurrentContext(prevContext); - [self setInputManager:nil]; - [context clearDrawable]; - [context release]; + [self setCdsVideoOutput:nil]; + [localContext clearDrawable]; + [localContext release]; + + delete _cdv; [super dealloc]; } #pragma mark Dynamic Property Methods +- (ClientDisplay3DView *) clientDisplay3DView +{ + return _cdv; +} + - (BOOL) canUseShaderBasedFilters { - return (_cdv->CanFilterOnGPU()) ? YES : NO; + return [[self cdsVideoOutput] canFilterOnGPU]; } - (void) setIsHUDVisible:(BOOL)theState { - OSSpinLockLock(&spinlockIsHUDVisible); - _cdv->SetHUDVisibility((theState) ? true : false); - OSSpinLockUnlock(&spinlockIsHUDVisible); + [[self cdsVideoOutput] setIsHUDVisible:theState]; } - (BOOL) isHUDVisible { - OSSpinLockLock(&spinlockIsHUDVisible); - const BOOL theState = (_cdv->GetHUDVisibility()) ? YES : NO; - OSSpinLockUnlock(&spinlockIsHUDVisible); - - return theState; + return [[self cdsVideoOutput] isHUDVisible]; } - (void) setIsHUDVideoFPSVisible:(BOOL)theState { - OSSpinLockLock(&spinlockIsHUDVisible); - _cdv->SetHUDShowVideoFPS((theState) ? true : false); - OSSpinLockUnlock(&spinlockIsHUDVisible); + [[self cdsVideoOutput] setIsHUDVideoFPSVisible:theState]; } - (BOOL) isHUDVideoFPSVisible { - OSSpinLockLock(&spinlockIsHUDVisible); - const BOOL theState = (_cdv->GetHUDShowVideoFPS()) ? YES : NO; - OSSpinLockUnlock(&spinlockIsHUDVisible); - - return theState; + return [[self cdsVideoOutput] isHUDVideoFPSVisible]; } - (void) setIsHUDRender3DFPSVisible:(BOOL)theState { - OSSpinLockLock(&spinlockIsHUDVisible); - _cdv->SetHUDShowRender3DFPS((theState) ? true : false); - OSSpinLockUnlock(&spinlockIsHUDVisible); + [[self cdsVideoOutput] setIsHUDRender3DFPSVisible:theState]; } - (BOOL) isHUDRender3DFPSVisible { - OSSpinLockLock(&spinlockIsHUDVisible); - const BOOL theState = (_cdv->GetHUDShowRender3DFPS()) ? YES : NO; - OSSpinLockUnlock(&spinlockIsHUDVisible); - - return theState; + return [[self cdsVideoOutput] isHUDRender3DFPSVisible]; } - (void) setIsHUDFrameIndexVisible:(BOOL)theState { - OSSpinLockLock(&spinlockIsHUDVisible); - _cdv->SetHUDShowFrameIndex((theState) ? true : false); - OSSpinLockUnlock(&spinlockIsHUDVisible); + [[self cdsVideoOutput] setIsHUDFrameIndexVisible:theState]; } - (BOOL) isHUDFrameIndexVisible { - OSSpinLockLock(&spinlockIsHUDVisible); - const BOOL theState = (_cdv->GetHUDShowFrameIndex()) ? YES : NO; - OSSpinLockUnlock(&spinlockIsHUDVisible); - - return theState; + return [[self cdsVideoOutput] isHUDFrameIndexVisible]; } - (void) setIsHUDLagFrameCountVisible:(BOOL)theState { - OSSpinLockLock(&spinlockIsHUDVisible); - _cdv->SetHUDShowLagFrameCount((theState) ? true : false); - OSSpinLockUnlock(&spinlockIsHUDVisible); + [[self cdsVideoOutput] setIsHUDLagFrameCountVisible:theState]; } - (BOOL) isHUDLagFrameCountVisible { - OSSpinLockLock(&spinlockIsHUDVisible); - const BOOL theState = (_cdv->GetHUDShowLagFrameCount()) ? YES : NO; - OSSpinLockUnlock(&spinlockIsHUDVisible); - - return theState; + return [[self cdsVideoOutput] isHUDLagFrameCountVisible]; } - (void) setIsHUDCPULoadAverageVisible:(BOOL)theState { - OSSpinLockLock(&spinlockIsHUDVisible); - _cdv->SetHUDShowCPULoadAverage((theState) ? true : false); - OSSpinLockUnlock(&spinlockIsHUDVisible); + [[self cdsVideoOutput] setIsHUDCPULoadAverageVisible:theState]; } - (BOOL) isHUDCPULoadAverageVisible { - OSSpinLockLock(&spinlockIsHUDVisible); - const BOOL theState = (_cdv->GetHUDShowCPULoadAverage()) ? YES : NO; - OSSpinLockUnlock(&spinlockIsHUDVisible); - - return theState; + return [[self cdsVideoOutput] isHUDCPULoadAverageVisible]; } - (void) setIsHUDRealTimeClockVisible:(BOOL)theState { - OSSpinLockLock(&spinlockIsHUDVisible); - _cdv->SetHUDShowRTC((theState) ? true : false); - OSSpinLockUnlock(&spinlockIsHUDVisible); + [[self cdsVideoOutput] setIsHUDRealTimeClockVisible:theState]; } - (BOOL) isHUDRealTimeClockVisible { - OSSpinLockLock(&spinlockIsHUDVisible); - const BOOL theState = (_cdv->GetHUDShowRTC()) ? YES : NO; - OSSpinLockUnlock(&spinlockIsHUDVisible); - - return theState; + return [[self cdsVideoOutput] isHUDRealTimeClockVisible]; } - (void) setUseVerticalSync:(BOOL)theState { - OSSpinLockLock(&spinlockUseVerticalSync); - _cdv->SetUseVerticalSync((theState) ? true : false); - OSSpinLockUnlock(&spinlockUseVerticalSync); + [[self cdsVideoOutput] setUseVerticalSync:theState]; } - (BOOL) useVerticalSync { - OSSpinLockLock(&spinlockUseVerticalSync); - const BOOL theState = (_cdv->GetUseVerticalSync()) ? YES : NO; - OSSpinLockUnlock(&spinlockUseVerticalSync); - - return theState; + return [[self cdsVideoOutput] useVerticalSync]; } - (void) setVideoFiltersPreferGPU:(BOOL)theState { - OSSpinLockLock(&spinlockVideoFiltersPreferGPU); - _cdv->SetFiltersPreferGPU((theState) ? true : false); - OSSpinLockUnlock(&spinlockVideoFiltersPreferGPU); + [[self cdsVideoOutput] setVideoFiltersPreferGPU:theState]; } - (BOOL) videoFiltersPreferGPU { - OSSpinLockLock(&spinlockVideoFiltersPreferGPU); - const BOOL theState = (_cdv->GetFiltersPreferGPU()) ? YES : NO; - OSSpinLockUnlock(&spinlockVideoFiltersPreferGPU); - - return theState; + return [[self cdsVideoOutput] videoFiltersPreferGPU]; } - (void) setSourceDeposterize:(BOOL)theState { - OSSpinLockLock(&spinlockSourceDeposterize); - _cdv->SetSourceDeposterize((theState) ? true : false); - OSSpinLockUnlock(&spinlockSourceDeposterize); + [[self cdsVideoOutput] setSourceDeposterize:theState]; } - (BOOL) sourceDeposterize { - OSSpinLockLock(&spinlockSourceDeposterize); - const BOOL theState = (_cdv->GetSourceDeposterize()) ? YES : NO; - OSSpinLockUnlock(&spinlockSourceDeposterize); - - return theState; + return [[self cdsVideoOutput] sourceDeposterize]; } - (void) setOutputFilter:(NSInteger)filterID { - OSSpinLockLock(&spinlockOutputFilter); - _cdv->SetOutputFilter((OutputFilterTypeID)filterID); - OSSpinLockUnlock(&spinlockOutputFilter); + [[self cdsVideoOutput] setOutputFilter:filterID]; } - (NSInteger) outputFilter { - OSSpinLockLock(&spinlockOutputFilter); - const NSInteger filterID = _cdv->GetOutputFilter(); - OSSpinLockUnlock(&spinlockOutputFilter); - - return filterID; + return [[self cdsVideoOutput] outputFilter]; } - (void) setPixelScaler:(NSInteger)filterID { - OSSpinLockLock(&spinlockPixelScaler); - _cdv->SetPixelScaler((VideoFilterTypeID)filterID); - OSSpinLockUnlock(&spinlockPixelScaler); + [[self cdsVideoOutput] setPixelScaler:filterID]; } - (NSInteger) pixelScaler { - OSSpinLockLock(&spinlockPixelScaler); - const NSInteger filterID = _cdv->GetPixelScaler(); - OSSpinLockUnlock(&spinlockPixelScaler); - - return filterID; -} - -#pragma mark Class Methods - -- (void) setScaleFactor:(float)theScaleFactor -{ - OSSpinLockLock(&spinlockIsHUDVisible); - _cdv->SetScaleFactor(theScaleFactor); - OSSpinLockUnlock(&spinlockIsHUDVisible); -} - -- (void) commitViewProperties:(const ClientDisplayViewProperties &)viewProps -{ - OSSpinLockLock(&spinlockViewProperties); - _intermediateViewProps = viewProps; - OSSpinLockUnlock(&spinlockViewProperties); - - DisplayWindowController *windowController = (DisplayWindowController *)[[self window] delegate]; - [CocoaDSUtil messageSendOneWay:[[windowController cdsVideoOutput] receivePort] msgID:MESSAGE_CHANGE_VIEW_PROPERTIES]; + return [[self cdsVideoOutput] pixelScaler]; } #pragma mark InputHIDManagerTarget Protocol @@ -1999,8 +1865,7 @@ static std::unordered_map _screenMap; // NSData *bitmapImageFileTypeData = [[NSData alloc] initWithBytes:&fileType length:sizeof(NSBitmapImageFileType)]; NSArray *messageComponents = [[NSArray alloc] initWithObjects:fileURLStringData, bitmapImageFileTypeData, nil]; - DisplayWindowController *windowController = (DisplayWindowController *)[[self window] delegate]; - [CocoaDSUtil messageSendOneWayWithMessageComponents:[[windowController cdsVideoOutput] receivePort] msgID:MESSAGE_REQUEST_SCREENSHOT array:messageComponents]; + [CocoaDSUtil messageSendOneWayWithMessageComponents:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_REQUEST_SCREENSHOT array:messageComponents]; [bitmapImageFileTypeData release]; [messageComponents release]; @@ -2017,16 +1882,15 @@ static std::unordered_map _screenMap; // { [super lockFocus]; - if ([context view] != self) + if ([localContext view] != self) { - [context setView:self]; + [localContext setView:self]; } } - (void)drawRect:(NSRect)dirtyRect { - DisplayWindowController *windowController = (DisplayWindowController *)[[self window] delegate]; - [CocoaDSUtil messageSendOneWay:[[windowController cdsVideoOutput] receivePort] msgID:MESSAGE_REDRAW_VIEW]; + [CocoaDSUtil messageSendOneWay:[[self cdsVideoOutput] receivePort] msgID:MESSAGE_REDRAW_VIEW]; } - (void)setFrame:(NSRect)rect @@ -2036,7 +1900,7 @@ static std::unordered_map _screenMap; // if (rect.size.width != oldFrame.size.width || rect.size.height != oldFrame.size.height) { - [context update]; + [localContext update]; DisplayWindowController *windowController = (DisplayWindowController *)[[self window] delegate]; #if defined(MAC_OS_X_VERSION_10_7) && (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7) @@ -2056,7 +1920,7 @@ static std::unordered_map _screenMap; // props.clientHeight = newViewportRect.size.height; props.viewScale = ClientDisplayView::GetMaxScalarWithinBounds(checkWidth, checkHeight, props.clientWidth, props.clientHeight); - [self commitViewProperties:props]; + [[self cdsVideoOutput] commitViewProperties:props]; } } @@ -2164,61 +2028,6 @@ static std::unordered_map _screenMap; // return YES; } -#pragma mark CocoaDSDisplayVideoDelegate Protocol - -- (void)doInitVideoOutput:(NSDictionary *)properties -{ - // No init needed, so do nothing. -} - -- (void)doLoadVideoFrameWithMainSizeNative:(bool)isMainSizeNative touchSizeNative:(bool)isTouchSizeNative -{ - _cdv->HandleGPUFrameEndEvent(isMainSizeNative, isTouchSizeNative); -} - -- (void) doSetVideoBuffersUsingFormat:(const uint32_t)colorFormat - bufferHead:(const void *)videoBufferHead - nativeBuffer0:(const void *)nativeBuffer0 - nativeBuffer1:(const void *)nativeBuffer1 - customBuffer0:(const void *)customBuffer0 - customWidth0:(const size_t)customWidth0 - customHeight0:(const size_t)customHeight0 - customBuffer1:(const void *)customBuffer1 - customWidth1:(const size_t)customWidth1 - customHeight1:(const size_t)customHeight1 -{ - _cdv->SetVideoBuffers(colorFormat, - videoBufferHead, - nativeBuffer0, - nativeBuffer1, - customBuffer0, customWidth0, customHeight0, - customBuffer1, customWidth1, customHeight1); -} - -- (void)doFinishFrame -{ - _cdv->FrameFinish(); -} - -- (void)doProcessVideoFrameWithInfo:(const NDSFrameInfo &)frameInfo -{ - _cdv->HandleEmulatorFrameEndEvent(frameInfo); -} - -- (void)doViewPropertiesChanged -{ - OSSpinLockLock(&spinlockViewProperties); - _cdv->CommitViewProperties(_intermediateViewProps); - OSSpinLockUnlock(&spinlockViewProperties); - - _cdv->SetupViewProperties(); -} - -- (void)doRedraw -{ - _cdv->UpdateView(); -} - @end #pragma mark - diff --git a/desmume/src/frontend/cocoa/userinterface/EmuControllerDelegate.mm b/desmume/src/frontend/cocoa/userinterface/EmuControllerDelegate.mm index 16e17963d..aab0f53cb 100644 --- a/desmume/src/frontend/cocoa/userinterface/EmuControllerDelegate.mm +++ b/desmume/src/frontend/cocoa/userinterface/EmuControllerDelegate.mm @@ -347,7 +347,7 @@ { DisplayWindowController *newWindowController = [[DisplayWindowController alloc] initWithWindowNibName:@"DisplayWindow" emuControlDelegate:self]; - [CocoaDSUtil messageSendOneWay:[[newWindowController cdsVideoOutput] receivePort] msgID:MESSAGE_RELOAD_AND_REDRAW]; + [CocoaDSUtil messageSendOneWay:[[newWindowController cdsVideoOutput] receivePort] msgID:MESSAGE_RELOAD_REPROCESS_REDRAW]; [[newWindowController window] makeKeyAndOrderFront:self]; [[newWindowController window] makeMainWindow]; @@ -1509,7 +1509,7 @@ for (DisplayWindowController *windowController in windowList) { - [CocoaDSUtil messageSendOneWay:[[windowController cdsVideoOutput] receivePort] msgID:MESSAGE_RELOAD_AND_REDRAW]; + [CocoaDSUtil messageSendOneWay:[[windowController cdsVideoOutput] receivePort] msgID:MESSAGE_RELOAD_REPROCESS_REDRAW]; } [self setStatusText:NSSTRING_STATUS_EMULATOR_RESET]; @@ -1812,7 +1812,7 @@ for (DisplayWindowController *windowController in windowList) { - [CocoaDSUtil messageSendOneWay:[[windowController cdsVideoOutput] receivePort] msgID:MESSAGE_RELOAD_AND_REDRAW]; + [CocoaDSUtil messageSendOneWay:[[windowController cdsVideoOutput] receivePort] msgID:MESSAGE_RELOAD_REPROCESS_REDRAW]; } [self setStatusText:NSSTRING_STATUS_ROM_LOADED]; @@ -1891,7 +1891,7 @@ [[cdsCore cdsGPU] clearWithColor:0x8000]; for (DisplayWindowController *windowController in windowList) { - [CocoaDSUtil messageSendOneWay:[[windowController cdsVideoOutput] receivePort] msgID:MESSAGE_RELOAD_AND_REDRAW]; + [CocoaDSUtil messageSendOneWay:[[windowController cdsVideoOutput] receivePort] msgID:MESSAGE_RELOAD_REPROCESS_REDRAW]; } [self setStatusText:NSSTRING_STATUS_ROM_UNLOADED]; diff --git a/desmume/src/frontend/cocoa/userinterface/MacOGLDisplayView.h b/desmume/src/frontend/cocoa/userinterface/MacOGLDisplayView.h new file mode 100644 index 000000000..b311adfcb --- /dev/null +++ b/desmume/src/frontend/cocoa/userinterface/MacOGLDisplayView.h @@ -0,0 +1,78 @@ +/* + Copyright (C) 2017 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . + */ + +#ifndef _MAC_OGLDISPLAYOUTPUT_H_ +#define _MAC_OGLDISPLAYOUTPUT_H_ + +#import +#import + +#ifdef MAC_OS_X_VERSION_10_7 + #include "../OGLDisplayOutput_3_2.h" +#else + #include "../OGLDisplayOutput.h" +#endif + +class MacOGLDisplayView : public OGLVideoOutput +{ +protected: + CGLContextObj _context; + + void _FrameRenderAndFlush(); + +public: + void operator delete(void *ptr); + + virtual void Init(); + + CGLContextObj GetContext() const; + void SetContext(CGLContextObj context); + + virtual void SetHUDFontUsingPath(const char *filePath); + + virtual void SetVideoBuffers(const uint32_t colorFormat, + const void *videoBufferHead, + const void *nativeBuffer0, + const void *nativeBuffer1, + const void *customBuffer0, const size_t customWidth0, const size_t customHeight0, + const void *customBuffer1, const size_t customWidth1, const size_t customHeight1); + + virtual void SetUseVerticalSync(const bool useVerticalSync); + virtual void SetScaleFactor(const double scaleFactor); + + virtual void SetupViewProperties(); + + virtual void SetFiltersPreferGPU(const bool preferGPU); + virtual void SetOutputFilter(const OutputFilterTypeID filterID); + virtual void SetPixelScaler(const VideoFilterTypeID filterID); + + virtual void SetHUDVisibility(const bool visibleState); + virtual void SetHUDShowVideoFPS(const bool visibleState); + virtual void SetHUDShowRender3DFPS(const bool visibleState); + virtual void SetHUDShowFrameIndex(const bool visibleState); + virtual void SetHUDShowLagFrameCount(const bool visibleState); + virtual void SetHUDShowCPULoadAverage(const bool visibleState); + virtual void SetHUDShowRTC(const bool visibleState); + + virtual void FrameFinish(); + virtual void HandleGPUFrameEndEvent(const bool isMainSizeNative, const bool isTouchSizeNative); + virtual void HandleEmulatorFrameEndEvent(const NDSFrameInfo &frameInfo); + + virtual void UpdateView(); +}; + +#endif // _MAC_OGLDISPLAYOUTPUT_H_ diff --git a/desmume/src/frontend/cocoa/userinterface/MacOGLDisplayView.mm b/desmume/src/frontend/cocoa/userinterface/MacOGLDisplayView.mm new file mode 100644 index 000000000..1b447f18e --- /dev/null +++ b/desmume/src/frontend/cocoa/userinterface/MacOGLDisplayView.mm @@ -0,0 +1,274 @@ +/* + Copyright (C) 2017 DeSmuME team + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with the this software. If not, see . + */ + +#include "MacOGLDisplayView.h" +#include "../utilities.h" + +void MacOGLDisplayView::operator delete(void *ptr) +{ + CGLContextObj context = ((MacOGLDisplayView *)ptr)->GetContext(); + + CGLContextObj prevContext = CGLGetCurrentContext(); + CGLSetCurrentContext(context); + ::operator delete(ptr); + CGLSetCurrentContext(prevContext); + + CGLReleaseContext(context); +} + +void MacOGLDisplayView::Init() +{ + // Initialize the OpenGL context + CGLPixelFormatAttribute attributes[] = { + kCGLPFAColorSize, (CGLPixelFormatAttribute)24, + kCGLPFAAlphaSize, (CGLPixelFormatAttribute)8, + kCGLPFADepthSize, (CGLPixelFormatAttribute)0, + kCGLPFAStencilSize, (CGLPixelFormatAttribute)0, + kCGLPFADoubleBuffer, + (CGLPixelFormatAttribute)0, (CGLPixelFormatAttribute)0, + (CGLPixelFormatAttribute)0 }; + + OGLInfoCreate_Func = &OGLInfoCreate_Legacy; + +#ifdef _OGLDISPLAYOUTPUT_3_2_H_ + // If we can support a 3.2 Core Profile context, then request that in our + // pixel format attributes. + if (IsOSXVersionSupported(10, 7, 0)) + { + attributes[9] = kCGLPFAOpenGLProfile; + attributes[10] = (CGLPixelFormatAttribute)kCGLOGLPVersion_3_2_Core; + OGLInfoCreate_Func = &OGLInfoCreate_3_2; + } +#endif + + CGLPixelFormatObj cglPixFormat = NULL; + GLint virtualScreenCount = 0; + CGLChoosePixelFormat(attributes, &cglPixFormat, &virtualScreenCount); + + if (cglPixFormat == NULL) + { + // If we can't get a 3.2 Core Profile context, then switch to using a + // legacy context instead. + attributes[9] = (CGLPixelFormatAttribute)0; + attributes[10] = (CGLPixelFormatAttribute)0; + OGLInfoCreate_Func = &OGLInfoCreate_Legacy; + CGLChoosePixelFormat(attributes, &cglPixFormat, &virtualScreenCount); + } + + CGLCreateContext(cglPixFormat, NULL, &this->_context); + CGLReleasePixelFormat(cglPixFormat); + + CGLContextObj prevContext = CGLGetCurrentContext(); + CGLSetCurrentContext(this->_context); + this->OGLVideoOutput::Init(); + CGLSetCurrentContext(prevContext); +} + +void MacOGLDisplayView::_FrameRenderAndFlush() +{ + this->FrameRender(); + CGLFlushDrawable(this->_context); +} + +CGLContextObj MacOGLDisplayView::GetContext() const +{ + return this->_context; +} + +void MacOGLDisplayView::SetContext(CGLContextObj context) +{ + this->_context = context; +} + +void MacOGLDisplayView::SetHUDFontUsingPath(const char *filePath) +{ + CGLLockContext(this->_context); + CGLSetCurrentContext(this->_context); + this->OGLVideoOutput::SetHUDFontUsingPath(filePath); + CGLUnlockContext(this->_context); +} + +void MacOGLDisplayView::SetVideoBuffers(const uint32_t colorFormat, + const void *videoBufferHead, + const void *nativeBuffer0, + const void *nativeBuffer1, + const void *customBuffer0, const size_t customWidth0, const size_t customHeight0, + const void *customBuffer1, const size_t customWidth1, const size_t customHeight1) +{ + CGLLockContext(this->_context); + CGLSetCurrentContext(this->_context); + + this->OGLVideoOutput::SetVideoBuffers(colorFormat, + videoBufferHead, + nativeBuffer0, + nativeBuffer1, + customBuffer0, customWidth0, customHeight0, + customBuffer1, customWidth1, customHeight1); + + CGLUnlockContext(this->_context); +} + +void MacOGLDisplayView::SetUseVerticalSync(const bool useVerticalSync) +{ + const GLint swapInt = (useVerticalSync) ? 1 : 0; + + CGLLockContext(this->_context); + CGLSetCurrentContext(this->_context); + CGLSetParameter(this->_context, kCGLCPSwapInterval, &swapInt); + this->OGLVideoOutput::SetUseVerticalSync(useVerticalSync); + CGLUnlockContext(this->_context); +} + +void MacOGLDisplayView::SetScaleFactor(const double scaleFactor) +{ + CGLLockContext(this->_context); + CGLSetCurrentContext(this->_context); + this->OGLVideoOutput::SetScaleFactor(scaleFactor); + CGLUnlockContext(this->_context); +} + +void MacOGLDisplayView::SetupViewProperties() +{ + CGLLockContext(this->_context); + CGLSetCurrentContext(this->_context); + this->OGLVideoOutput::SetupViewProperties(); + this->_FrameRenderAndFlush(); + CGLUnlockContext(this->_context); +} + +void MacOGLDisplayView::SetFiltersPreferGPU(const bool preferGPU) +{ + CGLLockContext(this->_context); + CGLSetCurrentContext(this->_context); + this->OGLVideoOutput::SetFiltersPreferGPU(preferGPU); + CGLUnlockContext(this->_context); +} + +void MacOGLDisplayView::SetOutputFilter(const OutputFilterTypeID filterID) +{ + CGLLockContext(this->_context); + CGLSetCurrentContext(this->_context); + this->OGLVideoOutput::SetOutputFilter(filterID); + CGLUnlockContext(this->_context); +} + +void MacOGLDisplayView::SetPixelScaler(const VideoFilterTypeID filterID) +{ + CGLLockContext(this->_context); + CGLSetCurrentContext(this->_context); + this->OGLVideoOutput::SetPixelScaler(filterID); + CGLUnlockContext(this->_context); +} + +void MacOGLDisplayView::SetHUDVisibility(const bool visibleState) +{ + CGLLockContext(this->_context); + CGLSetCurrentContext(this->_context); + this->OGLVideoOutput::SetHUDVisibility(visibleState); + this->_FrameRenderAndFlush(); + CGLUnlockContext(this->_context); +} + +void MacOGLDisplayView::SetHUDShowVideoFPS(const bool visibleState) +{ + CGLLockContext(this->_context); + CGLSetCurrentContext(this->_context); + this->OGLVideoOutput::SetHUDShowVideoFPS(visibleState); + this->_FrameRenderAndFlush(); + CGLUnlockContext(this->_context); +} + +void MacOGLDisplayView::SetHUDShowRender3DFPS(const bool visibleState) +{ + CGLLockContext(this->_context); + CGLSetCurrentContext(this->_context); + this->OGLVideoOutput::SetHUDShowRender3DFPS(visibleState); + this->_FrameRenderAndFlush(); + CGLUnlockContext(this->_context); +} + +void MacOGLDisplayView::SetHUDShowFrameIndex(const bool visibleState) +{ + CGLLockContext(this->_context); + CGLSetCurrentContext(this->_context); + this->OGLVideoOutput::SetHUDShowFrameIndex(visibleState); + this->_FrameRenderAndFlush(); + CGLUnlockContext(this->_context); +} + +void MacOGLDisplayView::SetHUDShowLagFrameCount(const bool visibleState) +{ + CGLLockContext(this->_context); + CGLSetCurrentContext(this->_context); + this->OGLVideoOutput::SetHUDShowLagFrameCount(visibleState); + this->_FrameRenderAndFlush(); + CGLUnlockContext(this->_context); +} + +void MacOGLDisplayView::SetHUDShowCPULoadAverage(const bool visibleState) +{ + CGLLockContext(this->_context); + CGLSetCurrentContext(this->_context); + this->OGLVideoOutput::SetHUDShowCPULoadAverage(visibleState); + this->_FrameRenderAndFlush(); + CGLUnlockContext(this->_context); +} + +void MacOGLDisplayView::SetHUDShowRTC(const bool visibleState) +{ + CGLLockContext(this->_context); + CGLSetCurrentContext(this->_context); + this->OGLVideoOutput::SetHUDShowRTC(visibleState); + this->_FrameRenderAndFlush(); + CGLUnlockContext(this->_context); +} + +void MacOGLDisplayView::FrameFinish() +{ + CGLLockContext(this->_context); + CGLSetCurrentContext(this->_context); + this->OGLVideoOutput::FrameFinish(); + CGLUnlockContext(this->_context); +} + +void MacOGLDisplayView::HandleGPUFrameEndEvent(const bool isMainSizeNative, const bool isTouchSizeNative) +{ + CGLLockContext(this->_context); + CGLSetCurrentContext(this->_context); + this->FrameLoadGPU(isMainSizeNative, isTouchSizeNative); + this->FrameProcessGPU(); + CGLUnlockContext(this->_context); +} + +void MacOGLDisplayView::HandleEmulatorFrameEndEvent(const NDSFrameInfo &frameInfo) +{ + this->SetHUDInfo(frameInfo); + + CGLLockContext(this->_context); + CGLSetCurrentContext(this->_context); + this->FrameProcessHUD(); + this->_FrameRenderAndFlush(); + CGLUnlockContext(this->_context); +} + +void MacOGLDisplayView::UpdateView() +{ + CGLLockContext(this->_context); + CGLSetCurrentContext(this->_context); + this->_FrameRenderAndFlush(); + CGLUnlockContext(this->_context); +} diff --git a/desmume/src/frontend/cocoa/userinterface/appDelegate.mm b/desmume/src/frontend/cocoa/userinterface/appDelegate.mm index 9036725d5..6e434bc3c 100644 --- a/desmume/src/frontend/cocoa/userinterface/appDelegate.mm +++ b/desmume/src/frontend/cocoa/userinterface/appDelegate.mm @@ -694,7 +694,7 @@ } // Draw the display view now so that we guarantee that its drawn at least once. - [CocoaDSUtil messageSendOneWay:[[windowController cdsVideoOutput] receivePort] msgID:MESSAGE_RELOAD_AND_REDRAW]; + [CocoaDSUtil messageSendOneWay:[[windowController cdsVideoOutput] receivePort] msgID:MESSAGE_RELOAD_REPROCESS_REDRAW]; // If this window is set to full screen mode, its associated screen index must // exist. If not, this window will not enter full screen mode. This is necessary,