diff --git a/src/gui/render/renderMetal.h b/src/gui/render/renderMetal.h index f1913584..1204825b 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 84053d05..fbd7f16d 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() {