BufferImpl.cpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. // Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <AnKi/Gr/gl/BufferImpl.h>
  6. #include <AnKi/Util/Logger.h>
  7. #include <cmath>
  8. namespace anki {
  9. void BufferImpl::init()
  10. {
  11. ANKI_ASSERT(!isCreated());
  12. const BufferUsageBit usage = getBufferUsage();
  13. const BufferMapAccessBit access = getMapAccess();
  14. // Align size to satisfy BufferImpl::fill
  15. m_realSize = getAlignedRoundUp(4, getSize());
  16. // This is a guess, not very important since DSA doesn't care about it on creation
  17. m_target = GL_ARRAY_BUFFER;
  18. if((usage & BufferUsageBit::UNIFORM_ALL) != BufferUsageBit::NONE)
  19. {
  20. m_target = GL_UNIFORM_BUFFER;
  21. }
  22. if((usage & BufferUsageBit::STORAGE_ALL) != BufferUsageBit::NONE)
  23. {
  24. m_target = GL_SHADER_STORAGE_BUFFER;
  25. }
  26. //
  27. // Determine the creation flags
  28. //
  29. GLbitfield flags = 0;
  30. Bool shouldMap = false;
  31. if((usage & BufferUsageBit::TRANSFER_ALL) != BufferUsageBit::NONE)
  32. {
  33. flags |= GL_DYNAMIC_STORAGE_BIT;
  34. }
  35. if((access & BufferMapAccessBit::WRITE) != BufferMapAccessBit::NONE)
  36. {
  37. flags |= GL_MAP_WRITE_BIT;
  38. flags |= GL_MAP_PERSISTENT_BIT;
  39. flags |= GL_MAP_COHERENT_BIT;
  40. shouldMap = true;
  41. }
  42. if((access & BufferMapAccessBit::READ) != BufferMapAccessBit::NONE)
  43. {
  44. flags |= GL_MAP_READ_BIT;
  45. flags |= GL_MAP_PERSISTENT_BIT;
  46. flags |= GL_MAP_COHERENT_BIT;
  47. shouldMap = true;
  48. }
  49. //
  50. // Create
  51. //
  52. glGenBuffers(1, &m_glName);
  53. glBindBuffer(m_target, m_glName);
  54. glBufferStorage(m_target, m_realSize, nullptr, flags);
  55. //
  56. // Map
  57. //
  58. if(shouldMap)
  59. {
  60. const GLbitfield MAP_BITS = GL_MAP_READ_BIT | GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT;
  61. m_persistentMapping = glMapBufferRange(m_target, 0, m_size, flags & MAP_BITS);
  62. ANKI_ASSERT(m_persistentMapping != nullptr);
  63. }
  64. }
  65. } // end namespace anki