BsHardwareBufferManager.cpp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsHardwareBufferManager.h"
  4. #include "BsVertexData.h"
  5. #include "BsGpuBuffer.h"
  6. #include "BsVertexDeclaration.h"
  7. #include "BsGpuParamBlockBuffer.h"
  8. #include "BsVertexDataDesc.h"
  9. #include "BsGpuParams.h"
  10. namespace bs
  11. {
  12. HardwareBufferManager::HardwareBufferManager()
  13. {
  14. }
  15. HardwareBufferManager::~HardwareBufferManager()
  16. {
  17. }
  18. SPtr<VertexDeclaration> HardwareBufferManager::createVertexDeclaration(const SPtr<VertexDataDesc>& desc)
  19. {
  20. VertexDeclaration* decl = new (bs_alloc<VertexDeclaration>()) VertexDeclaration(desc->createElements());
  21. SPtr<VertexDeclaration> declPtr = bs_core_ptr<VertexDeclaration>(decl);
  22. declPtr->_setThisPtr(declPtr);
  23. declPtr->initialize();
  24. return declPtr;
  25. }
  26. SPtr<VertexBuffer> HardwareBufferManager::createVertexBuffer(const VERTEX_BUFFER_DESC& desc)
  27. {
  28. SPtr<VertexBuffer> vbuf = bs_core_ptr<VertexBuffer>(new (bs_alloc<VertexBuffer>()) VertexBuffer(desc));
  29. vbuf->_setThisPtr(vbuf);
  30. vbuf->initialize();
  31. return vbuf;
  32. }
  33. SPtr<IndexBuffer> HardwareBufferManager::createIndexBuffer(const INDEX_BUFFER_DESC& desc)
  34. {
  35. SPtr<IndexBuffer> ibuf = bs_core_ptr<IndexBuffer>(new (bs_alloc<IndexBuffer>()) IndexBuffer(desc));
  36. ibuf->_setThisPtr(ibuf);
  37. ibuf->initialize();
  38. return ibuf;
  39. }
  40. SPtr<GpuParamBlockBuffer> HardwareBufferManager::createGpuParamBlockBuffer(UINT32 size, GpuParamBlockUsage usage)
  41. {
  42. SPtr<GpuParamBlockBuffer> paramBlockPtr = bs_core_ptr<GpuParamBlockBuffer>(new (bs_alloc<GpuParamBlockBuffer>()) GpuParamBlockBuffer(size, usage));
  43. paramBlockPtr->_setThisPtr(paramBlockPtr);
  44. paramBlockPtr->initialize();
  45. return paramBlockPtr;
  46. }
  47. SPtr<GpuBuffer> HardwareBufferManager::createGpuBuffer(const GPU_BUFFER_DESC& desc)
  48. {
  49. SPtr<GpuBuffer> gbuf = bs_core_ptr<GpuBuffer>(new (bs_alloc<GpuBuffer>()) GpuBuffer(desc));
  50. gbuf->_setThisPtr(gbuf);
  51. gbuf->initialize();
  52. return gbuf;
  53. }
  54. SPtr<GpuParams> HardwareBufferManager::createGpuParams(const SPtr<GpuPipelineParamInfo>& paramInfo)
  55. {
  56. GpuParams* params = new (bs_alloc<GpuParams>()) GpuParams(paramInfo);
  57. SPtr<GpuParams> paramsPtr = bs_core_ptr<GpuParams>(params);
  58. paramsPtr->_setThisPtr(paramsPtr);
  59. paramsPtr->initialize();
  60. return paramsPtr;
  61. }
  62. HardwareBufferCoreManager::VertexDeclarationKey::VertexDeclarationKey(const List<VertexElement>& elements)
  63. :elements(elements)
  64. { }
  65. size_t HardwareBufferCoreManager::VertexDeclarationKey::HashFunction::operator()(const VertexDeclarationKey& v) const
  66. {
  67. size_t hash = 0;
  68. for(auto& entry : v.elements)
  69. hash_combine(hash, VertexElement::getHash(entry));
  70. return hash;
  71. }
  72. bool HardwareBufferCoreManager::VertexDeclarationKey::EqualFunction::operator()(const VertexDeclarationKey& lhs,
  73. const VertexDeclarationKey& rhs) const
  74. {
  75. if (lhs.elements.size() != rhs.elements.size())
  76. return false;
  77. size_t numElements = lhs.elements.size();
  78. auto iterLeft = lhs.elements.begin();
  79. auto iterRight = rhs.elements.begin();
  80. for(size_t i = 0; i < numElements; i++)
  81. {
  82. if (*iterLeft != *iterRight)
  83. return false;
  84. ++iterLeft;
  85. ++iterRight;
  86. }
  87. return true;
  88. }
  89. SPtr<IndexBufferCore> HardwareBufferCoreManager::createIndexBuffer(const INDEX_BUFFER_DESC& desc,
  90. GpuDeviceFlags deviceMask)
  91. {
  92. SPtr<IndexBufferCore> ibuf = createIndexBufferInternal(desc, deviceMask);
  93. ibuf->initialize();
  94. return ibuf;
  95. }
  96. SPtr<VertexBufferCore> HardwareBufferCoreManager::createVertexBuffer(const VERTEX_BUFFER_DESC& desc,
  97. GpuDeviceFlags deviceMask)
  98. {
  99. SPtr<VertexBufferCore> vbuf = createVertexBufferInternal(desc, deviceMask);
  100. vbuf->initialize();
  101. return vbuf;
  102. }
  103. SPtr<VertexDeclarationCore> HardwareBufferCoreManager::createVertexDeclaration(const SPtr<VertexDataDesc>& desc,
  104. GpuDeviceFlags deviceMask)
  105. {
  106. List<VertexElement> elements = desc->createElements();
  107. return createVertexDeclaration(elements, deviceMask);
  108. }
  109. SPtr<GpuParamsCore> HardwareBufferCoreManager::createGpuParams(const SPtr<GpuPipelineParamInfoCore>& paramInfo,
  110. GpuDeviceFlags deviceMask)
  111. {
  112. SPtr<GpuParamsCore> params = createGpuParamsInternal(paramInfo, deviceMask);
  113. params->initialize();
  114. return params;
  115. }
  116. SPtr<VertexDeclarationCore> HardwareBufferCoreManager::createVertexDeclaration(const List<VertexElement>& elements,
  117. GpuDeviceFlags deviceMask)
  118. {
  119. VertexDeclarationKey key(elements);
  120. auto iterFind = mCachedDeclarations.find(key);
  121. if (iterFind != mCachedDeclarations.end())
  122. return iterFind->second;
  123. SPtr<VertexDeclarationCore> declPtr = createVertexDeclarationInternal(elements, deviceMask);
  124. declPtr->initialize();
  125. mCachedDeclarations[key] = declPtr;
  126. return declPtr;
  127. }
  128. SPtr<GpuParamBlockBufferCore> HardwareBufferCoreManager::createGpuParamBlockBuffer(UINT32 size,
  129. GpuParamBlockUsage usage, GpuDeviceFlags deviceMask)
  130. {
  131. SPtr<GpuParamBlockBufferCore> paramBlockPtr = createGpuParamBlockBufferInternal(size, usage, deviceMask);
  132. paramBlockPtr->initialize();
  133. return paramBlockPtr;
  134. }
  135. SPtr<GpuBufferCore> HardwareBufferCoreManager::createGpuBuffer(const GPU_BUFFER_DESC& desc,
  136. GpuDeviceFlags deviceMask)
  137. {
  138. SPtr<GpuBufferCore> gbuf = createGpuBufferInternal(desc, deviceMask);
  139. gbuf->initialize();
  140. return gbuf;
  141. }
  142. SPtr<VertexDeclarationCore> HardwareBufferCoreManager::createVertexDeclarationInternal(
  143. const List<VertexElement>& elements, GpuDeviceFlags deviceMask)
  144. {
  145. VertexDeclarationCore* decl = new (bs_alloc<VertexDeclarationCore>()) VertexDeclarationCore(elements, deviceMask);
  146. SPtr<VertexDeclarationCore> ret = bs_shared_ptr<VertexDeclarationCore>(decl);
  147. ret->_setThisPtr(ret);
  148. return ret;
  149. }
  150. SPtr<GpuParamsCore> HardwareBufferCoreManager::createGpuParamsInternal(
  151. const SPtr<GpuPipelineParamInfoCore>& paramInfo, GpuDeviceFlags deviceMask)
  152. {
  153. GpuParamsCore* params = new (bs_alloc<GpuParamsCore>()) GpuParamsCore(paramInfo, deviceMask);
  154. SPtr<GpuParamsCore> paramsPtr = bs_shared_ptr<GpuParamsCore>(params);
  155. paramsPtr->_setThisPtr(paramsPtr);
  156. return paramsPtr;
  157. }
  158. }