Browse Source

Remove spec consts from Bloom

Panagiotis Christopoulos Charitos 2 years ago
parent
commit
f1789b0392
4 changed files with 44 additions and 74 deletions
  1. 16 37
      AnKi/Renderer/Bloom.cpp
  2. 0 6
      AnKi/Renderer/Bloom.h
  3. 13 14
      AnKi/Shaders/Bloom.hlsl
  4. 15 17
      AnKi/Shaders/BloomUpscale.hlsl

+ 16 - 37
AnKi/Renderer/Bloom.cpp

@@ -38,54 +38,33 @@ Error Bloom::initInternal()
 
 
 Error Bloom::initExposure()
 Error Bloom::initExposure()
 {
 {
-	m_exposure.m_width = getRenderer().getDownscaleBlur().getPassWidth(kMaxU32) * 2;
-	m_exposure.m_height = getRenderer().getDownscaleBlur().getPassHeight(kMaxU32) * 2;
+	const U32 width = getRenderer().getDownscaleBlur().getPassWidth(kMaxU32) * 2;
+	const U32 height = getRenderer().getDownscaleBlur().getPassHeight(kMaxU32) * 2;
 
 
 	// Create RT info
 	// Create RT info
-	m_exposure.m_rtDescr = getRenderer().create2DRenderTargetDescription(m_exposure.m_width, m_exposure.m_height, kRtPixelFormat, "Bloom Exp");
+	m_exposure.m_rtDescr = getRenderer().create2DRenderTargetDescription(width, height, kRtPixelFormat, "Bloom Exp");
 	m_exposure.m_rtDescr.bake();
 	m_exposure.m_rtDescr.bake();
 
 
 	// init shaders
 	// init shaders
-	CString progFname = (g_preferComputeCVar.get()) ? "ShaderBinaries/BloomCompute.ankiprogbin" : "ShaderBinaries/BloomRaster.ankiprogbin";
-	ANKI_CHECK(ResourceManager::getSingleton().loadResource(progFname, m_exposure.m_prog));
-
-	ShaderProgramResourceVariantInitInfo variantInitInfo(m_exposure.m_prog);
-	if(g_preferComputeCVar.get())
-	{
-		variantInitInfo.addConstant("kViewport", UVec2(m_exposure.m_width, m_exposure.m_height));
-	}
-
-	const ShaderProgramResourceVariant* variant;
-	m_exposure.m_prog->getOrCreateVariant(variantInitInfo, variant);
-	m_exposure.m_grProg.reset(&variant->getProgram());
+	const CString progFname = (g_preferComputeCVar.get()) ? "ShaderBinaries/BloomCompute.ankiprogbin" : "ShaderBinaries/BloomRaster.ankiprogbin";
+	ANKI_CHECK(loadShaderProgram(progFname, m_exposure.m_prog, m_exposure.m_grProg));
 
 
 	return Error::kNone;
 	return Error::kNone;
 }
 }
 
 
 Error Bloom::initUpscale()
 Error Bloom::initUpscale()
 {
 {
-	m_upscale.m_width = getRenderer().getPostProcessResolution().x() / kBloomFraction;
-	m_upscale.m_height = getRenderer().getPostProcessResolution().y() / kBloomFraction;
+	const U32 width = getRenderer().getPostProcessResolution().x() / kBloomFraction;
+	const U32 height = getRenderer().getPostProcessResolution().y() / kBloomFraction;
 
 
 	// Create RT descr
 	// Create RT descr
-	m_upscale.m_rtDescr = getRenderer().create2DRenderTargetDescription(m_upscale.m_width, m_upscale.m_height, kRtPixelFormat, "Bloom Upscale");
+	m_upscale.m_rtDescr = getRenderer().create2DRenderTargetDescription(width, height, kRtPixelFormat, "Bloom Upscale");
 	m_upscale.m_rtDescr.bake();
 	m_upscale.m_rtDescr.bake();
 
 
 	// init shaders
 	// init shaders
-	CString progFname =
+	const CString progFname =
 		(g_preferComputeCVar.get()) ? "ShaderBinaries/BloomUpscaleCompute.ankiprogbin" : "ShaderBinaries/BloomUpscaleRaster.ankiprogbin";
 		(g_preferComputeCVar.get()) ? "ShaderBinaries/BloomUpscaleCompute.ankiprogbin" : "ShaderBinaries/BloomUpscaleRaster.ankiprogbin";
-	ANKI_CHECK(ResourceManager::getSingleton().loadResource(progFname, m_upscale.m_prog));
-
-	ShaderProgramResourceVariantInitInfo variantInitInfo(m_upscale.m_prog);
-	variantInitInfo.addConstant("kInputTextureSize", UVec2(m_exposure.m_width, m_exposure.m_height));
-	if(g_preferComputeCVar.get())
-	{
-		variantInitInfo.addConstant("kViewport", UVec2(m_upscale.m_width, m_upscale.m_height));
-	}
-
-	const ShaderProgramResourceVariant* variant;
-	m_upscale.m_prog->getOrCreateVariant(variantInitInfo, variant);
-	m_upscale.m_grProg.reset(&variant->getProgram());
+	ANKI_CHECK(loadShaderProgram(progFname, m_upscale.m_prog, m_upscale.m_grProg));
 
 
 	// Textures
 	// Textures
 	ANKI_CHECK(ResourceManager::getSingleton().loadResource("EngineAssets/LensDirt.ankitex", m_upscale.m_lensDirtImage));
 	ANKI_CHECK(ResourceManager::getSingleton().loadResource("EngineAssets/LensDirt.ankitex", m_upscale.m_lensDirtImage));
@@ -141,8 +120,8 @@ void Bloom::populateRenderGraph(RenderingContext& ctx)
 			cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_trilinearClamp.get());
 			cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_trilinearClamp.get());
 			rgraphCtx.bindTexture(0, 1, getRenderer().getDownscaleBlur().getRt(), inputTexSubresource);
 			rgraphCtx.bindTexture(0, 1, getRenderer().getDownscaleBlur().getRt(), inputTexSubresource);
 
 
