Browse Source

Some renderer refactoring

Panagiotis Christopoulos Charitos 10 years ago
parent
commit
b81bfa03c0

+ 0 - 7
include/anki/renderer/Bloom.h

@@ -81,11 +81,6 @@ private:
 
 
 	TexturePtr m_hblurRt; ///< pass0Fai with the horizontal blur FAI
 	TexturePtr m_hblurRt; ///< pass0Fai with the horizontal blur FAI
 	TexturePtr m_vblurRt; ///< The final FAI
 	TexturePtr m_vblurRt; ///< The final FAI
-	/// When a parameter changed by the setters
-	Timestamp m_parameterUpdateTimestamp = 0;
-	/// When the commonUbo got updated
-	Timestamp m_commonUboUpdateTimestamp = 0;
-	BufferPtr m_commonBuff;
 
 
 	ResourceGroupPtr m_firstDescrGroup;
 	ResourceGroupPtr m_firstDescrGroup;
 	ResourceGroupPtr m_hDescrGroup;
 	ResourceGroupPtr m_hDescrGroup;
@@ -93,8 +88,6 @@ private:
 
 
 	ANKI_USE_RESULT Error initFb(FramebufferPtr& fb, TexturePtr& rt);
 	ANKI_USE_RESULT Error initFb(FramebufferPtr& fb, TexturePtr& rt);
 	ANKI_USE_RESULT Error initInternal(const ConfigSet& initializer);
 	ANKI_USE_RESULT Error initInternal(const ConfigSet& initializer);
-
-	void updateDefaultBlock(CommandBufferPtr& jobs);
 };
 };
 
 
 /// @}
 /// @}

+ 0 - 2
include/anki/renderer/Is.h

@@ -99,8 +99,6 @@ anki_internal:
 	}
 	}
 
 
 private:
 private:
-	U32 m_currentFrame = 0; ///< Cache value.
-
 	/// The IS render target
 	/// The IS render target
 	TexturePtr m_rt;
 	TexturePtr m_rt;
 
 

+ 2 - 2
include/anki/renderer/MainRenderer.h

@@ -6,8 +6,8 @@
 #pragma once
 #pragma once
 
 
 #include <anki/renderer/Common.h>
 #include <anki/renderer/Common.h>
-#include <anki/core/Timestamp.h>
 #include <anki/resource/Forward.h>
 #include <anki/resource/Forward.h>
+#include <anki/core/Timestamp.h>
 
 
 namespace anki
 namespace anki
 {
 {
@@ -35,7 +35,7 @@ public:
 		AllocAlignedCallback allocCb,
 		AllocAlignedCallback allocCb,
 		void* allocCbUserData,
 		void* allocCbUserData,
 		const ConfigSet& config,
 		const ConfigSet& config,
-		const Timestamp* globalTimestamp);
+		Timestamp* globTimestamp);
 
 
 	ANKI_USE_RESULT Error render(SceneGraph& scene);
 	ANKI_USE_RESULT Error render(SceneGraph& scene);
 
 

+ 15 - 29
include/anki/renderer/Renderer.h

@@ -111,7 +111,7 @@ public:
 		HeapAllocator<U8> alloc,
 		HeapAllocator<U8> alloc,
 		StackAllocator<U8> frameAlloc,
 		StackAllocator<U8> frameAlloc,
 		const ConfigSet& config,
 		const ConfigSet& config,
-		const Timestamp* globalTimestamp);
+		Timestamp* globTimestamp);
 
 
 	/// Set the output of the renderer before calling #render.
 	/// Set the output of the renderer before calling #render.
 	void setOutputFramebuffer(FramebufferPtr outputFb, U32 width, U32 height)
 	void setOutputFramebuffer(FramebufferPtr outputFb, U32 width, U32 height)
@@ -138,9 +138,9 @@ anki_internal:
 		}
 		}
 	}
 	}
 
 
-	U32 getFramesCount() const
+	U64 getFrameCount() const
 	{
 	{
-		return m_framesNum;
+		return m_frameCount;
 	}
 	}
 
 
 	const FrustumComponent& getActiveFrustumComponent() const
 	const FrustumComponent& getActiveFrustumComponent() const
@@ -165,16 +165,6 @@ anki_internal:
 		return m_sceneDrawer;
 		return m_sceneDrawer;
 	}
 	}
 
 
