Browse Source

Starting moving renderer to true HDR

Panagiotis Christopoulos Charitos 10 years ago
parent
commit
45f193a438

+ 2 - 2
include/anki/gr/Enums.h

@@ -117,6 +117,7 @@ enum class ComponentFormat: U8
 
 
 	// Special
 	// Special
 	R10G10B10A2,
 	R10G10B10A2,
+	R11G11B10,
 
 
 	// Compressed
 	// Compressed
 	R8G8B8_S3TC, ///< DXT1
 	R8G8B8_S3TC, ///< DXT1
@@ -156,8 +157,7 @@ enum class SamplingFilter: U8
 {
 {
 	NEAREST,
 	NEAREST,
 	LINEAR,
 	LINEAR,
-	NEAREST_MIPMAP,
-	TRILINEAR,
+	BASE ///< Only for mipmaps
 };
 };
 
 
 enum class ShaderType: U8
 enum class ShaderType: U8

+ 2 - 1
include/anki/gr/TextureSamplerCommon.h

@@ -16,7 +16,8 @@ namespace anki {
 class SamplerInitializer
 class SamplerInitializer
 {
 {
 public:
 public:
-	SamplingFilter m_filterType = SamplingFilter::NEAREST;
+	SamplingFilter m_minMagFilter = SamplingFilter::NEAREST;
+	SamplingFilter m_mipmapFilter = SamplingFilter::BASE;
 	CompareOperation m_compareOperation = CompareOperation::ALWAYS;
 	CompareOperation m_compareOperation = CompareOperation::ALWAYS;
 	F32 m_minLod = -1000.0;
 	F32 m_minLod = -1000.0;
 	F32 m_maxLod = 1000.0;
 	F32 m_maxLod = 1000.0;

+ 3 - 0
include/anki/gr/gl/Common.h

@@ -12,6 +12,9 @@ namespace anki {
 
 
 /// Converter.
 /// Converter.
 GLenum convertCompareOperation(CompareOperation in);
 GLenum convertCompareOperation(CompareOperation in);
+
+void convertFilter(SamplingFilter minMagFilter, SamplingFilter mipFilter,
+	GLenum& minFilter, GLenum& magFilter);
 /// @}
 /// @}
 
 
 } // end namespace anki
 } // end namespace anki

+ 1 - 1
include/anki/gr/gl/RenderingThread.h

@@ -15,7 +15,7 @@ namespace anki {
 /// @addtogroup opengl
 /// @addtogroup opengl
 /// @{
 /// @{
 
 
-#define ANKI_DISABLE_GL_RENDERING_THREAD 0
+#define ANKI_DISABLE_GL_RENDERING_THREAD 1
 
 
 /// Command queue. It's essentialy a queue of command buffers waiting for 
 /// Command queue. It's essentialy a queue of command buffers waiting for 
 /// execution and a server
 /// execution and a server

+ 6 - 6
shaders/Final.frag.glsl

@@ -10,20 +10,20 @@
 #pragma anki include "shaders/Common.glsl"
 #pragma anki include "shaders/Common.glsl"
 #pragma anki include "shaders/Pack.glsl"
 #pragma anki include "shaders/Pack.glsl"
 
 
-layout(binding = 0) uniform sampler2D uRasterImage;
+layout(binding = 0) uniform sampler2D u_tex;
 
 
-layout(location = 0) in highp vec2 inTexCoords;
-layout(location = 0) out vec3 outFragColor;
+layout(location = 0) in highp vec2 in_texCoord;
+layout(location = 0) out vec3 out_color;
 
 
 void main()
 void main()
 {
 {
-	vec3 col = textureRt(uRasterImage, inTexCoords).rgb;
+	vec3 col = textureLod(u_tex, in_texCoord, 0.0).rgb;
 	
 	
-	/*vec2 depth = textureRt(uRasterImage, inTexCoords).rg;
+	/*vec2 depth = textureRt(u_tex, in_texCoord).rg;
 	float zNear = 0.2;
 	float zNear = 0.2;
 	float zFar = 200.0;
 	float zFar = 200.0;
 	depth = (2.0 * zNear) / (zFar + zNear - depth * (zFar - zNear));
 	depth = (2.0 * zNear) / (zFar + zNear - depth * (zFar - zNear));
 	vec3 col = vec3(depth.rg, 0.0);*/
 	vec3 col = vec3(depth.rg, 0.0);*/
 
 
-	outFragColor = col;
+	out_color = col;
 }
 }

+ 37 - 12
shaders/PpsHdr.frag.glsl

@@ -11,34 +11,59 @@ layout(binding = 0) uniform lowp sampler2D u_tex; ///< Its the IS RT
 
 
 layout(std140) uniform _blk
 layout(std140) uniform _blk
 {
 {
-	vec4 u_exposureComp;
+	vec4 u_exposurePad3;
 };
 };
+#define u_exposure u_exposurePad3.x
 
 
 layout(location = 0) in vec2 in_texCoord;
 layout(location = 0) in vec2 in_texCoord;
 layout(location = 0) out vec3 out_color;
 layout(location = 0) out vec3 out_color;
 
 
 // Consts
 // Consts
-const uint MIPMAP = 4;
-const uint WIDTH = ANKI_RENDERER_WIDTH / (2 << (MIPMAP - 1));
-const uint HEIGHT = ANKI_RENDERER_HEIGHT / (2 << (MIPMAP - 1));
-
-const vec2 TEXTURE_SIZE = vec2(WIDTH, HEIGHT);
-const vec2 SCALE = (TEXTURE_SIZE - 1.0) / TEXTURE_SIZE;
-const vec2 OFFSET = 1.0 / (2.0 * TEXTURE_SIZE);
+const uint MIPMAP = 6;
 
 
 const float BRIGHT_MAX = 5.0;
 const float BRIGHT_MAX = 5.0;
 
 
+vec3 readTexture(in uint mipmap)
+{
+	uint w = ANKI_RENDERER_WIDTH / (2 << (mipmap - 1));
+	uint h = ANKI_RENDERER_HEIGHT / (2 << (mipmap - 1));
+
+	vec2 textureSize = vec2(w, h);
+	vec2 scale = (textureSize - 1.0) / textureSize;
+	vec2 offset = 1.0 / (2.0 * textureSize);
+
+	vec2 texc = in_texCoord * scale + offset;
+
+	return textureLod(u_tex, texc, float(mipmap)).rgb;
+}
+
 void main()
 void main()
 {
 {
-	vec3 color = 
-		textureLod(u_tex, in_texCoord + OFFSET, float(MIPMAP)).rgb;
+	vec3 color = vec3(0.0);
+	
+	color += readTexture(MIPMAP);
+	color += readTexture(MIPMAP - 1);
+	color += readTexture(MIPMAP - 2);
+	
+	color /= 2.0;
 
 
 #if 1
 #if 1
 	float luminance = dot(vec3(0.30, 0.59, 0.11), color);
 	float luminance = dot(vec3(0.30, 0.59, 0.11), color);
-	float yd = u_exposureComp.x * (u_exposureComp.x / BRIGHT_MAX + 1.0) /
-		(u_exposureComp.x + 1.0) * luminance;
+	float yd = u_exposure * (u_exposure / BRIGHT_MAX + 1.0) /
+		(u_exposure + 1.0) * luminance;
 	color *= yd;
 	color *= yd;
 #endif
 #endif
 
 
 	out_color = color;
 	out_color = color;
+#if 0
+	float gr = max(color.x, max(color.y, color.z));
+	if(gr > 1.0)
+	{
+		out_color = vec3(1.0);
+	}
+	else
+	{
+		out_color = vec3(0.0, 0.0, color.x);
+	}
+#endif
 }
 }

+ 46 - 0
src/gr/gl/Common.cpp

@@ -42,4 +42,50 @@ GLenum convertCompareOperation(CompareOperation in)
 	return out;
 	return out;
 }
 }
 
 
+//==============================================================================
+void convertFilter(SamplingFilter minMagFilter, SamplingFilter mipFilter,
+	GLenum& minFilter, GLenum& magFilter)
+{
+	switch(minMagFilter)
+	{
+	case SamplingFilter::NEAREST:
+		magFilter = GL_NEAREST;
+		switch(mipFilter)
+		{
+		case SamplingFilter::NEAREST:
+			minFilter = GL_NEAREST_MIPMAP_NEAREST;
+			break;
+		case SamplingFilter::LINEAR:
+			minFilter = GL_NEAREST_MIPMAP_LINEAR;
+			break;
+		case SamplingFilter::BASE:
+			minFilter = GL_NEAREST;
+			break;
+		default:
+			ANKI_ASSERT(0);
+		}
+		break;
+	case SamplingFilter::LINEAR:
+		magFilter = GL_LINEAR;
+		switch(mipFilter)
+		{
+		case SamplingFilter::NEAREST:
+			minFilter = GL_LINEAR_MIPMAP_NEAREST;
+			break;
+		case SamplingFilter::LINEAR:
+			minFilter = GL_LINEAR_MIPMAP_LINEAR;
+			break;
+		case SamplingFilter::BASE:
+			minFilter = GL_LINEAR;
+			break;
+		default:
+			ANKI_ASSERT(0);
+		}
+		break;
+	default:
+		ANKI_ASSERT(0);
+		break;
+	}
+}
+
 } // end namespace anki
 } // end namespace anki

