Browse Source

Fix bug in drawcall merging

Panagiotis Christopoulos Charitos 8 years ago
parent
commit
bac3d59712
1 changed files with 41 additions and 33 deletions
  1. 41 33
      src/anki/renderer/Drawer.cpp

+ 41 - 33
src/anki/renderer/Drawer.cpp

@@ -18,9 +18,43 @@
 namespace anki
 namespace anki
 {
 {
 
 
+class CompleteRenderingBuildInfo
+{
+public:
+	F32 m_flod = 0.0;
+	RenderComponent* m_rc = nullptr;
+	RenderingBuildInfoIn m_in;
+	RenderingBuildInfoOut m_out;
+};
+
+/// Drawer's context
+class DrawContext
+{
+public:
+	Pass m_pass;
+	Mat4 m_viewMat;
+	Mat4 m_viewProjMat;
+	CommandBufferPtr m_cmdb;
+
+	const VisibleNode* m_visibleNode = nullptr;
+
+	Array<Mat4, MAX_INSTANCES> m_cachedTrfs;
+	U m_cachedTrfCount = 0;
+
+	StagingGpuMemoryToken m_uboToken;
+
+	U m_nodeProcessedCount = 0;
+
+	Array<CompleteRenderingBuildInfo, 2> m_buildInfo;
+	U m_crntBuildInfo = 0;
+};
+
 /// Check if the drawcalls can be merged.
 /// Check if the drawcalls can be merged.
-static Bool canMergeBuildInfo(const RenderingBuildInfoOut& a, const RenderingBuildInfoOut& b)
+static Bool canMergeBuildInfo(const CompleteRenderingBuildInfo& abi, const CompleteRenderingBuildInfo& bbi)
 {
 {
+	const RenderingBuildInfoOut& a = abi.m_out;
+	const RenderingBuildInfoOut& b = bbi.m_out;
+
 	if(!a.m_hasTransform || !b.m_hasTransform)
 	if(!a.m_hasTransform || !b.m_hasTransform)
 	{
 	{
 		// Cannot merge if there is no transform
 		// Cannot merge if there is no transform
@@ -29,6 +63,11 @@ static Bool canMergeBuildInfo(const RenderingBuildInfoOut& a, const RenderingBui
 
 
 	ANKI_ASSERT(a.m_hasTransform == b.m_hasTransform);
 	ANKI_ASSERT(a.m_hasTransform == b.m_hasTransform);
 
 
+	if(abi.m_rc->getMaterial().getUuid() != bbi.m_rc->getMaterial().getUuid())
+	{
+		return false;
+	}
+
 	if(a.m_program != b.m_program)
 	if(a.m_program != b.m_program)
 	{
 	{
 		return false;
 		return false;
@@ -106,37 +145,6 @@ static void resetRenderingBuildInfoOut(RenderingBuildInfoOut& b)
 	b.m_topology = PrimitiveTopology::TRIANGLES;
 	b.m_topology = PrimitiveTopology::TRIANGLES;
 }
 }
 
 
-class CompleteRenderingBuildInfo
-{
-public:
-	F32 m_flod = 0.0;
-	RenderComponent* m_rc = nullptr;
-	RenderingBuildInfoIn m_in;
-	RenderingBuildInfoOut m_out;
-};
-
-/// Drawer's context
-class DrawContext
-{
-public:
-	Pass m_pass;
-	Mat4 m_viewMat;
-	Mat4 m_viewProjMat;
-	CommandBufferPtr m_cmdb;
-
-	const VisibleNode* m_visibleNode = nullptr;
-
-	Array<Mat4, MAX_INSTANCES> m_cachedTrfs;
-	U m_cachedTrfCount = 0;
-
-	StagingGpuMemoryToken m_uboToken;
-
-	U m_nodeProcessedCount = 0;
-
-	Array<CompleteRenderingBuildInfo, 2> m_buildInfo;
-	U m_crntBuildInfo = 0;
-};
-
 RenderableDrawer::~RenderableDrawer()
 RenderableDrawer::~RenderableDrawer()
 {
 {
 }
 }
@@ -453,7 +461,7 @@ Error RenderableDrawer::drawSingle(DrawContext& ctx)
 			ctx.m_cachedTrfs[ctx.m_cachedTrfCount++] = crntBuild.m_out.m_transform;
 			ctx.m_cachedTrfs[ctx.m_cachedTrfCount++] = crntBuild.m_out.m_transform;
 		}
 		}
 	}
 	}
-	else if(crntBuild.m_out.m_hasTransform && canMergeBuildInfo(crntBuild.m_out, prevBuild.m_out)
+	else if(crntBuild.m_out.m_hasTransform && canMergeBuildInfo(crntBuild, prevBuild)
 		&& ctx.m_cachedTrfCount < MAX_INSTANCES - 1)
 		&& ctx.m_cachedTrfCount < MAX_INSTANCES - 1)
 	{
 	{
 		// Can merge, will cache the drawcall and skip the drawcall
 		// Can merge, will cache the drawcall and skip the drawcall