FrameBuffer.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /*
  2. * TI Voxel Lib component.
  3. *
  4. * Copyright (c) 2014 Texas Instruments Inc.
  5. */
  6. #ifndef VOXEL_FRAMEBUFFER_H
  7. #define VOXEL_FRAMEBUFFER_H
  8. #include <Ptr.h>
  9. #include <Common.h>
  10. #include <algorithm>
  11. #define MAX_FRAME_BUFFERS 3
  12. namespace Voxel
  13. {
  14. /**
  15. * \addtogroup Frm
  16. * @{
  17. */
  18. template <typename BufferType>
  19. class FrameBufferManager;
  20. // Auto-releases the obtained buffer when FrameBuffer<> instance is terminated
  21. template <typename BufferType>
  22. class FrameBuffer: public Ptr<BufferType>
  23. {
  24. public:
  25. typedef Ptr<BufferType> BufferPtr;
  26. protected:
  27. BufferPtr &_buffer;
  28. FrameBufferManager<BufferType> &_manager;
  29. public:
  30. FrameBuffer(BufferPtr &buffer, FrameBufferManager<BufferType> &manager): _buffer(buffer), _manager(manager),
  31. Ptr<BufferType>(nullptr, [&manager, &buffer](BufferType *) { manager.release(buffer); }) // The deleter gets called when FrameBuffer<> goes out of scope. Deleter releases the held buffer
  32. {}
  33. inline BufferPtr &operator *() { return _buffer; }
  34. virtual ~FrameBuffer() {}
  35. };
  36. // This maintains a minimum number of buffers for use and re-use.
  37. // Call to release() on unused buffers is important for it be either freed or reused
  38. template <typename BufferType>
  39. class FrameBufferManager
  40. {
  41. public:
  42. typedef Ptr<BufferType> BufferPtr;
  43. typedef FrameBuffer<BufferType> FrameBufferType;
  44. protected:
  45. List<BufferPtr> _inUse;
  46. List<BufferPtr> _available;
  47. SizeType _minimumBufferCount;
  48. public:
  49. FrameBufferManager(SizeType minBufferCount): _minimumBufferCount(minBufferCount)
  50. {
  51. for(auto i = 0; i < minBufferCount; i++)
  52. _available.push_back(BufferPtr());
  53. }
  54. inline void setMinimumBufferCount(SizeType minBufferCount)
  55. {
  56. _minimumBufferCount = (minBufferCount > 0)?minBufferCount:MAX_FRAME_BUFFERS;
  57. }
  58. inline SizeType getMinimumBufferCount() const
  59. {
  60. return _minimumBufferCount;
  61. }
  62. FrameBufferType get()
  63. {
  64. if(_available.size() > 0)
  65. _inUse.splice(_inUse.begin(), _available, _available.begin());
  66. else
  67. _inUse.push_front(BufferPtr());
  68. return FrameBufferType(*_inUse.begin(), *this);
  69. }
  70. bool release(BufferPtr &p)
  71. {
  72. auto f = std::find(_inUse.begin(), _inUse.end(), p);
  73. if(f == _inUse.end())
  74. return false;
  75. if(_available.size() < _minimumBufferCount)
  76. _available.splice(_available.begin(), _inUse, f);
  77. else
  78. _inUse.erase(f);
  79. return true;
  80. }
  81. void clear()
  82. {
  83. _inUse.clear();
  84. _available.clear();
  85. }
  86. virtual ~FrameBufferManager() { clear(); }
  87. };
  88. /**
  89. * @}
  90. */
  91. }
  92. #endif // FRAMEBUFFER_H