BufferImpl.cpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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. {
  10. void BufferImpl::init()
  11. {
  12. ANKI_ASSERT(!isCreated());
  13. const BufferUsageBit usage = getBufferUsage();
  14. const BufferMapAccessBit access = getMapAccess();
  15. // Align size to satisfy BufferImpl::fill
  16. m_realSize = getAlignedRoundUp(4, getSize());
  17. // This is a guess, not very important since DSA doesn't care about it on creation
  18. m_target = GL_ARRAY_BUFFER;
  19. if((usage & BufferUsageBit::UNIFORM_ALL) != BufferUsageBit::NONE)
  20. {
  21. m_target = GL_UNIFORM_BUFFER;
  22. }
  23. if((usage & BufferUsageBit::STORAGE_ALL) != BufferUsageBit::NONE)
  24. {
  25. m_target = GL_SHADER_STORAGE_BUFFER;
  26. }
  27. //
  28. // Determine the creation flags
  29. //
  30. GLbitfield flags = 0;
  31. Bool shouldMap = false;
  32. if((usage & BufferUsageBit::TRANSFER_ALL) != BufferUsageBit::NONE)
  33. {
  34. flags |= GL_DYNAMIC_STORAGE_BIT;
  35. }
  36. if((access & BufferMapAccessBit::WRITE) != BufferMapAccessBit::NONE)
  37. {
  38. flags |= GL_MAP_WRITE_BIT;
  39. flags |= GL_MAP_PERSISTENT_BIT;
  40. flags |= GL_MAP_COHERENT_BIT;
  41. shouldMap = true;
  42. }
  43. if((access & BufferMapAccessBit::READ) != BufferMapAccessBit::NONE)
  44. {
  45. flags |= GL_MAP_READ_BIT;
  46. flags |= GL_MAP_PERSISTENT_BIT;
  47. flags |= GL_MAP_COHERENT_BIT;
  48. shouldMap = true;
  49. }
  50. //
  51. // Create
  52. //
  53. glGenBuffers(1, &m_glName);
  54. glBindBuffer(m_target, m_glName);
  55. glBufferStorage(m_target, m_realSize, nullptr, flags);
  56. //
  57. // Map
  58. //
  59. if(shouldMap)
  60. {
  61. const GLbitfield MAP_BITS = GL_MAP_READ_BIT | GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT;
  62. m_persistentMapping = glMapBufferRange(m_target, 0, m_size, flags & MAP_BITS);
  63. ANKI_ASSERT(m_persistentMapping != nullptr);
  64. }
  65. }
  66. } // end namespace anki