LAMA
|
00001 00035 #ifndef LAMA_CONTEXT_HPP_ 00036 #define LAMA_CONTEXT_HPP_ 00037 00038 // for dll_import 00039 #include <lama/config.hpp> 00040 00041 // base classes 00042 #include <lama/Printable.hpp> 00043 #include <lama/NonCopyable.hpp> 00044 00045 #include <lama/LAMATypes.hpp> 00046 00047 // logging 00048 #include <logging/logging.hpp> 00049 00050 // boost 00051 #include <boost/shared_ptr.hpp> 00052 #include <boost/function.hpp> 00053 00054 namespace lama 00055 { 00056 00057 class SyncToken; // forward declaration 00058 00059 class Context; // forward declaration 00060 00063 typedef boost::shared_ptr<const Context> ContextPtr; 00064 00077 class LAMA_DLL_IMPORTEXPORT Context : public Printable, 00078 private NonCopyable 00079 { 00080 public: 00081 00090 enum ContextType { Host, 00091 CUDA, 00092 OpenCL, 00093 // NewContext, //!< can be used for any new device 00094 MaxContext 00095 }; 00096 00097 struct LAMA_DLL_IMPORTEXPORT ContextData : private NonCopyable 00098 { 00099 enum AccessKind 00100 { 00101 Read, 00102 Write, 00103 MaxAccessKind 00104 }; 00105 00106 ContextPtr context; 00107 00108 void* pointer; 00109 00110 size_t size; 00111 00112 bool allocated; 00113 00114 bool valid; 00115 00116 unsigned char lock[MaxAccessKind]; 00117 00120 ContextData( ContextPtr context ); 00121 00122 ~ContextData(); 00123 00126 void allocate( const size_t size ); 00127 00130 void setRef( void* reference, const size_t size ); 00131 00139 void realloc( const size_t newSize, const size_t saveSize ); 00140 00143 void free(); 00144 00145 bool isPinned() const; 00146 00147 void setPinned() const; 00148 00149 void setCleanFunction( boost::function<void( void* )> cleanFunktion ) const; 00150 00151 private: 00152 00153 mutable bool pinned; 00154 00155 mutable boost::function<void( void* )> mCleanFunktion; 00156 00157 ContextData(); // disable default constructor 00158 }; 00159 00160 virtual ~Context(); 00161 00164 ContextType getType() const { return mContextType; } 00165 00170 bool operator==(const Context& other) const; 00171 00174 bool operator!=(const Context& other) const; 00175 00182 virtual bool canUseData(const Context& other) const = 0; 00183 00188 virtual void writeAt( std::ostream& stream ) const; 00189 00196 //virtual void* allocate( const size_t size ) const = 0; 00197 00205 virtual void allocate( ContextData& contextData, const size_t size ) const = 0; 00206 00215 virtual void free( void* pointer, const size_t size ) const = 0; 00216 00224 virtual void free( ContextData& contextData ) const = 0; 00225 00235 virtual void memcpy( void* dst, const void* src, const size_t size ) const = 0; 00236 00237 virtual std::auto_ptr<SyncToken> memcpyAsync( void* dst, const void* src, const size_t size ) const = 0; 00238 00245 virtual bool cancpy( const ContextData& dst, const ContextData& src ) const =0; 00246 00260 virtual void memcpy( ContextData& dst, const ContextData& src, const size_t size ) const = 0; 00261 00262 virtual std::auto_ptr<SyncToken> memcpyAsync( ContextData& dst, const ContextData& src, const size_t size ) const = 0; 00263 00266 virtual std::auto_ptr<SyncToken> getSyncToken() const = 0; 00267 00277 virtual void enable( const char* file, int line ) const; 00278 00283 virtual void disable( const char* file, int line ) const; 00284 00287 const class LAMAInterface& getInterface() const; 00288 00289 protected: 00290 00293 Context( ContextType type ); 00294 00295 LAMA_LOG_DECL_STATIC_LOGGER(logger); 00296 00297 ContextType mContextType; 00298 00299 mutable bool mEnabled; 00300 00301 mutable const char* mFile; 00302 00303 mutable int mLine; 00304 }; 00305 00308 typedef Context::ContextType ContextType; 00309 00310 LAMA_DLL_IMPORTEXPORT std::ostream& operator<<(std::ostream& stream, const ContextType type); 00311 00312 } 00313 00314 #endif // LAMA_CONTEXT_HPP_