-			const Vec4 uniforms(g_bloomThresholdCVar.get(), g_bloomScaleCVar.get(), 0.0f, 0.0f);
-			cmdb.setPushConstants(&uniforms, sizeof(uniforms));
+			const Vec4 consts(g_bloomThresholdCVar.get(), g_bloomScaleCVar.get(), 0.0f, 0.0f);
+			cmdb.setPushConstants(&consts, sizeof(consts));
 
 
 			rgraphCtx.bindUavTexture(0, 2, getRenderer().getTonemapping().getRt());
 			rgraphCtx.bindUavTexture(0, 2, getRenderer().getTonemapping().getRt());
 
 
@@ -150,11 +129,11 @@ void Bloom::populateRenderGraph(RenderingContext& ctx)
 			{
 			{
 				rgraphCtx.bindUavTexture(0, 3, m_runCtx.m_exposureRt, TextureSubresourceInfo());
 				rgraphCtx.bindUavTexture(0, 3, m_runCtx.m_exposureRt, TextureSubresourceInfo());
 
 
-				dispatchPPCompute(cmdb, 8, 8, m_exposure.m_width, m_exposure.m_height);
+				dispatchPPCompute(cmdb, 8, 8, m_exposure.m_rtDescr.m_width, m_exposure.m_rtDescr.m_height);
 			}
 			}
 			else
 			else
 			{
 			{
-				cmdb.setViewport(0, 0, m_exposure.m_width, m_exposure.m_height);
+				cmdb.setViewport(0, 0, m_exposure.m_rtDescr.m_width, m_exposure.m_rtDescr.m_height);
 
 
 				cmdb.draw(PrimitiveTopology::kTriangles, 3);
 				cmdb.draw(PrimitiveTopology::kTriangles, 3);
 			}
 			}
@@ -201,11 +180,11 @@ void Bloom::populateRenderGraph(RenderingContext& ctx)
 			{
 			{
 				rgraphCtx.bindUavTexture(0, 3, m_runCtx.m_upscaleRt, TextureSubresourceInfo());
 				rgraphCtx.bindUavTexture(0, 3, m_runCtx.m_upscaleRt, TextureSubresourceInfo());
 
 
-				dispatchPPCompute(cmdb, 8, 8, m_upscale.m_width, m_upscale.m_height);
+				dispatchPPCompute(cmdb, 8, 8, m_upscale.m_rtDescr.m_width, m_upscale.m_rtDescr.m_height);
 			}
 			}
 			else
 			else
 			{
 			{
-				cmdb.setViewport(0, 0, m_upscale.m_width, m_upscale.m_height);
+				cmdb.setViewport(0, 0, m_upscale.m_rtDescr.m_width, m_upscale.m_rtDescr.m_height);
 
 
 				cmdb.draw(PrimitiveTopology::kTriangles, 3);
 				cmdb.draw(PrimitiveTopology::kTriangles, 3);
 			}
 			}

