BsGpuBuffer.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "RenderAPI/BsGpuBuffer.h"
  4. #include "Error/BsException.h"
  5. #include "RenderAPI/BsRenderAPI.h"
  6. #include "Managers/BsHardwareBufferManager.h"
  7. namespace bs
  8. {
  9. UINT32 getBufferSize(const GPU_BUFFER_DESC& desc)
  10. {
  11. UINT32 elementSize;
  12. if (desc.type == GBT_STANDARD)
  13. elementSize = GpuBuffer::getFormatSize(desc.format);
  14. else
  15. elementSize = desc.elementSize;
  16. return elementSize * desc.elementCount;
  17. }
  18. GpuBufferProperties::GpuBufferProperties(const GPU_BUFFER_DESC& desc)
  19. : mDesc(desc)
  20. {
  21. if(mDesc.type == GBT_STANDARD)
  22. mDesc.elementSize = GpuBuffer::getFormatSize(mDesc.format);
  23. }
  24. GpuBuffer::GpuBuffer(const GPU_BUFFER_DESC& desc)
  25. :mProperties(desc)
  26. {
  27. }
  28. SPtr<ct::GpuBuffer> GpuBuffer::getCore() const
  29. {
  30. return std::static_pointer_cast<ct::GpuBuffer>(mCoreSpecific);
  31. }
  32. SPtr<ct::CoreObject> GpuBuffer::createCore() const
  33. {
  34. return ct::HardwareBufferManager::instance().createGpuBufferInternal(mProperties.mDesc);
  35. }
  36. UINT32 GpuBuffer::getFormatSize(GpuBufferFormat format)
  37. {
  38. static bool lookupInitialized = false;
  39. static UINT32 lookup[BF_COUNT];
  40. if (!lookupInitialized)
  41. {
  42. lookup[BF_16X1F] = 2;
  43. lookup[BF_16X2F] = 4;
  44. lookup[BF_16X4F] = 8;
  45. lookup[BF_32X1F] = 4;
  46. lookup[BF_32X2F] = 8;
  47. lookup[BF_32X3F] = 12;
  48. lookup[BF_32X4F] = 16;
  49. lookup[BF_8X1] = 1;
  50. lookup[BF_8X2] = 2;
  51. lookup[BF_8X4] = 4;
  52. lookup[BF_16X1] = 2;
  53. lookup[BF_16X2] = 4;
  54. lookup[BF_16X4] = 8;
  55. lookup[BF_8X1S] = 1;
  56. lookup[BF_8X2S] = 2;
  57. lookup[BF_8X4S] = 4;
  58. lookup[BF_16X1S] = 2;
  59. lookup[BF_16X2S] = 4;
  60. lookup[BF_16X4S] = 8;
  61. lookup[BF_32X1S] = 4;
  62. lookup[BF_32X2S] = 8;
  63. lookup[BF_32X3S] = 12;
  64. lookup[BF_32X4S] = 16;
  65. lookup[BF_8X1U] = 1;
  66. lookup[BF_8X2U] = 2;
  67. lookup[BF_8X4U] = 4;
  68. lookup[BF_16X1U] = 1;
  69. lookup[BF_16X2U] = 2;
  70. lookup[BF_16X4U] = 4;
  71. lookup[BF_32X1U] = 4;
  72. lookup[BF_32X2U] = 8;
  73. lookup[BF_32X3U] = 12;
  74. lookup[BF_32X4U] = 16;
  75. lookupInitialized = true;
  76. }
  77. if (format >= BF_COUNT)
  78. return 0;
  79. return lookup[(UINT32)format];
  80. }
  81. SPtr<GpuBuffer> GpuBuffer::create(const GPU_BUFFER_DESC& desc)
  82. {
  83. return HardwareBufferManager::instance().createGpuBuffer(desc);
  84. }
  85. namespace ct
  86. {
  87. GpuBuffer::GpuBuffer(const GPU_BUFFER_DESC& desc, UINT32 deviceMask)
  88. :HardwareBuffer(getBufferSize(desc)), mProperties(desc)
  89. {
  90. }
  91. GpuBuffer::~GpuBuffer()
  92. {
  93. // Make sure that derived classes call clearBufferViews
  94. // I can't call it here since it needs a virtual method call
  95. }
  96. SPtr<GpuBuffer> GpuBuffer::create(const GPU_BUFFER_DESC& desc, GpuDeviceFlags deviceMask)
  97. {
  98. return HardwareBufferManager::instance().createGpuBuffer(desc, deviceMask);
  99. }
  100. }
  101. }