Browse Source

Increase the UGB default size and because of that change how some parts of UGB are read from shaders

Panagiotis Christopoulos Charitos 2 months ago
parent
commit
68f34622b0

+ 1 - 1
AnKi/GpuMemory/UnifiedGeometryBuffer.h

@@ -14,7 +14,7 @@ namespace anki {
 /// @addtogroup gpu_memory
 /// @{
 
-ANKI_CVAR(NumericCVar<PtrSize>, Core, UnifiedGeometryBufferSize, 128_MB, 16_MB, 2_GB, "Global index and vertex buffer size")
+ANKI_CVAR(NumericCVar<PtrSize>, Core, UnifiedGeometryBufferSize, 256_MB, 16_MB, 2_GB, "Global index and vertex buffer size")
 
 /// @memberof UnifiedGeometryBuffer
 class UnifiedGeometryBufferAllocation

+ 1 - 0
AnKi/Renderer/IndirectDiffuse.cpp

@@ -148,6 +148,7 @@ void IndirectDiffuse::populateRenderGraph(RenderingContext& ctx)
 			cmdb.bindSrv(ANKI_MATERIAL_REGISTER_MESH_LODS, 0, GpuSceneArrays::MeshLod::getSingleton().getBufferView());
 			cmdb.bindSrv(ANKI_MATERIAL_REGISTER_TRANSFORMS, 0, GpuSceneArrays::Transform::getSingleton().getBufferView());
 
+			cmdb.bindSrv(ANKI_MATERIAL_REGISTER_UNIFIED_GEOMETRY_START, 0, UnifiedGeometryBuffer::getSingleton().getBufferView());
 #define ANKI_UNIFIED_GEOM_FORMAT(fmt, shaderType, reg) \
 	cmdb.bindSrv( \
 		reg, 0, \

+ 3 - 1
AnKi/Renderer/IndirectDiffuseClipmaps.cpp

@@ -482,6 +482,7 @@ void IndirectDiffuseClipmaps::populateRenderGraph(RenderingContext& ctx)
 				cmdb.bindSrv(ANKI_MATERIAL_REGISTER_MESH_LODS, 0, GpuSceneArrays::MeshLod::getSingleton().getBufferView());
 				cmdb.bindSrv(ANKI_MATERIAL_REGISTER_TRANSFORMS, 0, GpuSceneArrays::Transform::getSingleton().getBufferView());
 
+				cmdb.bindSrv(ANKI_MATERIAL_REGISTER_UNIFIED_GEOMETRY_START, 0, UnifiedGeometryBuffer::getSingleton().getBufferView());
 #define ANKI_UNIFIED_GEOM_FORMAT(fmt, shaderType, reg) \
 	cmdb.bindSrv( \
 		reg, 0, \
@@ -700,6 +701,7 @@ void IndirectDiffuseClipmaps::populateRenderGraph(RenderingContext& ctx)
 			cmdb.bindSrv(ANKI_MATERIAL_REGISTER_MESH_LODS, 0, GpuSceneArrays::MeshLod::getSingleton().getBufferView());
 			cmdb.bindSrv(ANKI_MATERIAL_REGISTER_TRANSFORMS, 0, GpuSceneArrays::Transform::getSingleton().getBufferView());
 
+			cmdb.bindSrv(ANKI_MATERIAL_REGISTER_UNIFIED_GEOMETRY_START, 0, UnifiedGeometryBuffer::getSingleton().getBufferView());
 #define ANKI_UNIFIED_GEOM_FORMAT(fmt, shaderType, reg) \
 	cmdb.bindSrv( \
 		reg, 0, \
@@ -855,7 +857,7 @@ void IndirectDiffuseClipmaps::drawDebugProbes(const RenderingContext& ctx, Rende
 
 	cmdb.bindConstantBuffer(0, 0, ctx.m_globalRenderingConstantsBuffer);
 
-	const RenderTargetHandle visVolume = m_runCtx.m_handles.m_avgIrradianceVolumes[clipmap];
+	const RenderTargetHandle visVolume = m_runCtx.m_handles.m_radianceVolumes[clipmap];
 	rgraphCtx.bindSrv(0, 0, visVolume);
 	rgraphCtx.bindSrv(1, 0, m_runCtx.m_handles.m_probeValidityVolumes[clipmap]);
 	cmdb.bindSampler(0, 0, getRenderer().getSamplers().m_trilinearRepeat.get());

+ 1 - 0
AnKi/Renderer/Reflections.cpp

@@ -301,6 +301,7 @@ void Reflections::populateRenderGraph(RenderingContext& ctx)
 			cmdb.bindSrv(ANKI_MATERIAL_REGISTER_MESH_LODS, 0, GpuSceneArrays::MeshLod::getSingleton().getBufferView());
 			cmdb.bindSrv(ANKI_MATERIAL_REGISTER_TRANSFORMS, 0, GpuSceneArrays::Transform::getSingleton().getBufferView());
 
+			cmdb.bindSrv(ANKI_MATERIAL_REGISTER_UNIFIED_GEOMETRY_START, 0, UnifiedGeometryBuffer::getSingleton().getBufferView());
 #define ANKI_UNIFIED_GEOM_FORMAT(fmt, shaderType, reg) \
 	cmdb.bindSrv( \
 		reg, 0, \

+ 1 - 0
AnKi/Renderer/RtMaterialFetchDbg.cpp

@@ -86,6 +86,7 @@ void RtMaterialFetchDbg::populateRenderGraph(RenderingContext& ctx)
 			cmdb.bindSrv(ANKI_MATERIAL_REGISTER_MESH_LODS, 0, GpuSceneArrays::MeshLod::getSingleton().getBufferView());
 			cmdb.bindSrv(ANKI_MATERIAL_REGISTER_TRANSFORMS, 0, GpuSceneArrays::Transform::getSingleton().getBufferView());
 
+			cmdb.bindSrv(ANKI_MATERIAL_REGISTER_UNIFIED_GEOMETRY_START, 0, UnifiedGeometryBuffer::getSingleton().getBufferView());
 #define ANKI_UNIFIED_GEOM_FORMAT(fmt, shaderType, reg) \
 	cmdb.bindSrv( \
 		reg, 0, \

+ 1 - 0
AnKi/Renderer/RtShadows.cpp

@@ -297,6 +297,7 @@ void RtShadows::populateRenderGraph(RenderingContext& ctx)
 			cmdb.bindSampler(ANKI_MATERIAL_REGISTER_TILINEAR_REPEAT_SAMPLER, 0, getRenderer().getSamplers().m_trilinearRepeat.get());
 			cmdb.bindSrv(ANKI_MATERIAL_REGISTER_GPU_SCENE, 0, GpuSceneBuffer::getSingleton().getBufferView());
 
+			cmdb.bindSrv(ANKI_MATERIAL_REGISTER_UNIFIED_GEOMETRY_START, 0, UnifiedGeometryBuffer::getSingleton().getBufferView());
 #define ANKI_UNIFIED_GEOM_FORMAT(fmt, shaderType, reg) \
 	cmdb.bindSrv( \
 		reg, 0, \

+ 1 - 0
AnKi/Renderer/Utils/Drawer.cpp

@@ -51,6 +51,7 @@ void RenderableDrawer::setState(const RenderableDrawerArguments& args, CommandBu
 	cmdb.bindSampler(ANKI_MATERIAL_REGISTER_TILINEAR_REPEAT_SAMPLER, 0, args.m_sampler);
 	cmdb.bindSrv(ANKI_MATERIAL_REGISTER_GPU_SCENE, 0, GpuSceneBuffer::getSingleton().getBufferView());
 
+	cmdb.bindSrv(ANKI_MATERIAL_REGISTER_UNIFIED_GEOMETRY_START, 0, UnifiedGeometryBuffer::getSingleton().getBufferView());
 #define ANKI_UNIFIED_GEOM_FORMAT(fmt, shaderType, reg) \
 	cmdb.bindSrv( \
 		reg, 0, \

+ 2 - 1
AnKi/Shaders/ForwardShadingParticles.ankiprog

@@ -42,7 +42,8 @@ VertOut main(VertIn input)
 	const GpuSceneMeshLod meshLod = g_meshLods[instance.m_meshLodIndex];
 
 	const U32 particleId = input.m_svVertexId / meshLod.m_indexCount;
-	const U32 vertexId = g_unifiedGeom_R16_Uint[meshLod.m_firstIndex + input.m_svVertexId % meshLod.m_indexCount];
+
+	const U32 vertexId = g_unifiedGeom.Load<U16>((meshLod.m_firstIndex + input.m_svVertexId % meshLod.m_indexCount) * sizeof(U16));
 
 	U32 idx = particles.m_vertexOffsets[(U32)VertexStreamId::kParticlePosition] + particleId * sizeof(Vec3);
 	const Vec3 particlePos = g_gpuScene.Load<Vec3>(idx);

+ 8 - 14
AnKi/Shaders/GBufferGeneric.ankiprog

@@ -638,13 +638,10 @@ ANKI_SHADER_RECORD_CONSTANTS(GpuSceneRenderableInstance, g_gpuSceneRenderable)
 
 	const GpuSceneMeshLod mesh = g_meshLods[g_gpuSceneRenderable.m_meshLodIndex];
 
-	const U32 idx0 = g_unifiedGeom_R16_Uint[mesh.m_firstIndex + PrimitiveIndex() * 3 + 0];
-	const U32 idx1 = g_unifiedGeom_R16_Uint[mesh.m_firstIndex + PrimitiveIndex() * 3 + 1];
-	const U32 idx2 = g_unifiedGeom_R16_Uint[mesh.m_firstIndex + PrimitiveIndex() * 3 + 2];
-
-	const UnpackedMeshVertex vert0 = loadVertex(mesh, idx0, false);
-	const UnpackedMeshVertex vert1 = loadVertex(mesh, idx1, false);
-	const UnpackedMeshVertex vert2 = loadVertex(mesh, idx2, false);
+	const U16Vec3 indices = g_unifiedGeom.Load<U16Vec3>(mesh.m_firstIndex * sizeof(U16) + PrimitiveIndex() * sizeof(U16Vec3));
+	const UnpackedMeshVertex vert0 = loadVertex(mesh, indices[0], false);
+	const UnpackedMeshVertex vert1 = loadVertex(mesh, indices[1], false);
+	const UnpackedMeshVertex vert2 = loadVertex(mesh, indices[2], false);
 
 	const Vec2 uv = vert0.m_uv * bary.x + vert1.m_uv * bary.y + vert2.m_uv * bary.z;
 
@@ -702,13 +699,10 @@ ANKI_SHADER_RECORD_CONSTANTS(GpuSceneRenderableInstance, g_gpuSceneRenderable)
 
 		const GpuSceneMeshLod mesh = g_meshLods[g_gpuSceneRenderable.m_meshLodIndex];
 
-		const U32 idx0 = g_unifiedGeom_R16_Uint[mesh.m_firstIndex + PrimitiveIndex() * 3 + 0];
-		const U32 idx1 = g_unifiedGeom_R16_Uint[mesh.m_firstIndex + PrimitiveIndex() * 3 + 1];
-		const U32 idx2 = g_unifiedGeom_R16_Uint[mesh.m_firstIndex + PrimitiveIndex() * 3 + 2];
-
-		const UnpackedMeshVertex vert0 = loadVertex(mesh, idx0, false);
-		const UnpackedMeshVertex vert1 = loadVertex(mesh, idx1, false);
-		const UnpackedMeshVertex vert2 = loadVertex(mesh, idx2, false);
+		const U16Vec3 indices = g_unifiedGeom.Load<U16Vec3>(mesh.m_firstIndex * sizeof(U16) + PrimitiveIndex() * sizeof(U16Vec3));
+		const UnpackedMeshVertex vert0 = loadVertex(mesh, indices[0], false);
+		const UnpackedMeshVertex vert1 = loadVertex(mesh, indices[1], false);
+		const UnpackedMeshVertex vert2 = loadVertex(mesh, indices[2], false);
 
 		uv = vert0.m_uv * bary.x + vert1.m_uv * bary.y + vert2.m_uv * bary.z;
 

+ 2 - 6
AnKi/Shaders/Include/UnifiedGeometryTypes.def.h

@@ -9,8 +9,8 @@
 #	define ANKI_UNIFIED_GEOM_FORMAT_SEPERATOR
 #endif
 
-ANKI_UNIFIED_GEOM_FORMAT(R32_Sfloat, F32, 15)
-ANKI_UNIFIED_GEOM_FORMAT_SEPERATOR
+// !!!! ALL FORMATS NEED TO BE MORE THAN 4 BYTES, else we can't address large typed buffers !!!!
+
 ANKI_UNIFIED_GEOM_FORMAT(R32G32_Sfloat, Vec2, 16)
 ANKI_UNIFIED_GEOM_FORMAT_SEPERATOR
 ANKI_UNIFIED_GEOM_FORMAT(R32G32B32_Sfloat, Vec3, 17)
@@ -22,10 +22,6 @@ ANKI_UNIFIED_GEOM_FORMAT_SEPERATOR
 ANKI_UNIFIED_GEOM_FORMAT(R8G8B8A8_Snorm, Vec4, 20)
 ANKI_UNIFIED_GEOM_FORMAT_SEPERATOR
 ANKI_UNIFIED_GEOM_FORMAT(R8G8B8A8_Uint, UVec4, 21)
-ANKI_UNIFIED_GEOM_FORMAT_SEPERATOR
-ANKI_UNIFIED_GEOM_FORMAT(R16_Uint, U32, 22)
-ANKI_UNIFIED_GEOM_FORMAT_SEPERATOR
-ANKI_UNIFIED_GEOM_FORMAT(R8_Uint, U32, 23)
 
 #undef ANKI_UNIFIED_GEOM_FORMAT
 #undef ANKI_UNIFIED_GEOM_FORMAT_SEPERATOR

+ 9 - 5
AnKi/Shaders/MaterialShadersCommon.hlsl

@@ -21,6 +21,7 @@ ConstantBuffer<MaterialGlobalConstants> g_globalConstants : register(ANKI_REG(b,
 ByteAddressBuffer g_gpuScene : register(ANKI_REG(t, ANKI_MATERIAL_REGISTER_GPU_SCENE));
 
 // Unified geom:
+ByteAddressBuffer g_unifiedGeom : register(ANKI_REG(t, ANKI_MATERIAL_REGISTER_UNIFIED_GEOMETRY_START));
 #define ANKI_UNIFIED_GEOM_FORMAT(fmt, shaderType, reg) Buffer<shaderType> g_unifiedGeom_##fmt : register(ANKI_REG(t, reg));
 #include <AnKi/Shaders/Include/UnifiedGeometryTypes.def.h>
 
@@ -61,6 +62,7 @@ Texture2D<Vec4> g_shadowAtlasTex : register(ANKI_REG(t, ANKI_MATERIAL_REGISTER_S
 
 #undef ANKI_REG
 
+/// Used in vert shading.
 UnpackedMeshVertex loadVertex(GpuSceneMeshLod mlod, U32 svVertexId, Bool bones)
 {
 	UnpackedMeshVertex v;
@@ -79,6 +81,7 @@ UnpackedMeshVertex loadVertex(GpuSceneMeshLod mlod, U32 svVertexId, Bool bones)
 	return v;
 }
 
+/// Used in mesh shading.
 UnpackedMeshVertex loadVertexLocalIndex(MeshletGeometryDescriptor meshlet, U32 localIdx, Bool bones)
 {
 	UnpackedMeshVertex v;
@@ -97,13 +100,14 @@ UnpackedMeshVertex loadVertexLocalIndex(MeshletGeometryDescriptor meshlet, U32 l
 	return v;
 }
 
+/// Used in SW meshlet rendering.
 UnpackedMeshVertex loadVertex(MeshletGeometryDescriptor meshlet, U32 svVertexId, Bool bones)
 {
-	// Indices are stored in R8G8B8A8_Uint per primitive. Last component is not used. Instead of reading 4 bytes use the code bellow to read just 1.
-	// Find prev version in an older commit
-	const U32 componentsPerPrimitive = 4u;
-	const F32 offset = floor(F32(svVertexId) / 3.0f) * F32(componentsPerPrimitive) + fmod(F32(svVertexId), 3.0f);
-	const U32 localIdx = g_unifiedGeom_R8_Uint[meshlet.m_firstPrimitive * componentsPerPrimitive + U32(offset)];
+	// Indices are stored in R8G8B8A8_Uint per primitive. Last component is not used.
+	const U32 primitiveId = svVertexId / 3u;
+	const U32 primitiveIndices = g_unifiedGeom.Load<U32>((meshlet.m_firstPrimitive + primitiveId) * sizeof(U32));
+	const U32 vertOfPrimitive = svVertexId % 3u;
+	const U32 localIdx = (primitiveIndices >> (vertOfPrimitive * 8u)) & 0xFF;
 
 	return loadVertexLocalIndex(meshlet, localIdx, bones);
 }

+ 1 - 3
AnKi/Shaders/RtMaterialFetchDbg.ankiprog

@@ -7,12 +7,10 @@
 
 #pragma anki technique RtMaterialFetch rgen
 
-#define ANKI_ASSERTIONS_ENABLED 1
-
 #include <AnKi/Shaders/RtMaterialFetch.hlsl>
 #include <AnKi/Shaders/Include/GpuSceneTypes.h>
 
-#define CHEAP 1
+#define CHEAP 0
 
 [shader("raygeneration")] void main()
 {

+ 4 - 1
AnKi/Window/NativeWindowSdl.cpp

@@ -103,7 +103,10 @@ Error NativeWindowSdl::initSdl(const NativeWindowInitInfo& init)
 
 	if(init.m_fullscreenDesktopRez)
 	{
-		flags |= SDL_WINDOW_FULLSCREEN;
+		if(init.m_exclusiveFullscreen)
+		{
+			flags |= SDL_WINDOW_FULLSCREEN;
+		}
 
 		SDL_DisplayID display = SDL_GetPrimaryDisplay();
 		if(!display)

BIN
ThirdParty/Bin/Windows64/MaliOfflineCompiler/graphics/Mali-T600_r23p0-00rel0.dll


BIN
ThirdParty/Bin/Windows64/MaliOfflineCompiler/malioc.exe