00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 #pragma once
00024 
00025 #include <OgreVector2.h>
00026 #include <OgreTexture.h>
00027 #include <OgreRenderSystem.h>
00028 #include <OgreRenderWindow.h>
00029 
00030 #include <CL/OpenCL.h>
00031 
00032 namespace Ogre
00033 {
00034         namespace OpenCL
00035         {
00036                 class Ressource;
00037                 
00038                 
00039                 class VertexBufferManager;
00040                 struct DeviceProperties;
00041 
00042                 enum RessourceType
00043                 {
00044                         TEXTURE_RESSOURCE,
00045                         VERTEXBUFFER_RESSOURCE
00046                 };
00047 
00048                 class Root
00049                 {
00050                         public:
00051                                 virtual bool init() = 0;
00052                                 void shutdown();
00053                                 void synchronize();
00054 
00055                                 
00056                                 VertexBufferManager* getVertexBufferManager();
00057 
00058                                 cl_command_queue* getCommandQueue();
00059                                 cl_context* getContext();
00060 
00061                                 bool map(std::vector<Ogre::OpenCL::Ressource*> ressources);   
00062                                 bool unmap(std::vector<Ogre::OpenCL::Ressource*> ressources); 
00063 
00064                                 static Root* createRoot(Ogre::RenderWindow* renderWindow, Ogre::RenderSystem* renderSystem);
00065                                 static void destroyRoot(Root* root);
00066 
00067                         protected:
00068                                 Root();
00069                                 virtual ~Root();
00070 
00071                                 
00072                                 Ogre::OpenCL::VertexBufferManager* mVertexBufferManager;
00073 
00074                                 cl_context       mContext;
00075                                 cl_command_queue mCommandQueue;
00076                 };
00077 
00078                 class Ressource
00079                 {
00080                         friend class Root;      
00081 
00082                         public:
00083                                 Ressource();
00084 
00085                                 virtual bool registerForCL() = 0;
00086                                 virtual bool unregister();
00087                                 cl_mem* getPointer();
00088 
00089                                 virtual bool map() = 0;
00090                                 virtual bool unmap() = 0;
00091 
00092                                 virtual Ogre::OpenCL::RessourceType getType() = 0;
00093 
00094                         protected:
00095                                 cl_mem mMemory;
00096                 };
00097 
00098                 class VertexBuffer : public Ressource
00099                 {
00100                         friend class VertexBufferManager;
00101 
00102                         public:
00103                                 virtual bool registerForCL() = 0;                               
00104 
00105                                 virtual bool map() = 0;
00106                                 virtual bool unmap() = 0;
00107 
00108                                 virtual Ogre::OpenCL::RessourceType getType();
00109 
00110                         protected:
00111                                 VertexBuffer(Root* root, Ogre::HardwareVertexBufferSharedPtr vertexBuffer);
00112 
00113                                 Ogre::HardwareVertexBufferSharedPtr mVertexBuffer;
00114                                 Root* mRoot;
00115                 };
00116 
00117                 class VertexBufferManager
00118                 {
00119                         public:
00120                                 VertexBufferManager(Root* root);
00121 
00122                                 virtual VertexBuffer* createVertexBuffer(Ogre::HardwareVertexBufferSharedPtr vertexBuffer) = 0;
00123                                 virtual void destroyVertexBuffer(VertexBuffer* vertexBuffer) = 0;
00124 
00125                         protected:
00126                                 Root* mRoot;
00127                 };
00128 
00129         }
00130 }