-	Timestamp getProjectionParametersUpdateTimestamp() const
-	{
-		return m_projectionParamsUpdateTimestamp;
-	}
-
-	const Vec4& getProjectionParameters() const
-	{
-		return m_projectionParams;
-	}
-
 	U getSamples() const
 	U getSamples() const
 	{
 	{
 		return m_samples;
 		return m_samples;
@@ -287,26 +277,33 @@ anki_internal:
 		return *m_threadpool;
 		return *m_threadpool;
 	}
 	}
 
 
+	const DynamicBufferToken& getCommonUniformsDynamicBufferToken() const
+	{
+		return m_commonUniformsToken;
+	}
+
 	Timestamp getGlobalTimestamp() const
 	Timestamp getGlobalTimestamp() const
 	{
 	{
-		return *m_globalTimestamp;
+		return *m_globTimestamp;
 	}
 	}
 
 
-	const Timestamp* getGlobalTimestampPtr()
+	Timestamp* getGlobalTimestampPtr()
 	{
 	{
-		return m_globalTimestamp;
+		return m_globTimestamp;
 	}
 	}
 
 
 private:
 private:
 	ThreadPool* m_threadpool;
 	ThreadPool* m_threadpool;
 	ResourceManager* m_resources;
 	ResourceManager* m_resources;
 	GrManager* m_gr;
 	GrManager* m_gr;
+	Timestamp* m_globTimestamp;
 	HeapAllocator<U8> m_alloc;
 	HeapAllocator<U8> m_alloc;
 	StackAllocator<U8> m_frameAlloc;
 	StackAllocator<U8> m_frameAlloc;
-	const Timestamp* m_globalTimestamp = nullptr;
 
 
 	Clusterer m_clusterer;
 	Clusterer m_clusterer;
 
 
+	DynamicBufferToken m_commonUniformsToken;
+
 	/// @name Rendering stages
 	/// @name Rendering stages
 	/// @{
 	/// @{
 	UniquePtr<Ir> m_ir;
 	UniquePtr<Ir> m_ir;
@@ -331,21 +328,10 @@ private:
 
 
 	ShaderResourcePtr m_drawQuadVert;
 	ShaderResourcePtr m_drawQuadVert;
 
 
-	/// @name Optimization vars
-	/// Used in other stages
-	/// @{
-
-	/// A vector that contains useful numbers for calculating the view space
-	/// position from the depth
-	Vec4 m_projectionParams = Vec4(0.0);
-
-	Timestamp m_projectionParamsUpdateTimestamp = 0;
-	/// @}
-
 	FrustumComponent* m_frc = nullptr; ///< Cache current frustum component.
 	FrustumComponent* m_frc = nullptr; ///< Cache current frustum component.
 	RenderableDrawer m_sceneDrawer;
 	RenderableDrawer m_sceneDrawer;
 
 
-	U m_framesNum; ///< Frame number
+	U64 m_frameCount; ///< Frame number
 
 
 	FramebufferPtr m_outputFb;
 	FramebufferPtr m_outputFb;
 	UVec2 m_outputFbSize;
 	UVec2 m_outputFbSize;

+ 0 - 3
include/anki/renderer/RenderingPass.h

@@ -8,7 +8,6 @@
 #include <anki/renderer/Common.h>
 #include <anki/renderer/Common.h>
 #include <anki/util/StdTypes.h>
 #include <anki/util/StdTypes.h>
 #include <anki/Gr.h>
 #include <anki/Gr.h>
-#include <anki/core/Timestamp.h>
 #include <anki/resource/ResourceManager.h>
 #include <anki/resource/ResourceManager.h>
 #include <anki/resource/ShaderResource.h>
 #include <anki/resource/ShaderResource.h>
 
 
@@ -47,8 +46,6 @@ anki_internal:
 	{
 	{
 	}
 	}
 
 
-	Timestamp getGlobalTimestamp() const;
-
 	HeapAllocator<U8> getAllocator() const;
 	HeapAllocator<U8> getAllocator() const;
 
 
 	StackAllocator<U8> getFrameAllocator() const;
 	StackAllocator<U8> getFrameAllocator() const;

+ 0 - 7
include/anki/renderer/Ssao.h

@@ -36,11 +36,6 @@ anki_internal:
 		return m_vblurRt;
 		return m_vblurRt;
 	}
 	}
 
 
-	BufferPtr& getUniformBuffer()
-	{
-		return m_uniformsBuff;
-	}
-
 private:
 private:
 	U32 m_width, m_height; ///< Blur passes size
 	U32 m_width, m_height; ///< Blur passes size
 	U8 m_blurringIterationsCount;
 	U8 m_blurringIterationsCount;
