You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

180 lines
5.7 KiB
C

/*=========================================================================
Program: Visualization Toolkit
Module: vtkThreadedImageAlgorithm.h
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
/**
* @class vtkThreadedImageAlgorithm
* @brief Generic filter that has one input.
*
* vtkThreadedImageAlgorithm is a filter superclass that hides much of the
* pipeline complexity. It handles breaking the pipeline execution
* into smaller extents so that the vtkImageData limits are observed. It
* also provides support for multithreading. If you don't need any of this
* functionality, consider using vtkSimpleImageToImageAlgorithm instead.
* @sa
* vtkSimpleImageToImageAlgorithm
*/
#ifndef vtkThreadedImageAlgorithm_h
#define vtkThreadedImageAlgorithm_h
#include "vtkCommonExecutionModelModule.h" // For export macro
#include "vtkImageAlgorithm.h"
class vtkImageData;
class vtkMultiThreader;
class VTKCOMMONEXECUTIONMODEL_EXPORT vtkThreadedImageAlgorithm : public vtkImageAlgorithm
{
public:
vtkTypeMacro(vtkThreadedImageAlgorithm, vtkImageAlgorithm);
void PrintSelf(ostream& os, vtkIndent indent) override;
/**
* If the subclass does not define an Execute method, then the task
* will be broken up, multiple threads will be spawned, and each thread
* will call this method. It is public so that the thread functions
* can call this method.
*/
virtual void ThreadedRequestData(vtkInformation* request, vtkInformationVector** inputVector,
vtkInformationVector* outputVector, vtkImageData*** inData, vtkImageData** outData,
int extent[6], int threadId);
// also support the old signature
virtual void ThreadedExecute(
vtkImageData* inData, vtkImageData* outData, int extent[6], int threadId);
//@{
/**
* Enable/Disable SMP for threading.
*/
vtkGetMacro(EnableSMP, bool);
vtkSetMacro(EnableSMP, bool);
//@}
//@{
/**
* Global Disable SMP for all derived Imaging filters.
*/
static void SetGlobalDefaultEnableSMP(bool enable);
static bool GetGlobalDefaultEnableSMP();
//@}
//@{
/**
* The minimum piece size when volume is split for execution.
* By default, the minimum size is (16,1,1).
*/
vtkSetVector3Macro(MinimumPieceSize, int);
vtkGetVector3Macro(MinimumPieceSize, int);
//@}
//@{
/**
* The desired bytes per piece when volume is split for execution.
* When SMP is enabled, this is used to subdivide the volume into pieces.
* Smaller pieces allow for better dynamic load balancing, but increase
* the total overhead. The default is 65536 bytes.
*/
vtkSetMacro(DesiredBytesPerPiece, vtkIdType);
vtkGetMacro(DesiredBytesPerPiece, vtkIdType);
//@}
//@{
/**
* Set the method used to divide the volume into pieces.
* Slab mode splits the volume along the Z direction first,
* Beam mode splits evenly along the Z and Y directions, and
* Block mode splits evenly along all three directions.
* Most filters use Slab mode as the default.
*/
vtkSetClampMacro(SplitMode, int, 0, 2);
void SetSplitModeToSlab() { this->SetSplitMode(SLAB); }
void SetSplitModeToBeam() { this->SetSplitMode(BEAM); }
void SetSplitModeToBlock() { this->SetSplitMode(BLOCK); }
vtkGetMacro(SplitMode, int);
//@}
//@{
/**
* Get/Set the number of threads to create when rendering.
* This is ignored if EnableSMP is On.
*/
vtkSetClampMacro(NumberOfThreads, int, 1, VTK_MAX_THREADS);
vtkGetMacro(NumberOfThreads, int);
//@}
/**
* Putting this here until I merge graphics and imaging streaming.
*/
virtual int SplitExtent(int splitExt[6], int startExt[6], int num, int total);
protected:
vtkThreadedImageAlgorithm();
~vtkThreadedImageAlgorithm() override;
vtkMultiThreader* Threader;
int NumberOfThreads;
bool EnableSMP;
static bool GlobalDefaultEnableSMP;
enum SplitModeEnum
{
SLAB = 0,
BEAM = 1,
BLOCK = 2
};
int SplitMode;
int SplitPath[3];
int SplitPathLength;
int MinimumPieceSize[3];
vtkIdType DesiredBytesPerPiece;
/**
* This is called by the superclass.
* This is the method you should override.
*/
int RequestData(vtkInformation* request, vtkInformationVector** inputVector,
vtkInformationVector* outputVector) override;
/**
* Execute ThreadedRequestData for the given set of pieces.
* The extent will be broken into the number of pieces specified,
* and ThreadedRequestData will be called for all pieces starting
* at "begin" and up to but not including "end".
*/
virtual void SMPRequestData(vtkInformation* request, vtkInformationVector** inputVector,
vtkInformationVector* outputVector, vtkImageData*** inData, vtkImageData** outData,
vtkIdType begin, vtkIdType end, vtkIdType pieces, int extent[6]);
/**
* Allocate space for output data and copy attributes from first input.
* If the inDataObjects and outDataObjects are not passed as zero, then
* they must be large enough to store the data objects for all inputs and
* outputs.
*/
virtual void PrepareImageData(vtkInformationVector** inputVector,
vtkInformationVector* outputVector, vtkImageData*** inDataObjects = nullptr,
vtkImageData** outDataObjects = nullptr);
private:
vtkThreadedImageAlgorithm(const vtkThreadedImageAlgorithm&) = delete;
void operator=(const vtkThreadedImageAlgorithm&) = delete;
friend class vtkThreadedImageAlgorithmFunctor;
};
#endif