BsGpuParamBlockBuffer.cpp 5.2 KB

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