@@ -57,8 +52,6 @@ private:
 	PipelinePtr m_hblurPpline;
 	PipelinePtr m_hblurPpline;
 	PipelinePtr m_vblurPpline;
 	PipelinePtr m_vblurPpline;
 
 
-	Timestamp m_commonUboUpdateTimestamp = 0;
-	BufferPtr m_uniformsBuff;
 	TexturePtr m_noiseTex;
 	TexturePtr m_noiseTex;
 
 
 	ResourceGroupPtr m_rcFirst;
 	ResourceGroupPtr m_rcFirst;

+ 22 - 0
shaders/RendererCommonUniforms.glsl

@@ -0,0 +1,22 @@
+// Copyright (C) 2009-2016, Panagiotis Christopoulos Charitos.
+// All rights reserved.
+// Code licensed under the BSD License.
+// http://www.anki3d.org/LICENSE
+
+#ifndef ANKI_SHADERS_RENDERER_COMMON_UNIFORMS_GLSL
+#define ANKI_SHADERS_RENDERER_COMMON_UNIFORMS_GLSL
+
+#include "shaders/Common.glsl"
+
+struct RendererCommonUniforms
+{
+	// Projection params
+	vec4 projectionParams;
+
+	// x: near, y: far, zw: depth linearization coefficients
+	vec4 nearFarLinearizeDepth;
+
+	mat4 projectionMatrix;
+};
+
+#endif

+ 2 - 9
shaders/Ssao.frag.glsl

@@ -7,6 +7,7 @@
 #include "shaders/Common.glsl"
 #include "shaders/Common.glsl"
 #include "shaders/Pack.glsl"
 #include "shaders/Pack.glsl"
 #include "shaders/LinearDepth.glsl"
 #include "shaders/LinearDepth.glsl"
+#include "shaders/RendererCommonUniforms.glsl"
 
 
 const vec3 KERNEL[KERNEL_SIZE] = KERNEL_ARRAY; // This will be appended in C++
 const vec3 KERNEL[KERNEL_SIZE] = KERNEL_ARRAY; // This will be appended in C++
 
 
@@ -23,17 +24,9 @@ layout(location = 0) in vec2 in_texCoords;
 
 
 layout(location = 0) out float out_color;
 layout(location = 0) out float out_color;
 
 
-struct Uniforms
-{
-	vec4 projectionParams;
-
-	/// The projection matrix
-	mat4 projectionMatrix;
-};
-
 layout(UBO_BINDING(0, 0), std140, row_major) uniform _blk
 layout(UBO_BINDING(0, 0), std140, row_major) uniform _blk
 {
 {
-	Uniforms u_uniforms;
+	RendererCommonUniforms u_uniforms;
 };
 };
 
 
 layout(TEX_BINDING(0, 0)) uniform sampler2D u_mMsDepthRt;
 layout(TEX_BINDING(0, 0)) uniform sampler2D u_mMsDepthRt;

+ 7 - 28
src/renderer/Bloom.cpp

@@ -73,13 +73,6 @@ Error Bloom::initInternal(const ConfigSet& config)
 	colorState.m_attachmentCount = 1;
 	colorState.m_attachmentCount = 1;
 	colorState.m_attachments[0].m_format = RT_PIXEL_FORMAT;
 	colorState.m_attachments[0].m_format = RT_PIXEL_FORMAT;
 
 
