BsGpuBuffer.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsGpuBuffer.h"
  4. #include "BsException.h"
  5. #include "BsRenderAPI.h"
  6. #include "BsHardwareBufferManager.h"
  7. namespace BansheeEngine
  8. {
  9. GpuBufferProperties::GpuBufferProperties(UINT32 elementCount, UINT32 elementSize, GpuBufferType type,
  10. GpuBufferUsage usage, bool randomGpuWrite, bool useCounter)
  11. : mType(type), mUsage(usage), mRandomGpuWrite(randomGpuWrite), mUseCounter(useCounter), mElementCount(elementCount)
  12. , mElementSize(elementSize)
  13. {
  14. }
  15. GpuBufferCore::GpuBufferCore(UINT32 elementCount, UINT32 elementSize, GpuBufferType type, GpuBufferUsage usage,
  16. bool randomGpuWrite, bool useCounter)
  17. : mProperties(elementCount, elementSize, type, usage, randomGpuWrite, useCounter)
  18. {
  19. }
  20. GpuBufferCore::~GpuBufferCore()
  21. {
  22. // Make sure that derived classes call clearBufferViews
  23. // I can't call it here since it needs a virtual method call
  24. }
  25. void GpuBufferCore::clearBufferViews()
  26. {
  27. for (auto iter = mBufferViews.begin(); iter != mBufferViews.end(); ++iter)
  28. {
  29. destroyView(iter->second->view);
  30. bs_delete(iter->second);
  31. }
  32. mBufferViews.clear();
  33. }
  34. GpuBufferView* GpuBufferCore::requestView(const SPtr<GpuBufferCore>& buffer, UINT32 firstElement,
  35. UINT32 elementWidth, UINT32 numElements, bool useCounter, GpuViewUsage usage)
  36. {
  37. GPU_BUFFER_DESC key;
  38. key.firstElement = firstElement;
  39. key.elementWidth = elementWidth;
  40. key.numElements = numElements;
  41. key.numElements = numElements;
  42. key.usage = usage;
  43. auto iterFind = buffer->mBufferViews.find(key);
  44. if (iterFind == buffer->mBufferViews.end())
  45. {
  46. GpuBufferView* newView = buffer->createView();
  47. newView->initialize(buffer, key);
  48. buffer->mBufferViews[key] = bs_new<GpuBufferReference>(newView);
  49. iterFind = buffer->mBufferViews.find(key);
  50. }
  51. iterFind->second->refCount++;
  52. return iterFind->second->view;
  53. }
  54. void GpuBufferCore::releaseView(GpuBufferView* view)
  55. {
  56. SPtr<GpuBufferCore> buffer = view->getBuffer();
  57. auto iterFind = buffer->mBufferViews.find(view->getDesc());
  58. if (iterFind == buffer->mBufferViews.end())
  59. {
  60. BS_EXCEPT(InternalErrorException, "Trying to release a buffer view that doesn't exist!");
  61. }
  62. iterFind->second->refCount--;
  63. if (iterFind->second->refCount == 0)
  64. {
  65. GpuBufferReference* toRemove = iterFind->second;
  66. buffer->mBufferViews.erase(iterFind);
  67. buffer->destroyView(toRemove->view);
  68. bs_delete(toRemove);
  69. }
  70. }
  71. GpuBuffer::GpuBuffer(UINT32 elementCount, UINT32 elementSize, GpuBufferType type, GpuBufferUsage usage,
  72. bool randomGpuWrite, bool useCounter)
  73. :mProperties(elementCount, elementSize, type, usage, randomGpuWrite, useCounter)
  74. {
  75. }
  76. SPtr<GpuBufferCore> GpuBuffer::getCore() const
  77. {
  78. return std::static_pointer_cast<GpuBufferCore>(mCoreSpecific);
  79. }
  80. SPtr<CoreObjectCore> GpuBuffer::createCore() const
  81. {
  82. return HardwareBufferCoreManager::instance().createGpuBufferInternal(mProperties.getElementCount(),
  83. mProperties.getElementSize(), mProperties.getType(), mProperties.getUsage(), mProperties.getRandomGpuWrite(), mProperties.getUseCounter());
  84. }
  85. }