Browse Source

Add FP16 support to HDR render-targets

Panagiotis Christopoulos Charitos 3 years ago
parent
commit
790041828c

+ 0 - 2
AnKi/Renderer/Common.h

@@ -78,8 +78,6 @@ extern const Array<Format, GBUFFER_COLOR_ATTACHMENT_COUNT> GBUFFER_COLOR_ATTACHM
 
 constexpr Format GBUFFER_DEPTH_ATTACHMENT_PIXEL_FORMAT = Format::D32_SFLOAT;
 
-constexpr Format LIGHT_SHADING_COLOR_ATTACHMENT_PIXEL_FORMAT = Format::B10G11R11_UFLOAT_PACK32;
-
 constexpr Format FORWARD_SHADING_COLOR_ATTACHMENT_PIXEL_FORMAT = Format::R16G16B16A16_SFLOAT;
 
 constexpr Format DBG_COLOR_ATTACHMENT_PIXEL_FORMAT = Format::R8G8B8A8_UNORM;

+ 3 - 1
AnKi/Renderer/ConfigVars.defs.h

@@ -5,11 +5,13 @@
 
 ANKI_CONFIG_VAR_GROUP(R)
 
-ANKI_CONFIG_VAR_U8(RTextureAnisotropy, 8, 1, 16, "Texture anisotropy for the main passes")
+ANKI_CONFIG_VAR_U8(RTextureAnisotropy, (ANKI_PLATFORM_MOBILE) ? 1 : 8, 1, 16, "Texture anisotropy for the main passes")
 ANKI_CONFIG_VAR_U32(RTileSize, 64, 8, 256, "Tile lighting tile size")
 ANKI_CONFIG_VAR_U32(RZSplitCount, 64, 8, 1024, "Clusterer number of Z splits")
 ANKI_CONFIG_VAR_BOOL(RPreferCompute, !ANKI_PLATFORM_MOBILE, "Prefer compute shaders")
 ANKI_CONFIG_VAR_BOOL(RVrs, true, "Enable VRS in multiple passes")
+ANKI_CONFIG_VAR_BOOL(RHighQualityHdr, !ANKI_PLATFORM_MOBILE,
+					 "If true use R16G16B16 for HDR images. Alternatively use B10G11R11")
 
 ANKI_CONFIG_VAR_F32(RInternalRenderScaling, 1.0f, 0.5f, 1.0f,
 					"A factor over the requested swapchain resolution. Applies to all passes up to TAA")

+ 2 - 2
AnKi/Renderer/DownscaleBlur.cpp

@@ -38,8 +38,8 @@ Error DownscaleBlur::initInternal()
 	const Bool preferCompute = getConfig().getRPreferCompute();
 
 	// Create the miped texture
