buffer.h 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #ifndef AL_BUFFER_H
  2. #define AL_BUFFER_H
  3. #include "config.h"
  4. #include <array>
  5. #include <atomic>
  6. #include <cstddef>
  7. #include <cstdint>
  8. #include <string_view>
  9. #include <utility>
  10. #include "AL/al.h"
  11. #include "AL/alc.h"
  12. #include "alc/inprogext.h"
  13. #include "almalloc.h"
  14. #include "alnumeric.h"
  15. #include "core/buffer_storage.h"
  16. #include "vector.h"
  17. #if ALSOFT_EAX
  18. enum class EaxStorage : uint8_t {
  19. Automatic,
  20. Accessible,
  21. Hardware
  22. };
  23. #endif // ALSOFT_EAX
  24. struct ALbuffer : public BufferStorage {
  25. ALbitfieldSOFT Access{0u};
  26. al::vector<std::byte,16> mDataStorage;
  27. ALuint OriginalSize{0};
  28. ALuint UnpackAlign{0};
  29. ALuint PackAlign{0};
  30. ALuint UnpackAmbiOrder{1};
  31. ALbitfieldSOFT MappedAccess{0u};
  32. ALsizei MappedOffset{0};
  33. ALsizei MappedSize{0};
  34. ALuint mLoopStart{0u};
  35. ALuint mLoopEnd{0u};
  36. /* Number of times buffer was attached to a source (deletion can only occur when 0) */
  37. std::atomic<ALuint> ref{0u};
  38. /* Self ID */
  39. ALuint id{0};
  40. static void SetName(ALCcontext *context, ALuint id, std::string_view name);
  41. DISABLE_ALLOC
  42. #if ALSOFT_EAX
  43. EaxStorage eax_x_ram_mode{EaxStorage::Automatic};
  44. bool eax_x_ram_is_hardware{};
  45. #endif // ALSOFT_EAX
  46. };
  47. struct BufferSubList {
  48. uint64_t FreeMask{~0_u64};
  49. gsl::owner<std::array<ALbuffer,64>*> Buffers{nullptr};
  50. BufferSubList() noexcept = default;
  51. BufferSubList(const BufferSubList&) = delete;
  52. BufferSubList(BufferSubList&& rhs) noexcept : FreeMask{rhs.FreeMask}, Buffers{rhs.Buffers}
  53. { rhs.FreeMask = ~0_u64; rhs.Buffers = nullptr; }
  54. ~BufferSubList();
  55. BufferSubList& operator=(const BufferSubList&) = delete;
  56. BufferSubList& operator=(BufferSubList&& rhs) noexcept
  57. { std::swap(FreeMask, rhs.FreeMask); std::swap(Buffers, rhs.Buffers); return *this; }
  58. };
  59. #endif