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