VTK
/Users/kitware/Dashboards/MyTests/VTK_BLD_Release_docs/Utilities/Doxygen/dox/Rendering/ParallelLIC/vtkPSurfaceLICComposite.h
Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    vtkPSurfaceLICComposite.h
00005 
00006   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
00007   All rights reserved.
00008   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
00009 
00010      This software is distributed WITHOUT ANY WARRANTY; without even
00011      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
00012      PURPOSE.  See the above copyright notice for more information.
00013 
00014 =========================================================================*/
00024 #ifndef vtkPSurfaceLICComposite_h
00025 #define vtkPSurfaceLICComposite_h
00026 
00027 #include "vtkSurfaceLICComposite.h"
00028 #include "vtkWeakPointer.h" // for ren context
00029 #include "vtkOpenGLRenderWindow.h" // for context
00030 #include "vtkRenderingParallelLICModule.h" // for export macro
00031 #include "vtkPixelExtent.h" // for pixel extent
00032 #include "vtkPPixelTransfer.h" // for pixel transfer
00033 #include <deque> // for deque
00034 #include <vector> // for vector
00035 #include <list> // for list
00036 
00037 class vtkFloatArray;
00038 class vtkRenderWindow;
00039 class vtkFrameBufferObject2;
00040 class vtkTextureObject;
00041 class vtkShaderProgram2;
00042 class vtkPainterCommunicator;
00043 class vtkPPainterCommunicator;
00044 class vtkPPixelExtentOps;
00045 
00046 class VTKRENDERINGPARALLELLIC_EXPORT vtkPSurfaceLICComposite : public vtkSurfaceLICComposite
00047 {
00048 public:
00049   static vtkPSurfaceLICComposite *New();
00050   vtkTypeMacro(vtkPSurfaceLICComposite, vtkSurfaceLICComposite);
00051   virtual void PrintSelf(ostream &os, vtkIndent indent);
00052 
00054 
00057   virtual void SetContext(vtkOpenGLRenderWindow *rwin);
00058   virtual vtkOpenGLRenderWindow *GetContext(){ return this->Context; }
00060 
00063    virtual void SetCommunicator(vtkPainterCommunicator *comm);
00064 
00067   virtual int BuildProgram(float *vectors);
00068 
00070 
00072   virtual int Gather(
00073         void *pSendPBO,
00074         int dataType,
00075         int nComps,
00076         vtkTextureObject *&newImage);
00078 
00080 
00082   virtual int Scatter(
00083         void *pSendPBO,
00084         int dataType,
00085         int nComps,
00086         vtkTextureObject *&newImage);
00088 
00089 protected:
00090   vtkPSurfaceLICComposite();
00091   ~vtkPSurfaceLICComposite();
00092 
00093 private:
00095   int InitializeCompositeShader(vtkOpenGLRenderWindow *context);
00096 
00098   int ExecuteShader(const vtkPixelExtent &ext, vtkTextureObject *tex);
00099 
00101 
00104   double EstimateCommunicationCost(
00105         const std::deque<std::deque<vtkPixelExtent> > &srcExts,
00106         const std::deque<std::deque<vtkPixelExtent> > &destExts);
00108 
00110 
00112   double EstimateDecompEfficiency(
00113         const std::deque< std::deque<vtkPixelExtent> > &exts,
00114         const std::deque< std::deque<vtkPixelExtent> > &guardExts);
00116 
00118 
00119   int DecomposeScreenExtent(
00120         std::deque< std::deque<vtkPixelExtent> >&newExts,
00121         float *vectors);
00123 
00125 
00126   int DecomposeExtent(
00127       vtkPixelExtent &in,
00128       int nPieces,
00129       std::list<vtkPixelExtent> &out);
00131 
00133 
00139   int MakeDecompDisjoint(
00140         const std::deque< std::deque< vtkPixelExtent> > &in,
00141         std::deque< std::deque< vtkPixelExtent> > &out,
00142         float *vectors);
00144 
00145 
00146   // decomp set of extents
00147   int MakeDecompLocallyDisjoint(
00148        const std::deque< std::deque< vtkPixelExtent> > &in,
00149        std::deque< std::deque< vtkPixelExtent> > &out);
00150 
00151   using vtkSurfaceLICComposite::MakeDecompDisjoint;
00152 
00154 
00157   int AllGatherExtents(
00158         const std::deque<vtkPixelExtent> &localExts,
00159         std::deque<std::deque<vtkPixelExtent> > &remoteExts,
00160         vtkPixelExtent &dataSetExt);
00162 
00164 
00165   int AllReduceVectorMax(
00166         const std::deque<vtkPixelExtent> &originalExts,
00167         const std::deque<std::deque<vtkPixelExtent> > &newExts,
00168         float *vectors,
00169         std::vector<std::vector<float> > &vectorMax);
00171 
00173 
00174   int AddGuardPixels(
00175       const std::deque<std::deque<vtkPixelExtent> > &exts,
00176       std::deque<std::deque<vtkPixelExtent> > &guardExts,
00177       std::deque<std::deque<vtkPixelExtent> > &disjointGuardExts,
00178       float *vectors);
00180 
00181 private:
00182   vtkPPainterCommunicator *PainterComm;          // mpi state
00183   vtkPPixelExtentOps *PixelOps;
00184   int CommRank;
00185   int CommSize;
00186 
00187   vtkWeakPointer<vtkOpenGLRenderWindow> Context; // rendering context
00188   vtkFrameBufferObject2 *FBO;                    // buffer object
00189   vtkShaderProgram2 *CompositeShader;            // shader program for compositing
00190 
00191   std::deque<vtkPPixelTransfer> GatherProgram;   // ordered steps required to move data to new decomp
00192   std::deque<vtkPPixelTransfer> ScatterProgram;  // ordered steps required to unmove data from new decomp
00193 
00194   friend
00195   ostream &operator<<(ostream &os, vtkPSurfaceLICComposite &ss);
00196 
00197   vtkPSurfaceLICComposite(const vtkPSurfaceLICComposite&); // Not implemented
00198   void operator=(const vtkPSurfaceLICComposite&); // Not implemented
00199 };
00200 
00201 ostream &operator<<(ostream &os, vtkPSurfaceLICComposite &ss);
00202 
00203 #endif