Browse Source

Convert DepthDownscaleRaster to HLSL

Panagiotis Christopoulos Charitos 3 years ago
parent
commit
20e8f21175

+ 2 - 2
AnKi/Renderer/DepthDownscale.cpp

@@ -97,7 +97,7 @@ Error DepthDownscale::initInternal()
 		m_grProg = variant->getProgram();
 		m_grProg = variant->getProgram();
 
 
 		// 1st mip prog
 		// 1st mip prog
-		variantInitInfo.addMutation("REDUCTION_SAMPLER", 0);
+		variantInitInfo.addMutation("REDUCTION_SAMPLER", 1);
 		m_prog->getOrCreateVariant(variantInitInfo, variant);
 		m_prog->getOrCreateVariant(variantInitInfo, variant);
 		m_firstMipGrProg = variant->getProgram();
 		m_firstMipGrProg = variant->getProgram();
 	}
 	}
@@ -132,7 +132,7 @@ Error DepthDownscale::initInternal()
 	// Reduction sampler
 	// Reduction sampler
 	if(!preferCompute && supportsReductionSampler)
 	if(!preferCompute && supportsReductionSampler)
 	{
 	{
-		SamplerInitInfo sinit("HiZReduction");
+		SamplerInitInfo sinit("HiZReductionMax");
 		sinit.m_addressing = SamplingAddressing::kClamp;
 		sinit.m_addressing = SamplingAddressing::kClamp;
 		sinit.m_mipmapFilter = SamplingFilter::kMax;
 		sinit.m_mipmapFilter = SamplingFilter::kMax;
 		sinit.m_minMagFilter = SamplingFilter::kMax;
 		sinit.m_minMagFilter = SamplingFilter::kMax;

+ 6 - 1
AnKi/Renderer/Renderer.cpp

@@ -255,22 +255,26 @@ Error Renderer::initInternal(UVec2 swapchainResolution)
 
 
 	// Init samplers
 	// Init samplers
 	{
 	{
-		SamplerInitInfo sinit("Renderer");
+		SamplerInitInfo sinit("NearestNearestClamp");
 		sinit.m_addressing = SamplingAddressing::kClamp;
 		sinit.m_addressing = SamplingAddressing::kClamp;
 		sinit.m_mipmapFilter = SamplingFilter::kNearest;
 		sinit.m_mipmapFilter = SamplingFilter::kNearest;
 		sinit.m_minMagFilter = SamplingFilter::kNearest;
 		sinit.m_minMagFilter = SamplingFilter::kNearest;
 		m_samplers.m_nearestNearestClamp = m_subsystems.m_grManager->newSampler(sinit);
 		m_samplers.m_nearestNearestClamp = m_subsystems.m_grManager->newSampler(sinit);
 
 
+		sinit.setName("TrilinearClamp");
 		sinit.m_minMagFilter = SamplingFilter::kLinear;
 		sinit.m_minMagFilter = SamplingFilter::kLinear;
 		sinit.m_mipmapFilter = SamplingFilter::kLinear;
 		sinit.m_mipmapFilter = SamplingFilter::kLinear;
 		m_samplers.m_trilinearClamp = m_subsystems.m_grManager->newSampler(sinit);
 		m_samplers.m_trilinearClamp = m_subsystems.m_grManager->newSampler(sinit);
 
 
+		sinit.setName("TrilinearRepeat");
 		sinit.m_addressing = SamplingAddressing::kRepeat;
 		sinit.m_addressing = SamplingAddressing::kRepeat;
 		m_samplers.m_trilinearRepeat = m_subsystems.m_grManager->newSampler(sinit);
 		m_samplers.m_trilinearRepeat = m_subsystems.m_grManager->newSampler(sinit);
 
 
+		sinit.setName("TrilinearRepeatAniso");
 		sinit.m_anisotropyLevel = m_subsystems.m_config->getRTextureAnisotropy();
 		sinit.m_anisotropyLevel = m_subsystems.m_config->getRTextureAnisotropy();
 		m_samplers.m_trilinearRepeatAniso = m_subsystems.m_grManager->newSampler(sinit);
 		m_samplers.m_trilinearRepeatAniso = m_subsystems.m_grManager->newSampler(sinit);
 
 
+		sinit.setName("TrilinearRepeatAnisoRezScalingBias");
 		F32 scalingMipBias = log2(F32(m_internalResolution.x()) / F32(m_postProcessResolution.x()));
 		F32 scalingMipBias = log2(F32(m_internalResolution.x()) / F32(m_postProcessResolution.x()));
 		if(getScale().getUsingGrUpscaler())
 		if(getScale().getUsingGrUpscaler())
 		{
 		{
@@ -282,6 +286,7 @@ Error Renderer::initInternal(UVec2 swapchainResolution)
 		m_samplers.m_trilinearRepeatAnisoResolutionScalingBias = m_subsystems.m_grManager->newSampler(sinit);
 		m_samplers.m_trilinearRepeatAnisoResolutionScalingBias = m_subsystems.m_grManager->newSampler(sinit);
 
 
 		sinit = {};
 		sinit = {};
+		sinit.setName("TrilinearClampShadow");
 		sinit.m_minMagFilter = SamplingFilter::kLinear;
 		sinit.m_minMagFilter = SamplingFilter::kLinear;
 		sinit.m_mipmapFilter = SamplingFilter::kLinear;
 		sinit.m_mipmapFilter = SamplingFilter::kLinear;
 		sinit.m_compareOperation = CompareOperation::kLessEqual;
 		sinit.m_compareOperation = CompareOperation::kLessEqual;

+ 23 - 24
AnKi/Shaders/DepthDownscaleRaster.ankiprog

@@ -3,46 +3,45 @@
 // Code licensed under the BSD License.
 // Code licensed under the BSD License.
 // http://www.anki3d.org/LICENSE
 // http://www.anki3d.org/LICENSE
 
 
+#pragma anki hlsl
+
 #pragma anki mutator REDUCTION_SAMPLER 0 1
 #pragma anki mutator REDUCTION_SAMPLER 0 1
 
 
 #pragma anki start vert
 #pragma anki start vert
-#include <AnKi/Shaders/QuadVert.glsl>
+#include <AnKi/Shaders/QuadVert.hlsl>
 #pragma anki end
 #pragma anki end
 
 
 #pragma anki start frag
 #pragma anki start frag
-#include <AnKi/Shaders/Common.glsl>
-
-layout(location = 0) in Vec2 in_uv;
-layout(location = 0) out F32 out_depth;
-
-layout(set = 0, binding = 0) uniform texture2D u_inputTex;
-layout(set = 0, binding = 1) uniform sampler u_sampler;
+#include <AnKi/Shaders/Common.hlsl>
 
 
-layout(std430, set = 0, binding = 2) writeonly buffer b_cb
-{
-	F32 u_clientBuf[];
-};
+[[vk::binding(0)]] Texture2D g_inputTex;
+[[vk::binding(1)]] SamplerState g_sampler;
+[[vk::binding(2)]] RWStructuredBuffer<F32> g_clientBuff;
 
 
-layout(push_constant, std140) uniform b_pc
+struct Uniforms
 {
 {
-	Vec3 u_padding;
-	U32 u_lastMipWidth;
+	Vec3 m_padding;
+	U32 m_lastMipWidth;
 };
 };
+[[vk::push_constant]] ConstantBuffer<Uniforms> g_uniforms;
 
 
-void main()
+F32 main([[vk::location(0)]] Vec2 uv : TEXCOORD, Vec4 svPosition : SV_POSITION): SV_TARGET0
 {
 {
-#if !REDUCTION_SAMPLER
-	out_depth = textureLod(u_inputTex, u_sampler, in_uv, 0.0).x;
+	F32 output;
+#if REDUCTION_SAMPLER
+	output = g_inputTex.SampleLevel(g_sampler, uv, 0.0).x;
 #else
 #else
-	const Vec4 depths = textureGather(sampler2D(u_inputTex, u_sampler), in_uv, 0);
-	out_depth = max(depths.x, max(depths.y, max(depths.z, depths.w)));
+	const Vec4 depths = g_inputTex.GatherRed(g_sampler, uv);
+	output = max(depths.x, max(depths.y, max(depths.z, depths.w)));
 #endif
 #endif
 
 
-	if(u_lastMipWidth != 0u)
+	if(g_uniforms.m_lastMipWidth != 0u)
 	{
 	{
-		const UVec2 p = UVec2(gl_FragCoord.xy);
-		const U32 idx = p.y * u_lastMipWidth + p.x;
-		u_clientBuf[idx] = out_depth;
+		const UVec2 p = UVec2(svPosition.xy);
+		const U32 idx = p.y * g_uniforms.m_lastMipWidth + p.x;
+		g_clientBuff[idx] = output;
 	}
 	}
+
+	return output;
 }
 }
 #pragma anki end
 #pragma anki end

+ 5 - 0
AnKi/Shaders/Include/Common.h

@@ -649,6 +649,11 @@ Bool all(Bool b)
 	return b;
 	return b;
 }
 }
 
 
+Bool any(Bool b)
+{
+	return b;
+}
+
 #	define saturate(x_) clamp((x_), 0.0, 1.0)
 #	define saturate(x_) clamp((x_), 0.0, 1.0)
 #	define saturateRp(x) min(x, F32(kMaxF16))
 #	define saturateRp(x) min(x, F32(kMaxF16))
 #	define mad(a_, b_, c_) fma((a_), (b_), (c_))
 #	define mad(a_, b_, c_) fma((a_), (b_), (c_))

+ 3 - 3
ThirdParty/FidelityFX/ffx_a.h

@@ -2037,9 +2037,9 @@
   AF4 AZolSignedF4(AF4 x){return ASatF4(x*AF4_(A_INFN_F));}
   AF4 AZolSignedF4(AF4 x){return ASatF4(x*AF4_(A_INFN_F));}
 //------------------------------------------------------------------------------------------------------------------------------
 //------------------------------------------------------------------------------------------------------------------------------
   AF1 AZolZeroPassF1(AF1 x,AF1 y){return AF1_AU1((AU1_AF1(x)!=AU1_(0))?AU1_(0):AU1_AF1(y));}
   AF1 AZolZeroPassF1(AF1 x,AF1 y){return AF1_AU1((AU1_AF1(x)!=AU1_(0))?AU1_(0):AU1_AF1(y));}
-  AF2 AZolZeroPassF2(AF2 x,AF2 y){return AF2_AU2(select(AU2_AF2(x)!=AU2_(0),AU2_(0),AU2_AF2(y)));}
-  AF3 AZolZeroPassF3(AF3 x,AF3 y){return AF3_AU3(select(AU3_AF3(x)!=AU3_(0),AU3_(0),AU3_AF3(y)));}
-  AF4 AZolZeroPassF4(AF4 x,AF4 y){return AF4_AU4(select(AU4_AF4(x)!=AU4_(0),AU4_(0),AU4_AF4(y)));}
+  AF2 AZolZeroPassF2(AF2 x,AF2 y){return AF2_AU2(any(AU2_AF2(x)!=AU2_(0))?AU2_(0):AU2_AF2(y));}
+  AF3 AZolZeroPassF3(AF3 x,AF3 y){return AF3_AU3(any(AU3_AF3(x)!=AU3_(0))?AU3_(0):AU3_AF3(y));}
+  AF4 AZolZeroPassF4(AF4 x,AF4 y){return AF4_AU4(any(AU4_AF4(x)!=AU4_(0))?AU4_(0):AU4_AF4(y));}
  #endif
  #endif
 //==============================================================================================================================
 //==============================================================================================================================
  #ifdef A_HALF
  #ifdef A_HALF