BsGpuBuffer.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include "BsGpuBuffer.h"
  2. #include "BsException.h"
  3. #include "BsRenderSystem.h"
  4. namespace BansheeEngine
  5. {
  6. GpuBuffer::GpuBuffer(UINT32 elementCount, UINT32 elementSize, GpuBufferType type, GpuBufferUsage usage, bool randomGpuWrite, bool useCounter)
  7. :mElementCount(elementCount), mElementSize(elementSize), mType(type), mUsage(usage), mRandomGpuWrite(randomGpuWrite), mUseCounter(useCounter)
  8. {
  9. }
  10. GpuBuffer::~GpuBuffer()
  11. {
  12. // Make sure that derived classes call clearBufferViews
  13. // I can't call it here since it needs a virtual method call
  14. }
  15. void GpuBuffer::destroy_internal()
  16. {
  17. clearBufferViews();
  18. CoreObject::destroy_internal();
  19. }
  20. void GpuBuffer::clearBufferViews()
  21. {
  22. for(auto iter = mBufferViews.begin(); iter != mBufferViews.end(); ++iter)
  23. {
  24. destroyView(iter->second->view);
  25. bs_delete<PoolAlloc>(iter->second);
  26. }
  27. mBufferViews.clear();
  28. }
  29. GpuBufferView* GpuBuffer::requestView(GpuBufferPtr buffer, UINT32 firstElement, UINT32 elementWidth, UINT32 numElements, bool useCounter, GpuViewUsage usage)
  30. {
  31. GPU_BUFFER_DESC key;
  32. key.firstElement = firstElement;
  33. key.elementWidth = elementWidth;
  34. key.numElements = numElements;
  35. key.numElements = numElements;
  36. key.usage = usage;
  37. auto iterFind = buffer->mBufferViews.find(key);
  38. if(iterFind == buffer->mBufferViews.end())
  39. {
  40. GpuBufferView* newView = buffer->createView();
  41. newView->initialize(buffer, key);
  42. buffer->mBufferViews[key] = bs_new<GpuBufferReference, PoolAlloc>(newView);
  43. iterFind = buffer->mBufferViews.find(key);
  44. }
  45. iterFind->second->refCount++;
  46. return iterFind->second->view;
  47. }
  48. void GpuBuffer::releaseView(GpuBufferView* view)
  49. {
  50. GpuBufferPtr buffer = view->getBuffer();
  51. auto iterFind = buffer->mBufferViews.find(view->getDesc());
  52. if(iterFind == buffer->mBufferViews.end())
  53. {
  54. BS_EXCEPT(InternalErrorException, "Trying to release a buffer view that doesn't exist!");
  55. }
  56. iterFind->second->refCount--;
  57. if(iterFind->second->refCount == 0)
  58. {
  59. GpuBufferReference* toRemove = iterFind->second;
  60. buffer->mBufferViews.erase(iterFind);
  61. buffer->destroyView(toRemove->view);
  62. bs_delete<PoolAlloc>(toRemove);
  63. }
  64. }
  65. }