-	m_commonBuff = gl.newInstance<Buffer>(
-		sizeof(Vec4), BufferUsageBit::UNIFORM, BufferAccessBit::CLIENT_WRITE);
-
-	CommandBufferPtr cmdb = gl.newInstance<CommandBuffer>();
-	updateDefaultBlock(cmdb);
-	cmdb->flush();
-
 	StringAuto pps(getAllocator());
 	StringAuto pps(getAllocator());
 	pps.sprintf("#define ANKI_RENDERER_WIDTH %u\n"
 	pps.sprintf("#define ANKI_RENDERER_WIDTH %u\n"
 				"#define ANKI_RENDERER_HEIGHT %u\n",
 				"#define ANKI_RENDERER_HEIGHT %u\n",
@@ -126,7 +119,7 @@ Error Bloom::initInternal(const ConfigSet& config)
 	// Set descriptors
 	// Set descriptors
 	ResourceGroupInitializer descInit;
 	ResourceGroupInitializer descInit;
 	descInit.m_textures[0].m_texture = m_r->getIs().getRt();
 	descInit.m_textures[0].m_texture = m_r->getIs().getRt();
-	descInit.m_uniformBuffers[0].m_buffer = m_commonBuff;
+	descInit.m_uniformBuffers[0].m_dynamic = true;
 	descInit.m_uniformBuffers[0].m_range = sizeof(Vec4);
 	descInit.m_uniformBuffers[0].m_range = sizeof(Vec4);
 	descInit.m_storageBuffers[0].m_buffer =
 	descInit.m_storageBuffers[0].m_buffer =
 		m_r->getPps().getTm().getAverageLuminanceBuffer();
 		m_r->getPps().getTm().getAverageLuminanceBuffer();
@@ -139,10 +132,6 @@ Error Bloom::initInternal(const ConfigSet& config)
 	descInit.m_textures[0].m_texture = m_hblurRt;
 	descInit.m_textures[0].m_texture = m_hblurRt;
 	m_vDescrGroup = gl.newInstance<ResourceGroup>(descInit);
 	m_vDescrGroup = gl.newInstance<ResourceGroup>(descInit);
 
 
-	// Set timestamps
-	m_parameterUpdateTimestamp = getGlobalTimestamp();
-	m_commonUboUpdateTimestamp = getGlobalTimestamp();
-
 	getGrManager().finish();
 	getGrManager().finish();
 	return ErrorCode::NONE;
 	return ErrorCode::NONE;
 }
 }
@@ -172,13 +161,13 @@ void Bloom::run(CommandBufferPtr& cmdb)
 	cmdb->setViewport(0, 0, m_width, m_height);
 	cmdb->setViewport(0, 0, m_width, m_height);
 	cmdb->bindPipeline(m_tonePpline);
 	cmdb->bindPipeline(m_tonePpline);
 
 
-	if(m_parameterUpdateTimestamp > m_commonUboUpdateTimestamp)
-	{
-		updateDefaultBlock(cmdb);
-		m_commonUboUpdateTimestamp = getGlobalTimestamp();
-	}
+	DynamicBufferInfo dyn;
+	Vec4* uniforms = static_cast<Vec4*>(
+		getGrManager().allocateFrameHostVisibleMemory(
+		sizeof(Vec4), BufferUsage::UNIFORM, dyn.m_uniformBuffers[0]));
+	*uniforms = Vec4(m_threshold, m_scale, 0.0, 0.0);
 
 
-	cmdb->bindResourceGroup(m_firstDescrGroup, 0, nullptr);
+	cmdb->bindResourceGroup(m_firstDescrGroup, 0, &dyn);
 
 
 	m_r->drawQuad(cmdb);
 	m_r->drawQuad(cmdb);
 
 
@@ -199,14 +188,4 @@ void Bloom::run(CommandBufferPtr& cmdb)
 	}
 	}
 }
 }
 
 
-//==============================================================================
-void Bloom::updateDefaultBlock(CommandBufferPtr& cmdb)
-{
-	DynamicBufferToken token;
-	void* uniforms = getGrManager().allocateFrameHostVisibleMemory(
-		sizeof(Vec4), BufferUsage::TRANSFER, token);
-	cmdb->writeBuffer(m_commonBuff, 0, token);
-	*static_cast<Vec4*>(uniforms) = Vec4(m_threshold, m_scale, 0.0, 0.0);
-}
-
 } // end namespace anki
 } // end namespace anki

+ 3 - 3
src/renderer/Ir.cpp

@@ -674,7 +674,7 @@ void Ir::findCacheEntry(SceneNode& node, U& entry, Bool& render)
 	if(canditate)
 	if(canditate)
 	{
 	{
 		// Update timestamp
 		// Update timestamp
-		canditate->m_timestamp = getGlobalTimestamp();
+		canditate->m_timestamp = m_r->getFrameCount();
 		it = canditate;
 		it = canditate;
 		render = false;
 		render = false;
 	}
 	}
