[APU] Switched to New XMA decoder as default
- Added codepath for "consume only" pass. This should resolve constant clicking in Source engine games. - Added smaller performance improvements to decoder
This commit is contained in:
@@ -146,6 +146,12 @@ struct XMA_CONTEXT_DATA {
|
|||||||
const uint32_t GetCurrentInputBufferPacketCount() const {
|
const uint32_t GetCurrentInputBufferPacketCount() const {
|
||||||
return GetInputBufferPacketCount(current_buffer);
|
return GetInputBufferPacketCount(current_buffer);
|
||||||
}
|
}
|
||||||
|
const bool IsStreamingContext() const {
|
||||||
|
return (input_buffer_0_packet_count | input_buffer_1_packet_count) == 1;
|
||||||
|
}
|
||||||
|
const bool IsConsumeOnlyContext() const {
|
||||||
|
return (input_buffer_0_packet_count | input_buffer_1_packet_count) == 0;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
static_assert_size(XMA_CONTEXT_DATA, 64);
|
static_assert_size(XMA_CONTEXT_DATA, 64);
|
||||||
|
|
||||||
|
|||||||
@@ -128,6 +128,15 @@ bool XmaContextNew::Work() {
|
|||||||
|
|
||||||
RingBuffer output_rb = PrepareOutputRingBuffer(&data);
|
RingBuffer output_rb = PrepareOutputRingBuffer(&data);
|
||||||
|
|
||||||
|
if (data.IsConsumeOnlyContext()) {
|
||||||
|
Consume(&output_rb, &data);
|
||||||
|
if (data.output_buffer_read_offset == data.output_buffer_write_offset) {
|
||||||
|
Clear();
|
||||||
|
}
|
||||||
|
data.Store(context_ptr);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
const int32_t minimum_subframe_decode_count =
|
const int32_t minimum_subframe_decode_count =
|
||||||
(data.subframe_decode_count * 2) - 1;
|
(data.subframe_decode_count * 2) - 1;
|
||||||
|
|
||||||
@@ -257,7 +266,8 @@ void XmaContextNew::SwapInputBuffer(XMA_CONTEXT_DATA* data) {
|
|||||||
data->input_buffer_read_offset = kBitsPerPacketHeader;
|
data->input_buffer_read_offset = kBitsPerPacketHeader;
|
||||||
}
|
}
|
||||||
|
|
||||||
void XmaContextNew::Consume(RingBuffer* output_rb, XMA_CONTEXT_DATA* data) {
|
void XmaContextNew::Consume(RingBuffer* XE_RESTRICT output_rb,
|
||||||
|
const XMA_CONTEXT_DATA* const XE_RESTRICT data) {
|
||||||
if (!current_frame_remaining_subframes_) {
|
if (!current_frame_remaining_subframes_) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -106,7 +106,8 @@ class XmaContextNew : public XmaContext {
|
|||||||
static uint32_t GetCurrentInputBufferSize(XMA_CONTEXT_DATA* data);
|
static uint32_t GetCurrentInputBufferSize(XMA_CONTEXT_DATA* data);
|
||||||
|
|
||||||
void Decode(XMA_CONTEXT_DATA* data);
|
void Decode(XMA_CONTEXT_DATA* data);
|
||||||
void Consume(RingBuffer* output_rb, XMA_CONTEXT_DATA* data);
|
void Consume(RingBuffer* XE_RESTRICT output_rb,
|
||||||
|
const XMA_CONTEXT_DATA* const XE_RESTRICT data);
|
||||||
|
|
||||||
void UpdateLoopStatus(XMA_CONTEXT_DATA* data);
|
void UpdateLoopStatus(XMA_CONTEXT_DATA* data);
|
||||||
int PrepareDecoder(int sample_rate, bool is_two_channel);
|
int PrepareDecoder(int sample_rate, bool is_two_channel);
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ extern "C" {
|
|||||||
DEFINE_bool(ffmpeg_verbose, false, "Verbose FFmpeg output (debug and above)",
|
DEFINE_bool(ffmpeg_verbose, false, "Verbose FFmpeg output (debug and above)",
|
||||||
"APU");
|
"APU");
|
||||||
|
|
||||||
DEFINE_bool(use_new_decoder, false,
|
DEFINE_bool(use_new_decoder, true,
|
||||||
"Enables usage of new experimental XMA audio decoder.", "APU");
|
"Enables usage of new experimental XMA audio decoder.", "APU");
|
||||||
|
|
||||||
DEFINE_bool(use_dedicated_xma_thread, true,
|
DEFINE_bool(use_dedicated_xma_thread, true,
|
||||||
@@ -62,6 +62,8 @@ DEFINE_bool(use_dedicated_xma_thread, true,
|
|||||||
"better results, but decrease performance a bit.",
|
"better results, but decrease performance a bit.",
|
||||||
"APU");
|
"APU");
|
||||||
|
|
||||||
|
UPDATE_from_bool(use_new_decoder, 2025, 12, 01, 23, false);
|
||||||
|
|
||||||
namespace xe {
|
namespace xe {
|
||||||
namespace apu {
|
namespace apu {
|
||||||
|
|
||||||
|
|||||||
@@ -511,7 +511,7 @@ class IConfigVarUpdate {
|
|||||||
// If you're reviewing a pull request with a change here, check if 1) has been
|
// If you're reviewing a pull request with a change here, check if 1) has been
|
||||||
// done by the submitter before merging.
|
// done by the submitter before merging.
|
||||||
static constexpr uint32_t kLastCommittedUpdateDate =
|
static constexpr uint32_t kLastCommittedUpdateDate =
|
||||||
MakeConfigVarUpdateDate(2024, 9, 23, 9);
|
MakeConfigVarUpdateDate(2025, 12, 1, 23);
|
||||||
|
|
||||||
virtual ~IConfigVarUpdate() = default;
|
virtual ~IConfigVarUpdate() = default;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user