CmGenericBuffer.cpp 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #include "CmGenericBuffer.h"
  2. #include "CmException.h"
  3. namespace CamelotEngine
  4. {
  5. GenericBuffer::GenericBuffer(UINT32 elementCount, UINT32 elementSize, GenericBufferType type, GpuBufferUsage usage, bool randomGpuWrite, bool useCounter)
  6. :mElementCount(elementCount), mElementSize(elementSize), mType(type), mUsage(usage), mRandomGpuWrite(randomGpuWrite), mUseCounter(useCounter)
  7. {
  8. }
  9. GenericBuffer::~GenericBuffer()
  10. {
  11. // Make sure that derived classes call clearBufferViews
  12. // I can't call it here since it needs a virtual method call
  13. }
  14. void GenericBuffer::clearBufferViews()
  15. {
  16. for(auto iter = mBufferViews.begin(); iter != mBufferViews.end(); ++iter)
  17. {
  18. destroyView(iter->second->view);
  19. delete iter->second;
  20. }
  21. mBufferViews.clear();
  22. }
  23. GenericBufferView* GenericBuffer::requestView(UINT32 firstElement, UINT32 elementWidth, UINT32 numElements, bool randomGpuWrite)
  24. {
  25. GenericBufferView::Key key(firstElement, elementWidth, numElements, randomGpuWrite);
  26. auto iterFind = mBufferViews.find(key);
  27. if(iterFind == mBufferViews.end())
  28. {
  29. GenericBufferView* newView = createView(firstElement, elementWidth, numElements, randomGpuWrite);
  30. mBufferViews[key] = new GenericBufferReference(newView);
  31. iterFind = mBufferViews.find(key);
  32. }
  33. iterFind->second->refCount++;
  34. return iterFind->second->view;
  35. }
  36. void GenericBuffer::releaseView(GenericBufferView* view)
  37. {
  38. GenericBufferView::Key key(*view);
  39. auto iterFind = mBufferViews.find(key);
  40. if(iterFind == mBufferViews.end())
  41. {
  42. CM_EXCEPT(InternalErrorException, "Trying to release a buffer that doesn't exist!");
  43. }
  44. iterFind->second->refCount--;
  45. if(iterFind->second->refCount == 0)
  46. {
  47. GenericBufferReference* toRemove = iterFind->second;
  48. mBufferViews.erase(iterFind);
  49. destroyView(toRemove->view);
  50. delete toRemove;
  51. }
  52. }
  53. }