Browse Source

Some test enhancements

Panagiotis Christopoulos Charitos 4 months ago
parent
commit
170649c8af
5 changed files with 103 additions and 14 deletions
  1. 10 1
      AnKi/Gr/Common.cpp
  2. 1 0
      AnKi/Gr/Common.h
  3. 1 1
      AnKi/Gr/Texture.h
  4. 17 0
      AnKi/ShaderCompiler/Dxc.cpp
  5. 74 12
      Tests/Gr/Gr.cpp

+ 10 - 1
AnKi/Gr/Common.cpp

@@ -162,11 +162,20 @@ Error ShaderReflection::linkShaderReflection(const ShaderReflection& a, const Sh
 	if(a.m_descriptor.m_fastConstantsSize != 0 && b.m_descriptor.m_fastConstantsSize != 0
 	   && a.m_descriptor.m_fastConstantsSize != b.m_descriptor.m_fastConstantsSize)
 	{
-		ANKI_GR_LOGE("Can't link shader reflection because fast constant size doesn't match");
+		ANKI_GR_LOGE("Can't link shader reflection because fast constants size doesn't match");
 		return Error::kFunctionFailed;
 	}
 	c.m_descriptor.m_fastConstantsSize = max(a.m_descriptor.m_fastConstantsSize, b.m_descriptor.m_fastConstantsSize);
 
+	if(a.m_descriptor.m_d3dShaderBindingTableRecordConstantsSize != 0 && b.m_descriptor.m_d3dShaderBindingTableRecordConstantsSize != 0
+	   && a.m_descriptor.m_d3dShaderBindingTableRecordConstantsSize != b.m_descriptor.m_d3dShaderBindingTableRecordConstantsSize)
+	{
+		ANKI_GR_LOGE("Can't link shader reflection because SBT constants size is not correct");
+		return Error::kFunctionFailed;
+	}
+	c.m_descriptor.m_d3dShaderBindingTableRecordConstantsSize =
+		max(a.m_descriptor.m_d3dShaderBindingTableRecordConstantsSize, b.m_descriptor.m_d3dShaderBindingTableRecordConstantsSize);
+
 	c.m_descriptor.m_hasVkBindlessDescriptorSet = a.m_descriptor.m_hasVkBindlessDescriptorSet || b.m_descriptor.m_hasVkBindlessDescriptorSet;
 
 	c.m_vertex.m_vkVertexAttributeLocations =

+ 1 - 0
AnKi/Gr/Common.h

@@ -987,6 +987,7 @@ public:
 	Array<U8, kMaxRegisterSpaces> m_bindingCounts = {};
 
 	U32 m_fastConstantsSize = 0;
+	U32 m_d3dShaderBindingTableRecordConstantsSize = 0;
 
 	Bool m_hasVkBindlessDescriptorSet = false; ///< Filled by the shader compiler.
 	U8 m_vkBindlessDescriptorSet = kMaxU8; ///< Filled by the VK backend.

+ 1 - 1
AnKi/Gr/Texture.h

@@ -294,7 +294,7 @@ public:
 	{
 	}
 
-	explicit TextureView(const Texture* tex, const TextureSubresourceDesc& subresource)
+	explicit TextureView(const Texture* tex, const TextureSubresourceDesc& subresource = TextureSubresourceDesc::all())
 		: m_tex(tex)
 		, m_subresource(subresource)
 	{

+ 17 - 0
AnKi/ShaderCompiler/Dxc.cpp

@@ -392,6 +392,23 @@ Error doReflectionDxil(ConstWeakArray<U8> dxil, ShaderType type, ShaderReflectio
 
 					continue;
 				}
+				else if(bindDesc.Space == 3001 && bindDesc.BindPoint == 0)
+				{
+					// It's SBT consts
+
+					if(!isLib)
+					{
+						// Ignore
+						continue;
+					}
+
+					ID3D12ShaderReflectionConstantBuffer* cbuffer = funcReflections[ifunc]->GetConstantBufferByName(bindDesc.Name);
+					D3D12_SHADER_BUFFER_DESC desc;
+					ANKI_DXC_CHECK(cbuffer->GetDesc(&desc));
+					refl.m_descriptor.m_d3dShaderBindingTableRecordConstantsSize = desc.Size;
+
+					continue;
+				}
 
 				akBinding.m_type = DescriptorType::kConstantBuffer;
 			}

+ 74 - 12
Tests/Gr/Gr.cpp

@@ -2605,10 +2605,19 @@ struct [raypayload] Payload
 	float3 m_color : write(closesthit, miss, caller) : read(caller);
 };
 
