diff --git a/components/rgbd-sources/src/algorithms/fixstars_sgm.cpp b/components/rgbd-sources/src/algorithms/fixstars_sgm.cpp
index 6392add645026d0d6b2a62950d4e6b2beaf5d39b..c7547c76c8a30b8d36b689e579ef5a75705a7b44 100644
--- a/components/rgbd-sources/src/algorithms/fixstars_sgm.cpp
+++ b/components/rgbd-sources/src/algorithms/fixstars_sgm.cpp
@@ -51,26 +51,28 @@ void FixstarsSGM::init(const cv::Size size) {
 void FixstarsSGM::compute(	const cv::cuda::GpuMat &l, const cv::cuda::GpuMat &r,
 							cv::cuda::GpuMat &disp, cv::cuda::Stream &stream)
 {
+	GpuMat downscale_l;
+
 	if (l.size() != size_) {
-		GpuMat tmp;
-		cv::cuda::resize(l, tmp, size_, 0.0, 0.0, cv::INTER_CUBIC, stream);
-		cv::cuda::cvtColor(tmp, lbw_, cv::COLOR_BGR2GRAY, 0, stream);
+		// re-use same buffer for l/r
+		cv::cuda::resize(r, downscale_l, size_, 0.0, 0.0, cv::INTER_CUBIC, stream);
+		cv::cuda::cvtColor(downscale_l, rbw_, cv::COLOR_BGR2GRAY, 0, stream);
 
-		cv::cuda::resize(r, tmp, size_, 0.0, 0.0, cv::INTER_CUBIC, stream);
-		cv::cuda::cvtColor(tmp, rbw_, cv::COLOR_BGR2GRAY, 0, stream);
+		cv::cuda::resize(l, downscale_l, size_, 0.0, 0.0, cv::INTER_CUBIC, stream);
+		cv::cuda::cvtColor(downscale_l, lbw_, cv::COLOR_BGR2GRAY, 0, stream);
 	}
 	else {
 		cv::cuda::cvtColor(l, lbw_, cv::COLOR_BGR2GRAY, 0, stream);
 		cv::cuda::cvtColor(r, rbw_, cv::COLOR_BGR2GRAY, 0, stream);
 	}
 
+	stream.waitForCompletion();
+
 	if (!ssgm_) {
 		// issue #145 has to be fixed before can be moved into constructor
 		init(size_);
 	}
 
-	stream.waitForCompletion();
-
 	ssgm_->execute(lbw_.data, rbw_.data, dispt_.data);
 
 	GpuMat left_pixels(dispt_, cv::Rect(0, 0, max_disp_, dispt_.rows));
@@ -78,18 +80,25 @@ void FixstarsSGM::compute(	const cv::cuda::GpuMat &l, const cv::cuda::GpuMat &r,
 
 	cv::cuda::threshold(dispt_, dispt_, 4096.0f, 0.0f, cv::THRESH_TOZERO_INV, stream);
 
-	GpuMat dispt;
-	if (l.size() != size_)
-	{
-		cv::cuda::multiply(dispt_, (double) l.cols / (double)size_.width, dispt_);
+	// TODO: filter could be applied after upscaling (to the upscaled disparity image)
+	if (use_filter_) {
+		filter_->apply(dispt_,
+			l.size() != dispt_.size() ? downscale_l : l,
+			dispt_,
+			stream
+		);
+	}
 
+	GpuMat dispt;
+	if (l.size() != size_) {
+		cv::cuda::multiply(dispt_, (double)l.cols / (double)size_.width, dispt_);
 		// invalid areas (bad values) have to be taken into account in interpolation
 		cv::cuda::resize(dispt_, dispt, l.size(), 0.0, 0.0, cv::INTER_NEAREST, stream);
 	}
-	else { dispt = dispt_; }
+	else {
+		dispt = dispt_;
+	}
 
-	if (use_filter_) { filter_->apply(dispt, l, dispt, stream); }
-	
 	dispt.convertTo(disp, CV_32F, 1.0f / 16.0f, stream);
 }