From df703cc693b5298c8f6687bed6db5bb948f03231 Mon Sep 17 00:00:00 2001 From: turanszkij Date: Mon, 12 Mar 2018 14:34:55 +0000 Subject: [PATCH] waitforgpu() dx12 wrapper added, sync before exit editor --- Editor/Editor.cpp | 1 + WickedEngine/MainComponent.cpp | 2 ++ WickedEngine/MainComponent.h | 2 +- WickedEngine/wiGraphicsDevice.h | 2 ++ WickedEngine/wiGraphicsDevice_DX11.cpp | 5 +++++ WickedEngine/wiGraphicsDevice_DX11.h | 6 ++++-- WickedEngine/wiGraphicsDevice_DX12.cpp | 11 +++++++++++ WickedEngine/wiGraphicsDevice_DX12.h | 2 ++ WickedEngine/wiGraphicsResource.cpp | 4 ++-- WickedEngine/wiRenderer.cpp | 1 - WickedEngine/wiResourceManager.cpp | 2 ++ WickedEngine/wiVersion.cpp | 2 +- 12 files changed, 33 insertions(+), 7 deletions(-) diff --git a/Editor/Editor.cpp b/Editor/Editor.cpp index e4bfcb549..e7c31bf91 100644 --- a/Editor/Editor.cpp +++ b/Editor/Editor.cpp @@ -835,6 +835,7 @@ void EditorComponent::Load() exitButton->SetColor(wiColor(190, 0, 0, 200), wiWidget::WIDGETSTATE::IDLE); exitButton->SetColor(wiColor(255, 0, 0, 255), wiWidget::WIDGETSTATE::FOCUS); exitButton->OnClick([](wiEventArgs args) { + wiRenderer::GetDevice()->WaitForGPU(); exit(0); }); GetGUI().AddWidget(exitButton); diff --git a/WickedEngine/MainComponent.cpp b/WickedEngine/MainComponent.cpp index 6734c6138..02d755efb 100644 --- a/WickedEngine/MainComponent.cpp +++ b/WickedEngine/MainComponent.cpp @@ -40,6 +40,8 @@ MainComponent::MainComponent() MainComponent::~MainComponent() { + wiRenderer::GetDevice()->WaitForGPU(); + if (activeComponent != nullptr) { activeComponent->Unload(); diff --git a/WickedEngine/MainComponent.h b/WickedEngine/MainComponent.h index 56affe87a..d36a48b5a 100644 --- a/WickedEngine/MainComponent.h +++ b/WickedEngine/MainComponent.h @@ -21,7 +21,7 @@ private: wiFadeManager fadeManager; public: MainComponent(); - ~MainComponent(); + virtual ~MainComponent(); int screenW, screenH; bool fullscreen; diff --git a/WickedEngine/wiGraphicsDevice.h b/WickedEngine/wiGraphicsDevice.h index 0b70e6b63..892ed6a59 100644 --- a/WickedEngine/wiGraphicsDevice.h +++ b/WickedEngine/wiGraphicsDevice.h @@ -132,6 +132,8 @@ namespace wiGraphicsTypes virtual void UAVBarrier(GPUResource *const* uavs, UINT NumBarriers, GRAPHICSTHREAD threadID) = 0; virtual void TransitionBarrier(GPUResource *const* resources, UINT NumBarriers, RESOURCE_STATES stateBefore, RESOURCE_STATES stateAfter, GRAPHICSTHREAD threadID) = 0; + virtual void WaitForGPU() = 0; + virtual HRESULT CreateTextureFromFile(const std::string& fileName, Texture2D **ppTexture, bool mipMaps, GRAPHICSTHREAD threadID) = 0; virtual HRESULT SaveTexturePNG(const std::string& fileName, Texture2D *pTexture, GRAPHICSTHREAD threadID) = 0; virtual HRESULT SaveTextureDDS(const std::string& fileName, Texture *pTexture, GRAPHICSTHREAD threadID) = 0; diff --git a/WickedEngine/wiGraphicsDevice_DX11.cpp b/WickedEngine/wiGraphicsDevice_DX11.cpp index 016e23d04..91f494525 100644 --- a/WickedEngine/wiGraphicsDevice_DX11.cpp +++ b/WickedEngine/wiGraphicsDevice_DX11.cpp @@ -3409,6 +3409,11 @@ void GraphicsDevice_DX11::SetScissorRects(UINT numRects, const Rect* rects, GRAP deviceContexts[threadID]->RSSetScissorRects(numRects, pRects); } +void GraphicsDevice_DX11::WaitForGPU() +{ + deviceContexts[GRAPHICSTHREAD_IMMEDIATE]->Flush(); +} + void GraphicsDevice_DX11::QueryBegin(GPUQuery *query, GRAPHICSTHREAD threadID) { deviceContexts[threadID]->Begin(query->resource_DX11[query->async_frameshift]); diff --git a/WickedEngine/wiGraphicsDevice_DX11.h b/WickedEngine/wiGraphicsDevice_DX11.h index bcb2ca62c..8b2d9309c 100644 --- a/WickedEngine/wiGraphicsDevice_DX11.h +++ b/WickedEngine/wiGraphicsDevice_DX11.h @@ -111,8 +111,10 @@ namespace wiGraphicsTypes virtual void QueryBegin(GPUQuery *query, GRAPHICSTHREAD threadID) override; virtual void QueryEnd(GPUQuery *query, GRAPHICSTHREAD threadID) override; virtual bool QueryRead(GPUQuery *query, GRAPHICSTHREAD threadID) override; - virtual void UAVBarrier(GPUResource *const* uavs, UINT NumBarriers, GRAPHICSTHREAD threadID) {}; - virtual void TransitionBarrier(GPUResource *const* resources, UINT NumBarriers, RESOURCE_STATES stateBefore, RESOURCE_STATES stateAfter, GRAPHICSTHREAD threadID) {}; + virtual void UAVBarrier(GPUResource *const* uavs, UINT NumBarriers, GRAPHICSTHREAD threadID) override {}; + virtual void TransitionBarrier(GPUResource *const* resources, UINT NumBarriers, RESOURCE_STATES stateBefore, RESOURCE_STATES stateAfter, GRAPHICSTHREAD threadID) override {}; + + virtual void WaitForGPU() override; virtual HRESULT CreateTextureFromFile(const std::string& fileName, Texture2D **ppTexture, bool mipMaps, GRAPHICSTHREAD threadID) override; virtual HRESULT SaveTexturePNG(const std::string& fileName, Texture2D *pTexture, GRAPHICSTHREAD threadID) override; diff --git a/WickedEngine/wiGraphicsDevice_DX12.cpp b/WickedEngine/wiGraphicsDevice_DX12.cpp index 554f4cd1f..c02cec51d 100644 --- a/WickedEngine/wiGraphicsDevice_DX12.cpp +++ b/WickedEngine/wiGraphicsDevice_DX12.cpp @@ -1906,6 +1906,8 @@ namespace wiGraphicsTypes } GraphicsDevice_DX12::~GraphicsDevice_DX12() { + WaitForGPU(); + SAFE_RELEASE(swapChain); for (UINT fr = 0; fr < BACKBUFFER_COUNT; ++fr) @@ -3644,6 +3646,15 @@ namespace wiGraphicsTypes GetDirectCommandList(threadID)->RSSetScissorRects(numRects, pRects); } + void GraphicsDevice_DX12::WaitForGPU() + { + if (frameFence->GetCompletedValue() < FRAMECOUNT) + { + HRESULT result = frameFence->SetEventOnCompletion(FRAMECOUNT, frameFenceEvent); + WaitForSingleObject(frameFenceEvent, INFINITE); + } + } + void GraphicsDevice_DX12::QueryBegin(GPUQuery *query, GRAPHICSTHREAD threadID) { } diff --git a/WickedEngine/wiGraphicsDevice_DX12.h b/WickedEngine/wiGraphicsDevice_DX12.h index 5fc5217c2..b67aff0ea 100644 --- a/WickedEngine/wiGraphicsDevice_DX12.h +++ b/WickedEngine/wiGraphicsDevice_DX12.h @@ -222,6 +222,8 @@ namespace wiGraphicsTypes virtual void UAVBarrier(GPUResource *const* uavs, UINT NumBarriers, GRAPHICSTHREAD threadID) override; virtual void TransitionBarrier(GPUResource *const* resources, UINT NumBarriers, RESOURCE_STATES stateBefore, RESOURCE_STATES stateAfter, GRAPHICSTHREAD threadID) override; + virtual void WaitForGPU(); + virtual HRESULT CreateTextureFromFile(const std::string& fileName, Texture2D **ppTexture, bool mipMaps, GRAPHICSTHREAD threadID) override; virtual HRESULT SaveTexturePNG(const std::string& fileName, Texture2D *pTexture, GRAPHICSTHREAD threadID) override; virtual HRESULT SaveTextureDDS(const std::string& fileName, Texture *pTexture, GRAPHICSTHREAD threadID) override; diff --git a/WickedEngine/wiGraphicsResource.cpp b/WickedEngine/wiGraphicsResource.cpp index 36f5787a8..22672edd3 100644 --- a/WickedEngine/wiGraphicsResource.cpp +++ b/WickedEngine/wiGraphicsResource.cpp @@ -265,7 +265,7 @@ namespace wiGraphicsTypes } GraphicsPSO::~GraphicsPSO() { - SAFE_DELETE(resource_DX12); + SAFE_RELEASE(resource_DX12); } ComputePSO::ComputePSO() @@ -274,6 +274,6 @@ namespace wiGraphicsTypes } ComputePSO::~ComputePSO() { - SAFE_DELETE(resource_DX12); + SAFE_RELEASE(resource_DX12); } } diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index e5bba5de8..8f3e82522 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -269,7 +269,6 @@ void wiRenderer::SetUpStaticComponents() void wiRenderer::CleanUpStatic() { - wiHairParticle::CleanUpStatic(); wiEmittedParticle::CleanUpStatic(); Cube::CleanUpStatic(); diff --git a/WickedEngine/wiResourceManager.cpp b/WickedEngine/wiResourceManager.cpp index 649c03590..64b12e8aa 100644 --- a/WickedEngine/wiResourceManager.cpp +++ b/WickedEngine/wiResourceManager.cpp @@ -306,6 +306,8 @@ bool wiResourceManager::del(const wiHashString& name, bool forceDelete) bool wiResourceManager::CleanUp() { + wiRenderer::GetDevice()->WaitForGPU(); + std::vectorresNames(0); for (auto& x : resources) { diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 2d3248397..c115b80da 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wiVersion // minor features, major updates const int minor = 16; // minor bug fixes, alterations, refactors, updates - const int revision = 17; + const int revision = 18; long GetVersion()