From 5c894d1731b988a568117a5c8cd7a3260a194763 Mon Sep 17 00:00:00 2001
From: Nicolas Pope <nwpope@utu.fi>
Date: Thu, 19 Mar 2020 18:30:15 +0200
Subject: [PATCH] Limit SGM memory usage

---
 components/operators/include/ftl/operators/disparity.hpp | 2 ++
 components/operators/include/ftl/operators/operator.hpp  | 2 ++
 components/operators/src/operator.cpp                    | 5 +++--
 3 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/components/operators/include/ftl/operators/disparity.hpp b/components/operators/include/ftl/operators/disparity.hpp
index 54cfa1c88..2f9a807cd 100644
--- a/components/operators/include/ftl/operators/disparity.hpp
+++ b/components/operators/include/ftl/operators/disparity.hpp
@@ -29,6 +29,8 @@ class FixstarsSGM : public ftl::operators::Operator {
 	~FixstarsSGM();
 	inline Operator::Type type() const override { return Operator::Type::OneToOne; }
 	bool apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, cudaStream_t stream) override;
+
+	bool isMemoryHeavy() const override { return true; }
 	
 	private:
 	bool init();
diff --git a/components/operators/include/ftl/operators/operator.hpp b/components/operators/include/ftl/operators/operator.hpp
index 8dee5f7b9..399adddd4 100644
--- a/components/operators/include/ftl/operators/operator.hpp
+++ b/components/operators/include/ftl/operators/operator.hpp
@@ -54,6 +54,8 @@ class Operator {
 	 */
 	virtual void wait(cudaStream_t) {}
 
+	virtual bool isMemoryHeavy() const { return false; }
+
 	inline ftl::Configurable *config() const { return config_; }
 
 	private:
diff --git a/components/operators/src/operator.cpp b/components/operators/src/operator.cpp
index 1f000e9a7..617514afd 100644
--- a/components/operators/src/operator.cpp
+++ b/components/operators/src/operator.cpp
@@ -59,14 +59,15 @@ bool Graph::apply(FrameSet &in, FrameSet &out, cudaStream_t stream) {
 			//while (i.instances.size() < in.frames.size()) {
 				//i.instances.push_back(i.maker->make());
 			//}
-			if (in.frames.size() > 1 && i.instances.size() < 2) {
+			if (in.frames.size() > 1 && i.instances.size() < 2 && !i.instances[0]->isMemoryHeavy()) {
 				i.instances.push_back(i.maker->make());
 			}
 
 			for (size_t j=0; j<in.frames.size(); ++j) {
 				if (!in.hasFrame(j)) continue;
 				
-				auto *instance = i.instances[j&0x1];
+				int iix = (i.instances[0]->isMemoryHeavy()) ? 0 : j&0x1;
+				auto *instance = i.instances[iix];
 
 				if (instance->enabled()) {
 					try {
-- 
GitLab