VTK
|
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