OgreMemoryAllocatorConfig.h

Go to the documentation of this file.
00001 /*
00002 -----------------------------------------------------------------------------
00003 This source file is part of OGRE
00004 (Object-oriented Graphics Rendering Engine)
00005 For the latest info, see http://www.ogre3d.org/
00006 
00007 Copyright (c) 2000-2012 Torus Knot Software Ltd
00008 
00009 Permission is hereby granted, free of charge, to any person obtaining a copy
00010 of this software and associated documentation files (the "Software"), to deal
00011 in the Software without restriction, including without limitation the rights
00012 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
00013 copies of the Software, and to permit persons to whom the Software is
00014 furnished to do so, subject to the following conditions:
00015 
00016 The above copyright notice and this permission notice shall be included in
00017 all copies or substantial portions of the Software.
00018 
00019 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00020 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00021 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00022 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00023 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00024 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00025 THE SOFTWARE.
00026 -----------------------------------------------------------------------------
00027 */
00028 
00029 #ifndef __MemoryAllocatorConfig_H__
00030 #define __MemoryAllocatorConfig_H__
00031 
00032 #include "OgreMemoryAllocatedObject.h" 
00033 
00114 
00119 
00124 
00127 
00130 
00140 namespace Ogre
00141 {
00158     enum MemoryCategory
00159     {
00161         MEMCATEGORY_GENERAL = 0,
00163         MEMCATEGORY_GEOMETRY = 1, 
00165         MEMCATEGORY_ANIMATION = 2, 
00167         MEMCATEGORY_SCENE_CONTROL = 3,
00169         MEMCATEGORY_SCENE_OBJECTS = 4,
00171         MEMCATEGORY_RESOURCE = 5,
00173         MEMCATEGORY_SCRIPTING = 6,
00175         MEMCATEGORY_RENDERSYS = 7,
00176 
00177         
00178         // sentinel value, do not use 
00179         MEMCATEGORY_COUNT = 8
00180     };
00184 }
00185 
00186 #include "OgreMemoryAllocatedObject.h"
00187 #include "OgreMemorySTLAllocator.h"
00188 
00189 #if OGRE_MEMORY_ALLOCATOR == OGRE_MEMORY_ALLOCATOR_NEDPOOLING
00190 
00191 #  include "OgreMemoryNedPooling.h"
00192 namespace Ogre
00193 {
00194     // configure default allocators based on the options above
00195     // notice how we're not using the memory categories here but still roughing them out
00196     // in your allocators you might choose to create different policies per category
00197 
00198     // configurable category, for general malloc
00199     // notice how we ignore the category here, you could specialise
00200     template <MemoryCategory Cat> class CategorisedAllocPolicy : public NedPoolingPolicy{};
00201     template <MemoryCategory Cat, size_t align = 0> class CategorisedAlignAllocPolicy : public NedPoolingAlignedPolicy<align>{};
00202 }
00203 
00204 #elif OGRE_MEMORY_ALLOCATOR == OGRE_MEMORY_ALLOCATOR_NED
00205 
00206 #  include "OgreMemoryNedAlloc.h"
00207 namespace Ogre
00208 {
00209     // configure default allocators based on the options above
00210     // notice how we're not using the memory categories here but still roughing them out
00211     // in your allocators you might choose to create different policies per category
00212 
00213     // configurable category, for general malloc
00214     // notice how we ignore the category here, you could specialise
00215     template <MemoryCategory Cat> class CategorisedAllocPolicy : public NedAllocPolicy{};
00216     template <MemoryCategory Cat, size_t align = 0> class CategorisedAlignAllocPolicy : public NedAlignedAllocPolicy<align>{};
00217 }
00218 
00219 #elif OGRE_MEMORY_ALLOCATOR == OGRE_MEMORY_ALLOCATOR_STD
00220 
00221 #  include "OgreMemoryStdAlloc.h"
00222 namespace Ogre
00223 {
00224     // configure default allocators based on the options above
00225     // notice how we're not using the memory categories here but still roughing them out
00226     // in your allocators you might choose to create different policies per category
00227 
00228     // configurable category, for general malloc
00229     // notice how we ignore the category here
00230     template <MemoryCategory Cat> class CategorisedAllocPolicy : public StdAllocPolicy{};
00231     template <MemoryCategory Cat, size_t align = 0> class CategorisedAlignAllocPolicy : public StdAlignedAllocPolicy<align>{};
00232 
00233     // if you wanted to specialise the allocation per category, here's how it might work:
00234     // template <> class CategorisedAllocPolicy<MEMCATEGORY_SCENE_OBJECTS> : public YourSceneObjectAllocPolicy{};
00235     // template <size_t align> class CategorisedAlignAllocPolicy<MEMCATEGORY_SCENE_OBJECTS, align> : public YourSceneObjectAllocPolicy<align>{};
00236     
00237     
00238 }
00239 
00240 #else
00241     
00242 // your allocators here?
00243 
00244 #endif
00245 
00246 namespace Ogre
00247 {
00248     // Useful shortcuts
00249     typedef CategorisedAllocPolicy<Ogre::MEMCATEGORY_GENERAL> GeneralAllocPolicy;
00250     typedef CategorisedAllocPolicy<Ogre::MEMCATEGORY_GEOMETRY> GeometryAllocPolicy;
00251     typedef CategorisedAllocPolicy<Ogre::MEMCATEGORY_ANIMATION> AnimationAllocPolicy;
00252     typedef CategorisedAllocPolicy<Ogre::MEMCATEGORY_SCENE_CONTROL> SceneCtlAllocPolicy;
00253     typedef CategorisedAllocPolicy<Ogre::MEMCATEGORY_SCENE_OBJECTS> SceneObjAllocPolicy;
00254     typedef CategorisedAllocPolicy<Ogre::MEMCATEGORY_RESOURCE> ResourceAllocPolicy;
00255     typedef CategorisedAllocPolicy<Ogre::MEMCATEGORY_SCRIPTING> ScriptingAllocPolicy;
00256     typedef CategorisedAllocPolicy<Ogre::MEMCATEGORY_RENDERSYS> RenderSysAllocPolicy;
00257 
00258     // Now define all the base classes for each allocation
00259     typedef AllocatedObject<GeneralAllocPolicy> GeneralAllocatedObject;
00260     typedef AllocatedObject<GeometryAllocPolicy> GeometryAllocatedObject;
00261     typedef AllocatedObject<AnimationAllocPolicy> AnimationAllocatedObject;
00262     typedef AllocatedObject<SceneCtlAllocPolicy> SceneCtlAllocatedObject;
00263     typedef AllocatedObject<SceneObjAllocPolicy> SceneObjAllocatedObject;
00264     typedef AllocatedObject<ResourceAllocPolicy> ResourceAllocatedObject;
00265     typedef AllocatedObject<ScriptingAllocPolicy> ScriptingAllocatedObject;
00266     typedef AllocatedObject<RenderSysAllocPolicy> RenderSysAllocatedObject;
00267 
00268 
00269     // Per-class allocators defined here
00270     // NOTE: small, non-virtual classes should not subclass an allocator
00271     // the virtual function table could double their size and make them less efficient
00272     // use primitive or STL allocators / deallocators for those
00273     typedef ScriptingAllocatedObject    AbstractNodeAlloc;
00274     typedef AnimationAllocatedObject    AnimableAlloc;
00275     typedef AnimationAllocatedObject    AnimationAlloc;
00276     typedef GeneralAllocatedObject      ArchiveAlloc;
00277     typedef GeometryAllocatedObject     BatchedGeometryAlloc;
00278     typedef RenderSysAllocatedObject    BufferAlloc;
00279     typedef GeneralAllocatedObject      CodecAlloc;
00280     typedef ResourceAllocatedObject     CompositorInstAlloc;
00281     typedef GeneralAllocatedObject      ConfigAlloc;
00282     typedef GeneralAllocatedObject      ControllerAlloc;
00283     typedef GeometryAllocatedObject     DebugGeomAlloc;
00284     typedef GeneralAllocatedObject      DynLibAlloc;
00285     typedef GeometryAllocatedObject     EdgeDataAlloc;
00286     typedef GeneralAllocatedObject      FactoryAlloc;
00287     typedef SceneObjAllocatedObject     FXAlloc;
00288     typedef GeneralAllocatedObject      ImageAlloc;
00289     typedef GeometryAllocatedObject     IndexDataAlloc;
00290     typedef GeneralAllocatedObject      LogAlloc;
00291     typedef SceneObjAllocatedObject     MovableAlloc;
00292     typedef SceneCtlAllocatedObject     NodeAlloc;
00293     typedef SceneObjAllocatedObject     OverlayAlloc;
00294     typedef RenderSysAllocatedObject    GpuParamsAlloc;
00295     typedef ResourceAllocatedObject     PassAlloc;
00296     typedef GeometryAllocatedObject     PatchAlloc;
00297     typedef GeneralAllocatedObject      PluginAlloc;
00298     typedef GeneralAllocatedObject      ProfilerAlloc;
00299     typedef GeometryAllocatedObject     ProgMeshAlloc;
00300     typedef SceneCtlAllocatedObject     RenderQueueAlloc;
00301     typedef RenderSysAllocatedObject    RenderSysAlloc;
00302     typedef GeneralAllocatedObject      RootAlloc;
00303     typedef ResourceAllocatedObject     ResourceAlloc;
00304     typedef GeneralAllocatedObject      SerializerAlloc;
00305     typedef SceneCtlAllocatedObject     SceneMgtAlloc;
00306     typedef ScriptingAllocatedObject    ScriptCompilerAlloc;
00307     typedef ScriptingAllocatedObject    ScriptTranslatorAlloc;
00308     typedef SceneCtlAllocatedObject     ShadowDataAlloc;
00309     typedef GeneralAllocatedObject      StreamAlloc;
00310     typedef SceneObjAllocatedObject     SubEntityAlloc;
00311     typedef ResourceAllocatedObject     SubMeshAlloc;
00312     typedef ResourceAllocatedObject     TechniqueAlloc;
00313     typedef GeneralAllocatedObject      TimerAlloc;
00314     typedef ResourceAllocatedObject     TextureUnitStateAlloc;
00315     typedef GeneralAllocatedObject      UtilityAlloc;
00316     typedef GeometryAllocatedObject     VertexDataAlloc;
00317     typedef RenderSysAllocatedObject    ViewportAlloc;
00318     typedef SceneCtlAllocatedObject     LodAlloc;
00319 
00320     // Containers (by-value only)
00321     // Will  be of the form:
00322     // typedef STLAllocator<T, DefaultAllocPolicy, Category> TAlloc;
00323     // for use in vector<T, TAlloc>::type 
00324     
00325 
00326 
00327 }
00328 
00329 // Util functions
00330 namespace Ogre
00331 {
00343     template<typename T>
00344     T* constructN(T* basePtr, size_t count)
00345     {
00346         for (size_t i = 0; i < count; ++i)
00347         {
00348             new ((void*)(basePtr+i)) T();
00349         }
00350         return basePtr;
00351     }
00355 }
00356 // define macros 
00357 
00365 #if OGRE_DEBUG_MODE
00366 
00368 #   define OGRE_MALLOC(bytes, category) ::Ogre::CategorisedAllocPolicy<category>::allocateBytes(bytes, __FILE__, __LINE__, __FUNCTION__)
00370 #   define OGRE_ALLOC_T(T, count, category) static_cast<T*>(::Ogre::CategorisedAllocPolicy<category>::allocateBytes(sizeof(T)*(count), __FILE__, __LINE__, __FUNCTION__))
00372 #   define OGRE_FREE(ptr, category) ::Ogre::CategorisedAllocPolicy<category>::deallocateBytes((void*)ptr)
00373 
00375 #   define OGRE_NEW_T(T, category) new (::Ogre::CategorisedAllocPolicy<category>::allocateBytes(sizeof(T), __FILE__, __LINE__, __FUNCTION__)) T
00377 #   define OGRE_NEW_ARRAY_T(T, count, category) ::Ogre::constructN(static_cast<T*>(::Ogre::CategorisedAllocPolicy<category>::allocateBytes(sizeof(T)*(count), __FILE__, __LINE__, __FUNCTION__)), count) 
00379 #   define OGRE_DELETE_T(ptr, T, category) if(ptr){(ptr)->~T(); ::Ogre::CategorisedAllocPolicy<category>::deallocateBytes((void*)ptr);}
00381 #   define OGRE_DELETE_ARRAY_T(ptr, T, count, category) if(ptr){for (size_t b = 0; b < count; ++b) { (ptr)[b].~T();} ::Ogre::CategorisedAllocPolicy<category>::deallocateBytes((void*)ptr);}
00382 
00383 // aligned allocation
00385 #   define OGRE_MALLOC_SIMD(bytes, category) ::Ogre::CategorisedAlignAllocPolicy<category>::allocateBytes(bytes, __FILE__, __LINE__, __FUNCTION__)
00387 #   define OGRE_MALLOC_ALIGN(bytes, category, align) ::Ogre::CategorisedAlignAllocPolicy<category, align>::allocateBytes(bytes, __FILE__, __LINE__, __FUNCTION__)
00389 #   define OGRE_ALLOC_T_SIMD(T, count, category) static_cast<T*>(::Ogre::CategorisedAlignAllocPolicy<category>::allocateBytes(sizeof(T)*(count), __FILE__, __LINE__, __FUNCTION__))
00391 #   define OGRE_ALLOC_T_ALIGN(T, count, category, align) static_cast<T*>(::Ogre::CategorisedAlignAllocPolicy<category, align>::allocateBytes(sizeof(T)*(count), __FILE__, __LINE__, __FUNCTION__))
00393 #   define OGRE_FREE_SIMD(ptr, category) ::Ogre::CategorisedAlignAllocPolicy<category>::deallocateBytes(ptr)
00395 #   define OGRE_FREE_ALIGN(ptr, category, align) ::Ogre::CategorisedAlignAllocPolicy<category, align>::deallocateBytes(ptr)
00396 
00398 #   define OGRE_NEW_T_SIMD(T, category) new (::Ogre::CategorisedAlignAllocPolicy<category>::allocateBytes(sizeof(T), __FILE__, __LINE__, __FUNCTION__)) T
00400 #   define OGRE_NEW_ARRAY_T_SIMD(T, count, category) ::Ogre::constructN(static_cast<T*>(::Ogre::CategorisedAlignAllocPolicy<category>::allocateBytes(sizeof(T)*(count), __FILE__, __LINE__, __FUNCTION__)), count) 
00402 #   define OGRE_DELETE_T_SIMD(ptr, T, category) if(ptr){(ptr)->~T(); ::Ogre::CategorisedAlignAllocPolicy<category>::deallocateBytes(ptr);}
00404 #   define OGRE_DELETE_ARRAY_T_SIMD(ptr, T, count, category) if(ptr){for (size_t b = 0; b < count; ++b) { (ptr)[b].~T();} ::Ogre::CategorisedAlignAllocPolicy<category>::deallocateBytes(ptr);}
00406 #   define OGRE_NEW_T_ALIGN(T, category, align) new (::Ogre::CategorisedAlignAllocPolicy<category, align>::allocateBytes(sizeof(T), __FILE__, __LINE__, __FUNCTION__)) T
00408 #   define OGRE_NEW_ARRAY_T_ALIGN(T, count, category, align) ::Ogre::constructN(static_cast<T*>(::Ogre::CategorisedAlignAllocPolicy<category, align>::allocateBytes(sizeof(T)*(count), __FILE__, __LINE__, __FUNCTION__)), count) 
00410 #   define OGRE_DELETE_T_ALIGN(ptr, T, category, align) if(ptr){(ptr)->~T(); ::Ogre::CategorisedAlignAllocPolicy<category, align>::deallocateBytes(ptr);}
00412 #   define OGRE_DELETE_ARRAY_T_ALIGN(ptr, T, count, category, align) if(ptr){for (size_t _b = 0; _b < count; ++_b) { (ptr)[_b].~T();} ::Ogre::CategorisedAlignAllocPolicy<category, align>::deallocateBytes(ptr);}
00413 
00414 // new / delete for classes deriving from AllocatedObject (alignment determined by per-class policy)
00415 // Also hooks up the file/line/function params
00416 // Can only be used with classes that derive from AllocatedObject since customised new/delete needed
00417 #   define OGRE_NEW new (__FILE__, __LINE__, __FUNCTION__)
00418 #   define OGRE_DELETE delete
00419 
00420 
00421 #else // !OGRE_DEBUG_MODE
00422 
00424 #   define OGRE_MALLOC(bytes, category) ::Ogre::CategorisedAllocPolicy<category>::allocateBytes(bytes)
00426 #   define OGRE_ALLOC_T(T, count, category) static_cast<T*>(::Ogre::CategorisedAllocPolicy<category>::allocateBytes(sizeof(T)*(count)))
00428 #   define OGRE_FREE(ptr, category) ::Ogre::CategorisedAllocPolicy<category>::deallocateBytes((void*)ptr)
00429 
00431 #   define OGRE_NEW_T(T, category) new (::Ogre::CategorisedAllocPolicy<category>::allocateBytes(sizeof(T))) T
00433 #   define OGRE_NEW_ARRAY_T(T, count, category) ::Ogre::constructN(static_cast<T*>(::Ogre::CategorisedAllocPolicy<category>::allocateBytes(sizeof(T)*(count))), count) 
00435 #   define OGRE_DELETE_T(ptr, T, category) if(ptr){(ptr)->~T(); ::Ogre::CategorisedAllocPolicy<category>::deallocateBytes((void*)ptr);}
00437 #   define OGRE_DELETE_ARRAY_T(ptr, T, count, category) if(ptr){for (size_t b = 0; b < count; ++b) { (ptr)[b].~T();} ::Ogre::CategorisedAllocPolicy<category>::deallocateBytes((void*)ptr);}
00438 
00439 // aligned allocation
00441 #   define OGRE_MALLOC_SIMD(bytes, category) ::Ogre::CategorisedAlignAllocPolicy<category>::allocateBytes(bytes)
00443 #   define OGRE_MALLOC_ALIGN(bytes, category, align) ::Ogre::CategorisedAlignAllocPolicy<category, align>::allocateBytes(bytes)
00445 #   define OGRE_ALLOC_T_SIMD(T, count, category) static_cast<T*>(::Ogre::CategorisedAlignAllocPolicy<category>::allocateBytes(sizeof(T)*(count)))
00447 #   define OGRE_ALLOC_T_ALIGN(T, count, category, align) static_cast<T*>(::Ogre::CategorisedAlignAllocPolicy<category, align>::allocateBytes(sizeof(T)*(count)))
00449 #   define OGRE_FREE_SIMD(ptr, category) ::Ogre::CategorisedAlignAllocPolicy<category>::deallocateBytes((void*)ptr)
00451 #   define OGRE_FREE_ALIGN(ptr, category, align) ::Ogre::CategorisedAlignAllocPolicy<category, align>::deallocateBytes((void*)ptr)
00452 
00454 #   define OGRE_NEW_T_SIMD(T, category) new (::Ogre::CategorisedAlignAllocPolicy<category>::allocateBytes(sizeof(T))) T
00456 #   define OGRE_NEW_ARRAY_T_SIMD(T, count, category) ::Ogre::constructN(static_cast<T*>(::Ogre::CategorisedAlignAllocPolicy<category>::allocateBytes(sizeof(T)*(count))), count) 
00458 #   define OGRE_DELETE_T_SIMD(ptr, T, category) if(ptr){(ptr)->~T(); ::Ogre::CategorisedAlignAllocPolicy<category>::deallocateBytes((void*)ptr);}
00460 #   define OGRE_DELETE_ARRAY_T_SIMD(ptr, T, count, category) if(ptr){for (size_t b = 0; b < count; ++b) { (ptr)[b].~T();} ::Ogre::CategorisedAlignAllocPolicy<category>::deallocateBytes((void*)ptr);}
00462 #   define OGRE_NEW_T_ALIGN(T, category, align) new (::Ogre::CategorisedAlignAllocPolicy<category, align>::allocateBytes(sizeof(T))) T
00464 #   define OGRE_NEW_ARRAY_T_ALIGN(T, count, category, align) ::Ogre::constructN(static_cast<T*>(::Ogre::CategorisedAlignAllocPolicy<category, align>::allocateBytes(sizeof(T)*(count))), count) 
00466 #   define OGRE_DELETE_T_ALIGN(ptr, T, category, align) if(ptr){(ptr)->~T(); ::Ogre::CategorisedAlignAllocPolicy<category, align>::deallocateBytes((void*)ptr);}
00468 #   define OGRE_DELETE_ARRAY_T_ALIGN(ptr, T, count, category, align) if(ptr){for (size_t _b = 0; _b < count; ++_b) { (ptr)[_b].~T();} ::Ogre::CategorisedAlignAllocPolicy<category, align>::deallocateBytes((void*)ptr);}
00469 
00470 // new / delete for classes deriving from AllocatedObject (alignment determined by per-class policy)
00471 #   define OGRE_NEW new 
00472 #   define OGRE_DELETE delete
00473 
00474 #endif // OGRE_DEBUG_MODE
00475 
00476 
00477 namespace Ogre
00478 {
00483     template<typename T>
00484     void deletePtr(T* ptr)
00485     {
00486         OGRE_DELETE ptr;
00487     }
00488 }
00489 
00493 #endif

Copyright © 2012 Torus Knot Software Ltd
Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Fri May 25 23:36:24 2012