+ 1 - 1
src/gr/gl/FramebufferImpl.cpp

@@ -63,7 +63,7 @@ Error FramebufferImpl::create(Initializer& init)
 	GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
 	GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
 	if(status != GL_FRAMEBUFFER_COMPLETE)
 	if(status != GL_FRAMEBUFFER_COMPLETE)
 	{
 	{
-		ANKI_LOGE("FBO is incomplete");
+		ANKI_LOGE("FBO is incomplete: 0x%x", status);
 		destroy();
 		destroy();
 		return ErrorCode::FUNCTION_FAILED;
 		return ErrorCode::FUNCTION_FAILED;
 	}
 	}

+ 6 - 19
src/gr/gl/SamplerImpl.cpp

@@ -26,25 +26,12 @@ Error SamplerImpl::create(const SamplerInitializer& sinit)
 	}
 	}
 
 
 	// Set filtering type
 	// Set filtering type
-	switch(sinit.m_filterType)
-	{
-	case SamplingFilter::NEAREST:
-		glSamplerParameteri(m_glName, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-		glSamplerParameteri(m_glName, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-		break;
-	case SamplingFilter::LINEAR:
-		glSamplerParameteri(m_glName, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-		glSamplerParameteri(m_glName, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-		break;
-	case SamplingFilter::TRILINEAR:
-		glSamplerParameteri(m_glName, 
-			GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
-		glSamplerParameteri(m_glName, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-		break;
-	default:
-		ANKI_ASSERT(0);
-		break;
-	}
+	GLenum minFilter = GL_NONE;
+		GLenum magFilter = GL_NONE;
+	convertFilter(sinit.m_minMagFilter, sinit.m_mipmapFilter, minFilter, 
+		magFilter);
+	glSamplerParameteri(m_glName, GL_TEXTURE_MIN_FILTER, minFilter);
+	glSamplerParameteri(m_glName, GL_TEXTURE_MAG_FILTER, magFilter);
 
 
 #if ANKI_GL == ANKI_GL_DESKTOP
 #if ANKI_GL == ANKI_GL_DESKTOP
 	if(sinit.m_anisotropyLevel > 1)
 	if(sinit.m_anisotropyLevel > 1)

+ 37 - 24
src/gr/gl/TextureImpl.cpp

@@ -130,6 +130,36 @@ static void convertTextureInformation(
 			ANKI_ASSERT(0 && "TODO");
 			ANKI_ASSERT(0 && "TODO");
 		}
 		}
 		break;
 		break;
+	case ComponentFormat::R16G16B16:
+		if(pf.m_transform == TransformFormat::FLOAT)
+		{
+			format = GL_RGB;
+			internalFormat = GL_RGB16F;
+			type = GL_FLOAT;
+		}
+		else if(pf.m_transform == TransformFormat::UINT)
+		{
+			format = GL_RGB_INTEGER;
+			internalFormat = GL_RGB16UI;
+			type = GL_UNSIGNED_INT;
+		}
+		else
+		{
+			ANKI_ASSERT(0 && "TODO");
+		}
+		break;
+	case ComponentFormat::R11G11B10:
+		if(pf.m_transform == TransformFormat::FLOAT)
+		{
+			format = GL_RGB;
+			internalFormat = GL_R11F_G11F_B10F;
+			type = GL_FLOAT;
+		}
+		else
+		{
+			ANKI_ASSERT(0 && "TODO");
+		}
+		break;
 	case ComponentFormat::D24:
 	case ComponentFormat::D24:
 		format = GL_DEPTH_COMPONENT;
 		format = GL_DEPTH_COMPONENT;
 		internalFormat = GL_DEPTH_COMPONENT24;
 		internalFormat = GL_DEPTH_COMPONENT24;
@@ -376,30 +406,13 @@ void TextureImpl::create(const Initializer& init)
 		glTexParameteri(m_target, GL_TEXTURE_MAX_LEVEL, m_mipsCount - 1);
 		glTexParameteri(m_target, GL_TEXTURE_MAX_LEVEL, m_mipsCount - 1);
 
 
 		// Set filtering type
 		// Set filtering type
-		switch(sinit.m_filterType)
-		{
-		case SamplingFilter::NEAREST:
-			glTexParameteri(m_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-			glTexParameteri(m_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-			break;
-		case SamplingFilter::LINEAR:
-			glTexParameteri(m_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-			glTexParameteri(m_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-			break;
-		case SamplingFilter::NEAREST_MIPMAP:
-			glTexParameteri(
-				m_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
-			glTexParameteri(m_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-			break;
-		case SamplingFilter::TRILINEAR:
-			glTexParameteri(
-				m_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
-			glTexParameteri(m_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-			break;
-		default:
-			ANKI_ASSERT(0);
-			break;
-		}
+		GLenum minFilter = GL_NONE;
+		GLenum magFilter = GL_NONE;
+		convertFilter(sinit.m_minMagFilter, sinit.m_mipmapFilter, 
+			minFilter, magFilter);
+
+		glTexParameteri(m_target, GL_TEXTURE_MIN_FILTER, minFilter);
+		glTexParameteri(m_target, GL_TEXTURE_MAG_FILTER, magFilter);
 
 
 #if ANKI_GL == ANKI_GL_DESKTOP
 #if ANKI_GL == ANKI_GL_DESKTOP
 		if(sinit.m_anisotropyLevel > 1)
 		if(sinit.m_anisotropyLevel > 1)

+ 2 - 2
src/renderer/Hdr.cpp

@@ -139,8 +139,8 @@ Error Hdr::run(CommandBufferHandle& cmdb)
 {
 {
 	ANKI_ASSERT(m_enabled);
 	ANKI_ASSERT(m_enabled);
 
 
-	// For the passes it should be NEAREST
-	//vblurFai.setFiltering(Texture::TFrustumType::NEAREST);
+	// For the passes it should be NEAREST_BASE
+	//vblurFai.setFiltering(Texture::TFrustumType::NEAREST_BASE);
 
 
 	// pass 0
 	// pass 0
 	m_vblurFb.bind(cmdb);
 	m_vblurFb.bind(cmdb);

+ 7 - 3
src/renderer/Is.cpp

@@ -219,8 +219,9 @@ Error Is::initInternal(const ConfigSet& config)
 
 
 	ANKI_CHECK(m_r->createRenderTarget(
 	ANKI_CHECK(m_r->createRenderTarget(
 		m_r->getWidth(), m_r->getHeight(), 
 		m_r->getWidth(), m_r->getHeight(), 
+		//PixelFormat(ComponentFormat::R11G11B10, TransformFormat::FLOAT), 
 		PixelFormat(ComponentFormat::R8G8B8, TransformFormat::UNORM), 
 		PixelFormat(ComponentFormat::R8G8B8, TransformFormat::UNORM), 
-		1, SamplingFilter::NEAREST_MIPMAP, 6, m_rt));
+		1, SamplingFilter::LINEAR, 7, m_rt));
 
 
 	FramebufferHandle::Initializer fbInit;
 	FramebufferHandle::Initializer fbInit;
 	fbInit.m_colorAttachmentsCount = 1;
 	fbInit.m_colorAttachmentsCount = 1;
@@ -759,11 +760,14 @@ void Is::binLight(
 //==============================================================================
 //==============================================================================
 void Is::setState(CommandBufferHandle& cmdBuff)
 void Is::setState(CommandBufferHandle& cmdBuff)
 {
 {
-	/*Bool drawToDefaultFbo = !m_r->getPps().getEnabled() 
+#if 1
+	Bool drawToDefaultFbo = !m_r->getPps().getEnabled() 
 		&& !m_r->getDbg().getEnabled() 
 		&& !m_r->getDbg().getEnabled() 
 		&& !m_r->getIsOffscreen()
 		&& !m_r->getIsOffscreen()
-		&& m_r->getRenderingQuality() == 1.0;*/
+		&& m_r->getRenderingQuality() == 1.0;
+#else
 	Bool drawToDefaultFbo = false;
 	Bool drawToDefaultFbo = false;
+#endif
 
 
 	if(drawToDefaultFbo)
 	if(drawToDefaultFbo)
 	{
 	{

+ 5 - 0
src/renderer/MainRenderer.cpp

@@ -66,9 +66,14 @@ Error MainRenderer::render(SceneGraph& scene)
 
 
 	ANKI_CHECK(Renderer::render(scene, jobs));
 	ANKI_CHECK(Renderer::render(scene, jobs));
 
 
+#if 1
 	Bool alreadyDrawnToDefault = 
 	Bool alreadyDrawnToDefault = 
 		!getDbg().getEnabled()
 		!getDbg().getEnabled()
 		&& getRenderingQuality() == 1.0;
 		&& getRenderingQuality() == 1.0;
+#else
+	const Bool alreadyDrawnToDefault = false;
+	ANKI_LOGW("Have a debug code enabled");
+#endif
 
 
 	if(!alreadyDrawnToDefault)
 	if(!alreadyDrawnToDefault)
 	{
 	{

+ 1 - 1
src/renderer/Ms.cpp

@@ -139,7 +139,7 @@ Error Ms::run(CommandBufferHandle& cmdb)
 		fbo[1].blitFrom(fbo[0], UVec2(0U), UVec2(r->getWidth(), r->getHeight()),
 		fbo[1].blitFrom(fbo[0], UVec2(0U), UVec2(r->getWidth(), r->getHeight()),
 			UVec2(0U), UVec2(r->getWidth(), r->getHeight()),
 			UVec2(0U), UVec2(r->getWidth(), r->getHeight()),
 			GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT,
 			GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT,
-			GL_NEAREST);
+			GL_NEAREST_BASE);
 #endif
 #endif
 		ANKI_ASSERT(0 && "TODO");
 		ANKI_ASSERT(0 && "TODO");
 	}
 	}

+ 9 - 1
src/renderer/Renderer.cpp

@@ -264,7 +264,15 @@ Error Renderer::createRenderTarget(U32 w, U32 h, const PixelFormat& format,
 	init.m_format = format;
 	init.m_format = format;
 	init.m_mipmapsCount = mipsCount;
 	init.m_mipmapsCount = mipsCount;
 	init.m_samples = samples;
 	init.m_samples = samples;
-	init.m_sampling.m_filterType = filter;
+	init.m_sampling.m_minMagFilter = filter;
+	if(mipsCount > 1)
+	{
+		init.m_sampling.m_mipmapFilter = filter;
+	}
+	else
+	{
+		init.m_sampling.m_mipmapFilter = SamplingFilter::BASE;
+	}
 	init.m_sampling.m_repeat = false;
 	init.m_sampling.m_repeat = false;
 	init.m_sampling.m_anisotropyLevel = 0;
 	init.m_sampling.m_anisotropyLevel = 0;
 
 

+ 1 - 1
src/renderer/Sm.cpp

@@ -45,7 +45,7 @@ Error Sm::init(const ConfigSet& initializer)
 	sminit.m_depth = initializer.get("is.sm.maxLights");
 	sminit.m_depth = initializer.get("is.sm.maxLights");
 	sminit.m_format = PixelFormat(ComponentFormat::D16, TransformFormat::FLOAT);
 	sminit.m_format = PixelFormat(ComponentFormat::D16, TransformFormat::FLOAT);
 	sminit.m_mipmapsCount = 1;
 	sminit.m_mipmapsCount = 1;
-	sminit.m_sampling.m_filterType = m_bilinearEnabled 
+	sminit.m_sampling.m_minMagFilter = m_bilinearEnabled 
 		? SamplingFilter::LINEAR 
 		? SamplingFilter::LINEAR 
 		: SamplingFilter::NEAREST;
 		: SamplingFilter::NEAREST;
 	sminit.m_sampling.m_compareOperation = CompareOperation::LESS_EQUAL;
 	sminit.m_sampling.m_compareOperation = CompareOperation::LESS_EQUAL;

+ 1 - 1
src/renderer/Ssao.cpp

@@ -136,7 +136,7 @@ Error Ssao::initInternal(const ConfigSet& config)
 	tinit.m_format = 
 	tinit.m_format = 
 		PixelFormat(ComponentFormat::R32G32B32, TransformFormat::FLOAT);
 		PixelFormat(ComponentFormat::R32G32B32, TransformFormat::FLOAT);
 	tinit.m_mipmapsCount = 1;
 	tinit.m_mipmapsCount = 1;
-	tinit.m_sampling.m_filterType = SamplingFilter::NEAREST;
+	tinit.m_sampling.m_minMagFilter = SamplingFilter::NEAREST;
 	tinit.m_sampling.m_repeat = true;
 	tinit.m_sampling.m_repeat = true;
 	tinit.m_data[0][0].m_ptr = static_cast<void*>(&noise[0]);
 	tinit.m_data[0][0].m_ptr = static_cast<void*>(&noise[0]);
 	tinit.m_data[0][0].m_size = sizeof(noise);
 	tinit.m_data[0][0].m_size = sizeof(noise);

+ 2 - 1
src/resource/TextureResource.cpp

@@ -140,7 +140,8 @@ Error TextureResource::load(const CString& filename, ResourceInitializer& rinit)
 	init.m_mipmapsCount = img->getMipLevelsCount();
 	init.m_mipmapsCount = img->getMipLevelsCount();
 
 
 	// filteringType
 	// filteringType
-	init.m_sampling.m_filterType = SamplingFilter::TRILINEAR;
+	init.m_sampling.m_minMagFilter = SamplingFilter::LINEAR;
+	init.m_sampling.m_mipmapFilter = SamplingFilter::LINEAR;
 
 
 	// repeat
 	// repeat
 	init.m_sampling.m_repeat = true;
 	init.m_sampling.m_repeat = true;

+ 1 - 1
testapp/Main.cpp

@@ -490,7 +490,7 @@ Error initSubsystems(int argc, char* argv[])
 	config.set("pps.hdr.enabled", true);
 	config.set("pps.hdr.enabled", true);
 	config.set("pps.hdr.renderingQuality", 0.5);
 	config.set("pps.hdr.renderingQuality", 0.5);
 	config.set("pps.hdr.blurringDist", 1.0);
 	config.set("pps.hdr.blurringDist", 1.0);
-	config.set("pps.hdr.blurringIterationsCount", 2);
+	config.set("pps.hdr.blurringIterationsCount", 3);
 	config.set("pps.hdr.exposure", 15.0);
 	config.set("pps.hdr.exposure", 15.0);
 	config.set("pps.hdr.samples", 17);
 	config.set("pps.hdr.samples", 17);
 	config.set("pps.sslr.enabled", true);
 	config.set("pps.sslr.enabled", true);