+struct SbtConsts
+{
+	float3 m_color;
+};
+
+[[vk::shader_record_ext]] ConstantBuffer<SbtConsts> g_sbtConsts : register(b0);
+
 [shader("closesthit")] void main(inout Payload payload : SV_RayPayload, in Barycentrics barycentrics : SV_IntersectionAttributes)
 {
 	const float3 bary = float3(1.0 - barycentrics.m_value.x - barycentrics.m_value.y, barycentrics.m_value.x, barycentrics.m_value.y);
-	payload.m_color = bary * COLOR_SCALE;
+	float3 c = bary * COLOR_SCALE;
+	float factor = max(c.x, max(c.y, c.z));
+	payload.m_color = lerp(g_sbtConsts.m_color, c, saturate(factor));
 })";
 
 			constexpr const Char* kMiss = R"(
@@ -2679,8 +2688,8 @@ RWTexture2D<float4> g_uav : register(u0);
 			ShaderPtr chit1Shader = createShader(kCHit, ShaderType::kClosestHit, Array<CString, 1>{"-DCOLOR_SCALE=float4(1, 0, 0, 0)"});
 			ShaderPtr chit2Shader = createShader(kCHit, ShaderType::kClosestHit, Array<CString, 1>{"-DCOLOR_SCALE=float4(0, 0, 1, 0)"});
 			ShaderPtr missShader = createShader(kMiss, ShaderType::kMiss);
-			ShaderPtr raygen1Shader = createShader(kRaygen, ShaderType::kRayGen, Array<CString, 1>{"-DCOLOR_BIAS=float4(0.5, 0, 0, 0)"});
-			ShaderPtr raygen2Shader = createShader(kRaygen, ShaderType::kRayGen, Array<CString, 1>{"-DCOLOR_BIAS=float4(0, 0.5, 0, 0)"});
+			ShaderPtr raygen1Shader = createShader(kRaygen, ShaderType::kRayGen, Array<CString, 1>{"-DCOLOR_BIAS=float4(1, 1, 1, 0)"});
+			ShaderPtr raygen2Shader = createShader(kRaygen, ShaderType::kRayGen, Array<CString, 1>{"-DCOLOR_BIAS=float4(0, 0, 0, 0)"});
 
 			ShaderProgramInitInfo inf;
 			Array<Shader*, 2> raygenArr = {raygen1Shader.get(), raygen2Shader.get()};
@@ -2697,11 +2706,12 @@ RWTexture2D<float4> g_uav : register(u0);
 		U32 sbtRecordSize;
 		{
 			const U32 handleSize = GrManager::getSingleton().getDeviceCapabilities().m_shaderGroupHandleSize;
-			sbtRecordSize = getAlignedRoundUp(GrManager::getSingleton().getDeviceCapabilities().m_sbtRecordAlignment, handleSize);
+			sbtRecordSize = getAlignedRoundUp(GrManager::getSingleton().getDeviceCapabilities().m_sbtRecordAlignment, handleSize + sizeof(Vec3));
 
 			ConstWeakArray<U8> handles = prog->getShaderGroupHandles();
 
-			const Array<U32, 4> copyHandles = {1, 2, 3, 4};
+			const Array<U32, 4> copyHandles = {0, 2, 3, 4};
+			const Array<Vec3, 4> colors = {Vec3(0.0f), Vec3(0.0f), Vec3(0.0f, 1.0f, 0.0f), Vec3(1.0f, 0.0f, 0.0f)};
 
 			DynamicArray<U8> sbtData;
 			sbtData.resize(copyHandles.getSize() * sbtRecordSize, 0);
@@ -2710,6 +2720,7 @@ RWTexture2D<float4> g_uav : register(u0);
 			for(U32 handleIdx : copyHandles)
 			{
 				memcpy(sbtData.getBegin() + sbtRecordSize * count, handles.getBegin() + handleSize * handleIdx, handleSize);
+				memcpy(sbtData.getBegin() + sbtRecordSize * count + handleSize, &colors[count], sizeof(Vec3));
 				++count;
 			}
 
@@ -2759,6 +2770,38 @@ RWTexture2D<float4> g_uav : register(u0);
 			GrManager::getSingleton().submit(cmdb.get());
 		}
 
