From bb3ccedb29a53cbd3ffb22757138a377f154202c Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 3 Jul 2023 17:19:50 -0500 Subject: [PATCH 01/32] prepare for Metal render backend ugh Apple. how about you don't deprecate OpenGL instead? --- CMakeLists.txt | 21 ++++- src/gui/gui.h | 8 +- src/gui/render.cpp | 11 +++ src/gui/render/renderMetal.h | 49 ++++++++++ src/gui/render/renderMetal.mm | 171 ++++++++++++++++++++++++++++++++++ src/gui/settings.cpp | 5 + 6 files changed, 263 insertions(+), 2 deletions(-) create mode 100644 src/gui/render/renderMetal.h create mode 100644 src/gui/render/renderMetal.mm diff --git a/CMakeLists.txt b/CMakeLists.txt index a5e91fb00..18ec2d0ef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,6 +65,11 @@ if (WIN32) else() set(WITH_RENDER_DX11_DEFAULT OFF) endif() +if (APPLE) + set(WITH_RENDER_METAL_DEFAULT ON) +else() + set(WITH_RENDER_METAL_DEFAULT OFF) +endif() if (ANDROID) set(USE_GLES_DEFAULT ON) @@ -81,6 +86,7 @@ option(WITH_JACK "Whether to build with JACK support. Auto-detects if JACK is av option(WITH_RENDER_SDL "Whether to build with the SDL_Renderer render backend." ${WITH_RENDER_SDL_DEFAULT}) option(WITH_RENDER_OPENGL "Whether to build with the OpenGL render backend." ${WITH_RENDER_OPENGL_DEFAULT}) option(WITH_RENDER_DX11 "Whether to build with the DirectX 11 render backend." ${WITH_RENDER_DX11_DEFAULT}) +option(WITH_RENDER_METAL "Whether to build with the Metal render backend." ${WITH_RENDER_METAL_DEFAULT}) option(USE_GLES "Use OpenGL ES for the OpenGL render backend." ${USE_GLES_DEFAULT}) option(SYSTEM_FFTW "Use a system-installed version of FFTW instead of the vendored one" OFF) option(SYSTEM_FMT "Use a system-installed version of fmt instead of the vendored one" OFF) @@ -308,7 +314,7 @@ else() endif() if (BUILD_GUI) - if (NOT WITH_RENDER_SDL AND NOT WITH_RENDER_OPENGL AND NOT WITH_RENDER_DX11) + if (NOT WITH_RENDER_SDL AND NOT WITH_RENDER_OPENGL AND NOT WITH_RENDER_DX11 AND NOT WITH_RENDER_METAL) message(FATAL_ERROR "No render backends selected!") endif() endif() @@ -753,6 +759,19 @@ if (WITH_RENDER_DX11) endif() endif() +if (WITH_RENDER_METAL) + if (APPLE) + list(APPEND GUI_SOURCES src/gui/render/renderMetal.cpp) + list(APPEND GUI_SOURCES extern/imgui_patched/backends/imgui_impl_metal.cpp) + list(APPEND DEPENDENCIES_DEFINES HAVE_RENDER_METAL) + # TODO: what is being used? + #list(APPEND DEPENDENCIES_LIBRARIES d3d11) + message(STATUS "UI render backend: Metal") + else() + message(FATAL_ERROR "Metal render backend only for Apple operating systems!") + endif() +endif() + if (NOT WIN32 AND NOT APPLE) CHECK_INCLUDE_FILE(sys/io.h SYS_IO_FOUND) CHECK_INCLUDE_FILE(linux/input.h LINUX_INPUT_FOUND) diff --git a/src/gui/gui.h b/src/gui/gui.h index a8befff29..f53b1a8d4 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -72,7 +72,8 @@ enum FurnaceGUIRenderBackend { GUI_BACKEND_SDL=0, GUI_BACKEND_GL, - GUI_BACKEND_DX11 + GUI_BACKEND_DX11, + GUI_BACKEND_METAL }; #ifdef HAVE_RENDER_SDL @@ -83,10 +84,15 @@ enum FurnaceGUIRenderBackend { #define GUI_BACKEND_DEFAULT GUI_BACKEND_DX11 #define GUI_BACKEND_DEFAULT_NAME "DirectX 11" #else +#ifdef HAVE_RENDER_METAL +#define GUI_BACKEND_DEFAULT GUI_BACKEND_METAL +#define GUI_BACKEND_DEFAULT_NAME "Metal" +#else #define GUI_BACKEND_DEFAULT GUI_BACKEND_GL #define GUI_BACKEND_DEFAULT_NAME "OpenGL" #endif #endif +#endif // TODO: // - add colors for FM envelope and waveform diff --git a/src/gui/render.cpp b/src/gui/render.cpp index 5ad753c23..6ed2430e4 100644 --- a/src/gui/render.cpp +++ b/src/gui/render.cpp @@ -28,6 +28,9 @@ #ifdef HAVE_RENDER_DX11 #include "render/renderDX11.h" #endif +#ifdef HAVE_RENDER_METAL +#include "render/renderMetal.h" +#endif bool FurnaceGUI::initRender() { if (rend!=NULL) return false; @@ -36,6 +39,8 @@ bool FurnaceGUI::initRender() { renderBackend=GUI_BACKEND_GL; } else if (settings.renderBackend=="DirectX 11") { renderBackend=GUI_BACKEND_DX11; + } else if (settings.renderBackend=="Metal") { + renderBackend=GUI_BACKEND_METAL; } else if (settings.renderBackend=="SDL") { renderBackend=GUI_BACKEND_SDL; } else { @@ -55,6 +60,12 @@ bool FurnaceGUI::initRender() { rend=new FurnaceGUIRenderDX11; break; #endif +#ifdef HAVE_RENDER_METAL + case GUI_BACKEND_METAL: + logI("render backend: Metal"); + rend=new FurnaceGUIRenderMetal; + break; +#endif #ifdef HAVE_RENDER_SDL case GUI_BACKEND_SDL: logI("render backend: SDL_Renderer"); diff --git a/src/gui/render/renderMetal.h b/src/gui/render/renderMetal.h new file mode 100644 index 000000000..f19135841 --- /dev/null +++ b/src/gui/render/renderMetal.h @@ -0,0 +1,49 @@ +/** + * Furnace Tracker - multi-system chiptune tracker + * Copyright (C) 2021-2023 tildearrow and contributors + * + * This program 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 program 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 this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "../gui.h" + +class FurnaceGUIRenderSDL: public FurnaceGUIRender { + SDL_Renderer* sdlRend; + public: + ImTextureID getTextureID(FurnaceGUITexture* which); + bool lockTexture(FurnaceGUITexture* which, void** data, int* pitch); + bool unlockTexture(FurnaceGUITexture* which); + bool updateTexture(FurnaceGUITexture* which, void* data, int pitch); + FurnaceGUITexture* createTexture(bool dynamic, int width, int height); + bool destroyTexture(FurnaceGUITexture* which); + void setTextureBlendMode(FurnaceGUITexture* which, FurnaceGUIBlendMode mode); + void setBlendMode(FurnaceGUIBlendMode mode); + void clear(ImVec4 color); + bool newFrame(); + void createFontsTexture(); + void destroyFontsTexture(); + void renderGUI(); + void wipe(float alpha); + void present(); + bool getOutputSize(int& w, int& h); + int getWindowFlags(); + void preInit(); + bool init(SDL_Window* win); + void initGUI(SDL_Window* win); + void quitGUI(); + bool quit(); + FurnaceGUIRenderSDL(): + sdlRend(NULL) {} +}; \ No newline at end of file diff --git a/src/gui/render/renderMetal.mm b/src/gui/render/renderMetal.mm new file mode 100644 index 000000000..84053d057 --- /dev/null +++ b/src/gui/render/renderMetal.mm @@ -0,0 +1,171 @@ +/** + * Furnace Tracker - multi-system chiptune tracker + * Copyright (C) 2021-2023 tildearrow and contributors + * + * This program 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 program 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 this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +// TODO: everything + +#include "renderMetal.h" +#include "backends/imgui_impl_metal.h" +#include +#include + +class FurnaceMetalTexture: public FurnaceGUITexture { + public: + MTLTexture* tex; + FurnaceMetalTexture(): + tex(NULL) {} +}; + +ImTextureID FurnaceGUIRenderMetal::getTextureID(FurnaceGUITexture* which) { + FurnaceSDLTexture* t=(FurnaceSDLTexture*)which; + return t->tex; +} + +bool FurnaceGUIRenderMetal::lockTexture(FurnaceGUITexture* which, void** data, int* pitch) { + FurnaceSDLTexture* t=(FurnaceSDLTexture*)which; + return SDL_LockTexture(t->tex,NULL,data,pitch)==0; +} + +bool FurnaceGUIRenderMetal::unlockTexture(FurnaceGUITexture* which) { + FurnaceSDLTexture* t=(FurnaceSDLTexture*)which; + SDL_UnlockTexture(t->tex); + return true; +} + +bool FurnaceGUIRenderMetal::updateTexture(FurnaceGUITexture* which, void* data, int pitch) { + FurnaceSDLTexture* t=(FurnaceSDLTexture*)which; + return SDL_UpdateTexture(t->tex,NULL,data,pitch)==0; +} + +FurnaceGUITexture* FurnaceGUIRenderMetal::createTexture(bool dynamic, int width, int height) { + SDL_Texture* t=SDL_CreateTexture(sdlRend,SDL_PIXELFORMAT_ABGR8888,dynamic?SDL_TEXTUREACCESS_STREAMING:SDL_TEXTUREACCESS_STATIC,width,height); + + if (t==NULL) return NULL; + FurnaceSDLTexture* ret=new FurnaceSDLTexture; + ret->tex=t; + return ret; +} + +bool FurnaceGUIRenderMetal::destroyTexture(FurnaceGUITexture* which) { + FurnaceSDLTexture* t=(FurnaceSDLTexture*)which; + + SDL_DestroyTexture(t->tex); + delete t; + return true; +} + +void FurnaceGUIRenderMetal::setTextureBlendMode(FurnaceGUITexture* which, FurnaceGUIBlendMode mode) { + FurnaceSDLTexture* t=(FurnaceSDLTexture*)which; + switch (mode) { + case GUI_BLEND_MODE_NONE: + SDL_SetTextureBlendMode(t->tex,SDL_BLENDMODE_NONE); + break; + case GUI_BLEND_MODE_BLEND: + SDL_SetTextureBlendMode(t->tex,SDL_BLENDMODE_BLEND); + break; + case GUI_BLEND_MODE_ADD: + SDL_SetTextureBlendMode(t->tex,SDL_BLENDMODE_ADD); + break; + case GUI_BLEND_MODE_MULTIPLY: + SDL_SetTextureBlendMode(t->tex,SDL_BLENDMODE_MOD); + break; + } +} + +void FurnaceGUIRenderMetal::setBlendMode(FurnaceGUIBlendMode mode) { + switch (mode) { + case GUI_BLEND_MODE_NONE: + SDL_SetRenderDrawBlendMode(sdlRend,SDL_BLENDMODE_NONE); + break; + case GUI_BLEND_MODE_BLEND: + SDL_SetRenderDrawBlendMode(sdlRend,SDL_BLENDMODE_BLEND); + break; + case GUI_BLEND_MODE_ADD: + SDL_SetRenderDrawBlendMode(sdlRend,SDL_BLENDMODE_ADD); + break; + case GUI_BLEND_MODE_MULTIPLY: + SDL_SetRenderDrawBlendMode(sdlRend,SDL_BLENDMODE_MOD); + break; + } +} + +void FurnaceGUIRenderMetal::clear(ImVec4 color) { + SDL_SetRenderDrawColor(sdlRend,color.x*255,color.y*255,color.z*255,color.w*255); + SDL_RenderClear(sdlRend); +} + +bool FurnaceGUIRenderMetal::newFrame() { + return ImGui_ImplSDLRenderer2_NewFrame(); +} + +void FurnaceGUIRenderMetal::createFontsTexture() { + ImGui_ImplSDLRenderer2_CreateFontsTexture(); +} + +void FurnaceGUIRenderMetal::destroyFontsTexture() { + ImGui_ImplSDLRenderer2_DestroyFontsTexture(); +} + +void FurnaceGUIRenderMetal::renderGUI() { + ImGui_ImplSDLRenderer2_RenderDrawData(ImGui::GetDrawData()); +} + +void FurnaceGUIRenderMetal::wipe(float alpha) { + SDL_SetRenderDrawBlendMode(sdlRend,SDL_BLENDMODE_BLEND); + SDL_SetRenderDrawColor(sdlRend,0,0,0,255*alpha); + SDL_RenderFillRect(sdlRend,NULL); +} + +void FurnaceGUIRenderMetal::present() { + SDL_RenderPresent(sdlRend); +} + +bool FurnaceGUIRenderMetal::getOutputSize(int& w, int& h) { + return SDL_GetRendererOutputSize(sdlRend,&w,&h)==0; +} + +int FurnaceGUIRenderMetal::getWindowFlags() { + return 0; +} + +void FurnaceGUIRenderMetal::preInit() { + SDL_SetHint(SDL_HINT_RENDER_DRIVER,"metal"); +} + +bool FurnaceGUIRenderMetal::init(SDL_Window* win) { + SDL_SetHint(SDL_HINT_RENDER_DRIVER,"metal"); + + sdlRend=SDL_CreateRenderer(win,-1,SDL_RENDERER_ACCELERATED|SDL_RENDERER_PRESENTVSYNC|SDL_RENDERER_TARGETTEXTURE); + return (sdlRend!=NULL); +} + +void FurnaceGUIRenderMetal::initGUI(SDL_Window* win) { + ImGui_ImplSDL2_InitForSDLRenderer(win,sdlRend); + ImGui_ImplSDLRenderer2_Init(sdlRend); +} + +void FurnaceGUIRenderMetal::quitGUI() { + ImGui_ImplSDLRenderer2_Shutdown(); +} + +bool FurnaceGUIRenderMetal::quit() { + if (sdlRend==NULL) return false; + SDL_DestroyRenderer(sdlRend); + sdlRend=NULL; + return true; +} diff --git a/src/gui/settings.cpp b/src/gui/settings.cpp index 882bc8075..2e1861eb7 100644 --- a/src/gui/settings.cpp +++ b/src/gui/settings.cpp @@ -1316,6 +1316,11 @@ void FurnaceGUI::drawSettings() { settings.renderBackend="DirectX 11"; } #endif +#ifdef HAVE_RENDER_METAL + if (ImGui::Selectable("Metal",curRenderBackend=="Metal")) { + settings.renderBackend="Metal"; + } +#endif #ifdef HAVE_RENDER_GL if (ImGui::Selectable("OpenGL",curRenderBackend=="OpenGL")) { settings.renderBackend="OpenGL"; From 1189cde0724a04b3c19b9eb97821faebb60a4a88 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 3 Jul 2023 18:13:45 -0500 Subject: [PATCH 02/32] what is this mess --- src/gui/render/renderMetal.h | 12 ++++--- src/gui/render/renderMetal.mm | 65 +++++++++++++---------------------- 2 files changed, 31 insertions(+), 46 deletions(-) diff --git a/src/gui/render/renderMetal.h b/src/gui/render/renderMetal.h index f19135841..1204825b3 100644 --- a/src/gui/render/renderMetal.h +++ b/src/gui/render/renderMetal.h @@ -19,8 +19,11 @@ #include "../gui.h" -class FurnaceGUIRenderSDL: public FurnaceGUIRender { +struct FurnaceGUIRenderMetalPrivate; + +class FurnaceGUIRenderMetal: public FurnaceGUIRender { SDL_Renderer* sdlRend; + FurnaceGUIRenderMetalPrivate* priv; public: ImTextureID getTextureID(FurnaceGUITexture* which); bool lockTexture(FurnaceGUITexture* which, void** data, int* pitch); @@ -44,6 +47,7 @@ class FurnaceGUIRenderSDL: public FurnaceGUIRender { void initGUI(SDL_Window* win); void quitGUI(); bool quit(); - FurnaceGUIRenderSDL(): - sdlRend(NULL) {} -}; \ No newline at end of file + FurnaceGUIRenderMetal(): + sdlRend(NULL), + priv(NULL) {} +}; diff --git a/src/gui/render/renderMetal.mm b/src/gui/render/renderMetal.mm index 84053d057..fbd7f16d7 100644 --- a/src/gui/render/renderMetal.mm +++ b/src/gui/render/renderMetal.mm @@ -21,9 +21,16 @@ #include "renderMetal.h" #include "backends/imgui_impl_metal.h" + #include #include +struct FurnaceGUIRenderMetalPrivate { + CAMetalLayer* context; + id cmdQueue; + MTLRenderPassDescriptor* renderPass; +}; + class FurnaceMetalTexture: public FurnaceGUITexture { public: MTLTexture* tex; @@ -70,69 +77,32 @@ bool FurnaceGUIRenderMetal::destroyTexture(FurnaceGUITexture* which) { } void FurnaceGUIRenderMetal::setTextureBlendMode(FurnaceGUITexture* which, FurnaceGUIBlendMode mode) { - FurnaceSDLTexture* t=(FurnaceSDLTexture*)which; - switch (mode) { - case GUI_BLEND_MODE_NONE: - SDL_SetTextureBlendMode(t->tex,SDL_BLENDMODE_NONE); - break; - case GUI_BLEND_MODE_BLEND: - SDL_SetTextureBlendMode(t->tex,SDL_BLENDMODE_BLEND); - break; - case GUI_BLEND_MODE_ADD: - SDL_SetTextureBlendMode(t->tex,SDL_BLENDMODE_ADD); - break; - case GUI_BLEND_MODE_MULTIPLY: - SDL_SetTextureBlendMode(t->tex,SDL_BLENDMODE_MOD); - break; - } } void FurnaceGUIRenderMetal::setBlendMode(FurnaceGUIBlendMode mode) { - switch (mode) { - case GUI_BLEND_MODE_NONE: - SDL_SetRenderDrawBlendMode(sdlRend,SDL_BLENDMODE_NONE); - break; - case GUI_BLEND_MODE_BLEND: - SDL_SetRenderDrawBlendMode(sdlRend,SDL_BLENDMODE_BLEND); - break; - case GUI_BLEND_MODE_ADD: - SDL_SetRenderDrawBlendMode(sdlRend,SDL_BLENDMODE_ADD); - break; - case GUI_BLEND_MODE_MULTIPLY: - SDL_SetRenderDrawBlendMode(sdlRend,SDL_BLENDMODE_MOD); - break; - } } void FurnaceGUIRenderMetal::clear(ImVec4 color) { - SDL_SetRenderDrawColor(sdlRend,color.x*255,color.y*255,color.z*255,color.w*255); - SDL_RenderClear(sdlRend); } bool FurnaceGUIRenderMetal::newFrame() { - return ImGui_ImplSDLRenderer2_NewFrame(); + ImGui_ImplMetal_NewFrame(priv->renderPass); } void FurnaceGUIRenderMetal::createFontsTexture() { - ImGui_ImplSDLRenderer2_CreateFontsTexture(); } void FurnaceGUIRenderMetal::destroyFontsTexture() { - ImGui_ImplSDLRenderer2_DestroyFontsTexture(); } void FurnaceGUIRenderMetal::renderGUI() { - ImGui_ImplSDLRenderer2_RenderDrawData(ImGui::GetDrawData()); + ImGui_ImplMetal_RenderDrawData(ImGui::GetDrawData()); } void FurnaceGUIRenderMetal::wipe(float alpha) { - SDL_SetRenderDrawBlendMode(sdlRend,SDL_BLENDMODE_BLEND); - SDL_SetRenderDrawColor(sdlRend,0,0,0,255*alpha); - SDL_RenderFillRect(sdlRend,NULL); } void FurnaceGUIRenderMetal::present() { - SDL_RenderPresent(sdlRend); } bool FurnaceGUIRenderMetal::getOutputSize(int& w, int& h) { @@ -145,22 +115,33 @@ int FurnaceGUIRenderMetal::getWindowFlags() { void FurnaceGUIRenderMetal::preInit() { SDL_SetHint(SDL_HINT_RENDER_DRIVER,"metal"); + priv=new FurnaceGUIRenderMetalPrivate; } bool FurnaceGUIRenderMetal::init(SDL_Window* win) { SDL_SetHint(SDL_HINT_RENDER_DRIVER,"metal"); sdlRend=SDL_CreateRenderer(win,-1,SDL_RENDERER_ACCELERATED|SDL_RENDERER_PRESENTVSYNC|SDL_RENDERER_TARGETTEXTURE); - return (sdlRend!=NULL); + + if (sdlRend==NULL) return NULL; + + priv->context=(__bridge CAMetalLayer*)SDL_RenderGetMetalLayer(sdlRend); + priv->context.pixelFormat=MTLPixelFormatBGRA8Unorm; + return true; } void FurnaceGUIRenderMetal::initGUI(SDL_Window* win) { - ImGui_ImplSDL2_InitForSDLRenderer(win,sdlRend); - ImGui_ImplSDLRenderer2_Init(sdlRend); + ImGui_ImplMetal_Init(context.device); + ImGui_ImplSDL2_InitForMetal(win); + + priv->cmdQueue=[priv->context.device newCommandQueue]; + priv->renderPass=[MTLRenderPassDescriptor new]; } void FurnaceGUIRenderMetal::quitGUI() { ImGui_ImplSDLRenderer2_Shutdown(); + [priv->renderPass release]; + [priv->cmdQueue release]; } bool FurnaceGUIRenderMetal::quit() { From e0aae156af097b94cb7607f66a2c3250327af030 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 11 Apr 2024 14:19:46 -0500 Subject: [PATCH 03/32] asdf --- src/gui/render/renderMetal.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/render/renderMetal.mm b/src/gui/render/renderMetal.mm index fbd7f16d7..3261d403a 100644 --- a/src/gui/render/renderMetal.mm +++ b/src/gui/render/renderMetal.mm @@ -33,7 +33,7 @@ struct FurnaceGUIRenderMetalPrivate { class FurnaceMetalTexture: public FurnaceGUITexture { public: - MTLTexture* tex; + id tex; FurnaceMetalTexture(): tex(NULL) {} }; From 285bc9171f237168a59d461e990eb3d2b5b42dea Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 11 Apr 2024 22:30:04 -0500 Subject: [PATCH 04/32] asdfasdf --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 743009e5a..649e3e10c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -958,8 +958,8 @@ endif() if (WITH_RENDER_METAL) if (APPLE) - list(APPEND GUI_SOURCES src/gui/render/renderMetal.cpp) - list(APPEND GUI_SOURCES extern/imgui_patched/backends/imgui_impl_metal.cpp) + list(APPEND GUI_SOURCES src/gui/render/renderMetal.mm) + list(APPEND GUI_SOURCES extern/imgui_patched/backends/imgui_impl_metal.mm) list(APPEND DEPENDENCIES_DEFINES HAVE_RENDER_METAL) list(APPEND DEPENDENCIES_LIBRARIES "-framework Metal") list(APPEND DEPENDENCIES_LIBRARIES "-framework MetalKit") From 6c8a8f9fe741c17b458df087c5d970c5e3b0a061 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 11 Apr 2024 22:35:47 -0500 Subject: [PATCH 05/32] update to new render functions --- src/gui/render/renderMetal.h | 4 ++-- src/gui/render/renderMetal.mm | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/gui/render/renderMetal.h b/src/gui/render/renderMetal.h index 1204825b3..6a1470c53 100644 --- a/src/gui/render/renderMetal.h +++ b/src/gui/render/renderMetal.h @@ -29,7 +29,7 @@ class FurnaceGUIRenderMetal: public FurnaceGUIRender { bool lockTexture(FurnaceGUITexture* which, void** data, int* pitch); bool unlockTexture(FurnaceGUITexture* which); bool updateTexture(FurnaceGUITexture* which, void* data, int pitch); - FurnaceGUITexture* createTexture(bool dynamic, int width, int height); + FurnaceGUITexture* createTexture(bool dynamic, int width, int height, bool interpolate=true); bool destroyTexture(FurnaceGUITexture* which); void setTextureBlendMode(FurnaceGUITexture* which, FurnaceGUIBlendMode mode); void setBlendMode(FurnaceGUIBlendMode mode); @@ -43,7 +43,7 @@ class FurnaceGUIRenderMetal: public FurnaceGUIRender { bool getOutputSize(int& w, int& h); int getWindowFlags(); void preInit(); - bool init(SDL_Window* win); + bool init(SDL_Window* win, int swapInterval); void initGUI(SDL_Window* win); void quitGUI(); bool quit(); diff --git a/src/gui/render/renderMetal.mm b/src/gui/render/renderMetal.mm index 3261d403a..a40407976 100644 --- a/src/gui/render/renderMetal.mm +++ b/src/gui/render/renderMetal.mm @@ -59,7 +59,7 @@ bool FurnaceGUIRenderMetal::updateTexture(FurnaceGUITexture* which, void* data, return SDL_UpdateTexture(t->tex,NULL,data,pitch)==0; } -FurnaceGUITexture* FurnaceGUIRenderMetal::createTexture(bool dynamic, int width, int height) { +FurnaceGUITexture* FurnaceGUIRenderMetal::createTexture(bool dynamic, int width, int height, bool interpolate) { SDL_Texture* t=SDL_CreateTexture(sdlRend,SDL_PIXELFORMAT_ABGR8888,dynamic?SDL_TEXTUREACCESS_STREAMING:SDL_TEXTUREACCESS_STATIC,width,height); if (t==NULL) return NULL; @@ -118,7 +118,7 @@ void FurnaceGUIRenderMetal::preInit() { priv=new FurnaceGUIRenderMetalPrivate; } -bool FurnaceGUIRenderMetal::init(SDL_Window* win) { +bool FurnaceGUIRenderMetal::init(SDL_Window* win, int swapInterval) { SDL_SetHint(SDL_HINT_RENDER_DRIVER,"metal"); sdlRend=SDL_CreateRenderer(win,-1,SDL_RENDERER_ACCELERATED|SDL_RENDERER_PRESENTVSYNC|SDL_RENDERER_TARGETTEXTURE); From eddbd16bd6282b369a3402ab4d7c4536090648d6 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 11 Apr 2024 22:36:35 -0500 Subject: [PATCH 06/32] remove Windows and Linux from CI for now --- .github/workflows/build.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 673e18ff3..9ba8e45b0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -18,14 +18,8 @@ jobs: strategy: matrix: config: - - { name: 'Windows MSVC x86', os: windows-latest, compiler: msvc, arch: x86 } - - { name: 'Windows MSVC x86_64', os: windows-latest, compiler: msvc, arch: x86_64 } - #- { name: 'Windows MinGW x86', os: ubuntu-20.04, compiler: mingw, arch: x86 } - #- { name: 'Windows MinGW x86_64', os: ubuntu-20.04, compiler: mingw, arch: x86_64 } - { name: 'macOS x86_64', os: macos-latest, arch: x86_64 } - { name: 'macOS ARM', os: macos-latest, arch: arm64 } - - { name: 'Linux x86_64', os: ubuntu-20.04, arch: x86_64 } - #- { name: 'Linux ARM', os: ubuntu-18.04, arch: armhf } fail-fast: false name: ${{ matrix.config.name }} From bd676bde64b3e4e4a2a1a8a5c4ca52a85eeaf4cc Mon Sep 17 00:00:00 2001 From: tildearrow Date: Thu, 11 Apr 2024 23:57:39 -0500 Subject: [PATCH 07/32] Metal backend, part 1 --- src/gui/render/renderMetal.mm | 58 ++++++++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 14 deletions(-) diff --git a/src/gui/render/renderMetal.mm b/src/gui/render/renderMetal.mm index a40407976..36034ebed 100644 --- a/src/gui/render/renderMetal.mm +++ b/src/gui/render/renderMetal.mm @@ -28,6 +28,9 @@ struct FurnaceGUIRenderMetalPrivate { CAMetalLayer* context; id cmdQueue; + id cmdBuf; + id renderEncoder; + id drawable; MTLRenderPassDescriptor* renderPass; }; @@ -39,39 +42,47 @@ class FurnaceMetalTexture: public FurnaceGUITexture { }; ImTextureID FurnaceGUIRenderMetal::getTextureID(FurnaceGUITexture* which) { - FurnaceSDLTexture* t=(FurnaceSDLTexture*)which; + FurnaceMetalTexture* t=(FurnaceMetalTexture*)which; return t->tex; } bool FurnaceGUIRenderMetal::lockTexture(FurnaceGUITexture* which, void** data, int* pitch) { - FurnaceSDLTexture* t=(FurnaceSDLTexture*)which; - return SDL_LockTexture(t->tex,NULL,data,pitch)==0; + return false; + /* + FurnaceMetalTexture* t=(FurnaceMetalTexture*)which; + return SDL_LockTexture(t->tex,NULL,data,pitch)==0;*/ } bool FurnaceGUIRenderMetal::unlockTexture(FurnaceGUITexture* which) { - FurnaceSDLTexture* t=(FurnaceSDLTexture*)which; + return false; + /* + FurnaceMetalTexture* t=(FurnaceMetalTexture*)which; SDL_UnlockTexture(t->tex); - return true; + return true;*/ } bool FurnaceGUIRenderMetal::updateTexture(FurnaceGUITexture* which, void* data, int pitch) { + return false; + /* FurnaceSDLTexture* t=(FurnaceSDLTexture*)which; - return SDL_UpdateTexture(t->tex,NULL,data,pitch)==0; + return SDL_UpdateTexture(t->tex,NULL,data,pitch)==0;*/ } FurnaceGUITexture* FurnaceGUIRenderMetal::createTexture(bool dynamic, int width, int height, bool interpolate) { - SDL_Texture* t=SDL_CreateTexture(sdlRend,SDL_PIXELFORMAT_ABGR8888,dynamic?SDL_TEXTUREACCESS_STREAMING:SDL_TEXTUREACCESS_STATIC,width,height); + MTLTextureDescriptor* texDesc=[MTLTextureDescriptor texture2DDescriptorWithPixelFormat:MTLPixelFormatRGBA8Unorm width:(NSUInteger)width height:(NSUInteger)height mipmapped:NO]; + texDesc.usage=MTLTextureUsageShaderRead; + texDesc.storageMode=MTLStorageModeManaged; - if (t==NULL) return NULL; - FurnaceSDLTexture* ret=new FurnaceSDLTexture; - ret->tex=t; + id texture=[priv->context.device newTextureWithDescriptor:texDesc]; + + if (texture==NULL) return NULL; + FurnaceMetalTexture* ret=new FurnaceMetalTexture; + ret->tex=texture; return ret; } bool FurnaceGUIRenderMetal::destroyTexture(FurnaceGUITexture* which) { - FurnaceSDLTexture* t=(FurnaceSDLTexture*)which; - - SDL_DestroyTexture(t->tex); + FurnaceMetalTexture* t=(FurnaceMetalTexture*)which; delete t; return true; } @@ -82,7 +93,19 @@ void FurnaceGUIRenderMetal::setTextureBlendMode(FurnaceGUITexture* which, Furnac void FurnaceGUIRenderMetal::setBlendMode(FurnaceGUIBlendMode mode) { } +// you should only call this once!!! void FurnaceGUIRenderMetal::clear(ImVec4 color) { + int outW, outH; + getOutputSize(outW,outH); + priv->context.drawableSize=CGSizeMake(outW,outH); + priv->drawable=[priv->context nextDrawable]; + + priv->cmdBuf=[priv->cmdQueue commandBuffer]; + priv->renderPass.colorAttachments[0].clearColor=MTLClearColorMake(color.x,color.y,color.z,color.w); + priv->renderPass.colorAttachments[0].texture=drawable.texture; + priv->renderPass.colorAttachments[0].loadAction=MTLLoadActionClear; + priv->renderPass.colorAttachments[0].storeAction=MTLStoreActionStore; + priv->renderEncoder=[commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor]; } bool FurnaceGUIRenderMetal::newFrame() { @@ -90,19 +113,26 @@ bool FurnaceGUIRenderMetal::newFrame() { } void FurnaceGUIRenderMetal::createFontsTexture() { + ImGui_ImplMetal_CreateFontsTexture(priv->context); } void FurnaceGUIRenderMetal::destroyFontsTexture() { + ImGui_ImplMetal_DestroyFontsTexture(); } void FurnaceGUIRenderMetal::renderGUI() { - ImGui_ImplMetal_RenderDrawData(ImGui::GetDrawData()); + ImGui_ImplMetal_RenderDrawData(ImGui::GetDrawData(),priv->cmdBuf,priv->renderEncoder); } void FurnaceGUIRenderMetal::wipe(float alpha) { + // TODO } void FurnaceGUIRenderMetal::present() { + [priv->renderEncoder endEncoding]; + + [priv->cmdBuf presentDrawable:priv->drawable]; + [priv->cmdBuf commit]; } bool FurnaceGUIRenderMetal::getOutputSize(int& w, int& h) { From fe2cf4b508de506d4aa2cd77545b4ecb92f0a6aa Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 12 Apr 2024 00:10:44 -0500 Subject: [PATCH 08/32] Metal backend, part 2 --- src/gui/render/renderMetal.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/render/renderMetal.mm b/src/gui/render/renderMetal.mm index 36034ebed..d016dce4d 100644 --- a/src/gui/render/renderMetal.mm +++ b/src/gui/render/renderMetal.mm @@ -102,7 +102,7 @@ void FurnaceGUIRenderMetal::clear(ImVec4 color) { priv->cmdBuf=[priv->cmdQueue commandBuffer]; priv->renderPass.colorAttachments[0].clearColor=MTLClearColorMake(color.x,color.y,color.z,color.w); - priv->renderPass.colorAttachments[0].texture=drawable.texture; + priv->renderPass.colorAttachments[0].texture=priv->drawable.texture; priv->renderPass.colorAttachments[0].loadAction=MTLLoadActionClear; priv->renderPass.colorAttachments[0].storeAction=MTLStoreActionStore; priv->renderEncoder=[commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor]; From 8bd104f783247b994c9b642c17328831619cb378 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 12 Apr 2024 00:20:29 -0500 Subject: [PATCH 09/32] Metal backend, part 3 --- src/gui/render/renderMetal.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/render/renderMetal.mm b/src/gui/render/renderMetal.mm index d016dce4d..d734c2de4 100644 --- a/src/gui/render/renderMetal.mm +++ b/src/gui/render/renderMetal.mm @@ -105,7 +105,7 @@ void FurnaceGUIRenderMetal::clear(ImVec4 color) { priv->renderPass.colorAttachments[0].texture=priv->drawable.texture; priv->renderPass.colorAttachments[0].loadAction=MTLLoadActionClear; priv->renderPass.colorAttachments[0].storeAction=MTLStoreActionStore; - priv->renderEncoder=[commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor]; + priv->renderEncoder=[priv->cmdBuf renderCommandEncoderWithDescriptor:renderPassDescriptor]; } bool FurnaceGUIRenderMetal::newFrame() { From cb0856f63551ab99e618fe515670d0e39938316f Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 12 Apr 2024 00:34:55 -0500 Subject: [PATCH 10/32] Metal backend, part 4 --- src/gui/render/renderMetal.mm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/render/renderMetal.mm b/src/gui/render/renderMetal.mm index d734c2de4..75b604af1 100644 --- a/src/gui/render/renderMetal.mm +++ b/src/gui/render/renderMetal.mm @@ -105,7 +105,7 @@ void FurnaceGUIRenderMetal::clear(ImVec4 color) { priv->renderPass.colorAttachments[0].texture=priv->drawable.texture; priv->renderPass.colorAttachments[0].loadAction=MTLLoadActionClear; priv->renderPass.colorAttachments[0].storeAction=MTLStoreActionStore; - priv->renderEncoder=[priv->cmdBuf renderCommandEncoderWithDescriptor:renderPassDescriptor]; + priv->renderEncoder=[priv->cmdBuf renderCommandEncoderWithDescriptor:priv->renderPass]; } bool FurnaceGUIRenderMetal::newFrame() { @@ -113,7 +113,7 @@ bool FurnaceGUIRenderMetal::newFrame() { } void FurnaceGUIRenderMetal::createFontsTexture() { - ImGui_ImplMetal_CreateFontsTexture(priv->context); + ImGui_ImplMetal_CreateFontsTexture(priv->context.device); } void FurnaceGUIRenderMetal::destroyFontsTexture() { From 25f65635a2335e1301b3bdbc3f5902444a790429 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 12 Apr 2024 00:55:57 -0500 Subject: [PATCH 11/32] Metal backend, part 5 --- src/gui/render/renderMetal.mm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/gui/render/renderMetal.mm b/src/gui/render/renderMetal.mm index 75b604af1..ca968e92c 100644 --- a/src/gui/render/renderMetal.mm +++ b/src/gui/render/renderMetal.mm @@ -153,7 +153,7 @@ bool FurnaceGUIRenderMetal::init(SDL_Window* win, int swapInterval) { sdlRend=SDL_CreateRenderer(win,-1,SDL_RENDERER_ACCELERATED|SDL_RENDERER_PRESENTVSYNC|SDL_RENDERER_TARGETTEXTURE); - if (sdlRend==NULL) return NULL; + if (sdlRend==NULL) return false; priv->context=(__bridge CAMetalLayer*)SDL_RenderGetMetalLayer(sdlRend); priv->context.pixelFormat=MTLPixelFormatBGRA8Unorm; @@ -161,7 +161,7 @@ bool FurnaceGUIRenderMetal::init(SDL_Window* win, int swapInterval) { } void FurnaceGUIRenderMetal::initGUI(SDL_Window* win) { - ImGui_ImplMetal_Init(context.device); + ImGui_ImplMetal_Init(priv->context.device); ImGui_ImplSDL2_InitForMetal(win); priv->cmdQueue=[priv->context.device newCommandQueue]; @@ -169,7 +169,7 @@ void FurnaceGUIRenderMetal::initGUI(SDL_Window* win) { } void FurnaceGUIRenderMetal::quitGUI() { - ImGui_ImplSDLRenderer2_Shutdown(); + ImGui_ImplMetal_Shutdown(); [priv->renderPass release]; [priv->cmdQueue release]; } From ec99c77554e6b9956533c3d96612c11f96597eec Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 12 Apr 2024 17:28:11 -0500 Subject: [PATCH 12/32] actually make artifact --- .github/workflows/build.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9ba8e45b0..1bf88a60c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -331,3 +331,10 @@ jobs: with: name: ${{ steps.package-identify.outputs.id }} path: ${{ steps.package-identify.outputs.filename }} + + - name: Upload Metal artifact + if: ${{ github.repository == 'tildearrow/furnace' && github.ref_name == 'metal' }} + uses: actions/upload-artifact@v4.3.0 + with: + name: ${{ steps.package-identify.outputs.id }} + path: ${{ steps.package-identify.outputs.filename }} From 31f9559f5e27fe88b7a5d1381564bf4c1c0bd1dc Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 14 Apr 2024 16:41:04 -0500 Subject: [PATCH 13/32] display init errors on macOS --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 91a5e8302..e91e302ca 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -393,7 +393,7 @@ void reportError(String what) { logE("%s",what); MessageBox(NULL,what.c_str(),"Furnace",MB_OK|MB_ICONERROR); } -#elif defined(ANDROID) +#elif defined(ANDROID) || defined(__APPLE__) void reportError(String what) { logE("%s",what); #ifdef HAVE_SDL2 From b39a775800e94f7bbc2889d634c3bd6ec15f20c5 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 14 Apr 2024 17:48:01 -0500 Subject: [PATCH 14/32] debug messages --- src/gui/render/renderMetal.mm | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/gui/render/renderMetal.mm b/src/gui/render/renderMetal.mm index ca968e92c..3b2219ea2 100644 --- a/src/gui/render/renderMetal.mm +++ b/src/gui/render/renderMetal.mm @@ -95,6 +95,7 @@ void FurnaceGUIRenderMetal::setBlendMode(FurnaceGUIBlendMode mode) { // you should only call this once!!! void FurnaceGUIRenderMetal::clear(ImVec4 color) { + logI("Metal: clear()"); int outW, outH; getOutputSize(outW,outH); priv->context.drawableSize=CGSizeMake(outW,outH); @@ -109,18 +110,22 @@ void FurnaceGUIRenderMetal::clear(ImVec4 color) { } bool FurnaceGUIRenderMetal::newFrame() { + logI("Metal: newFrame()"); ImGui_ImplMetal_NewFrame(priv->renderPass); } void FurnaceGUIRenderMetal::createFontsTexture() { + logI("Metal: createFontsTexture()"); ImGui_ImplMetal_CreateFontsTexture(priv->context.device); } void FurnaceGUIRenderMetal::destroyFontsTexture() { + logI("Metal: destroyFontsTexture()"); ImGui_ImplMetal_DestroyFontsTexture(); } void FurnaceGUIRenderMetal::renderGUI() { + logI("Metal: renderGUI()"); ImGui_ImplMetal_RenderDrawData(ImGui::GetDrawData(),priv->cmdBuf,priv->renderEncoder); } @@ -129,6 +134,7 @@ void FurnaceGUIRenderMetal::wipe(float alpha) { } void FurnaceGUIRenderMetal::present() { + logI("Metal: present()"); [priv->renderEncoder endEncoding]; [priv->cmdBuf presentDrawable:priv->drawable]; @@ -149,18 +155,22 @@ void FurnaceGUIRenderMetal::preInit() { } bool FurnaceGUIRenderMetal::init(SDL_Window* win, int swapInterval) { + logI("Metal: init()"); SDL_SetHint(SDL_HINT_RENDER_DRIVER,"metal"); sdlRend=SDL_CreateRenderer(win,-1,SDL_RENDERER_ACCELERATED|SDL_RENDERER_PRESENTVSYNC|SDL_RENDERER_TARGETTEXTURE); if (sdlRend==NULL) return false; + logI("retrieving context..."); + priv->context=(__bridge CAMetalLayer*)SDL_RenderGetMetalLayer(sdlRend); priv->context.pixelFormat=MTLPixelFormatBGRA8Unorm; return true; } void FurnaceGUIRenderMetal::initGUI(SDL_Window* win) { + logI("Metal: initGUI()"); ImGui_ImplMetal_Init(priv->context.device); ImGui_ImplSDL2_InitForMetal(win); From d731a15e6d39b635d1977916d823df5fcedc9fe1 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 14 Apr 2024 18:11:46 -0500 Subject: [PATCH 15/32] move init of render pass --- src/gui/render/renderMetal.mm | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/gui/render/renderMetal.mm b/src/gui/render/renderMetal.mm index 3b2219ea2..70c9844a7 100644 --- a/src/gui/render/renderMetal.mm +++ b/src/gui/render/renderMetal.mm @@ -165,7 +165,16 @@ bool FurnaceGUIRenderMetal::init(SDL_Window* win, int swapInterval) { logI("retrieving context..."); priv->context=(__bridge CAMetalLayer*)SDL_RenderGetMetalLayer(sdlRend); + + if (priv->context==NULL) { + logE("Metal layer is NULL!"); + return false; + } + priv->context.pixelFormat=MTLPixelFormatBGRA8Unorm; + + priv->cmdQueue=[priv->context.device newCommandQueue]; + priv->renderPass=[MTLRenderPassDescriptor new]; return true; } @@ -173,19 +182,16 @@ void FurnaceGUIRenderMetal::initGUI(SDL_Window* win) { logI("Metal: initGUI()"); ImGui_ImplMetal_Init(priv->context.device); ImGui_ImplSDL2_InitForMetal(win); - - priv->cmdQueue=[priv->context.device newCommandQueue]; - priv->renderPass=[MTLRenderPassDescriptor new]; } void FurnaceGUIRenderMetal::quitGUI() { ImGui_ImplMetal_Shutdown(); - [priv->renderPass release]; - [priv->cmdQueue release]; } bool FurnaceGUIRenderMetal::quit() { if (sdlRend==NULL) return false; + [priv->renderPass release]; + [priv->cmdQueue release]; SDL_DestroyRenderer(sdlRend); sdlRend=NULL; return true; From 1e147ec4e53ff05ca4a578ff0ee13a667352bf51 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 14 Apr 2024 18:46:34 -0500 Subject: [PATCH 16/32] Metal backend, part 6 --- extern/imgui_patched/backends/imgui_impl_metal.h | 4 ++-- extern/imgui_patched/backends/imgui_impl_metal.mm | 14 +++++++------- src/gui/render/renderMetal.mm | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/extern/imgui_patched/backends/imgui_impl_metal.h b/extern/imgui_patched/backends/imgui_impl_metal.h index 83b3ee8d0..d494540df 100644 --- a/extern/imgui_patched/backends/imgui_impl_metal.h +++ b/extern/imgui_patched/backends/imgui_impl_metal.h @@ -25,7 +25,7 @@ IMGUI_IMPL_API bool ImGui_ImplMetal_Init(id device); IMGUI_IMPL_API void ImGui_ImplMetal_Shutdown(); -IMGUI_IMPL_API void ImGui_ImplMetal_NewFrame(MTLRenderPassDescriptor* renderPassDescriptor); +IMGUI_IMPL_API bool ImGui_ImplMetal_NewFrame(MTLRenderPassDescriptor* renderPassDescriptor); IMGUI_IMPL_API void ImGui_ImplMetal_RenderDrawData(ImDrawData* drawData, id commandBuffer, id commandEncoder); @@ -51,7 +51,7 @@ IMGUI_IMPL_API void ImGui_ImplMetal_DestroyDeviceObjects(); IMGUI_IMPL_API bool ImGui_ImplMetal_Init(MTL::Device* device); IMGUI_IMPL_API void ImGui_ImplMetal_Shutdown(); -IMGUI_IMPL_API void ImGui_ImplMetal_NewFrame(MTL::RenderPassDescriptor* renderPassDescriptor); +IMGUI_IMPL_API bool ImGui_ImplMetal_NewFrame(MTL::RenderPassDescriptor* renderPassDescriptor); IMGUI_IMPL_API void ImGui_ImplMetal_RenderDrawData(ImDrawData* draw_data, MTL::CommandBuffer* commandBuffer, MTL::RenderCommandEncoder* commandEncoder); diff --git a/extern/imgui_patched/backends/imgui_impl_metal.mm b/extern/imgui_patched/backends/imgui_impl_metal.mm index b29b4f26a..930806dfa 100644 --- a/extern/imgui_patched/backends/imgui_impl_metal.mm +++ b/extern/imgui_patched/backends/imgui_impl_metal.mm @@ -99,9 +99,9 @@ bool ImGui_ImplMetal_Init(MTL::Device* device) return ImGui_ImplMetal_Init((__bridge id)(device)); } -void ImGui_ImplMetal_NewFrame(MTL::RenderPassDescriptor* renderPassDescriptor) +bool ImGui_ImplMetal_NewFrame(MTL::RenderPassDescriptor* renderPassDescriptor) { - ImGui_ImplMetal_NewFrame((__bridge MTLRenderPassDescriptor*)(renderPassDescriptor)); + return ImGui_ImplMetal_NewFrame((__bridge MTLRenderPassDescriptor*)(renderPassDescriptor)); } void ImGui_ImplMetal_RenderDrawData(ImDrawData* draw_data, @@ -160,14 +160,16 @@ void ImGui_ImplMetal_Shutdown() io.BackendFlags &= ~(ImGuiBackendFlags_RendererHasVtxOffset | ImGuiBackendFlags_RendererHasViewports); } -void ImGui_ImplMetal_NewFrame(MTLRenderPassDescriptor* renderPassDescriptor) +bool ImGui_ImplMetal_NewFrame(MTLRenderPassDescriptor* renderPassDescriptor) { ImGui_ImplMetal_Data* bd = ImGui_ImplMetal_GetBackendData(); IM_ASSERT(bd->SharedMetalContext != nil && "No Metal context. Did you call ImGui_ImplMetal_Init() ?"); bd->SharedMetalContext.framebufferDescriptor = [[FramebufferDescriptor alloc] initWithRenderPassDescriptor:renderPassDescriptor]; if (bd->SharedMetalContext.depthStencilState == nil) - ImGui_ImplMetal_CreateDeviceObjects(bd->SharedMetalContext.device); + return ImGui_ImplMetal_CreateDeviceObjects(bd->SharedMetalContext.device); + + return true; } static void ImGui_ImplMetal_SetupRenderState(ImDrawData* drawData, id commandBuffer, @@ -376,9 +378,7 @@ bool ImGui_ImplMetal_CreateDeviceObjects(id device) depthStencilDescriptor.depthCompareFunction = MTLCompareFunctionAlways; bd->SharedMetalContext.depthStencilState = [device newDepthStencilStateWithDescriptor:depthStencilDescriptor]; ImGui_ImplMetal_CreateDeviceObjectsForPlatformWindows(); - ImGui_ImplMetal_CreateFontsTexture(device); - - return true; + return ImGui_ImplMetal_CreateFontsTexture(device); } void ImGui_ImplMetal_DestroyDeviceObjects() diff --git a/src/gui/render/renderMetal.mm b/src/gui/render/renderMetal.mm index 70c9844a7..8568745eb 100644 --- a/src/gui/render/renderMetal.mm +++ b/src/gui/render/renderMetal.mm @@ -111,7 +111,7 @@ void FurnaceGUIRenderMetal::clear(ImVec4 color) { bool FurnaceGUIRenderMetal::newFrame() { logI("Metal: newFrame()"); - ImGui_ImplMetal_NewFrame(priv->renderPass); + return ImGui_ImplMetal_NewFrame(priv->renderPass); } void FurnaceGUIRenderMetal::createFontsTexture() { From e180bb5ea001cf4993a098980b13c5a0840cb0aa Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 14 Apr 2024 19:14:42 -0500 Subject: [PATCH 17/32] Metal backend, part 7 --- src/gui/render/renderMetal.mm | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/gui/render/renderMetal.mm b/src/gui/render/renderMetal.mm index 8568745eb..fd7734afa 100644 --- a/src/gui/render/renderMetal.mm +++ b/src/gui/render/renderMetal.mm @@ -32,6 +32,14 @@ struct FurnaceGUIRenderMetalPrivate { id renderEncoder; id drawable; MTLRenderPassDescriptor* renderPass; + + FurnaceGUIRenderMetalPrivate(): + context(NULL), + cmdQueue(NULL), + cmdBuf(NULL), + renderEncoder(NULL), + drawable(NULL), + renderPass(NULL) {} }; class FurnaceMetalTexture: public FurnaceGUITexture { @@ -99,6 +107,20 @@ void FurnaceGUIRenderMetal::clear(ImVec4 color) { int outW, outH; getOutputSize(outW,outH); priv->context.drawableSize=CGSizeMake(outW,outH); + + if (priv->drawable) { + [priv->drawable release]; + priv->drawable=NULL; + } + if (priv->cmdBuf) { + [priv->cmdBuf release]; + priv->cmdBuf=NULL; + } + if (priv->renderEncoder) { + [priv->renderEncoder release]; + priv->renderEncoder=NULL; + } + priv->drawable=[priv->context nextDrawable]; priv->cmdBuf=[priv->cmdQueue commandBuffer]; From 887b418eae936d9a0e3da189369d63eef99144b4 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 14 Apr 2024 19:21:53 -0500 Subject: [PATCH 18/32] Metal backend, part 8 --- src/gui/render/renderMetal.mm | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/gui/render/renderMetal.mm b/src/gui/render/renderMetal.mm index fd7734afa..43cd210d7 100644 --- a/src/gui/render/renderMetal.mm +++ b/src/gui/render/renderMetal.mm @@ -110,15 +110,12 @@ void FurnaceGUIRenderMetal::clear(ImVec4 color) { if (priv->drawable) { [priv->drawable release]; - priv->drawable=NULL; } if (priv->cmdBuf) { [priv->cmdBuf release]; - priv->cmdBuf=NULL; } if (priv->renderEncoder) { [priv->renderEncoder release]; - priv->renderEncoder=NULL; } priv->drawable=[priv->context nextDrawable]; From 53d71c798a6199e6548c9538b3b6d3a9db825b30 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 14 Apr 2024 19:30:54 -0500 Subject: [PATCH 19/32] Metal backend, part 9 --- src/gui/render/renderMetal.mm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/gui/render/renderMetal.mm b/src/gui/render/renderMetal.mm index 43cd210d7..81fa74aa7 100644 --- a/src/gui/render/renderMetal.mm +++ b/src/gui/render/renderMetal.mm @@ -114,9 +114,6 @@ void FurnaceGUIRenderMetal::clear(ImVec4 color) { if (priv->cmdBuf) { [priv->cmdBuf release]; } - if (priv->renderEncoder) { - [priv->renderEncoder release]; - } priv->drawable=[priv->context nextDrawable]; @@ -158,6 +155,8 @@ void FurnaceGUIRenderMetal::present() { [priv->cmdBuf presentDrawable:priv->drawable]; [priv->cmdBuf commit]; + + [priv->renderEncoder release]; } bool FurnaceGUIRenderMetal::getOutputSize(int& w, int& h) { From a4fe96954b0cacc8761b74ff51a4a5f5e03cd8df Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 14 Apr 2024 19:39:43 -0500 Subject: [PATCH 20/32] Metal backend, part 10 --- src/gui/render/renderMetal.h | 6 +++++- src/gui/render/renderMetal.mm | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/gui/render/renderMetal.h b/src/gui/render/renderMetal.h index 6a1470c53..ed6219b3a 100644 --- a/src/gui/render/renderMetal.h +++ b/src/gui/render/renderMetal.h @@ -24,6 +24,7 @@ struct FurnaceGUIRenderMetalPrivate; class FurnaceGUIRenderMetal: public FurnaceGUIRender { SDL_Renderer* sdlRend; FurnaceGUIRenderMetalPrivate* priv; + bool swapIntervalSet; public: ImTextureID getTextureID(FurnaceGUITexture* which); bool lockTexture(FurnaceGUITexture* which, void** data, int* pitch); @@ -35,6 +36,7 @@ class FurnaceGUIRenderMetal: public FurnaceGUIRender { void setBlendMode(FurnaceGUIBlendMode mode); void clear(ImVec4 color); bool newFrame(); + bool canVSync(); void createFontsTexture(); void destroyFontsTexture(); void renderGUI(); @@ -42,6 +44,7 @@ class FurnaceGUIRenderMetal: public FurnaceGUIRender { void present(); bool getOutputSize(int& w, int& h); int getWindowFlags(); + void setSwapInterval(int swapInterval); void preInit(); bool init(SDL_Window* win, int swapInterval); void initGUI(SDL_Window* win); @@ -49,5 +52,6 @@ class FurnaceGUIRenderMetal: public FurnaceGUIRender { bool quit(); FurnaceGUIRenderMetal(): sdlRend(NULL), - priv(NULL) {} + priv(NULL), + swapIntervalSet(false) {} }; diff --git a/src/gui/render/renderMetal.mm b/src/gui/render/renderMetal.mm index 81fa74aa7..ccfb9f732 100644 --- a/src/gui/render/renderMetal.mm +++ b/src/gui/render/renderMetal.mm @@ -130,6 +130,10 @@ bool FurnaceGUIRenderMetal::newFrame() { return ImGui_ImplMetal_NewFrame(priv->renderPass); } +bool FurnaceGUIRenderMetal::canVSync() { + return swapIntervalSet; +} + void FurnaceGUIRenderMetal::createFontsTexture() { logI("Metal: createFontsTexture()"); ImGui_ImplMetal_CreateFontsTexture(priv->context.device); @@ -167,6 +171,15 @@ int FurnaceGUIRenderMetal::getWindowFlags() { return 0; } +void FurnaceGUIRenderMetal::setSwapInterval(int swapInterval) { + if (SDL_RenderSetVSync(sdlRend,(swapInterval>=0)?1:0)!=0) { + swapIntervalSet=false; + logW("tried to enable VSync but couldn't!"); + } else { + swapIntervalSet=true; + } +} + void FurnaceGUIRenderMetal::preInit() { SDL_SetHint(SDL_HINT_RENDER_DRIVER,"metal"); priv=new FurnaceGUIRenderMetalPrivate; @@ -180,6 +193,13 @@ bool FurnaceGUIRenderMetal::init(SDL_Window* win, int swapInterval) { if (sdlRend==NULL) return false; + if (SDL_RenderSetVSync(sdlRend,(swapInterval>=0)?1:0)!=0) { + swapIntervalSet=false; + logW("tried to enable VSync but couldn't!"); + } else { + swapIntervalSet=true; + } + logI("retrieving context..."); priv->context=(__bridge CAMetalLayer*)SDL_RenderGetMetalLayer(sdlRend); From ff2855e98b29269679ff3c50598bdd81f81b16b9 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 14 Apr 2024 19:44:30 -0500 Subject: [PATCH 21/32] Metal backend, part 11 --- src/gui/render/renderMetal.mm | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/gui/render/renderMetal.mm b/src/gui/render/renderMetal.mm index ccfb9f732..4a8e94569 100644 --- a/src/gui/render/renderMetal.mm +++ b/src/gui/render/renderMetal.mm @@ -103,7 +103,6 @@ void FurnaceGUIRenderMetal::setBlendMode(FurnaceGUIBlendMode mode) { // you should only call this once!!! void FurnaceGUIRenderMetal::clear(ImVec4 color) { - logI("Metal: clear()"); int outW, outH; getOutputSize(outW,outH); priv->context.drawableSize=CGSizeMake(outW,outH); @@ -126,7 +125,6 @@ void FurnaceGUIRenderMetal::clear(ImVec4 color) { } bool FurnaceGUIRenderMetal::newFrame() { - logI("Metal: newFrame()"); return ImGui_ImplMetal_NewFrame(priv->renderPass); } @@ -135,17 +133,14 @@ bool FurnaceGUIRenderMetal::canVSync() { } void FurnaceGUIRenderMetal::createFontsTexture() { - logI("Metal: createFontsTexture()"); ImGui_ImplMetal_CreateFontsTexture(priv->context.device); } void FurnaceGUIRenderMetal::destroyFontsTexture() { - logI("Metal: destroyFontsTexture()"); ImGui_ImplMetal_DestroyFontsTexture(); } void FurnaceGUIRenderMetal::renderGUI() { - logI("Metal: renderGUI()"); ImGui_ImplMetal_RenderDrawData(ImGui::GetDrawData(),priv->cmdBuf,priv->renderEncoder); } @@ -154,7 +149,6 @@ void FurnaceGUIRenderMetal::wipe(float alpha) { } void FurnaceGUIRenderMetal::present() { - logI("Metal: present()"); [priv->renderEncoder endEncoding]; [priv->cmdBuf presentDrawable:priv->drawable]; @@ -186,7 +180,6 @@ void FurnaceGUIRenderMetal::preInit() { } bool FurnaceGUIRenderMetal::init(SDL_Window* win, int swapInterval) { - logI("Metal: init()"); SDL_SetHint(SDL_HINT_RENDER_DRIVER,"metal"); sdlRend=SDL_CreateRenderer(win,-1,SDL_RENDERER_ACCELERATED|SDL_RENDERER_PRESENTVSYNC|SDL_RENDERER_TARGETTEXTURE); @@ -217,7 +210,6 @@ bool FurnaceGUIRenderMetal::init(SDL_Window* win, int swapInterval) { } void FurnaceGUIRenderMetal::initGUI(SDL_Window* win) { - logI("Metal: initGUI()"); ImGui_ImplMetal_Init(priv->context.device); ImGui_ImplSDL2_InitForMetal(win); } From be89a07c0f6cfb67f491f3d7579944f2dedbcd7e Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sun, 14 Apr 2024 19:56:41 -0500 Subject: [PATCH 22/32] Metal backend, part 12 update to-do list --- src/gui/render/renderMetal.mm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/gui/render/renderMetal.mm b/src/gui/render/renderMetal.mm index 4a8e94569..3c434ce03 100644 --- a/src/gui/render/renderMetal.mm +++ b/src/gui/render/renderMetal.mm @@ -17,7 +17,10 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -// TODO: everything +// TODO: +// - wipe +// - textures +// - maybe fix VSync #include "renderMetal.h" #include "backends/imgui_impl_metal.h" From d24c129e38e5bdeb3d58d0e8246cf2e3955bbc85 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 15 Apr 2024 04:37:41 -0500 Subject: [PATCH 23/32] Metal backend, part 13 --- src/gui/render/renderMetal.mm | 36 +++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/src/gui/render/renderMetal.mm b/src/gui/render/renderMetal.mm index 3c434ce03..0ebf70ae5 100644 --- a/src/gui/render/renderMetal.mm +++ b/src/gui/render/renderMetal.mm @@ -48,8 +48,13 @@ struct FurnaceGUIRenderMetalPrivate { class FurnaceMetalTexture: public FurnaceGUITexture { public: id tex; + int width, height; + unsigned char* lockedData; FurnaceMetalTexture(): - tex(NULL) {} + tex(NULL), + width(0), + height(0), + lockedData(NULL) {} }; ImTextureID FurnaceGUIRenderMetal::getTextureID(FurnaceGUITexture* which) { @@ -58,25 +63,30 @@ ImTextureID FurnaceGUIRenderMetal::getTextureID(FurnaceGUITexture* which) { } bool FurnaceGUIRenderMetal::lockTexture(FurnaceGUITexture* which, void** data, int* pitch) { - return false; - /* FurnaceMetalTexture* t=(FurnaceMetalTexture*)which; - return SDL_LockTexture(t->tex,NULL,data,pitch)==0;*/ + if (t->lockedData!=NULL) return false; + t->lockedData=new unsigned char[t->width*t->height*4]; + + *data=t->lockedData; + *pitch=t->width*4; + return true; } bool FurnaceGUIRenderMetal::unlockTexture(FurnaceGUITexture* which) { - return false; - /* FurnaceMetalTexture* t=(FurnaceMetalTexture*)which; - SDL_UnlockTexture(t->tex); - return true;*/ + if (t->lockedData==NULL) return false; + + [t->tex replaceRegion:MTLRegionMake2D(0,0,(NSUInteger)t->width,(NSUInteger)t->height) mipmapLevel:0 withBytes:t->lockedData bytesPerRow:(NSUInteger)t->width*4]; + delete[] t->lockedData; + t->lockedData=NULL; + + return true; } bool FurnaceGUIRenderMetal::updateTexture(FurnaceGUITexture* which, void* data, int pitch) { - return false; - /* - FurnaceSDLTexture* t=(FurnaceSDLTexture*)which; - return SDL_UpdateTexture(t->tex,NULL,data,pitch)==0;*/ + FurnaceMetalTexture* t=(FurnaceMetalTexture*)which; + [t->tex replaceRegion:MTLRegionMake2D(0,0,(NSUInteger)t->width,(NSUInteger)t->height) mipmapLevel:0 withBytes:data bytesPerRow:(NSUInteger)pitch]; + return true; } FurnaceGUITexture* FurnaceGUIRenderMetal::createTexture(bool dynamic, int width, int height, bool interpolate) { @@ -89,6 +99,8 @@ FurnaceGUITexture* FurnaceGUIRenderMetal::createTexture(bool dynamic, int width, if (texture==NULL) return NULL; FurnaceMetalTexture* ret=new FurnaceMetalTexture; ret->tex=texture; + ret->width=width; + ret->height=height; return ret; } From e1bb42fba96fc7c03b741141f6e4812b6af8c221 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 15 Apr 2024 12:29:33 -0500 Subject: [PATCH 24/32] Metal backend, part 14 --- src/gui/render/renderMetal.mm | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/render/renderMetal.mm b/src/gui/render/renderMetal.mm index 0ebf70ae5..467303f87 100644 --- a/src/gui/render/renderMetal.mm +++ b/src/gui/render/renderMetal.mm @@ -106,6 +106,7 @@ FurnaceGUITexture* FurnaceGUIRenderMetal::createTexture(bool dynamic, int width, bool FurnaceGUIRenderMetal::destroyTexture(FurnaceGUITexture* which) { FurnaceMetalTexture* t=(FurnaceMetalTexture*)which; + [t->tex release]; delete t; return true; } From a9cc805fac6170c244709856878b839eabf067b2 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 15 Apr 2024 12:46:47 -0500 Subject: [PATCH 25/32] Metal backend, part 15 --- src/gui/render/renderMetal.mm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/gui/render/renderMetal.mm b/src/gui/render/renderMetal.mm index 467303f87..410e47585 100644 --- a/src/gui/render/renderMetal.mm +++ b/src/gui/render/renderMetal.mm @@ -19,7 +19,6 @@ // TODO: // - wipe -// - textures // - maybe fix VSync #include "renderMetal.h" @@ -101,12 +100,16 @@ FurnaceGUITexture* FurnaceGUIRenderMetal::createTexture(bool dynamic, int width, ret->tex=texture; ret->width=width; ret->height=height; + + [texDesc release]; + return ret; } bool FurnaceGUIRenderMetal::destroyTexture(FurnaceGUITexture* which) { FurnaceMetalTexture* t=(FurnaceMetalTexture*)which; [t->tex release]; + t->tex=NULL; delete t; return true; } From 83719ce6c921812ecbdba5cc2c2ae466340bed57 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 15 Apr 2024 13:33:59 -0500 Subject: [PATCH 26/32] texture debug --- src/gui/debugWindow.cpp | 46 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/gui/debugWindow.cpp b/src/gui/debugWindow.cpp index ed5057915..6b8d6ea57 100644 --- a/src/gui/debugWindow.cpp +++ b/src/gui/debugWindow.cpp @@ -610,6 +610,52 @@ void FurnaceGUI::drawDebug() { ImGui::Unindent(); ImGui::TreePop(); } + if (ImGui::TreeNode("Texture Test")) { + ImGui::Text("Create and Destroy 128 Textures"); + if (ImGui::Button("No Write")) { + for (int i=0; i<128; i++) { + FurnaceGUITexture* t=rend->createTexture(false,2048,2048); + if (t==NULL) { + showError(fmt::sprintf("Failure! %d",i)); + break; + } + rend->destroyTexture(t); + } + } + if (ImGui::Button("Write (update)")) { + unsigned char* data=new unsigned char[2048*2048*4]; + for (int i=0; i<2048*2048*4; i++) { + data[i]=rand(); + } + for (int i=0; i<128; i++) { + FurnaceGUITexture* t=rend->createTexture(false,2048,2048); + if (t==NULL) { + showError(fmt::sprintf("Failure! %d",i)); + break; + } + rend->updateTexture(t,data,2048*4); + rend->destroyTexture(t); + } + } + if (ImGui::Button("Write (lock)")) { + unsigned char* data=NULL; + int pitch=0; + for (int i=0; i<128; i++) { + FurnaceGUITexture* t=rend->createTexture(false,2048,2048); + if (t==NULL) { + showError(fmt::sprintf("Failure! %d",i)); + break; + } + if (rend->lockTexture(t,(void**)&data,&pitch)) { + for (int i=0; i<2048*2048*4; i++) { + data[i]=rand(); + } + rend->unlockTexture(t); + } + rend->destroyTexture(t); + } + } + } if (ImGui::TreeNode("Osc Render Test")) { ImGui::InputInt("Length",&oscDebugLen); ImGui::InputInt("Height",&oscDebugHeight); From de2d8eefff144f498eadc6921a83e049f8805cc6 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 15 Apr 2024 13:38:09 -0500 Subject: [PATCH 27/32] untested garbage --- src/gui/debugWindow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/debugWindow.cpp b/src/gui/debugWindow.cpp index 6b8d6ea57..ce4d6515b 100644 --- a/src/gui/debugWindow.cpp +++ b/src/gui/debugWindow.cpp @@ -655,6 +655,7 @@ void FurnaceGUI::drawDebug() { rend->destroyTexture(t); } } + ImGui::TreePop(); } if (ImGui::TreeNode("Osc Render Test")) { ImGui::InputInt("Length",&oscDebugLen); From ddc9693a0c96049063bccddf98656948a95e9b1e Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 15 Apr 2024 17:44:12 -0500 Subject: [PATCH 28/32] LOL MEMORY LEAK IN THE MEMORY LEAK TESTER --- src/gui/debugWindow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gui/debugWindow.cpp b/src/gui/debugWindow.cpp index ce4d6515b..fdaf3b066 100644 --- a/src/gui/debugWindow.cpp +++ b/src/gui/debugWindow.cpp @@ -636,6 +636,7 @@ void FurnaceGUI::drawDebug() { rend->updateTexture(t,data,2048*4); rend->destroyTexture(t); } + delete[] data; } if (ImGui::Button("Write (lock)")) { unsigned char* data=NULL; From 7f765fc0a4f778c36a67326fb0bac36c2d468bae Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 17 Apr 2024 01:58:11 -0500 Subject: [PATCH 29/32] try fixing leak --- extern/imgui_patched/backends/imgui_impl_metal.mm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/extern/imgui_patched/backends/imgui_impl_metal.mm b/extern/imgui_patched/backends/imgui_impl_metal.mm index 930806dfa..1480c5026 100644 --- a/extern/imgui_patched/backends/imgui_impl_metal.mm +++ b/extern/imgui_patched/backends/imgui_impl_metal.mm @@ -164,6 +164,9 @@ bool ImGui_ImplMetal_NewFrame(MTLRenderPassDescriptor* renderPassDescriptor) { ImGui_ImplMetal_Data* bd = ImGui_ImplMetal_GetBackendData(); IM_ASSERT(bd->SharedMetalContext != nil && "No Metal context. Did you call ImGui_ImplMetal_Init() ?"); + if (bd->SharedMetalContext.framebufferDescriptor != nil) { + [bd->SharedMetalContext.framebufferDescriptor release]; + } bd->SharedMetalContext.framebufferDescriptor = [[FramebufferDescriptor alloc] initWithRenderPassDescriptor:renderPassDescriptor]; if (bd->SharedMetalContext.depthStencilState == nil) @@ -233,6 +236,7 @@ void ImGui_ImplMetal_RenderDrawData(ImDrawData* drawData, id c id renderPipelineState = ctx.renderPipelineStateCache[ctx.framebufferDescriptor]; if (renderPipelineState == nil) { + printf("RPS NULL....\n"); // No luck; make a new render pipeline state renderPipelineState = [ctx renderPipelineStateForFramebufferDescriptor:ctx.framebufferDescriptor device:commandBuffer.device]; From 346f6f119ead38bdfd1fc6c56b28b65ac21bc141 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 17 Apr 2024 17:03:46 -0500 Subject: [PATCH 30/32] the final part of Metal --- src/gui/render/renderMetal.mm | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/gui/render/renderMetal.mm b/src/gui/render/renderMetal.mm index 410e47585..48da7278d 100644 --- a/src/gui/render/renderMetal.mm +++ b/src/gui/render/renderMetal.mm @@ -17,10 +17,6 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -// TODO: -// - wipe -// - maybe fix VSync - #include "renderMetal.h" #include "backends/imgui_impl_metal.h" @@ -164,7 +160,12 @@ void FurnaceGUIRenderMetal::renderGUI() { } void FurnaceGUIRenderMetal::wipe(float alpha) { - // TODO + // you know what? cheat. + // I don't feel like learning yet another API just to please Apple. + // screw it. + SDL_SetRenderDrawBlendMode(sdlRend,SDL_BLENDMODE_BLEND); + SDL_SetRenderDrawColor(sdlRend,0,0,0,255*alpha); + SDL_RenderFillRect(sdlRend,NULL); } void FurnaceGUIRenderMetal::present() { From c3b30f89d525a07c85762e7a6c772d6769f9a507 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 17 Apr 2024 17:20:08 -0500 Subject: [PATCH 31/32] GUI: Metal testing credits --- src/gui/about.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/gui/about.cpp b/src/gui/about.cpp index 024cb9fe6..ad68bce99 100644 --- a/src/gui/about.cpp +++ b/src/gui/about.cpp @@ -199,6 +199,12 @@ const char* aboutLine[]={ "plane", "TheEssem", "", + "-- Metal backend test team --", + "Diggo", + "konard", + "NaxeCode", + "scratchminer", + "", "powered by:", "Dear ImGui by Omar Cornut", "SDL2 by Sam Lantinga", From 99b2c72e60e9a5b19d024acfa3c79ab90a57526d Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 17 Apr 2024 17:59:15 -0500 Subject: [PATCH 32/32] Revert "remove Windows and Linux from CI for now" This reverts commit eddbd16bd6282b369a3402ab4d7c4536090648d6. --- .github/workflows/build.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ef3b55091..13ca442b5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -18,8 +18,14 @@ jobs: strategy: matrix: config: + - { name: 'Windows MSVC x86', os: windows-latest, compiler: msvc, arch: x86 } + - { name: 'Windows MSVC x86_64', os: windows-latest, compiler: msvc, arch: x86_64 } + #- { name: 'Windows MinGW x86', os: ubuntu-20.04, compiler: mingw, arch: x86 } + #- { name: 'Windows MinGW x86_64', os: ubuntu-20.04, compiler: mingw, arch: x86_64 } - { name: 'macOS x86_64', os: macos-latest, arch: x86_64 } - { name: 'macOS ARM', os: macos-latest, arch: arm64 } + - { name: 'Linux x86_64', os: ubuntu-20.04, arch: x86_64 } + #- { name: 'Linux ARM', os: ubuntu-18.04, arch: armhf } fail-fast: false name: ${{ matrix.config.name }}