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 }