From cf144f4fe9e24dbfbe89c2067ddf909968fde588 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 12 Jun 2023 19:43:26 -0500 Subject: [PATCH] GUI: DirectX 11 render backend, part 2 --- src/gui/gui.cpp | 3 ++- src/gui/gui.h | 1 + src/gui/render/abstract.cpp | 5 ++++- src/gui/render/renderDX11.cpp | 22 +++++++++++++++++++++- src/gui/render/renderDX11.h | 7 +++++-- 5 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 732ce5514..6ea8a941a 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -3420,6 +3420,7 @@ bool FurnaceGUI::loop() { logV("portrait: %d (%dx%d)",portrait,scrW,scrH); logD("window resized to %dx%d",scrW,scrH); updateWindow=true; + rend->resized(ev); break; case SDL_WINDOWEVENT_MOVED: scrX=ev.window.data1; @@ -5824,8 +5825,8 @@ bool FurnaceGUI::loop() { } } } - rend->present(); drawTimeEnd=SDL_GetPerformanceCounter(); + rend->present(); if (settings.renderClearPos) { rend->clear(uiColors[GUI_COLOR_BACKGROUND]); } diff --git a/src/gui/gui.h b/src/gui/gui.h index 19fdb2817..81266e432 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1248,6 +1248,7 @@ class FurnaceGUIRender { virtual bool destroyTexture(void* which); virtual void setTextureBlendMode(void* which, FurnaceGUIBlendMode mode); virtual void setBlendMode(FurnaceGUIBlendMode mode); + virtual void resized(const SDL_Event& ev); virtual void clear(ImVec4 color); virtual bool newFrame(); virtual void createFontsTexture(); diff --git a/src/gui/render/abstract.cpp b/src/gui/render/abstract.cpp index 996cf4e86..a45c4ecd2 100644 --- a/src/gui/render/abstract.cpp +++ b/src/gui/render/abstract.cpp @@ -49,6 +49,9 @@ void FurnaceGUIRender::setTextureBlendMode(void* which, FurnaceGUIBlendMode mode void FurnaceGUIRender::setBlendMode(FurnaceGUIBlendMode mode) { } +void FurnaceGUIRender::resized(const SDL_Event& ev) { +} + void FurnaceGUIRender::clear(ImVec4 color) { } @@ -97,4 +100,4 @@ void FurnaceGUIRender::quitGUI() { } FurnaceGUIRender::~FurnaceGUIRender() { -} \ No newline at end of file +} diff --git a/src/gui/render/renderDX11.cpp b/src/gui/render/renderDX11.cpp index dcfb09984..767878ce7 100644 --- a/src/gui/render/renderDX11.cpp +++ b/src/gui/render/renderDX11.cpp @@ -48,6 +48,15 @@ bool FurnaceGUIRenderDX11::createRenderTarget() { return false; } + DXGI_SWAP_CHAIN_DESC chainDesc; + memset(&chainDesc,0,sizeof(chainDesc)); + if (swapchain->GetDesc(&chainDesc)!=S_OK) { + logW("createRenderTarget: could not get swapchain desc!"); + } else { + outW=chainDesc.BufferDesc.Width; + outH=chainDesc.BufferDesc.Height; + } + result=swapchain->GetBuffer(0,IID_PPV_ARGS(&screen)); if (result!=S_OK) { logW("createRenderTarget: could not get buffer! %.8x",result); @@ -103,6 +112,15 @@ void FurnaceGUIRenderDX11::setTextureBlendMode(void* which, FurnaceGUIBlendMode void FurnaceGUIRenderDX11::setBlendMode(FurnaceGUIBlendMode mode) { } +void FurnaceGUIRenderDX11::resized(const SDL_Event& ev) { + destroyRenderTarget(); + swapchain->ResizeBuffers(0,0,0,DXGI_FORMAT_UNKNOWN,0); + + + + createRenderTarget(); +} + void FurnaceGUIRenderDX11::clear(ImVec4 color) { float floatColor[4]={ color.x*color.w, @@ -141,7 +159,9 @@ void FurnaceGUIRenderDX11::present() { } bool FurnaceGUIRenderDX11::getOutputSize(int& w, int& h) { - return false; + w=outW; + h=outH; + return true; } int FurnaceGUIRenderDX11::getWindowFlags() { diff --git a/src/gui/render/renderDX11.h b/src/gui/render/renderDX11.h index 9db29851e..1a3d7dca1 100644 --- a/src/gui/render/renderDX11.h +++ b/src/gui/render/renderDX11.h @@ -31,8 +31,8 @@ class FurnaceGUIRenderDX11: public FurnaceGUIRender { ID3D11DeviceContext* context; ID3D11RenderTargetView* renderTarget; IDXGISwapChain* swapchain; + int outW, outH; float quadVertex[4][3]; - unsigned int quadBuf; bool destroyRenderTarget(); bool createRenderTarget(); @@ -46,6 +46,7 @@ class FurnaceGUIRenderDX11: public FurnaceGUIRender { bool destroyTexture(void* which); void setTextureBlendMode(void* which, FurnaceGUIBlendMode mode); void setBlendMode(FurnaceGUIBlendMode mode); + void resized(const SDL_Event& ev); void clear(ImVec4 color); bool newFrame(); void createFontsTexture(); @@ -64,7 +65,9 @@ class FurnaceGUIRenderDX11: public FurnaceGUIRender { device(NULL), context(NULL), renderTarget(NULL), - swapchain(NULL) { + swapchain(NULL), + outW(0), + outH(0) { memset(quadVertex,0,4*3*sizeof(float)); } };