Bläddra i källkod

switching some ssbos to ubos. 4FPS bump in an aging geforce 560

Panagiotis Christopoulos Charitos 9 år sedan
förälder
incheckning
0a650e45dc
5 ändrade filer med 36 tillägg och 35 borttagningar
  1. 2 2
      include/anki/gr/Common.h
  2. 3 2
      shaders/Common.glsl
  3. 14 14
      shaders/LightResources.glsl
  4. 6 6
      src/renderer/Fs.cpp
  5. 11 11
      src/renderer/Is.cpp

+ 2 - 2
include/anki/gr/Common.h

@@ -107,8 +107,8 @@ const U MAX_COLOR_ATTACHMENTS = 4;
 const U MAX_MIPMAPS = 16;
 const U MAX_TEXTURE_LAYERS = 32;
 const U MAX_TEXTURE_BINDINGS = 10;
-const U MAX_UNIFORM_BUFFER_BINDINGS = 1;
-const U MAX_STORAGE_BUFFER_BINDINGS = 8;
+const U MAX_UNIFORM_BUFFER_BINDINGS = 4;
+const U MAX_STORAGE_BUFFER_BINDINGS = 4;
 const U MAX_ATOMIC_BUFFER_BINDINGS = 1;
 const U MAX_FRAMES_IN_FLIGHT = 3;
 const U MAX_RESOURCE_GROUPS = 2;

+ 3 - 2
shaders/Common.glsl

@@ -23,14 +23,15 @@ precision DEFAULT_FLOAT_PRECISION int;
 
 const float EPSILON = 0.000001;
 const float PI = 3.14159265358979323846;
+const uint UBO_MAX_SIZE = 16384;
 
 // Read from a render target texture
 //#define textureRt(tex_, texc_) texture(tex_, texc_)
 #define textureRt(tex_, texc_) textureLod(tex_, texc_, 0.0)
 
 // Binding
-#define UBO_BINDING(slot_, binding_) binding = slot_ * 1 + binding_
-#define SS_BINDING(slot_, binding_) binding = slot_ * 8 + binding_
+#define UBO_BINDING(slot_, binding_) binding = slot_ * 4 + binding_
+#define SS_BINDING(slot_, binding_) binding = slot_ * 4 + binding_
 #define TEX_BINDING(slot_, binding_) binding = slot_ * 10 + binding_
 #define ATOMIC_BINDING(slot_, binding_) binding = slot_ * 1 + binding_
 

+ 14 - 14
shaders/LightResources.glsl

@@ -49,40 +49,40 @@ struct ReflectionProbe
 };
 
 layout(
-	std140, row_major, UBO_BINDING(LIGHT_SET, LIGHT_UBO_BINDING)) uniform ubo0_
+	std140, row_major, UBO_BINDING(LIGHT_SET, LIGHT_UBO_BINDING)) uniform u0_
 {
 	LightingUniforms u_lightingUniforms;
 };
 
 #ifdef FRAGMENT_SHADER
 
-layout(std140, SS_BINDING(LIGHT_SET, LIGHT_SS_BINDING + 0)) readonly buffer _s1
+layout(std140, UBO_BINDING(LIGHT_SET, LIGHT_UBO_BINDING + 1)) uniform u1_
 {
-	PointLight u_pointLights[];
+	PointLight u_pointLights[UBO_MAX_SIZE / (3 * 4 * 4)];
 };
 
-layout(SS_BINDING(LIGHT_SET, LIGHT_SS_BINDING + 1),
+layout(UBO_BINDING(LIGHT_SET, LIGHT_UBO_BINDING + 2),
 	std140,
-	row_major) readonly buffer _s2
+	row_major) uniform u2_
 {
-	SpotLight u_spotLights[];
+	SpotLight u_spotLights[UBO_MAX_SIZE / (9 * 4 * 4)];
 };
 
-layout(SS_BINDING(LIGHT_SET, LIGHT_SS_BINDING + 2), std430) readonly buffer _s3
+layout(std140,
+	row_major,
+	UBO_BINDING(LIGHT_SET, LIGHT_UBO_BINDING + 3)) uniform u3_
 {
-	uint u_clusters[];
+	ReflectionProbe u_reflectionProbes[UBO_MAX_SIZE / (2 * 4 * 4)];
 };
 
-layout(std430, SS_BINDING(LIGHT_SET, LIGHT_SS_BINDING + 3)) readonly buffer _s4
+layout(SS_BINDING(LIGHT_SET, LIGHT_SS_BINDING + 0), std430) readonly buffer s0_
 {
-	uint u_lightIndices[];
+	uint u_clusters[];
 };
 