+		// UAV
+		TexturePtr uav;
+		{
+			TextureInitInfo texInit;
+			texInit.m_width = kWidth;
+			texInit.m_height = kHeight;
+			texInit.m_format = Format::kR8G8B8A8_Unorm;
+			texInit.m_usage = TextureUsageBit::kAllUav | TextureUsageBit::kAllSrv;
+			uav = GrManager::getSingleton().newTexture(texInit);
+		}
+
+		// Prog to blit to swapchain
+		ShaderProgramPtr blitProg;
+		{
+			constexpr const Char* kVertSrc = R"(
+float4 main(uint svVertexId : SV_VERTEXID) : SV_POSITION
+{
+	const float2 coord = float2(svVertexId >> 1, svVertexId & 1);
+	return float4(coord * float2(4.0, -4.0) + float2(-1.0, 1.0), 0.0, 1.0);
+})";
+
+			CString kPixelSrc = R"(
+Texture2D g_srv : register(t0);
+
+float4 main(float4 svPosition : SV_POSITION) : SV_TARGET0
+{
+	return g_srv[svPosition.xy];
+})";
+
+			blitProg = createVertFragProg(kVertSrc, kPixelSrc);
+		}
+
 		// Draw
 		constexpr U32 kIterations = 200;
 		for(U i = 0; i < kIterations; ++i)
@@ -2776,6 +2819,12 @@ RWTexture2D<float4> g_uav : register(u0);
 			cinit.m_flags = CommandBufferFlag::kGeneralWork | CommandBufferFlag::kSmallBatch;
 			CommandBufferPtr cmdb = GrManager::getSingleton().newCommandBuffer(cinit);
 
+			TextureBarrierInfo barr;
+			barr.m_textureView = TextureView(uav.get());
+			barr.m_previousUsage = (i == 0) ? TextureUsageBit::kNone : TextureUsageBit::kSrvPixel;
+			barr.m_nextUsage = TextureUsageBit::kUavTraceRays;
+			cmdb->setPipelineBarrier({&barr, 1}, {}, {});
+
 			cmdb->bindShaderProgram(prog.get());
 			struct Consts
 			{
@@ -2791,19 +2840,32 @@ RWTexture2D<float4> g_uav : register(u0);
 			cmdb->setFastConstants(&consts, sizeof(consts));
 
 			cmdb->bindSrv(0, 0, tlas.get());
+			cmdb->bindUav(0, 0, TextureView(uav.get()));
 
-			TexturePtr presentTex = GrManager::getSingleton().acquireNextPresentableTexture();
-			cmdb->bindUav(0, 0, TextureView(presentTex.get(), TextureSubresourceDesc::all()));
+			cmdb->traceRays(BufferView(sbt.get()), sbtRecordSize, 2, 1, kWidth, kHeight, 1);
 
-			TextureBarrierInfo barr;
-			barr.m_textureView = TextureView(presentTex.get(), TextureSubresourceDesc::all());
+			barr.m_previousUsage = TextureUsageBit::kUavTraceRays;
+			barr.m_nextUsage = TextureUsageBit::kSrvPixel;
+			cmdb->setPipelineBarrier({&barr, 1}, {}, {});
+
+			// Blit to swapchain
+			TexturePtr presentTex = GrManager::getSingleton().acquireNextPresentableTexture();
+			barr.m_textureView = TextureView(presentTex.get());
 			barr.m_previousUsage = TextureUsageBit::kNone;
-			barr.m_nextUsage = TextureUsageBit::kUavTraceRays;
+			barr.m_nextUsage = TextureUsageBit::kRtvDsvWrite;
 			cmdb->setPipelineBarrier({&barr, 1}, {}, {});
 
-			cmdb->traceRays(BufferView(sbt.get()), sbtRecordSize, 2, 1, kWidth, kHeight, 1);
+			cmdb->beginRenderPass({TextureView(presentTex.get())});
 
-			barr.m_previousUsage = TextureUsageBit::kUavTraceRays;
+			cmdb->setViewport(0, 0, kWidth, kHeight);
+			cmdb->bindSrv(0, 0, TextureView(uav.get()));
+			cmdb->bindShaderProgram(blitProg.get());
+
+			cmdb->draw(PrimitiveTopology::kTriangles, 3);
+
+			cmdb->endRenderPass();
+
+			barr.m_previousUsage = TextureUsageBit::kRtvDsvWrite;
 			barr.m_nextUsage = TextureUsageBit::kPresent;
 			cmdb->setPipelineBarrier({&barr, 1}, {}, {});