BsGpuBuffer.cpp 3.2 KB

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