-layout(std140,
-	row_major,
-	SS_BINDING(LIGHT_SET, LIGHT_SS_BINDING + 4)) readonly buffer _s5
+layout(std430, SS_BINDING(LIGHT_SET, LIGHT_SS_BINDING + 1)) readonly buffer s1_
 {
-	ReflectionProbe u_reflectionProbes[];
+	uint u_lightIndices[];
 };
 
 layout(TEX_BINDING(LIGHT_SET,

+ 6 - 6
src/renderer/Fs.cpp

@@ -57,11 +57,11 @@ Error Fs::init(const ConfigSet&)
 		}
 
 		init.m_uniformBuffers[0].m_dynamic = true;
+		init.m_uniformBuffers[1].m_dynamic = true;
+		init.m_uniformBuffers[2].m_dynamic = true;
 
 		init.m_storageBuffers[0].m_dynamic = true;
 		init.m_storageBuffers[1].m_dynamic = true;
-		init.m_storageBuffers[2].m_dynamic = true;
-		init.m_storageBuffers[3].m_dynamic = true;
 
 		m_globalResources = getGrManager().newInstance<ResourceGroup>(init);
 	}
@@ -75,11 +75,11 @@ void Fs::prepareBuildCommandBuffers(RenderingContext& ctx)
 {
 	DynamicBufferInfo& dyn = ctx.m_fs.m_set1DynInfo;
 	dyn.m_uniformBuffers[0] = m_r->getIs().getCommonVarsToken();
+	dyn.m_uniformBuffers[1] = m_r->getIs().getPointLightsToken();
+	dyn.m_uniformBuffers[2] = m_r->getIs().getSpotLightsToken();
 
-	dyn.m_storageBuffers[0] = m_r->getIs().getPointLightsToken();
-	dyn.m_storageBuffers[1] = m_r->getIs().getSpotLightsToken();
-	dyn.m_storageBuffers[2] = m_r->getIs().getClustersToken();
-	dyn.m_storageBuffers[3] = m_r->getIs().getLightIndicesToken();
+	dyn.m_storageBuffers[0] = m_r->getIs().getClustersToken();
+	dyn.m_storageBuffers[1] = m_r->getIs().getLightIndicesToken();
 }
 
 //==============================================================================

+ 11 - 11
src/renderer/Is.cpp

@@ -455,12 +455,12 @@ Error Is::initInternal(const ConfigSet& config)
 		}
 
 		init.m_uniformBuffers[0].m_dynamic = true;
+		init.m_uniformBuffers[1].m_dynamic = true;
+		init.m_uniformBuffers[2].m_dynamic = true;
+		init.m_uniformBuffers[3].m_dynamic = true;
 
 		init.m_storageBuffers[0].m_dynamic = true;
 		init.m_storageBuffers[1].m_dynamic = true;
-		init.m_storageBuffers[2].m_dynamic = true;
-		init.m_storageBuffers[3].m_dynamic = true;
-		init.m_storageBuffers[4].m_dynamic = true;
 
 		m_rcGroup = getGrManager().newInstance<ResourceGroup>(init);
 	}
@@ -508,7 +508,7 @@ Error Is::populateBuffers(RenderingContext& ctx)
 		ShaderPointLight* data = static_cast<ShaderPointLight*>(
 			getGrManager().allocateFrameHostVisibleMemory(
 				sizeof(ShaderPointLight) * visiblePointLightsCount,
-				BufferUsage::STORAGE,
+				BufferUsage::UNIFORM,
 				m_pLightsToken));
 
 		taskData.m_pointLights =
@@ -528,7 +528,7 @@ Error Is::populateBuffers(RenderingContext& ctx)
 		ShaderSpotLight* data = static_cast<ShaderSpotLight*>(
 			getGrManager().allocateFrameHostVisibleMemory(
 				sizeof(ShaderSpotLight) * visibleSpotLightsCount,
-				BufferUsage::STORAGE,
+				BufferUsage::UNIFORM,
 				m_sLightsToken));
 
 		taskData.m_spotLights =
@@ -548,7 +548,7 @@ Error Is::populateBuffers(RenderingContext& ctx)
 		ShaderProbe* data = static_cast<ShaderProbe*>(
 			getGrManager().allocateFrameHostVisibleMemory(
 				sizeof(ShaderProbe) * visibleProbeCount,
-				BufferUsage::STORAGE,
+				BufferUsage::UNIFORM,
 				m_probesToken));
 
 		taskData.m_probes = SArray<ShaderProbe>(data, visibleProbeCount);
@@ -963,12 +963,12 @@ void Is::setState(CommandBufferPtr& cmdb)
 
 	DynamicBufferInfo dyn;
 	dyn.m_uniformBuffers[0] = m_commonVarsToken;
+	dyn.m_uniformBuffers[1] = m_pLightsToken;
+	dyn.m_uniformBuffers[2] = m_sLightsToken;
+	dyn.m_uniformBuffers[3] = m_probesToken;
 
-	dyn.m_storageBuffers[0] = m_pLightsToken;
-	dyn.m_storageBuffers[1] = m_sLightsToken;
-	dyn.m_storageBuffers[2] = m_clustersToken;
-	dyn.m_storageBuffers[3] = m_lightIdsToken;
-	dyn.m_storageBuffers[4] = m_probesToken;
+	dyn.m_storageBuffers[0] = m_clustersToken;
+	dyn.m_storageBuffers[1] = m_lightIdsToken;
 
 	cmdb->bindResourceGroup(m_rcGroup, 0, &dyn);
 }