BsGpuBuffer.cpp 2.5 KB

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