-	TextureInitInfo texinit = m_r->create2DRenderTargetDescription(
-		rez.x(), rez.y(), LIGHT_SHADING_COLOR_ATTACHMENT_PIXEL_FORMAT, "DownscaleBlur");
+	TextureInitInfo texinit =
+		m_r->create2DRenderTargetDescription(rez.x(), rez.y(), m_r->getHdrFormat(), "DownscaleBlur");
 	texinit.m_usage = TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::SAMPLED_COMPUTE;
 	if(preferCompute)
 	{

+ 2 - 2
AnKi/Renderer/IndirectDiffuse.cpp

@@ -42,8 +42,8 @@ Error IndirectDiffuse::initInternal()
 	TextureUsageBit usage = TextureUsageBit::ALL_SAMPLED;
 
 	usage |= (preferCompute) ? TextureUsageBit::IMAGE_COMPUTE_WRITE : TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE;
-	TextureInitInfo texInit = m_r->create2DRenderTargetInitInfo(size.x(), size.y(), Format::B10G11R11_UFLOAT_PACK32,
-																usage, "IndirectDiffuse #1");
+	TextureInitInfo texInit =
+		m_r->create2DRenderTargetInitInfo(size.x(), size.y(), m_r->getHdrFormat(), usage, "IndirectDiffuse #1");
 	texInit.m_initialUsage = TextureUsageBit::ALL_SAMPLED;
 	m_rts[0] = m_r->createAndClearRenderTarget(texInit);
 	texInit.setName("IndirectDiffuse #2");

+ 3 - 3
AnKi/Renderer/IndirectDiffuseProbes.cpp

@@ -188,8 +188,8 @@ Error IndirectDiffuseProbes::initLightShading()
 {
 	// Init RT descr
 	{
-		m_lightShading.m_rtDescr = m_r->create2DRenderTargetDescription(
-			m_tileSize * 6, m_tileSize, LIGHT_SHADING_COLOR_ATTACHMENT_PIXEL_FORMAT, "GI LS");
+		m_lightShading.m_rtDescr =
+			m_r->create2DRenderTargetDescription(m_tileSize * 6, m_tileSize, m_r->getHdrFormat(), "GI LS");
 		m_lightShading.m_rtDescr.bake();
 	}
 
@@ -479,7 +479,7 @@ void IndirectDiffuseProbes::prepareProbes(InternalContext& giCtx)
 		{
 			TextureInitInfo texInit("GiProbeVolume");
 			texInit.m_type = TextureType::_3D;
-			texInit.m_format = Format::B10G11R11_UFLOAT_PACK32;
+			texInit.m_format = m_r->getHdrFormat();
 			texInit.m_width = probe.m_cellCounts.x() * 6;
 			texInit.m_height = probe.m_cellCounts.y();
 			texInit.m_depth = probe.m_cellCounts.z();

+ 1 - 1
AnKi/Renderer/IndirectSpecular.cpp

@@ -39,7 +39,7 @@ Error IndirectSpecular::initInternal()
 	ANKI_CHECK(getResourceManager().loadResource("EngineAssets/BlueNoise_Rgba8_64x64.png", m_noiseImage));
 
 	// Create RT
-	m_rtDescr = m_r->create2DRenderTargetDescription(width, height, Format::B10G11R11_UFLOAT_PACK32, "SSR");
+	m_rtDescr = m_r->create2DRenderTargetDescription(width, height, m_r->getHdrFormat(), "SSR");
 	m_rtDescr.bake();
 
 	m_fbDescr.m_colorAttachmentCount = 1;

+ 2 - 3
AnKi/Renderer/LightShading.cpp

@@ -79,9 +79,8 @@ Error LightShading::initLightShading()
 	m_lightShading.m_grProg[1] = variant->getProgram();
 
 	// Create RT descr
-	m_lightShading.m_rtDescr =
-		m_r->create2DRenderTargetDescription(m_r->getInternalResolution().x(), m_r->getInternalResolution().y(),
-											 LIGHT_SHADING_COLOR_ATTACHMENT_PIXEL_FORMAT, "Light Shading");
+	m_lightShading.m_rtDescr = m_r->create2DRenderTargetDescription(
+		m_r->getInternalResolution().x(), m_r->getInternalResolution().y(), m_r->getHdrFormat(), "Light Shading");
 	m_lightShading.m_rtDescr.bake();
 
 	// Create FB descr

+ 1 - 1
AnKi/Renderer/ProbeReflections.cpp

@@ -117,7 +117,7 @@ Error ProbeReflections::initLightShading()
 	// Init cube arr
 	{
 		TextureInitInfo texinit = m_r->create2DRenderTargetInitInfo(
-			m_lightShading.m_tileSize, m_lightShading.m_tileSize, LIGHT_SHADING_COLOR_ATTACHMENT_PIXEL_FORMAT,
+			m_lightShading.m_tileSize, m_lightShading.m_tileSize, m_r->getHdrFormat(),
 			TextureUsageBit::SAMPLED_FRAGMENT | TextureUsageBit::SAMPLED_COMPUTE | TextureUsageBit::IMAGE_COMPUTE_READ
 				| TextureUsageBit::IMAGE_COMPUTE_WRITE | TextureUsageBit::ALL_FRAMEBUFFER_ATTACHMENT
 				| TextureUsageBit::GENERATE_MIPMAPS,

+ 18 - 0
AnKi/Renderer/Renderer.cpp

@@ -634,4 +634,22 @@ void Renderer::setCurrentDebugRenderTarget(CString rtName)
 	}
 }
 
+Format Renderer::getHdrFormat() const
+{
+	Format out;
+	if(!m_config->getRHighQualityHdr())
+	{
+		out = Format::B10G11R11_UFLOAT_PACK32;
+	}
+	else if(m_gr->getDeviceCapabilities().m_unalignedBbpTextureFormats)
+	{
+		out = Format::R16G16B16_SFLOAT;
+	}
+	else
+	{
+		out = Format::R16G16B16A16_SFLOAT;
+	}
+	return out;
+}
+
 } // end namespace anki

+ 2 - 0
AnKi/Renderer/Renderer.h

@@ -203,6 +203,8 @@ public:
 		return m_zSplitCount;
 	}
 
+	Format getHdrFormat() const;
+
 	/// @name Debug render targets
 	/// @{
 

+ 1 - 1
AnKi/Renderer/TemporalAA.cpp

@@ -67,7 +67,7 @@ Error TemporalAA::initInternal()
 
 		TextureInitInfo texinit =
 			m_r->create2DRenderTargetInitInfo(m_r->getInternalResolution().x(), m_r->getInternalResolution().y(),
-											  LIGHT_SHADING_COLOR_ATTACHMENT_PIXEL_FORMAT, usage, "TemporalAA");
+											  m_r->getHdrFormat(), usage, "TemporalAA");
 
 		texinit.m_initialUsage = TextureUsageBit::SAMPLED_FRAGMENT;