From b14fb531ad9ae3d565f2cf28f5506408ab10dbed Mon Sep 17 00:00:00 2001
From: Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl>
Date: Wed, 18 Nov 2015 11:26:15 +0100
Subject: Add CompositeGeometryManager

This handles FP and BP operations on multiple data objects at once,
splitting them to fit in GPU memory where necessary.
---
 include/astra/CompositeGeometryManager.h | 150 +++++++++++++++++++++++++++++++
 1 file changed, 150 insertions(+)
 create mode 100644 include/astra/CompositeGeometryManager.h

(limited to 'include/astra/CompositeGeometryManager.h')

diff --git a/include/astra/CompositeGeometryManager.h b/include/astra/CompositeGeometryManager.h
new file mode 100644
index 0000000..a6e57f1
--- /dev/null
+++ b/include/astra/CompositeGeometryManager.h
@@ -0,0 +1,150 @@
+/*
+-----------------------------------------------------------------------
+Copyright: 2010-2015, iMinds-Vision Lab, University of Antwerp
+           2014-2015, CWI, Amsterdam
+
+Contact: astra@uantwerpen.be
+Website: http://sf.net/projects/astra-toolbox
+
+This file is part of the ASTRA Toolbox.
+
+
+The ASTRA Toolbox is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+The ASTRA Toolbox is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>.
+
+-----------------------------------------------------------------------
+*/
+
+#ifndef _INC_ASTRA_COMPOSITEGEOMETRYMANAGER
+#define _INC_ASTRA_COMPOSITEGEOMETRYMANAGER
+
+#include "Globals.h"
+
+#ifdef ASTRA_CUDA
+
+#include <list>
+#include <map>
+#include <vector>
+#include <boost/shared_ptr.hpp>
+
+
+namespace astra {
+
+class CCompositeVolume;
+class CCompositeProjections;
+class CFloat32Data3DMemory;
+class CFloat32ProjectionData3DMemory;
+class CFloat32VolumeData3DMemory;
+class CVolumeGeometry3D;
+class CProjectionGeometry3D;
+class CProjector3D;
+
+
+
+class _AstraExport CCompositeGeometryManager {
+public:
+	class CPart;
+	typedef std::list<boost::shared_ptr<CPart> > TPartList;
+	class CPart {
+	public:
+		CPart() { }
+		CPart(const CPart& other);
+		virtual ~CPart() { }
+
+		enum {
+			PART_VOL, PART_PROJ
+		} eType;
+
+		CFloat32Data3DMemory* pData;
+		unsigned int subX;
+		unsigned int subY;
+		unsigned int subZ;
+
+		bool uploadToGPU();
+		bool downloadFromGPU(/*mode?*/);
+		virtual TPartList split(size_t maxSize, int div) = 0;
+		virtual CPart* reduce(const CPart *other) = 0;
+		virtual void getDims(size_t &x, size_t &y, size_t &z) = 0;
+		size_t getSize();
+	};
+
+	class CVolumePart : public CPart {
+	public:
+		CVolumePart() { eType = PART_VOL; }
+		CVolumePart(const CVolumePart& other);
+		virtual ~CVolumePart();
+
+		CVolumeGeometry3D* pGeom;
+
+		virtual TPartList split(size_t maxSize, int div);
+		virtual CPart* reduce(const CPart *other);
+		virtual void getDims(size_t &x, size_t &y, size_t &z);
+
+		CVolumePart* clone() const;
+	};
+	class CProjectionPart : public CPart {
+	public:
+		CProjectionPart() { eType = PART_PROJ; }
+		CProjectionPart(const CProjectionPart& other);
+		virtual ~CProjectionPart();
+
+		CProjectionGeometry3D* pGeom;
+
+		virtual TPartList split(size_t maxSize, int div);
+		virtual CPart* reduce(const CPart *other);
+		virtual void getDims(size_t &x, size_t &y, size_t &z);
+
+		CProjectionPart* clone() const;
+	};
+
+	struct SJob {
+	public:
+		boost::shared_ptr<CPart> pInput;
+		boost::shared_ptr<CPart> pOutput;
+		CProjector3D *pProjector; // For a `global' geometry. It will not match
+		                          // the geometries of the input and output.
+
+
+		enum {
+			JOB_FP, JOB_BP, JOB_NOP
+		} eType;
+		enum {
+			MODE_ADD, MODE_SET
+		} eMode;
+
+	};
+
+	typedef std::list<SJob> TJobList;
+	// output part -> list of jobs for that output
+	typedef std::map<CPart*, TJobList > TJobSet;
+
+	bool doJobs(TJobList &jobs);
+
+	// Convenience functions for creating and running a single FP or BP job
+	bool doFP(CProjector3D *pProjector, CFloat32VolumeData3DMemory *pVolData,
+	          CFloat32ProjectionData3DMemory *pProjData);
+	bool doBP(CProjector3D *pProjector, CFloat32VolumeData3DMemory *pVolData,
+	          CFloat32ProjectionData3DMemory *pProjData);
+
+
+protected:
+
+	bool splitJobs(TJobSet &jobs, size_t maxSize, int div, TJobSet &split);
+
+};
+
+}
+
+#endif
+
+#endif
-- 
cgit v1.2.3


From 81e7385c110a6210d0f9bc402df522301ec162f6 Mon Sep 17 00:00:00 2001
From: Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl>
Date: Fri, 4 Dec 2015 15:14:19 +0100
Subject: Add utility functions for creating FP/BP JobLists

---
 include/astra/CompositeGeometryManager.h | 2 ++
 1 file changed, 2 insertions(+)

(limited to 'include/astra/CompositeGeometryManager.h')

diff --git a/include/astra/CompositeGeometryManager.h b/include/astra/CompositeGeometryManager.h
index a6e57f1..6610151 100644
--- a/include/astra/CompositeGeometryManager.h
+++ b/include/astra/CompositeGeometryManager.h
@@ -136,6 +136,8 @@ public:
 	bool doBP(CProjector3D *pProjector, CFloat32VolumeData3DMemory *pVolData,
 	          CFloat32ProjectionData3DMemory *pProjData);
 
+	bool doFP(CProjector3D *pProjector, const std::vector<CFloat32VolumeData3DMemory *>& volData, const std::vector<CFloat32ProjectionData3DMemory *>& projData);
+	bool doBP(CProjector3D *pProjector, const std::vector<CFloat32VolumeData3DMemory *>& volData, const std::vector<CFloat32ProjectionData3DMemory *>& projData);
 
 protected:
 
-- 
cgit v1.2.3