BsGpuBuffer.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  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. GpuBufferFormat format, GpuBufferUsage usage, bool randomGpuWrite, bool useCounter)
  11. : mType(type), mUsage(usage), mFormat(format), mRandomGpuWrite(randomGpuWrite), mUseCounter(useCounter)
  12. , mElementCount(elementCount), mElementSize(elementSize)
  13. {
  14. if(type == GBT_STANDARD)
  15. mElementSize = GpuBuffer::getFormatSize(format);
  16. }
  17. GpuBufferCore::GpuBufferCore(UINT32 elementCount, UINT32 elementSize, GpuBufferType type, GpuBufferFormat format,
  18. GpuBufferUsage usage, bool randomGpuWrite, bool useCounter)
  19. : mProperties(elementCount, elementSize, type, format, usage, randomGpuWrite, useCounter)
  20. {
  21. }
  22. GpuBufferCore::~GpuBufferCore()
  23. {
  24. // Make sure that derived classes call clearBufferViews
  25. // I can't call it here since it needs a virtual method call
  26. }
  27. void GpuBufferCore::clearBufferViews()
  28. {
  29. for (auto iter = mBufferViews.begin(); iter != mBufferViews.end(); ++iter)
  30. {
  31. destroyView(iter->second->view);
  32. bs_delete(iter->second);
  33. }
  34. mBufferViews.clear();
  35. }
  36. GpuBufferView* GpuBufferCore::requestView(const SPtr<GpuBufferCore>& buffer, UINT32 firstElement,
  37. UINT32 numElements, GpuViewUsage usage)
  38. {
  39. const auto& props = buffer->getProperties();
  40. GPU_BUFFER_DESC key;
  41. key.firstElement = firstElement;
  42. key.elementWidth = props.getElementSize();
  43. key.numElements = numElements;
  44. key.usage = usage;
  45. key.format = props.getFormat();
  46. key.useCounter = props.getUseCounter();
  47. auto iterFind = buffer->mBufferViews.find(key);
  48. if (iterFind == buffer->mBufferViews.end())
  49. {
  50. GpuBufferView* newView = buffer->createView();
  51. newView->initialize(buffer, key);
  52. buffer->mBufferViews[key] = bs_new<GpuBufferReference>(newView);
  53. iterFind = buffer->mBufferViews.find(key);
  54. }
  55. iterFind->second->refCount++;
  56. return iterFind->second->view;
  57. }
  58. void GpuBufferCore::releaseView(GpuBufferView* view)
  59. {
  60. SPtr<GpuBufferCore> buffer = view->getBuffer();
  61. auto iterFind = buffer->mBufferViews.find(view->getDesc());
  62. if (iterFind == buffer->mBufferViews.end())
  63. {
  64. BS_EXCEPT(InternalErrorException, "Trying to release a buffer view that doesn't exist!");
  65. }
  66. iterFind->second->refCount--;
  67. if (iterFind->second->refCount == 0)
  68. {
  69. GpuBufferReference* toRemove = iterFind->second;
  70. buffer->mBufferViews.erase(iterFind);
  71. buffer->destroyView(toRemove->view);
  72. bs_delete(toRemove);
  73. }
  74. }
  75. SPtr<GpuBufferCore> GpuBufferCore::create(UINT32 elementCount, UINT32 elementSize, GpuBufferType type,
  76. GpuBufferFormat format, GpuBufferUsage usage, bool randomGpuWrite, bool useCounter)
  77. {
  78. SPtr<GpuBufferCore> gpuBuffer = HardwareBufferCoreManager::instance().createGpuBufferInternal(elementCount,
  79. elementSize, type, format, usage, randomGpuWrite, useCounter);
  80. gpuBuffer->initialize();
  81. return gpuBuffer;
  82. }
  83. GpuBuffer::GpuBuffer(UINT32 elementCount, UINT32 elementSize, GpuBufferType type, GpuBufferFormat format,
  84. GpuBufferUsage usage, bool randomGpuWrite, bool useCounter)
  85. :mProperties(elementCount, elementSize, type, format, usage, randomGpuWrite, useCounter)
  86. {
  87. }
  88. SPtr<GpuBufferCore> GpuBuffer::getCore() const
  89. {
  90. return std::static_pointer_cast<GpuBufferCore>(mCoreSpecific);
  91. }
  92. SPtr<CoreObjectCore> GpuBuffer::createCore() const
  93. {
  94. return HardwareBufferCoreManager::instance().createGpuBufferInternal(mProperties.getElementCount(),
  95. mProperties.getElementSize(), mProperties.getType(), mProperties.getFormat(), mProperties.getUsage(),
  96. mProperties.getRandomGpuWrite(), mProperties.getUseCounter());
  97. }
  98. UINT32 GpuBuffer::getFormatSize(GpuBufferFormat format)
  99. {
  100. static bool lookupInitialized = false;
  101. static UINT32 lookup[BF_COUNT];
  102. if (!lookupInitialized)
  103. {
  104. lookup[BF_16X1F] = 2;
  105. lookup[BF_16X2F] = 4;
  106. lookup[BF_16X4F] = 8;
  107. lookup[BF_32X1F] = 4;
  108. lookup[BF_32X2F] = 8;
  109. lookup[BF_32X3F] = 12;
  110. lookup[BF_32X4F] = 16;
  111. lookup[BF_8X1] = 1;
  112. lookup[BF_8X2] = 2;
  113. lookup[BF_8X4] = 4;
  114. lookup[BF_16X1] = 2;
  115. lookup[BF_16X2] = 4;
  116. lookup[BF_16X4] = 8;
  117. lookup[BF_8X1S] = 1;
  118. lookup[BF_8X2S] = 2;
  119. lookup[BF_8X4S] = 4;
  120. lookup[BF_16X1S] = 2;
  121. lookup[BF_16X2S] = 4;
  122. lookup[BF_16X4S] = 8;
  123. lookup[BF_32X1S] = 4;
  124. lookup[BF_32X2S] = 8;
  125. lookup[BF_32X3S] = 12;
  126. lookup[BF_32X4S] = 16;
  127. lookup[BF_8X1U] = 1;
  128. lookup[BF_8X2U] = 2;
  129. lookup[BF_8X4U] = 4;
  130. lookup[BF_16X1U] = 1;
  131. lookup[BF_16X2U] = 2;
  132. lookup[BF_16X4U] = 4;
  133. lookup[BF_32X1U] = 4;
  134. lookup[BF_32X2U] = 8;
  135. lookup[BF_32X3U] = 12;
  136. lookup[BF_32X4U] = 16;
  137. lookupInitialized = true;
  138. }
  139. if (format >= BF_COUNT)
  140. return 0;
  141. return lookup[(UINT32)format];
  142. }
  143. SPtr<GpuBuffer> GpuBuffer::create(UINT32 elementCount, UINT32 elementSize, GpuBufferType type,
  144. GpuBufferFormat format, GpuBufferUsage usage, bool randomGpuWrite, bool useCounter)
  145. {
  146. return HardwareBufferManager::instance().createGpuBuffer(elementCount, elementSize, type, format,
  147. usage, randomGpuWrite, useCounter);
  148. }
  149. }