BsGpuParamBlockBuffer.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsGpuParamBlockBuffer.h"
  4. #include "BsHardwareBufferManager.h"
  5. #include "BsFrameAlloc.h"
  6. namespace BansheeEngine
  7. {
  8. GpuParamBlockBufferCore::GpuParamBlockBufferCore(UINT32 size, GpuParamBlockUsage usage, GpuDeviceFlags deviceMask)
  9. :mUsage(usage), mSize(size), mCachedData(nullptr), mGPUBufferDirty(false)
  10. {
  11. if (mSize > 0)
  12. mCachedData = (UINT8*)bs_alloc(mSize);
  13. memset(mCachedData, 0, mSize);
  14. }
  15. GpuParamBlockBufferCore::~GpuParamBlockBufferCore()
  16. {
  17. if (mCachedData != nullptr)
  18. bs_free(mCachedData);
  19. }
  20. void GpuParamBlockBufferCore::write(UINT32 offset, const void* data, UINT32 size)
  21. {
  22. #if BS_DEBUG_MODE
  23. if ((offset + size) > mSize)
  24. {
  25. BS_EXCEPT(InvalidParametersException, "Wanted range is out of buffer bounds. " \
  26. "Available range: 0 .. " + toString(mSize) + ". " \
  27. "Wanted range: " + toString(offset) + " .. " + toString(offset + size) + ".");
  28. }
  29. #endif
  30. memcpy(mCachedData + offset, data, size);
  31. mGPUBufferDirty = true;
  32. }
  33. void GpuParamBlockBufferCore::read(UINT32 offset, void* data, UINT32 size)
  34. {
  35. #if BS_DEBUG_MODE
  36. if ((offset + size) > mSize)
  37. {
  38. BS_EXCEPT(InvalidParametersException, "Wanted range is out of buffer bounds. " \
  39. "Available range: 0 .. " + toString(mSize) + ". " \
  40. "Wanted range: " + toString(offset) + " .. " + toString(offset + size) + ".");
  41. }
  42. #endif
  43. memcpy(data, mCachedData + offset, size);
  44. }
  45. void GpuParamBlockBufferCore::zeroOut(UINT32 offset, UINT32 size)
  46. {
  47. #if BS_DEBUG_MODE
  48. if ((offset + size) > mSize)
  49. {
  50. BS_EXCEPT(InvalidParametersException, "Wanted range is out of buffer bounds. " \
  51. "Available range: 0 .. " + toString(mSize) + ". " \
  52. "Wanted range: " + toString(offset) + " .. " + toString(offset + size) + ".");
  53. }
  54. #endif
  55. memset(mCachedData + offset, 0, size);
  56. mGPUBufferDirty = true;
  57. }
  58. void GpuParamBlockBufferCore::flushToGPU()
  59. {
  60. if (mGPUBufferDirty)
  61. {
  62. writeToGPU(mCachedData);
  63. mGPUBufferDirty = false;
  64. }
  65. }
  66. void GpuParamBlockBufferCore::syncToCore(const CoreSyncData& data)
  67. {
  68. assert(mSize == data.getBufferSize());
  69. write(0, data.getBuffer(), data.getBufferSize());
  70. }
  71. SPtr<GpuParamBlockBufferCore> GpuParamBlockBufferCore::create(UINT32 size, GpuParamBlockUsage usage,
  72. GpuDeviceFlags deviceMask)
  73. {
  74. return HardwareBufferCoreManager::instance().createGpuParamBlockBuffer(size, usage, deviceMask);
  75. }
  76. GenericGpuParamBlockBufferCore::GenericGpuParamBlockBufferCore(UINT32 size, GpuParamBlockUsage usage,
  77. GpuDeviceFlags deviceMask)
  78. :GpuParamBlockBufferCore(size, usage, deviceMask), mData(nullptr)
  79. { }
  80. GenericGpuParamBlockBufferCore::~GenericGpuParamBlockBufferCore()
  81. {
  82. if (mData != nullptr)
  83. bs_free(mData);
  84. }
  85. void GenericGpuParamBlockBufferCore::writeToGPU(const UINT8* data)
  86. {
  87. memcpy(mData, data, mSize);
  88. }
  89. void GenericGpuParamBlockBufferCore::readFromGPU(UINT8* data) const
  90. {
  91. memcpy(data, mData, mSize);
  92. }
  93. void GenericGpuParamBlockBufferCore::initialize()
  94. {
  95. if (mSize > 0)
  96. mData = (UINT8*)bs_alloc(mSize);
  97. else
  98. mData = nullptr;
  99. memset(mData, 0, mSize);
  100. GpuParamBlockBufferCore::initialize();
  101. }
  102. GpuParamBlockBuffer::GpuParamBlockBuffer(UINT32 size, GpuParamBlockUsage usage)
  103. :mUsage(usage), mSize(size), mCachedData(nullptr)
  104. {
  105. if (mSize > 0)
  106. mCachedData = (UINT8*)bs_alloc(mSize);
  107. memset(mCachedData, 0, mSize);
  108. }
  109. GpuParamBlockBuffer::~GpuParamBlockBuffer()
  110. {
  111. if (mCachedData != nullptr)
  112. bs_free(mCachedData);
  113. }
  114. void GpuParamBlockBuffer::write(UINT32 offset, const void* data, UINT32 size)
  115. {
  116. #if BS_DEBUG_MODE
  117. if ((offset + size) > mSize)
  118. {
  119. BS_EXCEPT(InvalidParametersException, "Wanted range is out of buffer bounds. " \
  120. "Available range: 0 .. " + toString(mSize) + ". " \
  121. "Wanted range: " + toString(offset) + " .. " + toString(offset + size) + ".");
  122. }
  123. #endif
  124. memcpy(mCachedData + offset, data, size);
  125. markCoreDirty();
  126. }
  127. void GpuParamBlockBuffer::read(UINT32 offset, void* data, UINT32 size)
  128. {
  129. #if BS_DEBUG_MODE
  130. if ((offset + size) > mSize)
  131. {
  132. BS_EXCEPT(InvalidParametersException, "Wanted range is out of buffer bounds. " \
  133. "Available range: 0 .. " + toString(mSize) + ". " \
  134. "Wanted range: " + toString(offset) + " .. " + toString(offset + size) + ".");
  135. }
  136. #endif
  137. memcpy(data, mCachedData + offset, size);
  138. }
  139. void GpuParamBlockBuffer::zeroOut(UINT32 offset, UINT32 size)
  140. {
  141. #if BS_DEBUG_MODE
  142. if ((offset + size) > mSize)
  143. {
  144. BS_EXCEPT(InvalidParametersException, "Wanted range is out of buffer bounds. " \
  145. "Available range: 0 .. " + toString(mSize) + ". " \
  146. "Wanted range: " + toString(offset) + " .. " + toString(offset + size) + ".");
  147. }
  148. #endif
  149. memset(mCachedData + offset, 0, size);
  150. markCoreDirty();
  151. }
  152. SPtr<GpuParamBlockBufferCore> GpuParamBlockBuffer::getCore() const
  153. {
  154. return std::static_pointer_cast<GpuParamBlockBufferCore>(mCoreSpecific);
  155. }
  156. SPtr<CoreObjectCore> GpuParamBlockBuffer::createCore() const
  157. {
  158. return HardwareBufferCoreManager::instance().createGpuParamBlockBufferInternal(mSize, mUsage);
  159. }
  160. CoreSyncData GpuParamBlockBuffer::syncToCore(FrameAlloc* allocator)
  161. {
  162. UINT8* buffer = allocator->alloc(mSize);
  163. read(0, buffer, mSize);
  164. return CoreSyncData(buffer, mSize);
  165. }
  166. SPtr<GpuParamBlockBuffer> GpuParamBlockBuffer::create(UINT32 size, GpuParamBlockUsage usage)
  167. {
  168. return HardwareBufferManager::instance().createGpuParamBlockBuffer(size, usage);
  169. }
  170. }