buffer.h 1.8 KB

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