@@ -682,7 +682,7 @@ void Ir::findCacheEntry(SceneNode& node, U& entry, Bool& render)
 	{
 	{
 		ANKI_ASSERT(empty->m_node == nullptr);
 		ANKI_ASSERT(empty->m_node == nullptr);
 		empty->m_node = &node;
 		empty->m_node = &node;
-		empty->m_timestamp = getGlobalTimestamp();
+		empty->m_timestamp = m_r->getFrameCount();
 
 
 		it = empty;
 		it = empty;
 		render = true;
 		render = true;
@@ -690,7 +690,7 @@ void Ir::findCacheEntry(SceneNode& node, U& entry, Bool& render)
 	else if(kick)
 	else if(kick)
 	{
 	{
 		kick->m_node = &node;
 		kick->m_node = &node;
-		kick->m_timestamp = getGlobalTimestamp();
+		kick->m_timestamp = m_r->getFrameCount();
 
 
 		it = kick;
 		it = kick;
 		render = true;
 		render = true;

+ 1 - 3
src/renderer/Is.cpp

@@ -345,8 +345,6 @@ Error Is::lightPass(CommandBufferPtr& cmdb)
 	m_frc = &m_r->getActiveFrustumComponent();
 	m_frc = &m_r->getActiveFrustumComponent();
 	VisibilityTestResults& vi = m_frc->getVisibilityTestResults();
 	VisibilityTestResults& vi = m_frc->getVisibilityTestResults();
 
 
-	m_currentFrame = getGlobalTimestamp() % MAX_FRAMES_IN_FLIGHT;
-
 	U clusterCount = m_r->getClusterCount();
 	U clusterCount = m_r->getClusterCount();
 
 
 	//
 	//
@@ -810,7 +808,7 @@ void Is::updateCommonBlock(CommandBufferPtr& cmdb, const FrustumComponent& fr)
 			m_commonVarsToken));
 			m_commonVarsToken));
 
 
 	// Start writing
 	// Start writing
-	blk->m_projectionParams = m_r->getProjectionParameters();
+	blk->m_projectionParams = fr.getProjectionParameters();
 	blk->m_sceneAmbientColor = m_ambientColor;
 	blk->m_sceneAmbientColor = m_ambientColor;
 	blk->m_viewMat = fr.getViewMatrix().getTransposed();
 	blk->m_viewMat = fr.getViewMatrix().getTransposed();
 	blk->m_nearFarClustererMagicPad1 = Vec4(fr.getFrustum().getNear(),
 	blk->m_nearFarClustererMagicPad1 = Vec4(fr.getFrustum().getNear(),

+ 2 - 2
src/renderer/MainRenderer.cpp

@@ -41,7 +41,7 @@ Error MainRenderer::create(ThreadPool* threadpool,
 	AllocAlignedCallback allocCb,
 	AllocAlignedCallback allocCb,
 	void* allocCbUserData,
 	void* allocCbUserData,
 	const ConfigSet& config,
 	const ConfigSet& config,
-	const Timestamp* globalTimestamp)
+	Timestamp* globTimestamp)
 {
 {
 	ANKI_LOGI("Initializing main renderer");
 	ANKI_LOGI("Initializing main renderer");
 
 
@@ -73,7 +73,7 @@ Error MainRenderer::create(ThreadPool* threadpool,
 		m_alloc,
 		m_alloc,
 		m_frameAlloc,
 		m_frameAlloc,
 		config2,
 		config2,
-		globalTimestamp));
+		globTimestamp));
 
 
 	// Set the default preprocessor string
 	// Set the default preprocessor string
 	m_materialShaderSource.sprintf(m_alloc,
 	m_materialShaderSource.sprintf(m_alloc,

+ 2 - 2
src/renderer/Ms.cpp

@@ -37,7 +37,7 @@ Error Ms::createRt(U32 samples)
 		DEPTH_RT_PIXEL_FORMAT,
 		DEPTH_RT_PIXEL_FORMAT,
 		samples,
 		samples,
 		SamplingFilter::NEAREST,
 		SamplingFilter::NEAREST,
-		2,
+		3,
 		m_depthRt);
 		m_depthRt);
 
 
 	m_r->createRenderTarget(m_r->getWidth(),
 	m_r->createRenderTarget(m_r->getWidth(),
@@ -61,7 +61,7 @@ Error Ms::createRt(U32 samples)
 		RT_PIXEL_FORMATS[2],
 		RT_PIXEL_FORMATS[2],
 		samples,
 		samples,
 		SamplingFilter::NEAREST,
 		SamplingFilter::NEAREST,
-		2,
+		3,
 		m_rt2);
 		m_rt2);
 
 
 	AttachmentLoadOperation loadop = AttachmentLoadOperation::DONT_CARE;
 	AttachmentLoadOperation loadop = AttachmentLoadOperation::DONT_CARE;

+ 42 - 13
src/renderer/Renderer.cpp

