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 #include "OgreCudaPrerequisites.h"
00030
00031 #include <cuda_runtime.h>
00032
00033 namespace Ogre
00034 {
00035 namespace Cuda
00036 {
00037 class Ressource;
00038 class Texture;
00039 class TextureManager;
00040 class VertexBufferManager;
00041 struct DeviceProperties;
00042
00043 enum RessourceType
00044 {
00045 TEXTURE_RESSOURCE,
00046 VERTEXBUFFER_RESSOURCE
00047 };
00048
00049 class _OgreCudaExport Root
00050 {
00051 public:
00052 virtual void init() = 0;
00053 void shutdown();
00054 void synchronize();
00055
00056 TextureManager* getTextureManager();
00057 VertexBufferManager* getVertexBufferManager();
00058
00059 void map(std::vector<Ogre::Cuda::Ressource*> ressources);
00060 void unmap(std::vector<Ogre::Cuda::Ressource*> ressources);
00061
00062 bool isCudaStatusOK();
00063 std::string getErrorMessage();
00064
00065
00066
00067 static std::string getLastError();
00068
00069 static Root* createRoot(Ogre::RenderWindow* renderWindow, Ogre::RenderSystem* renderSystem);
00070 static void destroyRoot(Root* root);
00071
00072 static int getDeviceCount();
00073 static DeviceProperties getDeviceProperties(int index);
00074
00075 static int getCudaRuntimeVersion();
00076 static int getVideoDriverVersion();
00077
00078 protected:
00079 Root();
00080 virtual ~Root();
00081
00082 Ogre::Cuda::TextureManager* mTextureManager;
00083 Ogre::Cuda::VertexBufferManager* mVertexBufferManager;
00084 cudaError_t mLastCudaError;
00085 cudaStream_t mCudaStream;
00086 };
00087
00088 class _OgreCudaExport Ressource
00089 {
00090 friend class Root;
00091
00092 public:
00093 Ressource();
00094
00095 virtual void registerForCudaUse() = 0;
00096 virtual void unregister();
00097
00098 virtual void map();
00099 virtual void unmap();
00100
00101 virtual Ogre::Cuda::RessourceType getType() = 0;
00102
00103 protected:
00104 struct cudaGraphicsResource* mCudaRessource;
00105 cudaStream_t mCudaStream;
00106 };
00107
00108 class _OgreCudaExport TextureDeviceHandle
00109 {
00110 friend class Ogre::Cuda::Texture;
00111
00112 public:
00113 TextureDeviceHandle(size_t width, size_t height, size_t pitch, void* linearMemory);
00114 void* getPointer();
00115
00116 size_t width;
00117 size_t height;
00118 size_t pitch;
00119 void* linearMemory;
00120
00121 protected:
00122 cudaArray* mCudaArray;
00123 };
00124
00125 class _OgreCudaExport Texture : public Ressource
00126 {
00127 friend class TextureManager;
00128
00129 public:
00130 virtual void registerForCudaUse() = 0;
00131 virtual void unregister();
00132 void updateReading(TextureDeviceHandle& mem);
00133 void updateWriting(TextureDeviceHandle& mem);
00134
00135 TextureDeviceHandle getDeviceHandle(unsigned int face, unsigned int mipmap);
00136 Ogre::Vector2 getDimensions(unsigned int face, unsigned int mipmap);
00137
00138 virtual Ogre::Cuda::RessourceType getType();
00139
00140 protected:
00141 Texture(Ogre::TexturePtr texture);
00142 void allocate();
00143 unsigned int getIndex(unsigned int face, unsigned int mipmap);
00144
00145 int mPixelSizeInBytes;
00146 Ogre::TexturePtr mTexture;
00147 std::vector<TextureDeviceHandle> mDevicePtrs;
00148 };
00149
00150 class _OgreCudaExport VertexBuffer : public Ressource
00151 {
00152 friend class VertexBufferManager;
00153
00154 public:
00155 virtual void registerForCudaUse() = 0;
00156 void* getPointer();
00157
00158 virtual Ogre::Cuda::RessourceType getType();
00159
00160 protected:
00161 VertexBuffer(Ogre::HardwareVertexBufferSharedPtr vertexBuffer);
00162
00163 Ogre::HardwareVertexBufferSharedPtr mVertexBuffer;
00164 cudaArray* mCudaArray;
00165 };
00166
00167 class _OgreCudaExport TextureManager
00168 {
00169 public:
00170 virtual Texture* createTexture(Ogre::TexturePtr texture) = 0;
00171 virtual void destroyTexture(Texture* texture) = 0;
00172 };
00173
00174 class _OgreCudaExport VertexBufferManager
00175 {
00176 public:
00177 virtual VertexBuffer* createVertexBuffer(Ogre::HardwareVertexBufferSharedPtr vertexBuffer) = 0;
00178 virtual void destroyVertexBuffer(VertexBuffer* vertexBuffer) = 0;
00179 };
00180
00181 struct _OgreCudaExport DeviceProperties
00182 {
00183 DeviceProperties();
00184 DeviceProperties(const cudaDeviceProp& prop);
00185
00186 std::string name;
00187 size_t totalGlobalMem;
00188 size_t sharedMemPerBlock;
00189 int regsPerBlock;
00190 int warpSize;
00191 size_t memPitch;
00192 int maxThreadsPerBlock;
00193 int maxThreadsDim[3];
00194 int maxGridSize[3];
00195 int clockRate;
00196 size_t totalConstMem;
00197 int major;
00198 int minor;
00199 size_t textureAlignment;
00200 int deviceOverlap;
00201 int multiProcessorCount;
00202 int kernelExecTimeoutEnabled;
00203 int integrated;
00204 bool canMapHostMemory;
00205 int computeMode;
00206 };
00207 }
00208 }
00209 _OgreCudaExport std::ostream& operator <<(std::ostream& output, const Ogre::Cuda::DeviceProperties& prop);