feature_support.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <map>
  5. #include <ranges>
  6. #include <tuple>
  7. #include "common/assert.h"
  8. #include "common/common_funcs.h"
  9. #include "common/common_types.h"
  10. #include "common/polyfill_ranges.h"
  11. namespace AudioCore {
  12. constexpr u32 CurrentRevision = 11;
  13. enum class SupportTags {
  14. CommandProcessingTimeEstimatorVersion4,
  15. CommandProcessingTimeEstimatorVersion3,
  16. CommandProcessingTimeEstimatorVersion2,
  17. MultiTapBiquadFilterProcessing,
  18. EffectInfoVer2,
  19. WaveBufferVer2,
  20. BiquadFilterFloatProcessing,
  21. VolumeMixParameterPrecisionQ23,
  22. MixInParameterDirtyOnlyUpdate,
  23. BiquadFilterEffectStateClearBugFix,
  24. VoicePlayedSampleCountResetAtLoopPoint,
  25. VoicePitchAndSrcSkipped,
  26. SplitterBugFix,
  27. FlushVoiceWaveBuffers,
  28. ElapsedFrameCount,
  29. AudioRendererVariadicCommandBufferSize,
  30. PerformanceMetricsDataFormatVersion2,
  31. AudioRendererProcessingTimeLimit80Percent,
  32. AudioRendererProcessingTimeLimit75Percent,
  33. AudioRendererProcessingTimeLimit70Percent,
  34. AdpcmLoopContextBugFix,
  35. Splitter,
  36. LongSizePreDelay,
  37. AudioUsbDeviceOutput,
  38. DeviceApiVersion2,
  39. DelayChannelMappingChange,
  40. ReverbChannelMappingChange,
  41. I3dl2ReverbChannelMappingChange,
  42. // Not a real tag, just here to get the count.
  43. Size
  44. };
  45. constexpr u32 GetRevisionNum(u32 user_revision) {
  46. if (user_revision >= 0x100) {
  47. user_revision -= Common::MakeMagic('R', 'E', 'V', '0');
  48. user_revision >>= 24;
  49. }
  50. return user_revision;
  51. };
  52. constexpr bool CheckFeatureSupported(SupportTags tag, u32 user_revision) {
  53. constexpr std::array<std::pair<SupportTags, u32>, static_cast<u32>(SupportTags::Size)> features{
  54. {
  55. {SupportTags::AudioRendererProcessingTimeLimit70Percent, 1},
  56. {SupportTags::Splitter, 2},
  57. {SupportTags::AdpcmLoopContextBugFix, 2},
  58. {SupportTags::LongSizePreDelay, 3},
  59. {SupportTags::AudioUsbDeviceOutput, 4},
  60. {SupportTags::AudioRendererProcessingTimeLimit75Percent, 4},
  61. {SupportTags::VoicePlayedSampleCountResetAtLoopPoint, 5},
  62. {SupportTags::VoicePitchAndSrcSkipped, 5},
  63. {SupportTags::SplitterBugFix, 5},
  64. {SupportTags::FlushVoiceWaveBuffers, 5},
  65. {SupportTags::ElapsedFrameCount, 5},
  66. {SupportTags::AudioRendererProcessingTimeLimit80Percent, 5},
  67. {SupportTags::AudioRendererVariadicCommandBufferSize, 5},
  68. {SupportTags::PerformanceMetricsDataFormatVersion2, 5},
  69. {SupportTags::CommandProcessingTimeEstimatorVersion2, 5},
  70. {SupportTags::BiquadFilterEffectStateClearBugFix, 6},
  71. {SupportTags::BiquadFilterFloatProcessing, 7},
  72. {SupportTags::VolumeMixParameterPrecisionQ23, 7},
  73. {SupportTags::MixInParameterDirtyOnlyUpdate, 7},
  74. {SupportTags::WaveBufferVer2, 8},
  75. {SupportTags::CommandProcessingTimeEstimatorVersion3, 8},
  76. {SupportTags::EffectInfoVer2, 9},
  77. {SupportTags::CommandProcessingTimeEstimatorVersion4, 10},
  78. {SupportTags::MultiTapBiquadFilterProcessing, 10},
  79. {SupportTags::DelayChannelMappingChange, 11},
  80. {SupportTags::ReverbChannelMappingChange, 11},
  81. {SupportTags::I3dl2ReverbChannelMappingChange, 11},
  82. }};
  83. const auto& feature =
  84. std::ranges::find_if(features, [tag](const auto& entry) { return entry.first == tag; });
  85. if (feature == features.cend()) {
  86. LOG_ERROR(Service_Audio, "Invalid SupportTag {}!", static_cast<u32>(tag));
  87. return false;
  88. }
  89. user_revision = GetRevisionNum(user_revision);
  90. return (*feature).second <= user_revision;
  91. }
  92. constexpr bool CheckValidRevision(u32 user_revision) {
  93. return GetRevisionNum(user_revision) <= CurrentRevision;
  94. };
  95. } // namespace AudioCore