diff --git a/WickedEngine/ArchiveVersionHistory.txt b/WickedEngine/ArchiveVersionHistory.txt index 6bb24130c..8a24f0347 100644 --- a/WickedEngine/ArchiveVersionHistory.txt +++ b/WickedEngine/ArchiveVersionHistory.txt @@ -1,5 +1,7 @@ This file contains changelog of wiArchive versions +6: serialized area light properties +5: serialized color and emissive decal properties 4: serialized Material property alphaRef 3: serialized Material property parallaxOcclusionMapping 2: serialized Material property planar_reflections diff --git a/WickedEngine/DeferredRenderableComponent.cpp b/WickedEngine/DeferredRenderableComponent.cpp index 5d79d81bf..32d82f42d 100644 --- a/WickedEngine/DeferredRenderableComponent.cpp +++ b/WickedEngine/DeferredRenderableComponent.cpp @@ -6,6 +6,7 @@ #include "wiTextureHelper.h" #include "wiSprite.h" #include "ResourceMapping.h" +#include "wiProfiler.h" using namespace wiGraphicsTypes; @@ -98,6 +99,8 @@ void DeferredRenderableComponent::Render() void DeferredRenderableComponent::RenderScene(GRAPHICSTHREAD threadID) { + wiProfiler::GetInstance().BeginRange("Opaque Scene", wiProfiler::DOMAIN_GPU, threadID); + wiRenderer::UpdateCameraCB(wiRenderer::getCamera(), threadID); wiImageEffects fx((float)wiRenderer::GetDevice()->GetScreenWidth(), (float)wiRenderer::GetDevice()->GetScreenHeight()); @@ -240,6 +243,8 @@ void DeferredRenderableComponent::RenderScene(GRAPHICSTHREAD threadID) fx.process.clear(); } } + + wiProfiler::GetInstance().EndRange(); // Opaque Scene } wiRenderTarget& DeferredRenderableComponent::GetFinalRT() diff --git a/WickedEngine/ForwardRenderableComponent.cpp b/WickedEngine/ForwardRenderableComponent.cpp index 0684d8729..65bfeb219 100644 --- a/WickedEngine/ForwardRenderableComponent.cpp +++ b/WickedEngine/ForwardRenderableComponent.cpp @@ -3,6 +3,7 @@ #include "wiImage.h" #include "wiImageEffects.h" #include "wiHelper.h" +#include "wiProfiler.h" using namespace wiGraphicsTypes; @@ -77,6 +78,8 @@ void ForwardRenderableComponent::Render() void ForwardRenderableComponent::RenderScene(GRAPHICSTHREAD threadID) { + wiProfiler::GetInstance().BeginRange("Opaque Scene", wiProfiler::DOMAIN_GPU, threadID); + wiRenderer::UpdateCameraCB(wiRenderer::getCamera(), threadID); rtMain.Activate(threadID, 0, 0, 0, 0); @@ -98,6 +101,8 @@ void ForwardRenderableComponent::RenderScene(GRAPHICSTHREAD threadID) rtLinearDepth.Deactivate(threadID); wiRenderer::UpdateDepthBuffer(dtDepthCopy.GetTextureResolvedMSAA(threadID), rtLinearDepth.GetTexture(), threadID); + + wiProfiler::GetInstance().EndRange(); // Opaque Scene } diff --git a/WickedEngine/MainComponent.cpp b/WickedEngine/MainComponent.cpp index b5d7ba0f8..59c235177 100644 --- a/WickedEngine/MainComponent.cpp +++ b/WickedEngine/MainComponent.cpp @@ -11,6 +11,7 @@ #include "wiImageEffects.h" #include "wiTextureHelper.h" #include "wiFrameRate.h" +#include "wiProfiler.h" MainComponent::MainComponent() { @@ -79,6 +80,9 @@ void MainComponent::activateComponent(RenderableComponent* component, int fadeFr void MainComponent::run() { + wiProfiler::GetInstance().BeginFrame(); + wiProfiler::GetInstance().BeginRange("CPU Frame", wiProfiler::DOMAIN_CPU); + static wiTimer timer = wiTimer(); static double accumulator = 0.0; const double elapsedTime = timer.elapsed() / 1000.0; @@ -86,6 +90,7 @@ void MainComponent::run() wiLua::GetGlobal()->SetDeltaTime(elapsedTime); + wiProfiler::GetInstance().BeginRange("Fixed Update", wiProfiler::DOMAIN_CPU); if (frameskip) { accumulator += elapsedTime; @@ -106,10 +111,17 @@ void MainComponent::run() { Update(); } + wiProfiler::GetInstance().EndRange(); // Fixed Update + wiProfiler::GetInstance().BeginRange("Update", wiProfiler::DOMAIN_CPU); getActiveComponent()->Update((float)elapsedTime); + wiProfiler::GetInstance().EndRange(); // Update + wiProfiler::GetInstance().BeginRange("GPU Frame", wiProfiler::DOMAIN_GPU, GRAPHICSTHREAD_IMMEDIATE); Render(); + wiProfiler::GetInstance().EndRange(GRAPHICSTHREAD_IMMEDIATE); // GPU Frame + + wiProfiler::GetInstance().EndRange(); // CPU Frame wiRenderer::Present(bind(&MainComponent::Compose, this)); @@ -118,6 +130,8 @@ void MainComponent::run() wiLua::GetGlobal()->RunFile("startup.lua"); startupScriptProcessed = true; } + + wiProfiler::GetInstance().EndFrame(); } void MainComponent::Update() @@ -187,9 +201,12 @@ void MainComponent::Compose() } ss << endl; } + ss.precision(2); wiFont(ss.str(), wiFontProps(4, 4, infoDisplay.size, WIFALIGN_LEFT, WIFALIGN_TOP)).Draw(); } + wiProfiler::GetInstance().DrawData(4, 120, GRAPHICSTHREAD_IMMEDIATE); + // Draw the color grading palette if (colorGradingPaletteDisplayEnabled) { diff --git a/WickedEngine/Renderable2DComponent.cpp b/WickedEngine/Renderable2DComponent.cpp index 9dfbf8045..8536c33e7 100644 --- a/WickedEngine/Renderable2DComponent.cpp +++ b/WickedEngine/Renderable2DComponent.cpp @@ -88,7 +88,7 @@ void Renderable2DComponent::Render() { rtFinal.Activate(GRAPHICSTHREAD_IMMEDIATE, 0.0f, 0.0f, 0.0f, 0); - wiRenderer::GetDevice()->EventBegin(L"Sprite Layers"); + wiRenderer::GetDevice()->EventBegin("Sprite Layers"); for (auto& x : layers) { for (auto& y : x.entities) diff --git a/WickedEngine/Renderable3DComponent.cpp b/WickedEngine/Renderable3DComponent.cpp index a7a8cbd61..48391737e 100644 --- a/WickedEngine/Renderable3DComponent.cpp +++ b/WickedEngine/Renderable3DComponent.cpp @@ -6,6 +6,7 @@ #include "wiTextureHelper.h" #include "wiLoader.h" #include "ResourceMapping.h" +#include "wiProfiler.h" using namespace wiGraphicsTypes; @@ -193,8 +194,15 @@ void Renderable3DComponent::Compose() void Renderable3DComponent::RenderFrameSetUp(GRAPHICSTHREAD threadID) { + wiProfiler::GetInstance().BeginRange("Update Render Data", wiProfiler::DOMAIN_GPU, threadID); + wiRenderer::UpdateRenderData(threadID); + wiProfiler::GetInstance().EndRange(); // Update Render Data + + + wiProfiler::GetInstance().BeginRange("Occlusion Culling Render", wiProfiler::DOMAIN_GPU, threadID); + //ViewPort viewPort; //viewPort.TopLeftX = 0.0f; //viewPort.TopLeftY = 0.0f; @@ -220,6 +228,9 @@ void Renderable3DComponent::RenderFrameSetUp(GRAPHICSTHREAD threadID) wiRenderer::GetDevice()->BindViewports(1, &viewPort, threadID); wiRenderer::GetDevice()->BindRenderTargets(0, nullptr, dtDepthCopy.GetTexture(), threadID); wiRenderer::OcclusionCulling_Render(threadID); + + wiProfiler::GetInstance().EndRange(); // Occlusion Culling Render + } void Renderable3DComponent::RenderReflections(GRAPHICSTHREAD threadID) { @@ -233,6 +244,7 @@ void Renderable3DComponent::RenderReflections(GRAPHICSTHREAD threadID) { return; } + wiProfiler::GetInstance().BeginRange("Reflection rendering", wiProfiler::DOMAIN_GPU, threadID); wiRenderer::UpdateCameraCB(wiRenderer::getRefCamera(), threadID); @@ -253,6 +265,8 @@ void Renderable3DComponent::RenderReflections(GRAPHICSTHREAD threadID) wiRenderer::SetClipPlane(XMFLOAT4(0, 0, 0, 0), threadID); } + + wiProfiler::GetInstance().EndRange(); // Reflection Rendering } void Renderable3DComponent::RenderShadows(GRAPHICSTHREAD threadID) { @@ -267,7 +281,11 @@ void Renderable3DComponent::RenderShadows(GRAPHICSTHREAD threadID) return; } + wiProfiler::GetInstance().BeginRange("Shadow Rendering", wiProfiler::DOMAIN_GPU, threadID); + wiRenderer::DrawForShadowMap(threadID); + + wiProfiler::GetInstance().EndRange(); // Shadow Rendering } void Renderable3DComponent::RenderSecondaryScene(wiRenderTarget& mainRT, wiRenderTarget& shadedSceneRT, GRAPHICSTHREAD threadID) { @@ -281,10 +299,11 @@ void Renderable3DComponent::RenderSecondaryScene(wiRenderTarget& mainRT, wiRende // We don't need the following for stereograms... return; } + wiProfiler::GetInstance().BeginRange("Secondary Scene", wiProfiler::DOMAIN_GPU, threadID); if (getLightShaftsEnabled() && XMVectorGetX(XMVector3Dot(wiRenderer::GetSunPosition(), wiRenderer::getCamera()->GetAt())) > 0) { - wiRenderer::GetDevice()->EventBegin(L"Light Shafts", threadID); + wiRenderer::GetDevice()->EventBegin("Light Shafts", threadID); wiRenderer::GetDevice()->UnBindResources(TEXSLOT_ONDEMAND0, TEXSLOT_ONDEMAND_COUNT, threadID); rtSun[0].Activate(threadID, mainRT.depth); { wiRenderer::DrawSun(threadID); @@ -316,7 +335,7 @@ void Renderable3DComponent::RenderSecondaryScene(wiRenderTarget& mainRT, wiRende } rtSceneCopy.Activate(threadID, 0, 0, 0, 0); { - wiRenderer::GetDevice()->EventBegin(L"Refraction Target"); + wiRenderer::GetDevice()->EventBegin("Refraction Target"); fx.blendFlag = BLENDMODE_OPAQUE; fx.quality = QUALITY_NEAREST; fx.presentFullScreen = true; @@ -341,7 +360,7 @@ void Renderable3DComponent::RenderSecondaryScene(wiRenderTarget& mainRT, wiRende wiRenderer::DrawVolumeLights(wiRenderer::getCamera(), threadID); } - wiRenderer::GetDevice()->EventBegin(L"Contribute Emitters"); + wiRenderer::GetDevice()->EventBegin("Contribute Emitters"); fx.presentFullScreen = true; fx.blendFlag = BLENDMODE_ALPHA; if (getEmittedParticlesEnabled()) { @@ -354,7 +373,7 @@ void Renderable3DComponent::RenderSecondaryScene(wiRenderTarget& mainRT, wiRende } wiRenderer::GetDevice()->EventEnd(); - wiRenderer::GetDevice()->EventBegin(L"Contribute LightShafts"); + wiRenderer::GetDevice()->EventBegin("Contribute LightShafts"); if (getLightShaftsEnabled()) { wiImage::Draw(rtSun.back().GetTexture(), fx, threadID); } @@ -366,7 +385,7 @@ void Renderable3DComponent::RenderSecondaryScene(wiRenderTarget& mainRT, wiRende wiRenderer::DrawLensFlares(threadID); } - wiRenderer::GetDevice()->EventBegin(L"Debug Geometry", threadID); + wiRenderer::GetDevice()->EventBegin("Debug Geometry", threadID); wiRenderer::DrawDebugGridHelper(wiRenderer::getCamera(), threadID); wiRenderer::DrawDebugEnvProbes(wiRenderer::getCamera(), threadID); wiRenderer::DrawDebugBoneLines(wiRenderer::getCamera(), threadID); @@ -375,11 +394,17 @@ void Renderable3DComponent::RenderSecondaryScene(wiRenderTarget& mainRT, wiRende wiRenderer::DrawTranslators(wiRenderer::getCamera(), threadID); wiRenderer::GetDevice()->EventEnd(); } + + wiProfiler::GetInstance().EndRange(); // Secondary Scene } void Renderable3DComponent::RenderTransparentScene(wiRenderTarget& refractionRT, GRAPHICSTHREAD threadID) { + wiProfiler::GetInstance().BeginRange("Transparent Scene", wiProfiler::DOMAIN_GPU, threadID); + wiRenderer::DrawWorldTransparent(wiRenderer::getCamera(), SHADERTYPE_FORWARD, refractionRT.GetTexture(), rtReflection.GetTexture() , rtWaterRipple.GetTexture(), threadID, false); + + wiProfiler::GetInstance().EndRange(); // Transparent Scene } void Renderable3DComponent::RenderComposition(wiRenderTarget& shadedSceneRT, wiRenderTarget& mainRT, GRAPHICSTHREAD threadID) { @@ -388,12 +413,13 @@ void Renderable3DComponent::RenderComposition(wiRenderTarget& shadedSceneRT, wiR // We don't need the following for stereograms... return; } + wiProfiler::GetInstance().BeginRange("Post Processing 1", wiProfiler::DOMAIN_GPU, threadID); wiImageEffects fx((float)wiRenderer::GetDevice()->GetScreenWidth(), (float)wiRenderer::GetDevice()->GetScreenHeight()); if (getBloomEnabled()) { - wiRenderer::GetDevice()->EventBegin(L"Bloom", threadID); + wiRenderer::GetDevice()->EventBegin("Bloom", threadID); fx.process.clear(); fx.presentFullScreen = false; rtBloom[0].Activate(threadID); // separate bright parts @@ -437,7 +463,7 @@ void Renderable3DComponent::RenderComposition(wiRenderTarget& shadedSceneRT, wiR } if (getMotionBlurEnabled()) { - wiRenderer::GetDevice()->EventBegin(L"Motion Blur", threadID); + wiRenderer::GetDevice()->EventBegin("Motion Blur", threadID); rtMotionBlur.Activate(threadID); fx.process.setMotionBlur(true); fx.blendFlag = BLENDMODE_OPAQUE; @@ -448,7 +474,7 @@ void Renderable3DComponent::RenderComposition(wiRenderTarget& shadedSceneRT, wiR } - wiRenderer::GetDevice()->EventBegin(L"Tone Mapping", threadID); + wiRenderer::GetDevice()->EventBegin("Tone Mapping", threadID); fx.blendFlag = BLENDMODE_OPAQUE; rtFinal[0].Activate(threadID); fx.process.setToneMap(true); @@ -474,7 +500,7 @@ void Renderable3DComponent::RenderComposition(wiRenderTarget& shadedSceneRT, wiR if (getDepthOfFieldEnabled()) { - wiRenderer::GetDevice()->EventBegin(L"Depth Of Field", threadID); + wiRenderer::GetDevice()->EventBegin("Depth Of Field", threadID); // downsample + blur rtDof[0].Activate(threadID); fx.blur = getDepthOfFieldStrength(); @@ -501,7 +527,7 @@ void Renderable3DComponent::RenderComposition(wiRenderTarget& shadedSceneRT, wiR rtFinal[1].Activate(threadID); - wiRenderer::GetDevice()->EventBegin(L"FXAA", threadID); + wiRenderer::GetDevice()->EventBegin("FXAA", threadID); fx.process.setFXAA(getFXAAEnabled()); if (getDepthOfFieldEnabled()) wiImage::Draw(rtDof[2].GetTexture(), fx, threadID); @@ -509,8 +535,14 @@ void Renderable3DComponent::RenderComposition(wiRenderTarget& shadedSceneRT, wiR wiImage::Draw(rtFinal[0].GetTexture(), fx, threadID); fx.process.clear(); wiRenderer::GetDevice()->EventEnd(); + + + wiProfiler::GetInstance().EndRange(); // Post Processing 1 } -void Renderable3DComponent::RenderColorGradedComposition(){ +void Renderable3DComponent::RenderColorGradedComposition() +{ + wiProfiler::GetInstance().BeginRange("Post Processing 2", wiProfiler::DOMAIN_GPU, GRAPHICSTHREAD_IMMEDIATE); + wiImageEffects fx((float)wiRenderer::GetDevice()->GetScreenWidth(), (float)wiRenderer::GetDevice()->GetScreenHeight()); fx.blendFlag = BLENDMODE_OPAQUE; @@ -518,7 +550,7 @@ void Renderable3DComponent::RenderColorGradedComposition(){ if (getStereogramEnabled()) { - wiRenderer::GetDevice()->EventBegin(L"Stereogram"); + wiRenderer::GetDevice()->EventBegin("Stereogram"); fx.presentFullScreen = false; fx.process.clear(); fx.process.setStereogram(true); @@ -529,7 +561,7 @@ void Renderable3DComponent::RenderColorGradedComposition(){ if (getColorGradingEnabled()) { - wiRenderer::GetDevice()->EventBegin(L"Color Graded Composition"); + wiRenderer::GetDevice()->EventBegin("Color Graded Composition"); fx.quality = QUALITY_BILINEAR; if (wiRenderer::GetColorGrading() != nullptr){ fx.process.setColorGrade(true); @@ -543,12 +575,15 @@ void Renderable3DComponent::RenderColorGradedComposition(){ } else { - wiRenderer::GetDevice()->EventBegin(L"Composition"); + wiRenderer::GetDevice()->EventBegin("Composition"); fx.presentFullScreen = true; } wiImage::Draw(rtFinal[1].GetTexture(), fx); wiRenderer::GetDevice()->EventEnd(); + + + wiProfiler::GetInstance().EndRange(); // Post Processing 2 } diff --git a/WickedEngine/TiledForwardRenderableComponent.cpp b/WickedEngine/TiledForwardRenderableComponent.cpp index 4651b5dec..d4f510555 100644 --- a/WickedEngine/TiledForwardRenderableComponent.cpp +++ b/WickedEngine/TiledForwardRenderableComponent.cpp @@ -3,6 +3,7 @@ #include "wiImage.h" #include "wiImageEffects.h" #include "wiHelper.h" +#include "wiProfiler.h" using namespace wiGraphicsTypes; @@ -19,6 +20,8 @@ TiledForwardRenderableComponent::~TiledForwardRenderableComponent() void TiledForwardRenderableComponent::RenderScene(GRAPHICSTHREAD threadID) { + wiProfiler::GetInstance().BeginRange("Opaque Scene", wiProfiler::DOMAIN_GPU, threadID); + wiRenderer::UpdateCameraCB(wiRenderer::getCamera(), threadID); rtMain.Activate(threadID, 0, 0, 0, 0, true); // depth prepass @@ -53,10 +56,16 @@ void TiledForwardRenderableComponent::RenderScene(GRAPHICSTHREAD threadID) wiRenderer::DrawWorld(wiRenderer::getCamera(), getTessellationEnabled(), threadID, SHADERTYPE_TILEDFORWARD, rtReflection.GetTexture(), true); wiRenderer::DrawSky(threadID); } + + wiProfiler::GetInstance().EndRange(); // Opaque Scene } void TiledForwardRenderableComponent::RenderTransparentScene(wiRenderTarget& refractionRT, GRAPHICSTHREAD threadID) { + wiProfiler::GetInstance().BeginRange("Transparent Scene", wiProfiler::DOMAIN_GPU, threadID); + wiRenderer::DrawWorldTransparent(wiRenderer::getCamera(), SHADERTYPE_TILEDFORWARD, refractionRT.GetTexture(), rtReflection.GetTexture() , rtWaterRipple.GetTexture(), threadID, getHairParticleAlphaCompositionEnabled()); + + wiProfiler::GetInstance().EndRange(); // Transparent Scene } diff --git a/WickedEngine/WickedEngine_SHARED.vcxitems b/WickedEngine/WickedEngine_SHARED.vcxitems index 3dcdefb0f..42fd7492f 100644 --- a/WickedEngine/WickedEngine_SHARED.vcxitems +++ b/WickedEngine/WickedEngine_SHARED.vcxitems @@ -330,6 +330,7 @@ + @@ -666,6 +667,7 @@ + diff --git a/WickedEngine/WickedEngine_SHARED.vcxitems.filters b/WickedEngine/WickedEngine_SHARED.vcxitems.filters index bbfd2731e..76dd3f027 100644 --- a/WickedEngine/WickedEngine_SHARED.vcxitems.filters +++ b/WickedEngine/WickedEngine_SHARED.vcxitems.filters @@ -1086,6 +1086,9 @@ ENGINE\Helpers + + ENGINE\Helpers + @@ -1868,6 +1871,9 @@ ENGINE\Helpers + + ENGINE\Helpers + diff --git a/WickedEngine/wiEmittedParticle.cpp b/WickedEngine/wiEmittedParticle.cpp index 798c1cf5d..4a8b5162c 100644 --- a/WickedEngine/wiEmittedParticle.cpp +++ b/WickedEngine/wiEmittedParticle.cpp @@ -307,7 +307,7 @@ void wiEmittedParticle::Draw(GRAPHICSTHREAD threadID, int FLAG) if(!points.empty()) { GraphicsDevice* device = wiRenderer::GetDevice(); - device->EventBegin(L"EmittedParticle", threadID); + device->EventBegin("EmittedParticle", threadID); bool additive = (material->blendFlag==BLENDMODE_ADDITIVE || material->premultipliedTexture); diff --git a/WickedEngine/wiFont.cpp b/WickedEngine/wiFont.cpp index 1fa65521a..87d382a11 100644 --- a/WickedEngine/wiFont.cpp +++ b/WickedEngine/wiFont.cpp @@ -276,7 +276,7 @@ void wiFont::Draw(GRAPHICSTHREAD threadID, bool scissorTest) if(text.length()>0) { GraphicsDevice* device = wiRenderer::GetDevice(); - device->EventBegin(L"Font", threadID); + device->EventBegin("Font", threadID); device->BindPrimitiveTopology(PRIMITIVETOPOLOGY::TRIANGLELIST,threadID); device->BindVertexLayout(vertexLayout,threadID); diff --git a/WickedEngine/wiGUI.cpp b/WickedEngine/wiGUI.cpp index 76eeb44ca..9f51f9575 100644 --- a/WickedEngine/wiGUI.cpp +++ b/WickedEngine/wiGUI.cpp @@ -54,7 +54,7 @@ void wiGUI::Update() void wiGUI::Render() { - wiRenderer::GetDevice()->EventBegin(L"GUI"); + wiRenderer::GetDevice()->EventBegin("GUI"); for (auto&x : widgets) { if (x->container == nullptr) diff --git a/WickedEngine/wiGraphicsDescriptors.h b/WickedEngine/wiGraphicsDescriptors.h index 10d875835..b92b0a845 100644 --- a/WickedEngine/wiGraphicsDescriptors.h +++ b/WickedEngine/wiGraphicsDescriptors.h @@ -279,6 +279,8 @@ namespace wiGraphicsTypes { GPU_QUERY_TYPE_OCCLUSION, // how many samples passed depthstencil test? GPU_QUERY_TYPE_OCCLUSION_PREDICATE, // are there any samples that passed depthstencil test + GPU_QUERY_TYPE_TIMESTAMP, + GPU_QUERY_TYPE_TIMESTAMP_DISJOINT, }; // Flags //////////////////////////////////////////// diff --git a/WickedEngine/wiGraphicsDevice.h b/WickedEngine/wiGraphicsDevice.h index 44d53b09a..1eada192b 100644 --- a/WickedEngine/wiGraphicsDevice.h +++ b/WickedEngine/wiGraphicsDevice.h @@ -1,6 +1,7 @@ #ifndef _GRAPHICSDEVICE_H_ #define _GRAPHICSDEVICE_H_ +#include "CommonInclude.h" #include "wiThreadSafeManager.h" #include "wiEnums.h" #include "wiGraphicsDescriptors.h" @@ -142,9 +143,9 @@ namespace wiGraphicsTypes virtual HRESULT SaveTexturePNG(const string& fileName, Texture2D *pTexture, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) = 0; virtual HRESULT SaveTextureDDS(const string& fileName, Texture *pTexture, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) = 0; - virtual void EventBegin(const wchar_t* name, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) = 0; + virtual void EventBegin(const string& name, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) = 0; virtual void EventEnd(GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) = 0; - virtual void SetMarker(const wchar_t* name, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) = 0; + virtual void SetMarker(const string& name, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) = 0; }; } diff --git a/WickedEngine/wiGraphicsDevice_DX11.cpp b/WickedEngine/wiGraphicsDevice_DX11.cpp index 4f1dd6393..adc466bba 100644 --- a/WickedEngine/wiGraphicsDevice_DX11.cpp +++ b/WickedEngine/wiGraphicsDevice_DX11.cpp @@ -2179,6 +2179,14 @@ HRESULT GraphicsDevice_DX11::CreateQuery(const GPUQueryDesc *pDesc, GPUQuery *pQ { desc.Query = D3D11_QUERY_OCCLUSION; } + else if (pDesc->Type == GPU_QUERY_TYPE_TIMESTAMP) + { + desc.Query = D3D11_QUERY_TIMESTAMP; + } + else if (pDesc->Type == GPU_QUERY_TYPE_TIMESTAMP_DISJOINT) + { + desc.Query = D3D11_QUERY_TIMESTAMP_DISJOINT; + } HRESULT hr = E_FAIL; if (pQuery->desc.async_latency > 0) @@ -2652,6 +2660,17 @@ bool GraphicsDevice_DX11::QueryRead(GPUQuery *query, GRAPHICSTHREAD threadID) HRESULT hr = S_OK; switch (query->desc.Type) { + case GPU_QUERY_TYPE_TIMESTAMP: + hr = deviceContexts[threadID]->GetData(query->resource_DX11[_readQueryID], &query->result_timestamp, sizeof(query->result_timestamp), _flags); + break; + case GPU_QUERY_TYPE_TIMESTAMP_DISJOINT: + { + D3D11_QUERY_DATA_TIMESTAMP_DISJOINT _temp; + hr = deviceContexts[threadID]->GetData(query->resource_DX11[_readQueryID], &_temp, sizeof(_temp), _flags); + query->result_disjoint = _temp.Disjoint; + query->result_timestamp_frequency = _temp.Frequency; + } + break; case GPU_QUERY_TYPE_OCCLUSION: hr = deviceContexts[threadID]->GetData(query->resource_DX11[_readQueryID], &query->result_passed_sample_count, sizeof(query->result_passed_sample_count), _flags); query->result_passed = query->result_passed_sample_count != 0; @@ -2664,7 +2683,7 @@ bool GraphicsDevice_DX11::QueryRead(GPUQuery *query, GRAPHICSTHREAD threadID) query->active[_readQueryID] = false; - return SUCCEEDED(hr); + return hr != S_FALSE; } @@ -2718,17 +2737,17 @@ HRESULT GraphicsDevice_DX11::SaveTextureDDS(const string& fileName, Texture *pTe return E_FAIL; } -void GraphicsDevice_DX11::EventBegin(const wchar_t* name, GRAPHICSTHREAD threadID) +void GraphicsDevice_DX11::EventBegin(const string& name, GRAPHICSTHREAD threadID) { - userDefinedAnnotations[threadID]->BeginEvent(name); + userDefinedAnnotations[threadID]->BeginEvent(wstring(name.begin(), name.end()).c_str()); } void GraphicsDevice_DX11::EventEnd(GRAPHICSTHREAD threadID) { userDefinedAnnotations[threadID]->EndEvent(); } -void GraphicsDevice_DX11::SetMarker(const wchar_t* name, GRAPHICSTHREAD threadID) +void GraphicsDevice_DX11::SetMarker(const string& name, GRAPHICSTHREAD threadID) { - userDefinedAnnotations[threadID]->SetMarker(name); + userDefinedAnnotations[threadID]->SetMarker(wstring(name.begin(),name.end()).c_str()); } } diff --git a/WickedEngine/wiGraphicsDevice_DX11.h b/WickedEngine/wiGraphicsDevice_DX11.h index 740f29976..c5030e650 100644 --- a/WickedEngine/wiGraphicsDevice_DX11.h +++ b/WickedEngine/wiGraphicsDevice_DX11.h @@ -136,9 +136,9 @@ namespace wiGraphicsTypes virtual HRESULT SaveTexturePNG(const string& fileName, Texture2D *pTexture, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) override; virtual HRESULT SaveTextureDDS(const string& fileName, Texture *pTexture, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) override; - virtual void EventBegin(const wchar_t* name, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) override; + virtual void EventBegin(const string& name, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) override; virtual void EventEnd(GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) override; - virtual void SetMarker(const wchar_t* name, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) override; + virtual void SetMarker(const string& name, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) override; }; } diff --git a/WickedEngine/wiGraphicsResource.h b/WickedEngine/wiGraphicsResource.h index 79137bb2f..1eb1cc78a 100644 --- a/WickedEngine/wiGraphicsResource.h +++ b/WickedEngine/wiGraphicsResource.h @@ -278,6 +278,9 @@ namespace wiGraphicsTypes BOOL result_passed; UINT64 result_passed_sample_count; + UINT64 result_timestamp; + UINT64 result_timestamp_frequency; + BOOL result_disjoint; }; } diff --git a/WickedEngine/wiHairParticle.cpp b/WickedEngine/wiHairParticle.cpp index e51ae1667..fc4c9cfb5 100644 --- a/WickedEngine/wiHairParticle.cpp +++ b/WickedEngine/wiHairParticle.cpp @@ -371,7 +371,7 @@ void wiHairParticle::Draw(Camera* camera, SHADERTYPE shaderType, GRAPHICSTHREAD { GraphicsDevice* device = wiRenderer::GetDevice(); - device->EventBegin(L"HairParticle", threadID); + device->EventBegin("HairParticle", threadID); device->BindPrimitiveTopology(PRIMITIVETOPOLOGY::POINTLIST,threadID); diff --git a/WickedEngine/wiImage.cpp b/WickedEngine/wiImage.cpp index b0e2770de..d81780240 100644 --- a/WickedEngine/wiImage.cpp +++ b/WickedEngine/wiImage.cpp @@ -228,7 +228,7 @@ void wiImage::BindPersistentState(GRAPHICSTHREAD threadID) void wiImage::Draw(Texture2D* texture, const wiImageEffects& effects,GRAPHICSTHREAD threadID) { GraphicsDevice* device = wiRenderer::GetDevice(); - device->EventBegin(L"Image", threadID); + device->EventBegin("Image", threadID); bool fullScreenEffect = false; @@ -480,7 +480,7 @@ void wiImage::DrawDeferred(Texture2D* lightmap_diffuse, Texture2D* lightmap_spec { GraphicsDevice* device = wiRenderer::GetDevice(); - device->EventBegin(L"DeferredComposition", threadID); + device->EventBegin("DeferredComposition", threadID); device->BindPrimitiveTopology(PRIMITIVETOPOLOGY::TRIANGLELIST,threadID); device->BindRasterizerState(rasterizerState,threadID); diff --git a/WickedEngine/wiLensFlare.cpp b/WickedEngine/wiLensFlare.cpp index b1b67a0cd..f6bd7ff2a 100644 --- a/WickedEngine/wiLensFlare.cpp +++ b/WickedEngine/wiLensFlare.cpp @@ -34,7 +34,7 @@ void wiLensFlare::Draw(GRAPHICSTHREAD threadID, const XMVECTOR& lightPos, vector if(!rims.empty()) { GraphicsDevice* device = wiRenderer::GetDevice(); - device->EventBegin(L"LensFlare", threadID); + device->EventBegin("LensFlare", threadID); device->BindPrimitiveTopology(POINTLIST,threadID); device->BindVertexLayout(inputLayout,threadID); diff --git a/WickedEngine/wiProfiler.cpp b/WickedEngine/wiProfiler.cpp new file mode 100644 index 000000000..7a4d93b40 --- /dev/null +++ b/WickedEngine/wiProfiler.cpp @@ -0,0 +1,175 @@ +#include "wiProfiler.h" +#include "wiGraphicsDevice.h" +#include "wiRenderer.h" +#include "wiFont.h" + +using namespace wiGraphicsTypes; + +void wiProfiler::BeginFrame() +{ + if (!ENABLED) + return; + + wiRenderer::GetDevice()->QueryBegin(&disjoint, GRAPHICSTHREAD_IMMEDIATE); +} +void wiProfiler::EndFrame() +{ + if (!ENABLED) + return; + + wiRenderer::GetDevice()->QueryEnd(&disjoint, GRAPHICSTHREAD_IMMEDIATE); + while(!wiRenderer::GetDevice()->QueryRead(&disjoint, GRAPHICSTHREAD_IMMEDIATE)); + + assert(rangeStack.empty() && "There was a range which was not ended!"); + + if (disjoint.result_disjoint == FALSE) + { + for (auto& x : ranges) + { + x.second->time = 0; + switch (x.second->domain) + { + case wiProfiler::DOMAIN_CPU: + x.second->time = (float)abs(x.second->cpuEnd.elapsed() - x.second->cpuBegin.elapsed()); + break; + case wiProfiler::DOMAIN_GPU: + while (!wiRenderer::GetDevice()->QueryRead(&x.second->gpuBegin, GRAPHICSTHREAD_IMMEDIATE)); + while (!wiRenderer::GetDevice()->QueryRead(&x.second->gpuEnd, GRAPHICSTHREAD_IMMEDIATE)); + x.second->time = abs((float)(x.second->gpuEnd.result_timestamp - x.second->gpuBegin.result_timestamp) / disjoint.result_timestamp_frequency * 1000.0f); + break; + default: + assert(0); + break; + } + } + } +} + +void wiProfiler::BeginRange(const std::string& name, PROFILER_DOMAIN domain, GRAPHICSTHREAD threadID) +{ + if (!ENABLED) + return; + + if (ranges.find(name) == ranges.end()) + { + Range* range = new Range; + range->name = name; + range->domain = domain; + range->time = 0; + + switch (domain) + { + case wiProfiler::DOMAIN_CPU: + range->cpuBegin.Start(); + range->cpuEnd.Start(); + break; + case wiProfiler::DOMAIN_GPU: + { + GPUQueryDesc desc; + desc.async_latency = 5; + desc.MiscFlags = 0; + desc.Type = GPU_QUERY_TYPE_TIMESTAMP; + wiRenderer::GetDevice()->CreateQuery(&desc, &range->gpuBegin); + wiRenderer::GetDevice()->CreateQuery(&desc, &range->gpuEnd); + } + break; + default: + assert(0); + break; + } + + + ranges.insert(make_pair(name, range)); + } + + switch (domain) + { + case wiProfiler::DOMAIN_CPU: + ranges[name]->cpuBegin.record(); + break; + case wiProfiler::DOMAIN_GPU: + wiRenderer::GetDevice()->QueryEnd(&ranges[name]->gpuBegin, threadID); + break; + default: + assert(0); + break; + } + + rangeStack.push(name); +} +void wiProfiler::EndRange(GRAPHICSTHREAD threadID) +{ + if (!ENABLED) + return; + + assert(!rangeStack.empty() && "There is no range to end!"); + const string& top = rangeStack.top(); + + auto& it = ranges.find(top); + if (it != ranges.end()) + { + switch (it->second->domain) + { + case wiProfiler::DOMAIN_CPU: + it->second->cpuEnd.record(); + break; + case wiProfiler::DOMAIN_GPU: + wiRenderer::GetDevice()->QueryEnd(&it->second->gpuEnd, threadID); + break; + default: + assert(0); + break; + } + } + else + { + assert(0); + } + + rangeStack.pop(); +} + +void wiProfiler::DrawData(int x, int y, GRAPHICSTHREAD threadID) +{ + if (!ENABLED) + return; + + stringstream ss(""); + ss.precision(2); + ss << "Frame Profiler Ranges:" << endl << "----------------------------" << endl; + + for (int domain = DOMAIN_CPU; domain < DOMAIN_COUNT; ++domain) + { + for (auto& x : ranges) + { + if (x.second->domain == domain) + { + ss << x.first << ": " << fixed << x.second->time << " ms" << endl; + } + } + ss << endl; + } + + wiFont(ss.str(), wiFontProps(x, y, -1, WIFALIGN_LEFT, WIFALIGN_TOP)).Draw(threadID); +} + + +wiProfiler::wiProfiler() +{ + ranges.reserve(100); + + GPUQueryDesc desc; + desc.async_latency = 5; + desc.MiscFlags = 0; + desc.Type = GPU_QUERY_TYPE_TIMESTAMP_DISJOINT; + wiRenderer::GetDevice()->CreateQuery(&desc, &disjoint); + + ENABLED = true; +} +wiProfiler::~wiProfiler() +{ + for (auto& x : ranges) + { + SAFE_DELETE(x.second); + } +} diff --git a/WickedEngine/wiProfiler.h b/WickedEngine/wiProfiler.h new file mode 100644 index 000000000..c0cd516b8 --- /dev/null +++ b/WickedEngine/wiProfiler.h @@ -0,0 +1,55 @@ +#pragma once +#include +#include +#include + +#include "wiEnums.h" +#include "wiTimer.h" +#include "wiGraphicsResource.h" + +class wiProfiler +{ +public: + static wiProfiler& GetInstance() { static wiProfiler profiler; return profiler; } + + enum PROFILER_DOMAIN + { + DOMAIN_CPU, + DOMAIN_GPU, + DOMAIN_COUNT + }; + struct Range + { + PROFILER_DOMAIN domain; + std::string name; + float time; + + wiTimer cpuBegin, cpuEnd; + wiGraphicsTypes::GPUQuery gpuBegin, gpuEnd; + + Range() :time(0) {} + ~Range() {} + }; + + void BeginFrame(); + void EndFrame(); + void BeginRange(const std::string& name, PROFILER_DOMAIN domain, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE); + void EndRange(GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE); + + float GetRangeTime(const std::string& name) { return ranges[name]->time; } + const std::unordered_map& GetRanges() { return ranges; } + + // Renders a basic text of the Profiling results to the (x,y) screen coordinate + void DrawData(int x, int y, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE); + +private: + wiProfiler(); + ~wiProfiler(); + + std::unordered_map ranges; + std::stack rangeStack; + wiGraphicsTypes::GPUQuery disjoint; + + bool ENABLED; +}; + diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index 208ab911b..7d77c3045 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -25,6 +25,7 @@ #include "lightCullingCSInterop.h" #include "wiRectPacker.h" #include "wiBackLog.h" +#include "wiProfiler.h" using namespace wiGraphicsTypes; @@ -118,6 +119,7 @@ void wiRenderer::Present(function drawToScreen1,function drawToS *prevFrameCam = *cam; wiFrameRate::Frame(); + } @@ -1384,6 +1386,7 @@ void wiRenderer::Update() void wiRenderer::UpdatePerFrameData() { // update the space partitioning trees: + wiProfiler::GetInstance().BeginRange("SPTree Update", wiProfiler::DOMAIN_CPU); if (GetGameSpeed() > 0) { if (spTree != nullptr && spTree->root != nullptr) @@ -1405,8 +1408,10 @@ void wiRenderer::UpdatePerFrameData() } } } + wiProfiler::GetInstance().EndRange(); // SPTree Update // Perform culling and obtain closest reflector: + wiProfiler::GetInstance().BeginRange("SPTree Culling", wiProfiler::DOMAIN_CPU); { for (auto& x : frameCullings) { @@ -1539,6 +1544,8 @@ void wiRenderer::UpdatePerFrameData() } } } + wiProfiler::GetInstance().EndRange(); // SPTree Culling + refCam->Reflect(cam, waterPlane.getXMFLOAT4()); UpdateBoneLines(); @@ -1567,7 +1574,7 @@ void wiRenderer::UpdateRenderData(GRAPHICSTHREAD threadID) && mesh->streamoutBuffer.IsValid() && mesh->vertexBuffer.IsValid()) { #ifdef USE_GPU_SKINNING - GetDevice()->EventBegin(L"Skinning", threadID); + GetDevice()->EventBegin("Skinning", threadID); if (!streamOutSetUp) { @@ -1792,7 +1799,7 @@ void wiRenderer::OcclusionCulling_Render(GRAPHICSTHREAD threadID) if (!culledRenderer.empty()) { - GetDevice()->EventBegin(L"Occlusion Culling Render"); + GetDevice()->EventBegin("Occlusion Culling Render"); GetDevice()->BindRasterizerState(rasterizers[RSTYPE_OCCLUDEE], threadID); GetDevice()->BindBlendState(blendStates[BSTYPE_COLORWRITEDISABLE], threadID); @@ -1852,12 +1859,14 @@ void wiRenderer::OcclusionCulling_Read() return; } + wiProfiler::GetInstance().BeginRange("Occlusion Culling Read", wiProfiler::DOMAIN_CPU); + const FrameCulling& culling = frameCullings[getCamera()]; const CulledCollection& culledRenderer = culling.culledRenderer; if (!culledRenderer.empty()) { - GetDevice()->EventBegin(L"Occlusion Culling Read"); + GetDevice()->EventBegin("Occlusion Culling Read"); for (CulledCollection::const_iterator iter = culledRenderer.begin(); iter != culledRenderer.end(); ++iter) { @@ -1878,6 +1887,8 @@ void wiRenderer::OcclusionCulling_Read() GetDevice()->EventEnd(); } + + wiProfiler::GetInstance().EndRange(); // Occlusion Culling Read } void wiRenderer::UpdateImages() { @@ -1926,7 +1937,7 @@ void wiRenderer::ManageWaterRipples(){ } void wiRenderer::DrawWaterRipples(GRAPHICSTHREAD threadID) { - GetDevice()->EventBegin(L"Water Ripples"); + GetDevice()->EventBegin("Water Ripples"); for(wiSprite* i:waterRipples){ i->DrawNormal(threadID); } @@ -1978,7 +1989,7 @@ void wiRenderer::DrawDebugSpheres(Camera* camera, GRAPHICSTHREAD threadID) void wiRenderer::DrawDebugBoneLines(Camera* camera, GRAPHICSTHREAD threadID) { if(debugBoneLines){ - GetDevice()->EventBegin(L"DebugBoneLines", threadID); + GetDevice()->EventBegin("DebugBoneLines", threadID); GetDevice()->BindPrimitiveTopology(LINELIST,threadID); GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_LINE],threadID); @@ -2010,7 +2021,7 @@ void wiRenderer::DrawDebugLines(Camera* camera, GRAPHICSTHREAD threadID) if (linesTemp.empty()) return; - GetDevice()->EventBegin(L"DebugLines", threadID); + GetDevice()->EventBegin("DebugLines", threadID); GetDevice()->BindPrimitiveTopology(LINELIST, threadID); GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_LINE], threadID); @@ -2043,7 +2054,7 @@ void wiRenderer::DrawDebugLines(Camera* camera, GRAPHICSTHREAD threadID) void wiRenderer::DrawDebugBoxes(Camera* camera, GRAPHICSTHREAD threadID) { if(debugPartitionTree || !renderableBoxes.empty()){ - GetDevice()->EventBegin(L"DebugBoxes", threadID); + GetDevice()->EventBegin("DebugBoxes", threadID); GetDevice()->BindPrimitiveTopology(LINELIST,threadID); GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_LINE],threadID); @@ -2088,7 +2099,7 @@ void wiRenderer::DrawDebugBoxes(Camera* camera, GRAPHICSTHREAD threadID) void wiRenderer::DrawTranslators(Camera* camera, GRAPHICSTHREAD threadID) { if(!renderableTranslators.empty()){ - GetDevice()->EventBegin(L"Translators", threadID); + GetDevice()->EventBegin("Translators", threadID); GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_LINE],threadID); @@ -2180,7 +2191,7 @@ void wiRenderer::DrawTranslators(Camera* camera, GRAPHICSTHREAD threadID) void wiRenderer::DrawDebugEnvProbes(Camera* camera, GRAPHICSTHREAD threadID) { if (debugEnvProbes && !GetScene().environmentProbes.empty()) { - GetDevice()->EventBegin(L"Debug EnvProbes", threadID); + GetDevice()->EventBegin("Debug EnvProbes", threadID); GetDevice()->BindPrimitiveTopology(TRIANGLELIST, threadID); GetDevice()->BindRasterizerState(rasterizers[RSTYPE_FRONT], threadID); @@ -2215,7 +2226,7 @@ void wiRenderer::DrawDebugEnvProbes(Camera* camera, GRAPHICSTHREAD threadID) void wiRenderer::DrawDebugGridHelper(Camera* camera, GRAPHICSTHREAD threadID) { if(gridHelper){ - GetDevice()->EventBegin(L"GridHelper", threadID); + GetDevice()->EventBegin("GridHelper", threadID); GetDevice()->BindPrimitiveTopology(LINELIST,threadID); GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_LINE],threadID); @@ -2312,7 +2323,7 @@ void wiRenderer::DrawTrails(GRAPHICSTHREAD threadID, Texture2D* refracRes) return; } - GetDevice()->EventBegin(L"RibbonTrails", threadID); + GetDevice()->EventBegin("RibbonTrails", threadID); GetDevice()->BindPrimitiveTopology(TRIANGLESTRIP,threadID); GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_TRAIL],threadID); @@ -2435,7 +2446,7 @@ void wiRenderer::DrawLights(Camera* camera, GRAPHICSTHREAD threadID) const FrameCulling& culling = frameCullings[camera]; const CulledList& culledLights = culling.culledLights; - GetDevice()->EventBegin(L"Light Render", threadID); + GetDevice()->EventBegin("Light Render", threadID); GetDevice()->BindPrimitiveTopology(TRIANGLELIST,threadID); @@ -2567,7 +2578,7 @@ void wiRenderer::DrawVolumeLights(Camera* camera, GRAPHICSTHREAD threadID) if(!culledLights.empty()) { - GetDevice()->EventBegin(L"Light Volume Render", threadID); + GetDevice()->EventBegin("Light Volume Render", threadID); GetDevice()->BindPrimitiveTopology(TRIANGLELIST,threadID); GetDevice()->BindVertexLayout(nullptr); @@ -2802,7 +2813,7 @@ void wiRenderer::DrawForShadowMap(GRAPHICSTHREAD threadID) { if (GameSpeed) { - GetDevice()->EventBegin(L"ShadowMap Render", threadID); + GetDevice()->EventBegin("ShadowMap Render", threadID); const FrameCulling& culling = frameCullings[getCamera()]; const CulledList& culledLights = culling.culledLights; @@ -3210,7 +3221,7 @@ void wiRenderer::RenderMeshes(const XMFLOAT3& eye, const CulledCollection& culle { if (!culledRenderer.empty()) { - GetDevice()->EventBegin(L"RenderMeshes", threadID); + GetDevice()->EventBegin("RenderMeshes", threadID); tessellation = tessellation && GetDevice()->CheckCapability(GraphicsDevice::GRAPHICSDEVICE_CAPABILITY_TESSELLATION); @@ -3551,7 +3562,7 @@ void wiRenderer::DrawWorld(Camera* camera, bool tessellation, GRAPHICSTHREAD thr const FrameCulling& culling = frameCullings[camera]; const CulledCollection& culledRenderer = culling.culledRenderer_opaque; - GetDevice()->EventBegin(L"DrawWorld"); + GetDevice()->EventBegin("DrawWorld"); if (shaderType == SHADERTYPE_TILEDFORWARD) { @@ -3593,7 +3604,7 @@ void wiRenderer::DrawWorldTransparent(Camera* camera, SHADERTYPE shaderType, Tex const FrameCulling& culling = frameCullings[camera]; const CulledCollection& culledRenderer = culling.culledRenderer_transparent; - GetDevice()->EventBegin(L"DrawWorldTransparent"); + GetDevice()->EventBegin("DrawWorldTransparent"); if (shaderType == SHADERTYPE_TILEDFORWARD) { @@ -3633,7 +3644,7 @@ void wiRenderer::DrawSky(GRAPHICSTHREAD threadID) if (enviroMap == nullptr) return; - GetDevice()->EventBegin(L"DrawSky", threadID); + GetDevice()->EventBegin("DrawSky", threadID); GetDevice()->BindPrimitiveTopology(TRIANGLELIST,threadID); GetDevice()->BindRasterizerState(rasterizers[RSTYPE_BACK],threadID); @@ -3653,7 +3664,7 @@ void wiRenderer::DrawSky(GRAPHICSTHREAD threadID) } void wiRenderer::DrawSun(GRAPHICSTHREAD threadID) { - GetDevice()->EventBegin(L"DrawSun", threadID); + GetDevice()->EventBegin("DrawSun", threadID); GetDevice()->BindPrimitiveTopology(TRIANGLELIST, threadID); GetDevice()->BindRasterizerState(rasterizers[RSTYPE_BACK], threadID); @@ -3680,7 +3691,7 @@ void wiRenderer::DrawDecals(Camera* camera, GRAPHICSTHREAD threadID) if (model->decals.empty()) continue; - device->EventBegin(L"Decals", threadID); + device->EventBegin("Decals", threadID); if (!boundCB) { @@ -3734,7 +3745,7 @@ void wiRenderer::DrawDecals(Camera* camera, GRAPHICSTHREAD threadID) void wiRenderer::RefreshEnvProbes(GRAPHICSTHREAD threadID) { - GetDevice()->EventBegin(L"EnvironmentProbe Refresh"); + GetDevice()->EventBegin("EnvironmentProbe Refresh"); for (EnvironmentProbe* probe : GetScene().environmentProbes) { @@ -3967,7 +3978,7 @@ void wiRenderer::ComputeTiledLightCulling(GRAPHICSTHREAD threadID) // Perform the culling { - device->EventBegin(L"Light Culling", threadID); + device->EventBegin("Light Culling", threadID); device->UnBindResources(TEXSLOT_LIGHTGRID, SBSLOT_LIGHTINDEXLIST - TEXSLOT_LIGHTGRID + 1, threadID); @@ -3998,7 +4009,7 @@ void wiRenderer::ComputeTiledLightCulling(GRAPHICSTHREAD threadID) } void wiRenderer::ResolveMSAADepthBuffer(Texture2D* dst, Texture2D* src, GRAPHICSTHREAD threadID) { - GetDevice()->EventBegin(L"Resolve MSAA DepthBuffer"); + GetDevice()->EventBegin("Resolve MSAA DepthBuffer"); GetDevice()->BindResourceCS(src, TEXSLOT_ONDEMAND0, threadID); GetDevice()->BindUnorderedAccessResourceCS(dst, 0, threadID); diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index efcbc7de7..2bf879920 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -7,7 +7,7 @@ namespace wiVersion // minor features, major updates const int minor = 9; // minor bug fixes, alterations, refactors, updates - const int revision = 57; + const int revision = 58; long GetVersion() diff --git a/features.txt b/features.txt index 97dfaee30..abe9c88f0 100644 --- a/features.txt +++ b/features.txt @@ -61,3 +61,4 @@ Occlusion culling with gpu queries Texture atlas packing Tiled decals Area lights: Sphere, Disc, Rectangle, Tube +Frame Profiler