From b12ca3e9e35781821f11e7517fbe848e2cfb6abc Mon Sep 17 00:00:00 2001 From: Michael Buckley Date: Thu, 26 Dec 2019 11:12:39 -0800 Subject: [PATCH] Mac: Remove render lock and fix freeze/defrost screen --- macosx/.DS_Store | Bin 14340 -> 12292 bytes macosx/mac-os.mm | 11 ----------- macosx/mac-render.mm | 37 +++++++++++++------------------------ 3 files changed, 13 insertions(+), 35 deletions(-) diff --git a/macosx/.DS_Store b/macosx/.DS_Store index 932db0adc6b4cc70d043bc3c8d9ac8965645437e..631d51a89a69839b58639123ac20ae499215d8e5 100644 GIT binary patch delta 375 zcmZoEXh~3DU|?W$DortDV9)?EIe-{M3-ADmb_NCo?uiQejG+?)oF`vZx0+laExPfM zCO@Ou#0mD3E5&#=OA4rSig@PaCnx3PCxP?8Ln=cN zkgdm%3uKi5MRHIzF<1jNR{RG8pmqiZHilq^JfPZQ21|wtG_@=7sZA;`E`U1bln(r30;F+*~QOnt3y~!YoD^OxqYVU@qG{QPGJ_ w7UWY_kSl>6FHjJB-WmYh6R$zS2xS3mF7USltih695J%xED&NbNVD`CipqUbTB uBrDKhATZzt60XP=Z5CvF&per5$Crl*;tmUty2%+j6E|zB-eQ87sR{r9)F>zb diff --git a/macosx/mac-os.mm b/macosx/mac-os.mm index c202d156..adfe90cb 100644 --- a/macosx/mac-os.mm +++ b/macosx/mac-os.mm @@ -219,7 +219,6 @@ bool8 pressedFunctionButtons[kNumFunctionButtons] = { 0 }; bool8 pressedRawKeyboardButtons[MAC_NUM_KEYCODES] = { 0 }; bool8 heldFunctionButtons[kNumFunctionButtons] = { 0 }; pthread_mutex_t keyLock; -pthread_mutex_t renderLock; MTKView *s9xView; @@ -400,9 +399,7 @@ static inline void EmulationLoop (void) if (!pauseEmulation) { - pthread_mutex_lock(&renderLock); S9xMainLoop(); - pthread_mutex_unlock(&renderLock); } else { @@ -411,9 +408,7 @@ static inline void EmulationLoop (void) macFrameSkip = 1; skipFrames = 1; frameAdvance = false; - pthread_mutex_lock(&renderLock); S9xMainLoop(); - pthread_mutex_unlock(&renderLock); macFrameSkip = storedMacFrameSkip; } @@ -2808,7 +2803,6 @@ void QuitWithFatalError ( NSString *message) + (void)initialize { keyLock = PTHREAD_MUTEX_INITIALIZER; - renderLock = PTHREAD_MUTEX_INITIALIZER; } - (instancetype)initWithFrame:(NSRect)frameRect @@ -2939,13 +2933,10 @@ void QuitWithFatalError ( NSString *message) - (void)drawRect:(NSRect)dirtyRect { - pthread_mutex_lock(&renderLock); self.subviews[0].hidden = !pauseEmulation; CGFloat scaleFactor = MAX(self.window.backingScaleFactor, 1.0); glScreenW = self.frame.size.width * scaleFactor; glScreenH = self.frame.size.height * scaleFactor; - S9xPutImage(IPPU.RenderedScreenWidth, IPPU.RenderedScreenHeight); - pthread_mutex_unlock(&renderLock); } - (void)setFrame:(NSRect)frame @@ -3211,9 +3202,7 @@ void QuitWithFatalError ( NSString *message) - (void)setVideoMode:(int)mode { - pthread_mutex_lock(&renderLock); videoMode = mode; - pthread_mutex_unlock(&renderLock); } @dynamic inputDelegate; diff --git a/macosx/mac-render.mm b/macosx/mac-render.mm index 6c4bcdbb..c7b16cde 100644 --- a/macosx/mac-render.mm +++ b/macosx/mac-render.mm @@ -36,7 +36,7 @@ static void S9xInitMetal (void); static void S9xDeinitMetal(void); -static void S9xPutImageMetal (int, int, uint8 *); +static void S9xPutImageMetal (int, int, uint16 *); static uint16 *gfxScreen[2], *snesScreenA, @@ -137,21 +137,8 @@ void DeinitGraphics (void) void DrawFreezeDefrostScreen (uint8 *draw) { - const int w = SNES_WIDTH << 1, h = SNES_HEIGHT << 1; - - imageWidth[0] = imageHeight[0] = 0; - imageWidth[1] = imageHeight[1] = 0; - prevBlitWidth = prevBlitHeight = 0; - - if (nx < 0) - { - for (int y = 0; y < h; y++) - memcpy(blitGLBuffer + y * 1024 * 2, draw + y * w * 2, w * 2); - } - else - memcpy(blitGLBuffer, draw, w * h * 2); - - S9xPutImageMetal(w, h, draw); + const int w = SNES_WIDTH << 1, h = SNES_HEIGHT << 1; + S9xPutImageMetal(w, h, (uint16 *)draw); } static void S9xInitMetal (void) @@ -262,6 +249,7 @@ bool8 S9xInitUpdate (void) bool8 S9xDeinitUpdate (int width, int height) { + S9xPutImage(width, height); return true; } @@ -298,11 +286,17 @@ void S9xPutImage (int width, int height) IPPU.DisplayedRenderedFrameCount = (Memory.ROMFramesPerSecond * 60) / frameCalc; } + + S9xPutImageMetal(width, height, GFX.Screen); +} - uint8 buffer[width * height * 4]; + +static void S9xPutImageMetal (int width, int height, uint16 *buffer16) +{ + uint8 *buffer = (uint8 *)malloc(width * height * 4); for (int i = 0; i < width * height; ++i) { - uint16 pixel = GFX.Screen[i]; + uint16 pixel = buffer16[i]; unsigned int red = (pixel & FIRST_COLOR_MASK_RGB555) >> 10; unsigned int green = (pixel & SECOND_COLOR_MASK_RGB555) >> 5; unsigned int blue = (pixel & THIRD_COLOR_MASK_RGB555); @@ -318,12 +312,6 @@ void S9xPutImage (int width, int height) buffer[offset] = 0xFF; } - S9xPutImageMetal(width, height, buffer); -} - - -static void S9xPutImageMetal (int width, int height, uint8 *buffer) -{ CGSize layerSize = metalLayer.bounds.size; MTLTextureDescriptor *descriptor = [MTLTextureDescriptor new]; @@ -334,6 +322,7 @@ static void S9xPutImageMetal (int width, int height, uint8 *buffer) metalTexture = [metalDevice newTextureWithDescriptor:descriptor]; [metalTexture replaceRegion:MTLRegionMake2D(0, 0, width, height) mipmapLevel:0 withBytes:buffer bytesPerRow:width * 4]; + free(buffer); float vWidth = layerSize.width / 2.0; float vHeight = layerSize.height / 2.0;