+ 0 - 6
AnKi/Renderer/Bloom.h

@@ -54,9 +54,6 @@ private:
 		ShaderProgramResourcePtr m_prog;
 		ShaderProgramResourcePtr m_prog;
 		ShaderProgramPtr m_grProg;
 		ShaderProgramPtr m_grProg;
 
 
-		U32 m_width = 0;
-		U32 m_height = 0;
-
 		RenderTargetDescription m_rtDescr;
 		RenderTargetDescription m_rtDescr;
 	} m_exposure;
 	} m_exposure;
 
 
@@ -67,9 +64,6 @@ private:
 		ShaderProgramResourcePtr m_prog;
 		ShaderProgramResourcePtr m_prog;
 		ShaderProgramPtr m_grProg;
 		ShaderProgramPtr m_grProg;
 
 
-		U32 m_width = 0;
-		U32 m_height = 0;
-
 		RenderTargetDescription m_rtDescr;
 		RenderTargetDescription m_rtDescr;
 	} m_upscale;
 	} m_upscale;
 
 

+ 13 - 14
AnKi/Shaders/Bloom.hlsl

@@ -8,17 +8,18 @@
 constexpr U32 kTonemappingBinding = 2u;
 constexpr U32 kTonemappingBinding = 2u;
 #include <AnKi/Shaders/TonemappingResources.hlsl>
 #include <AnKi/Shaders/TonemappingResources.hlsl>
 
 
-ANKI_SPECIALIZATION_CONSTANT_UVEC2(kViewport, 0u);
-
 [[vk::binding(0)]] SamplerState g_linearAnyClampSampler;
 [[vk::binding(0)]] SamplerState g_linearAnyClampSampler;
-[[vk::binding(1)]] Texture2D g_inTex; ///< Its the IS RT
+[[vk::binding(1)]] Texture2D<RVec4> g_inTex;
 
 
 struct Constants
 struct Constants
 {
 {
-	Vec4 m_thresholdScalePad2;
+	F32 m_threshold;
+	F32 m_scale;
+	F32 m_padding0;
+	F32 m_padding1;
 };
 };
 
 
-[[vk::push_constant]] ConstantBuffer<Constants> g_pc;
+[[vk::push_constant]] ConstantBuffer<Constants> g_consts;
 
 
 #if defined(ANKI_COMPUTE_SHADER)
 #if defined(ANKI_COMPUTE_SHADER)
 #	define THREADGROUP_SIZE_X 8
 #	define THREADGROUP_SIZE_X 8
@@ -27,31 +28,29 @@ struct Constants
 #endif
 #endif
 
 
 #if defined(ANKI_COMPUTE_SHADER)
 #if defined(ANKI_COMPUTE_SHADER)