@@ -22,6 +22,23 @@
 namespace anki
 namespace anki
 {
 {
 
 
+//==============================================================================
+// Misc                                                                        =
+//==============================================================================
+
+/// See shader for documentation
+class RendererCommonUniforms
+{
+public:
+	Vec4 m_projectionParams;
+	Vec4 m_nearFarLinearizeDepth;
+	Mat4 m_projectionMatrix;
+};
+
+//==============================================================================
+// Renderer                                                                    =
+//==============================================================================
+
 //==============================================================================
 //==============================================================================
 Renderer::Renderer()
 Renderer::Renderer()
 	: m_sceneDrawer(this)
 	: m_sceneDrawer(this)
@@ -40,9 +57,9 @@ Error Renderer::init(ThreadPool* threadpool,
 	HeapAllocator<U8> alloc,
 	HeapAllocator<U8> alloc,
 	StackAllocator<U8> frameAlloc,
 	StackAllocator<U8> frameAlloc,
 	const ConfigSet& config,
 	const ConfigSet& config,
-	const Timestamp* globalTimestamp)
+	Timestamp* globTimestamp)
 {
 {
-	m_globalTimestamp = globalTimestamp;
+	m_globTimestamp = globTimestamp;
 	m_threadpool = threadpool;
 	m_threadpool = threadpool;
 	m_resources = resources;
 	m_resources = resources;
 	m_gr = gl;
 	m_gr = gl;
@@ -69,7 +86,7 @@ Error Renderer::initInternal(const ConfigSet& config)
 	ANKI_LOGI("Initializing offscreen renderer. Size %ux%u", m_width, m_height);
 	ANKI_LOGI("Initializing offscreen renderer. Size %ux%u", m_width, m_height);
 
 
 	m_lodDistance = config.getNumber("lodDistance");
 	m_lodDistance = config.getNumber("lodDistance");
-	m_framesNum = 0;
+	m_frameCount = 0;
 	m_samples = config.getNumber("samples");
 	m_samples = config.getNumber("samples");
 	m_tileCountXY.x() = m_width / TILE_SIZE;
 	m_tileCountXY.x() = m_width / TILE_SIZE;
 	m_tileCountXY.y() = m_height / TILE_SIZE;
 	m_tileCountXY.y() = m_height / TILE_SIZE;
@@ -164,18 +181,29 @@ Error Renderer::render(
 	(void)err;
 	(void)err;
 	ANKI_ASSERT(m_frc && "Not enough frustum components");
 	ANKI_ASSERT(m_frc && "Not enough frustum components");
 
 
-	// Calc a few vars
-	//
-	if(m_frc->getProjectionParameters() != m_projectionParams)
-	{
-		m_projectionParams = m_frc->getProjectionParameters();
-		m_projectionParamsUpdateTimestamp = getGlobalTimestamp();
-	}
-
+	// Misc
 	ANKI_ASSERT(m_frc->getFrustum().getType() == Frustum::Type::PERSPECTIVE);
 	ANKI_ASSERT(m_frc->getFrustum().getType() == Frustum::Type::PERSPECTIVE);
 	m_clusterer.prepare(getThreadPool(), *m_frc);
 	m_clusterer.prepare(getThreadPool(), *m_frc);
 
 
-	// First part of reflections
+	// Write the common uniforms
+	RendererCommonUniforms* commonUniforms =
+		static_cast<RendererCommonUniforms*>(
+			getGrManager().allocateFrameHostVisibleMemory(
+				sizeof(*commonUniforms),
+				BufferUsage::UNIFORM,
+				m_commonUniformsToken));
+
+	commonUniforms->m_projectionParams = m_frc->getProjectionParameters();
+	commonUniforms->m_nearFarLinearizeDepth.x() = m_frc->getFrustum().getNear();
+	commonUniforms->m_nearFarLinearizeDepth.y() = m_frc->getFrustum().getFar();
+	computeLinearizeDepthOptimal(m_frc->getFrustum().getNear(),
+		m_frc->getFrustum().getFar(),
+		commonUniforms->m_nearFarLinearizeDepth.z(),
+		commonUniforms->m_nearFarLinearizeDepth.w());
+
+	commonUniforms->m_projectionMatrix = m_frc->getProjectionMatrix();
+
+	// Run stages
 	if(m_ir)
 	if(m_ir)
 	{
 	{
 		ANKI_CHECK(m_ir->run(cmdb));
 		ANKI_CHECK(m_ir->run(cmdb));
@@ -190,6 +218,7 @@ Error Renderer::render(
 	ANKI_CHECK(m_is->run(cmdb));
 	ANKI_CHECK(m_is->run(cmdb));
 
 
 	cmdb->generateMipmaps(m_ms->getDepthRt());
 	cmdb->generateMipmaps(m_ms->getDepthRt());
+	cmdb->generateMipmaps(m_ms->getRt2());
 
 
 	ANKI_CHECK(m_fs->run(cmdb));
 	ANKI_CHECK(m_fs->run(cmdb));
 	m_lf->run(cmdb);
 	m_lf->run(cmdb);
@@ -206,7 +235,7 @@ Error Renderer::render(
 		ANKI_CHECK(m_dbg->run(cmdb));
 		ANKI_CHECK(m_dbg->run(cmdb));
 	}
 	}
 
 
-	++m_framesNum;
+	++m_frameCount;
 
 
 	return ErrorCode::NONE;
 	return ErrorCode::NONE;
 }
 }

+ 0 - 6
src/renderer/RenderingPass.cpp

@@ -10,12 +10,6 @@
 namespace anki
 namespace anki
 {
 {
 
 
-//==============================================================================
-Timestamp RenderingPass::getGlobalTimestamp() const
-{
-	return m_r->getGlobalTimestamp();
-}
-
 //==============================================================================
 //==============================================================================
 GrManager& RenderingPass::getGrManager()
 GrManager& RenderingPass::getGrManager()
 {
 {

+ 1 - 1
src/renderer/Sm.cpp

@@ -194,7 +194,7 @@ Bool Sm::skip(SceneNode& light, ShadowmapBase& sm)
 	Bool shouldUpdate = lastUpdate >= sm.m_timestamp;
 	Bool shouldUpdate = lastUpdate >= sm.m_timestamp;
 	if(shouldUpdate)
 	if(shouldUpdate)
 	{
 	{
-		sm.m_timestamp = getGlobalTimestamp();
+		sm.m_timestamp = m_r->getGlobalTimestamp();
 		LightComponent& lcomp = light.getComponent<LightComponent>();
 		LightComponent& lcomp = light.getComponent<LightComponent>();
 		lcomp.setShadowMapIndex(sm.m_layerId);
 		lcomp.setShadowMapIndex(sm.m_layerId);
 	}
 	}

+ 4 - 34
src/renderer/Ssao.cpp

@@ -54,14 +54,6 @@ static void genNoise(Vec3* ANKI_RESTRICT arr, Vec3* ANKI_RESTRICT arrEnd)
 	} while(++arr != arrEnd);
 	} while(++arr != arrEnd);
 }
 }
 
 
-//==============================================================================
-class ShaderCommonUniforms
-{
-public:
-	Vec4 m_projectionParams;
-	Mat4 m_projectionMatrix;
-};
-
 //==============================================================================
 //==============================================================================
 // Ssao                                                                        =
 // Ssao                                                                        =
 //==============================================================================
 //==============================================================================
@@ -171,10 +163,6 @@ Error Ssao::initInternal(const ConfigSet& config)
 	//
 	//
 	// Shaders
 	// Shaders
 	//
 	//
-	m_uniformsBuff = gr.newInstance<Buffer>(sizeof(ShaderCommonUniforms),
-		BufferUsageBit::UNIFORM,
-		BufferAccessBit::CLIENT_WRITE);
-
 	ColorStateInfo colorState;
 	ColorStateInfo colorState;
 	colorState.m_attachmentCount = 1;
 	colorState.m_attachmentCount = 1;
 	colorState.m_attachments[0].m_format = RT_PIXEL_FORMAT;
 	colorState.m_attachments[0].m_format = RT_PIXEL_FORMAT;
@@ -246,7 +234,7 @@ Error Ssao::initInternal(const ConfigSet& config)
 
 
 	rcinit.m_textures[2].m_texture = m_noiseTex;
 	rcinit.m_textures[2].m_texture = m_noiseTex;
 
 
-	rcinit.m_uniformBuffers[0].m_buffer = m_uniformsBuff;
+	rcinit.m_uniformBuffers[0].m_dynamic = true;
 	m_rcFirst = gr.newInstance<ResourceGroup>(rcinit);
 	m_rcFirst = gr.newInstance<ResourceGroup>(rcinit);
 
 
 	rcinit = ResourceGroupInitializer();
 	rcinit = ResourceGroupInitializer();
@@ -284,28 +272,10 @@ void Ssao::run(CommandBufferPtr& cmdb)
 	cmdb->bindFramebuffer(m_vblurFb);
 	cmdb->bindFramebuffer(m_vblurFb);
 	cmdb->setViewport(0, 0, m_width, m_height);
 	cmdb->setViewport(0, 0, m_width, m_height);
 	cmdb->bindPipeline(m_ssaoPpline);
 	cmdb->bindPipeline(m_ssaoPpline);
-	cmdb->bindResourceGroup(m_rcFirst, 0, nullptr);
-
-	// Write common block
-	const FrustumComponent& camFr = m_r->getActiveFrustumComponent();
 
 
-	if(m_commonUboUpdateTimestamp
-			< m_r->getProjectionParametersUpdateTimestamp()
-		|| m_commonUboUpdateTimestamp < camFr.getTimestamp()
-		|| m_commonUboUpdateTimestamp == 0)
-	{
-		DynamicBufferToken token;
-		ShaderCommonUniforms* blk = static_cast<ShaderCommonUniforms*>(
-			getGrManager().allocateFrameHostVisibleMemory(
-				sizeof(ShaderCommonUniforms), BufferUsage::TRANSFER, token));
-
-		blk->m_projectionParams = m_r->getProjectionParameters();
-		blk->m_projectionMatrix = camFr.getProjectionMatrix();
-
-		cmdb->writeBuffer(m_uniformsBuff, 0, token);
-
-		m_commonUboUpdateTimestamp = getGlobalTimestamp();
-	}
+	DynamicBufferInfo dyn;
+	dyn.m_uniformBuffers[0] = m_r->getCommonUniformsDynamicBufferToken();
+	cmdb->bindResourceGroup(m_rcFirst, 0, &dyn);
 
 
 	// Draw
 	// Draw
 	m_r->drawQuad(cmdb);
 	m_r->drawQuad(cmdb);

+ 2 - 2
src/renderer/Tiler.cpp

@@ -87,7 +87,7 @@ Error Tiler::initInternal()
 void Tiler::run(CommandBufferPtr& cmd)
 void Tiler::run(CommandBufferPtr& cmd)
 {
 {
 	// Issue the min/max job
 	// Issue the min/max job
-	U pboIdx = getGlobalTimestamp() % m_outBuffers.getSize();
+	U pboIdx = m_r->getFrameCount() % m_outBuffers.getSize();
 
 
 	cmd->bindPipeline(m_ppline);
 	cmd->bindPipeline(m_ppline);
 	cmd->bindResourceGroup(m_rcGroups[pboIdx], 0, nullptr);
 	cmd->bindResourceGroup(m_rcGroups[pboIdx], 0, nullptr);
@@ -102,7 +102,7 @@ void Tiler::prepareForVisibilityTests(const SceneNode& node)
 	// Get the min max
 	// Get the min max
 	U size = m_r->getTileCount() * sizeof(Vec2);
 	U size = m_r->getTileCount() * sizeof(Vec2);
 
 
-	U buffIdx = max<U>(getGlobalTimestamp() % m_outBuffers.getSize(), 2u) - 2;
+	U buffIdx = max<U>(m_r->getFrameCount() % m_outBuffers.getSize(), 2u) - 2;
 	BufferPtr& buff = m_outBuffers[buffIdx];
 	BufferPtr& buff = m_outBuffers[buffIdx];
 	void* mappedMem = buff->map(0, size, BufferAccessBit::CLIENT_MAP_READ);
 	void* mappedMem = buff->map(0, size, BufferAccessBit::CLIENT_MAP_READ);
 
 

+ 1 - 1
testapp/Main.cpp

@@ -502,7 +502,7 @@ Error initSubsystems(int argc, char* argv[])
 	config.set("is.sm.poissonEnabled", true);
 	config.set("is.sm.poissonEnabled", true);
 	config.set("is.sm.resolution", 1024);
 	config.set("is.sm.resolution", 1024);
 	config.set("lf.maxFlares", 32);
 	config.set("lf.maxFlares", 32);
-	config.set("pps.enabled", false);
+	config.set("pps.enabled", true);
 	config.set("pps.bloom.enabled", true);
 	config.set("pps.bloom.enabled", true);
 	config.set("pps.bloom.renderingQuality", 0.5);
 	config.set("pps.bloom.renderingQuality", 0.5);
 	config.set("pps.bloom.blurringDist", 1.0);
 	config.set("pps.bloom.blurringDist", 1.0);