-[numthreads(THREADGROUP_SIZE_X, THREADGROUP_SIZE_Y, 1)] void main(UVec3 svDispatchThreadId : SV_DISPATCHTHREADID)
+[numthreads(THREADGROUP_SIZE_X, THREADGROUP_SIZE_Y, 1)] void main(UVec2 svDispatchThreadId : SV_DISPATCHTHREADID)
 #else
 #else
 RVec3 main([[vk::location(0)]] Vec2 uv : TEXCOORD) : SV_TARGET0
 RVec3 main([[vk::location(0)]] Vec2 uv : TEXCOORD) : SV_TARGET0
 #endif
 #endif
 {
 {
 #if defined(ANKI_COMPUTE_SHADER)
 #if defined(ANKI_COMPUTE_SHADER)
-	if(skipOutOfBoundsInvocations(UVec2(THREADGROUP_SIZE_X, THREADGROUP_SIZE_Y), kViewport, svDispatchThreadId))
-	{
-		return;
-	}
+	Vec2 outUavSize;
+	g_outUav.GetDimensions(outUavSize.x, outUavSize.y);
 
 
-	const Vec2 uv = (Vec2(svDispatchThreadId.xy) + 0.5) / Vec2(kViewport);
+	const Vec2 uv = (Vec2(svDispatchThreadId) + 0.5) / outUavSize;
 #endif
 #endif
 
 
-	RF32 weight = 1.0 / 5.0;
+	const RF32 weight = 1.0 / 5.0;
 	RVec3 color = g_inTex.SampleLevel(g_linearAnyClampSampler, uv, 0.0).rgb * weight;
 	RVec3 color = g_inTex.SampleLevel(g_linearAnyClampSampler, uv, 0.0).rgb * weight;
 	color += g_inTex.SampleLevel(g_linearAnyClampSampler, uv, 0.0, IVec2(+1, +1)).rgb * weight;
 	color += g_inTex.SampleLevel(g_linearAnyClampSampler, uv, 0.0, IVec2(+1, +1)).rgb * weight;
 	color += g_inTex.SampleLevel(g_linearAnyClampSampler, uv, 0.0, IVec2(-1, -1)).rgb * weight;
 	color += g_inTex.SampleLevel(g_linearAnyClampSampler, uv, 0.0, IVec2(-1, -1)).rgb * weight;
 	color += g_inTex.SampleLevel(g_linearAnyClampSampler, uv, 0.0, IVec2(-1, +1)).rgb * weight;
 	color += g_inTex.SampleLevel(g_linearAnyClampSampler, uv, 0.0, IVec2(-1, +1)).rgb * weight;
 	color += g_inTex.SampleLevel(g_linearAnyClampSampler, uv, 0.0, IVec2(+1, -1)).rgb * weight;
 	color += g_inTex.SampleLevel(g_linearAnyClampSampler, uv, 0.0, IVec2(+1, -1)).rgb * weight;
 
 
-	color = tonemap(color, readExposureAndAverageLuminance().y, g_pc.m_thresholdScalePad2.x) * g_pc.m_thresholdScalePad2.y;
+	color = tonemap(color, readExposureAndAverageLuminance().y, g_consts.m_threshold) * g_consts.m_scale;
 
 
 #if defined(ANKI_COMPUTE_SHADER)
 #if defined(ANKI_COMPUTE_SHADER)
-	g_outUav[svDispatchThreadId.xy] = RVec4(color, 0.0);
+	g_outUav[svDispatchThreadId] = RVec4(color, 0.0);
 #else
 #else
 	return color;
 	return color;
 #endif
 #endif

+ 15 - 17
AnKi/Shaders/BloomUpscale.hlsl

@@ -5,9 +5,6 @@
 
 
 #include <AnKi/Shaders/Functions.hlsl>
 #include <AnKi/Shaders/Functions.hlsl>
 
 
-ANKI_SPECIALIZATION_CONSTANT_UVEC2(kViewport, 0u);
-ANKI_SPECIALIZATION_CONSTANT_UVEC2(kInputTextureSize, 2u);
-
 // Constants
 // Constants
 #define ENABLE_CHROMATIC_DISTORTION 1
 #define ENABLE_CHROMATIC_DISTORTION 1
 #define ENABLE_HALO 1
 #define ENABLE_HALO 1
@@ -40,9 +37,12 @@ RVec3 textureDistorted(Texture2D<RVec4> tex, SamplerState sampl, Vec2 uv,
 
 
 RVec3 ssLensFlare(Vec2 uv)
 RVec3 ssLensFlare(Vec2 uv)
 {
 {
-	constexpr Vec2 kTexelSize = 1.0 / Vec2(kInputTextureSize);
-	constexpr Vec3 kDistortion = Vec3(-kTexelSize.x * kChromaticDistortion, 0.0, kTexelSize.x * kChromaticDistortion);
-	constexpr F32 kLensOfHalf = length(Vec2(0.5, 0.5));
+	Vec2 textureSize;
+	g_inputTex.GetDimensions(textureSize.x, textureSize.y);
+
+	const Vec2 texelSize = 1.0 / textureSize;
+	const Vec3 distortion = Vec3(-texelSize.x * kChromaticDistortion, 0.0, texelSize.x * kChromaticDistortion);
+	const F32 lensOfHalf = length(Vec2(0.5, 0.5));
 
 
 	const Vec2 flipUv = Vec2(1.0, 1.0) - uv;
 	const Vec2 flipUv = Vec2(1.0, 1.0) - uv;
 
 
@@ -56,18 +56,18 @@ RVec3 ssLensFlare(Vec2 uv)
 	{
 	{
 		const Vec2 offset = frac(flipUv + ghostVec * F32(i));
 		const Vec2 offset = frac(flipUv + ghostVec * F32(i));
 
 
-		RF32 weight = length(Vec2(0.5, 0.5) - offset) / kLensOfHalf;
+		RF32 weight = length(Vec2(0.5, 0.5) - offset) / lensOfHalf;
 		weight = pow(1.0 - weight, 10.0);
 		weight = pow(1.0 - weight, 10.0);
 
 
-		result += textureDistorted(g_inputTex, g_linearAnyClampSampler, offset, direction, kDistortion) * weight;
+		result += textureDistorted(g_inputTex, g_linearAnyClampSampler, offset, direction, distortion) * weight;
 	}
 	}
 
 
 	// Sample halo
 	// Sample halo
 #if ENABLE_HALO
 #if ENABLE_HALO
 	const Vec2 haloVec = normalize(ghostVec) * kHaloWidth;
 	const Vec2 haloVec = normalize(ghostVec) * kHaloWidth;
-	RF32 weight = length(Vec2(0.5, 0.5) - frac(flipUv + haloVec)) / kLensOfHalf;
+	RF32 weight = length(Vec2(0.5, 0.5) - frac(flipUv + haloVec)) / lensOfHalf;
 	weight = pow(1.0 - weight, 20.0);
 	weight = pow(1.0 - weight, 20.0);
-	result += textureDistorted(g_inputTex, g_linearAnyClampSampler, flipUv + haloVec, direction, kDistortion) * (weight * kHaloOpacity);
+	result += textureDistorted(g_inputTex, g_linearAnyClampSampler, flipUv + haloVec, direction, distortion) * (weight * kHaloOpacity);
 #endif
 #endif
 
 
 	// Lens dirt
 	// Lens dirt
@@ -89,24 +89,22 @@ RVec3 upscale(Vec2 uv)
 }
 }
 
 
 #if defined(ANKI_COMPUTE_SHADER)
 #if defined(ANKI_COMPUTE_SHADER)
-[numthreads(THREADGROUP_SIZE_XY, THREADGROUP_SIZE_XY, 1)] void main(UVec3 svDispatchThreadId : SV_DISPATCHTHREADID)
+[numthreads(THREADGROUP_SIZE_XY, THREADGROUP_SIZE_XY, 1)] void main(UVec2 svDispatchThreadId : SV_DISPATCHTHREADID)
 #else
 #else
 RVec3 main([[vk::location(0)]] Vec2 uv : TEXCOORD) : SV_TARGET0
 RVec3 main([[vk::location(0)]] Vec2 uv : TEXCOORD) : SV_TARGET0
 #endif
 #endif
 {
 {
 #if defined(ANKI_COMPUTE_SHADER)
 #if defined(ANKI_COMPUTE_SHADER)
-	if(skipOutOfBoundsInvocations(UVec2(THREADGROUP_SIZE_XY, THREADGROUP_SIZE_XY), kViewport, svDispatchThreadId))
-	{
-		return;
-	}
+	Vec2 outUavTexSize;
+	g_outUav.GetDimensions(outUavTexSize.x, outUavTexSize.y);
 
 
-	const Vec2 uv = (Vec2(svDispatchThreadId.xy) + 0.5) / Vec2(kViewport);
+	const Vec2 uv = (Vec2(svDispatchThreadId) + 0.5) / outUavTexSize;
 #endif
 #endif
 
 
 	const RVec3 outColor = ssLensFlare(uv) + upscale(uv);
 	const RVec3 outColor = ssLensFlare(uv) + upscale(uv);
 
 
 #if defined(ANKI_COMPUTE_SHADER)
 #if defined(ANKI_COMPUTE_SHADER)
-	g_outUav[svDispatchThreadId.xy] = RVec4(outColor, 0.0);
+	g_outUav[svDispatchThreadId] = RVec4(outColor, 0.0);
 #else
 #else
 	return outColor;
 	return outColor;
 #endif
 #endif