aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2022-07-13 05:09:42 -0700
committerChris Robinson <[email protected]>2022-07-13 05:19:51 -0700
commitc843efd3225e53317d955dfe3550d2669f11639e (patch)
treee55b74e0d9e3aa8193b446115a4ac3e2965775fb
parent86094e87a575ef621d5d2550ed807ffeb6e5036d (diff)
Don't track dirty flags per EAX version
Only the current version's flags are used, and they're all reset when changing versions, making it unnecessary to track non-current version flags.
-rw-r--r--al/auxeffectslot.cpp68
-rw-r--r--al/auxeffectslot.h14
-rw-r--r--alc/context.cpp40
-rw-r--r--alc/context.h23
4 files changed, 60 insertions, 85 deletions
diff --git a/al/auxeffectslot.cpp b/al/auxeffectslot.cpp
index 8a5915a6..04e7720d 100644
--- a/al/auxeffectslot.cpp
+++ b/al/auxeffectslot.cpp
@@ -1198,7 +1198,6 @@ void ALeffectslot::eax4_fx_slot_set_defaults(Eax4Props& props)
void ALeffectslot::eax4_fx_slot_set_defaults()
{
eax4_fx_slot_set_defaults(eax4_.i);
- eax4_.df = ~EaxDirtyFlags{};
}
void ALeffectslot::eax5_fx_slot_set_defaults(Eax5Props& props)
@@ -1211,7 +1210,6 @@ void ALeffectslot::eax5_fx_slot_set_defaults(Eax5Props& props)
void ALeffectslot::eax5_fx_slot_set_defaults()
{
eax5_fx_slot_set_defaults(eax5_.i);
- eax5_.df = ~EaxDirtyFlags{};
}
void ALeffectslot::eax_fx_slot_set_defaults()
@@ -1220,6 +1218,7 @@ void ALeffectslot::eax_fx_slot_set_defaults()
eax5_fx_slot_set_defaults();
eax123_ = eax5_;
eax_ = eax5_.i;
+ eax_df_ = ~EaxDirtyFlags{};
}
void ALeffectslot::eax4_fx_slot_get(const EaxCall& call, const Eax4Props& props) const
@@ -1338,11 +1337,10 @@ void ALeffectslot::eax4_fx_slot_set_all(const EaxCall& call)
const auto& src = call.get_value<Exception, const EAX40FXSLOTPROPERTIES>();
Eax4AllValidator{}(src);
auto& dst = eax4_.i;
- auto& df = eax4_.df;
- df |= eax_load_effect_dirty_bit; // Always reset the effect.
- df |= (dst.lVolume != src.lVolume ? eax_volume_dirty_bit : EaxDirtyFlags{});
- df |= (dst.lLock != src.lLock ? eax_lock_dirty_bit : EaxDirtyFlags{});
- df |= (dst.ulFlags != src.ulFlags ? eax_flags_dirty_bit : EaxDirtyFlags{});
+ eax_df_ |= eax_load_effect_dirty_bit; // Always reset the effect.
+ eax_df_ |= (dst.lVolume != src.lVolume ? eax_volume_dirty_bit : EaxDirtyFlags{});
+ eax_df_ |= (dst.lLock != src.lLock ? eax_lock_dirty_bit : EaxDirtyFlags{});
+ eax_df_ |= (dst.ulFlags != src.ulFlags ? eax_flags_dirty_bit : EaxDirtyFlags{});
dst = src;
}
@@ -1351,20 +1349,18 @@ void ALeffectslot::eax5_fx_slot_set_all(const EaxCall& call)
const auto& src = call.get_value<Exception, const EAX50FXSLOTPROPERTIES>();
Eax5AllValidator{}(src);
auto& dst = eax5_.i;
- auto& df = eax5_.df;
- df |= eax_load_effect_dirty_bit; // Always reset the effect.
- df |= (dst.lVolume != src.lVolume ? eax_volume_dirty_bit : EaxDirtyFlags{});
- df |= (dst.lLock != src.lLock ? eax_lock_dirty_bit : EaxDirtyFlags{});
- df |= (dst.ulFlags != src.ulFlags ? eax_flags_dirty_bit : EaxDirtyFlags{});
- df |= (dst.lOcclusion != src.lOcclusion ? eax_flags_dirty_bit : EaxDirtyFlags{});
- df |= (dst.flOcclusionLFRatio != src.flOcclusionLFRatio ? eax_flags_dirty_bit : EaxDirtyFlags{});
+ eax_df_ |= eax_load_effect_dirty_bit; // Always reset the effect.
+ eax_df_ |= (dst.lVolume != src.lVolume ? eax_volume_dirty_bit : EaxDirtyFlags{});
+ eax_df_ |= (dst.lLock != src.lLock ? eax_lock_dirty_bit : EaxDirtyFlags{});
+ eax_df_ |= (dst.ulFlags != src.ulFlags ? eax_flags_dirty_bit : EaxDirtyFlags{});
+ eax_df_ |= (dst.lOcclusion != src.lOcclusion ? eax_flags_dirty_bit : EaxDirtyFlags{});
+ eax_df_ |= (dst.flOcclusionLFRatio != src.flOcclusionLFRatio ? eax_flags_dirty_bit : EaxDirtyFlags{});
dst = src;
}
// Returns `true` if all sources should be updated, or `false` otherwise.
bool ALeffectslot::eax4_fx_slot_set(const EaxCall& call)
{
- auto& df = eax4_.df;
auto& dst = eax4_.i;
switch(call.get_property_id())
@@ -1376,29 +1372,28 @@ bool ALeffectslot::eax4_fx_slot_set(const EaxCall& call)
break;
case EAXFXSLOT_LOADEFFECT:
eax4_fx_slot_ensure_unlocked();
- eax_fx_slot_set_dirty<Eax4GuidLoadEffectValidator, eax_load_effect_dirty_bit>(call, dst.guidLoadEffect, df);
+ eax_fx_slot_set_dirty<Eax4GuidLoadEffectValidator, eax_load_effect_dirty_bit>(call, dst.guidLoadEffect, eax_df_);
break;
case EAXFXSLOT_VOLUME:
- eax_fx_slot_set<Eax4VolumeValidator, eax_volume_dirty_bit>(call, dst.lVolume, df);
+ eax_fx_slot_set<Eax4VolumeValidator, eax_volume_dirty_bit>(call, dst.lVolume, eax_df_);
break;
case EAXFXSLOT_LOCK:
eax4_fx_slot_ensure_unlocked();
- eax_fx_slot_set<Eax4LockValidator, eax_lock_dirty_bit>(call, dst.lLock, df);
+ eax_fx_slot_set<Eax4LockValidator, eax_lock_dirty_bit>(call, dst.lLock, eax_df_);
break;
case EAXFXSLOT_FLAGS:
- eax_fx_slot_set<Eax4FlagsValidator, eax_flags_dirty_bit>(call, dst.ulFlags, df);
+ eax_fx_slot_set<Eax4FlagsValidator, eax_flags_dirty_bit>(call, dst.ulFlags, eax_df_);
break;
default:
eax_fail_unknown_property_id();
}
- return (df & (eax_occlusion_dirty_bit | eax_occlusion_lf_ratio_dirty_bit)) != EaxDirtyFlags{};
+ return (eax_df_ & (eax_occlusion_dirty_bit | eax_occlusion_lf_ratio_dirty_bit)) != EaxDirtyFlags{};
}
// Returns `true` if all sources should be updated, or `false` otherwise.
bool ALeffectslot::eax5_fx_slot_set(const EaxCall& call)
{
- auto& df = eax5_.df;
auto& dst = eax5_.i;
switch(call.get_property_id())
@@ -1409,28 +1404,28 @@ bool ALeffectslot::eax5_fx_slot_set(const EaxCall& call)
eax5_fx_slot_set_all(call);
break;
case EAXFXSLOT_LOADEFFECT:
- eax_fx_slot_set_dirty<Eax4GuidLoadEffectValidator, eax_load_effect_dirty_bit>(call, dst.guidLoadEffect, df);
+ eax_fx_slot_set_dirty<Eax4GuidLoadEffectValidator, eax_load_effect_dirty_bit>(call, dst.guidLoadEffect, eax_df_);
break;
case EAXFXSLOT_VOLUME:
- eax_fx_slot_set<Eax4VolumeValidator, eax_volume_dirty_bit>(call, dst.lVolume, df);
+ eax_fx_slot_set<Eax4VolumeValidator, eax_volume_dirty_bit>(call, dst.lVolume, eax_df_);
break;
case EAXFXSLOT_LOCK:
- eax_fx_slot_set<Eax4LockValidator, eax_lock_dirty_bit>(call, dst.lLock, df);
+ eax_fx_slot_set<Eax4LockValidator, eax_lock_dirty_bit>(call, dst.lLock, eax_df_);
break;
case EAXFXSLOT_FLAGS:
- eax_fx_slot_set<Eax4FlagsValidator, eax_flags_dirty_bit>(call, dst.ulFlags, df);
+ eax_fx_slot_set<Eax4FlagsValidator, eax_flags_dirty_bit>(call, dst.ulFlags, eax_df_);
break;
case EAXFXSLOT_OCCLUSION:
- eax_fx_slot_set<Eax5OcclusionValidator, eax_occlusion_dirty_bit>(call, dst.lOcclusion, df);
+ eax_fx_slot_set<Eax5OcclusionValidator, eax_occlusion_dirty_bit>(call, dst.lOcclusion, eax_df_);
break;
case EAXFXSLOT_OCCLUSIONLFRATIO:
- eax_fx_slot_set<Eax5OcclusionLfRatioValidator, eax_occlusion_lf_ratio_dirty_bit>(call, dst.flOcclusionLFRatio, df);
+ eax_fx_slot_set<Eax5OcclusionLfRatioValidator, eax_occlusion_lf_ratio_dirty_bit>(call, dst.flOcclusionLFRatio, eax_df_);
break;
default:
eax_fail_unknown_property_id();
}
- return (df & (eax_occlusion_dirty_bit | eax_occlusion_lf_ratio_dirty_bit)) != EaxDirtyFlags{};
+ return (eax_df_ & (eax_occlusion_dirty_bit | eax_occlusion_lf_ratio_dirty_bit)) != EaxDirtyFlags{};
}
// Returns `true` if all sources should be updated, or `false` otherwise.
@@ -1449,13 +1444,8 @@ bool ALeffectslot::eax_set(const EaxCall& call)
{
const auto version = call.get_version();
- if(eax_version_ != version) {
- constexpr auto all_bits = ~EaxDirtyFlags{};
- eax123_.df = all_bits;
- eax4_.df = all_bits;
- eax5_.df = all_bits;
- }
-
+ if(eax_version_ != version)
+ eax_df_ = ~EaxDirtyFlags{};
eax_version_ = version;
switch(call.get_property_set_id())
@@ -1468,7 +1458,7 @@ bool ALeffectslot::eax_set(const EaxCall& call)
void ALeffectslot::eax4_fx_slot_commit(EaxDirtyFlags& dst_df)
{
- if(eax4_.df == EaxDirtyFlags{})
+ if(eax_df_ == EaxDirtyFlags{})
return;
eax_fx_slot_commit_property<eax_load_effect_dirty_bit>(eax4_, dst_df, &EAX40FXSLOTPROPERTIES::guidLoadEffect);
@@ -1488,12 +1478,12 @@ void ALeffectslot::eax4_fx_slot_commit(EaxDirtyFlags& dst_df)
dst_i.flOcclusionLFRatio = EAXFXSLOT_DEFAULTOCCLUSIONLFRATIO;
}
- eax4_.df = EaxDirtyFlags{};
+ eax_df_ = EaxDirtyFlags{};
}
void ALeffectslot::eax5_fx_slot_commit(Eax5State& state, EaxDirtyFlags& dst_df)
{
- if(state.df == EaxDirtyFlags{})
+ if(eax_df_ == EaxDirtyFlags{})
return;
eax_fx_slot_commit_property<eax_load_effect_dirty_bit>(state, dst_df, &EAX50FXSLOTPROPERTIES::guidLoadEffect);
@@ -1502,7 +1492,7 @@ void ALeffectslot::eax5_fx_slot_commit(Eax5State& state, EaxDirtyFlags& dst_df)
eax_fx_slot_commit_property<eax_flags_dirty_bit>(state, dst_df, &EAX50FXSLOTPROPERTIES::ulFlags);
eax_fx_slot_commit_property<eax_occlusion_dirty_bit>(state, dst_df, &EAX50FXSLOTPROPERTIES::lOcclusion);
eax_fx_slot_commit_property<eax_occlusion_lf_ratio_dirty_bit>(state, dst_df, &EAX50FXSLOTPROPERTIES::flOcclusionLFRatio);
- state.df = EaxDirtyFlags{};
+ eax_df_ = EaxDirtyFlags{};
}
void ALeffectslot::eax_dispatch_effect(const EaxCall& call)
diff --git a/al/auxeffectslot.h b/al/auxeffectslot.h
index fb6a2e1e..8d8b187e 100644
--- a/al/auxeffectslot.h
+++ b/al/auxeffectslot.h
@@ -109,14 +109,12 @@ private:
struct Eax4State {
Eax4Props i; // Immediate.
- EaxDirtyFlags df; // Dirty flags.
};
using Eax5Props = EAX50FXSLOTPROPERTIES;
struct Eax5State {
Eax5Props i; // Immediate.
- EaxDirtyFlags df; // Dirty flags.
};
struct EaxRangeValidator {
@@ -241,6 +239,7 @@ private:
ALCcontext* eax_al_context_{};
EaxFxSlotIndexValue eax_fx_slot_index_{};
int eax_version_{}; // Current EAX version.
+ EaxDirtyFlags eax_df_{}; // Dirty flags for the current EAX version.
EaxEffectUPtr eax_effect_{};
Eax5State eax123_{}; // EAX1/EAX2/EAX3 state.
Eax4State eax4_{}; // EAX4 state.
@@ -270,7 +269,8 @@ private:
// sets a dirty flag without comparing the values,
// and assigns the new value.
template<typename TValidator, EaxDirtyFlags TDirtyBit, typename TProperties>
- void eax_fx_slot_set_dirty(const EaxCall& call, TProperties& dst, EaxDirtyFlags& dirty_flags)
+ static void eax_fx_slot_set_dirty(const EaxCall& call, TProperties& dst,
+ EaxDirtyFlags& dirty_flags)
{
const auto& src = call.get_value<Exception, const TProperties>();
TValidator{}(src);
@@ -321,16 +321,14 @@ private:
typename TMemberResult,
typename TProps,
typename TState>
- void eax_fx_slot_commit_property(
- TState& state,
- EaxDirtyFlags& dst_df,
+ void eax_fx_slot_commit_property(TState& state, EaxDirtyFlags& dst_df,
TMemberResult TProps::*member) noexcept
{
auto& src_i = state.i;
- auto& src_df = state.df;
auto& dst_i = eax_;
- if ((src_df & TDirtyBit) != EaxDirtyFlags{}) {
+ if((eax_df_ & TDirtyBit) != EaxDirtyFlags{})
+ {
dst_df |= TDirtyBit;
dst_i.*member = src_i.*member;
}
diff --git a/alc/context.cpp b/alc/context.cpp
index 9f4e9b5a..a6b56d1d 100644
--- a/alc/context.cpp
+++ b/alc/context.cpp
@@ -319,15 +319,12 @@ ALenum ALCcontext::eax_eax_set(
property_source_id,
property_value,
property_value_size);
- const auto eax_version = call.get_version();
-
- if(eax_version != eax_version_) {
- eax123_.df = ~EaxDirtyFlags();
- eax4_.df = ~EaxDirtyFlags();
- eax5_.df = ~EaxDirtyFlags();
- }
+ const auto eax_version = call.get_version();
+ if(eax_version != eax_version_)
+ eax_df_ = ~EaxDirtyFlags();
eax_version_ = eax_version;
+
eax_initialize(call);
switch(call.get_property_set_id())
@@ -587,7 +584,6 @@ void ALCcontext::eax4_context_set_defaults(Eax4State& state) noexcept
{
eax4_context_set_defaults(state.i);
state.d = state.i;
- state.df = ~EaxDirtyFlags{};
}
void ALCcontext::eax5_context_set_defaults(Eax5Props& props) noexcept
@@ -603,7 +599,6 @@ void ALCcontext::eax5_context_set_defaults(Eax5State& state) noexcept
{
eax5_context_set_defaults(state.i);
state.d = state.i;
- state.df = ~EaxDirtyFlags{};
}
void ALCcontext::eax_context_set_defaults() noexcept
@@ -612,6 +607,7 @@ void ALCcontext::eax_context_set_defaults() noexcept
eax4_context_set_defaults(eax4_);
eax5_context_set_defaults(eax5_);
eax_ = eax5_.i;
+ eax_df_ = ~EaxDirtyFlags{};
}
void ALCcontext::eax_set_defaults() noexcept
@@ -813,16 +809,16 @@ void ALCcontext::eax4_defer_all(const EaxCall& call, Eax4State& state)
dst_d = src;
if(dst_i.guidPrimaryFXSlotID != dst_d.guidPrimaryFXSlotID)
- state.df |= eax_primary_fx_slot_id_dirty_bit;
+ eax_df_ |= eax_primary_fx_slot_id_dirty_bit;
if(dst_i.flDistanceFactor != dst_d.flDistanceFactor)
- state.df |= eax_distance_factor_dirty_bit;
+ eax_df_ |= eax_distance_factor_dirty_bit;
if(dst_i.flAirAbsorptionHF != dst_d.flAirAbsorptionHF)
- state.df |= eax_air_absorption_hf_dirty_bit;
+ eax_df_ |= eax_air_absorption_hf_dirty_bit;
if(dst_i.flHFReference != dst_d.flHFReference)
- state.df |= eax_hf_reference_dirty_bit;
+ eax_df_ |= eax_hf_reference_dirty_bit;
}
void ALCcontext::eax4_defer(const EaxCall& call, Eax4State& state)
@@ -863,19 +859,19 @@ void ALCcontext::eax5_defer_all(const EaxCall& call, Eax5State& state)
dst_d = src;
if(dst_i.guidPrimaryFXSlotID != dst_d.guidPrimaryFXSlotID)
- state.df |= eax_primary_fx_slot_id_dirty_bit;
+ eax_df_ |= eax_primary_fx_slot_id_dirty_bit;
if(dst_i.flDistanceFactor != dst_d.flDistanceFactor)
- state.df |= eax_distance_factor_dirty_bit;
+ eax_df_ |= eax_distance_factor_dirty_bit;
if(dst_i.flAirAbsorptionHF != dst_d.flAirAbsorptionHF)
- state.df |= eax_air_absorption_hf_dirty_bit;
+ eax_df_ |= eax_air_absorption_hf_dirty_bit;
if(dst_i.flHFReference != dst_d.flHFReference)
- state.df |= eax_hf_reference_dirty_bit;
+ eax_df_ |= eax_hf_reference_dirty_bit;
if(dst_i.flMacroFXFactor != dst_d.flMacroFXFactor)
- state.df |= eax_macro_fx_factor_dirty_bit;
+ eax_df_ |= eax_macro_fx_factor_dirty_bit;
}
void ALCcontext::eax5_defer(const EaxCall& call, Eax5State& state)
@@ -923,7 +919,7 @@ void ALCcontext::eax_set(const EaxCall& call)
void ALCcontext::eax4_context_commit(Eax4State& state, EaxDirtyFlags& dst_df)
{
- if(state.df == EaxDirtyFlags{})
+ if(eax_df_ == EaxDirtyFlags{})
return;
eax_context_commit_property<eax_primary_fx_slot_id_dirty_bit>(
@@ -935,12 +931,12 @@ void ALCcontext::eax4_context_commit(Eax4State& state, EaxDirtyFlags& dst_df)
eax_context_commit_property<eax_hf_reference_dirty_bit>(
state, dst_df, &EAX40CONTEXTPROPERTIES::flHFReference);
- state.df = EaxDirtyFlags{};
+ eax_df_ = EaxDirtyFlags{};
}
void ALCcontext::eax5_context_commit(Eax5State& state, EaxDirtyFlags& dst_df)
{
- if(state.df == EaxDirtyFlags{})
+ if(eax_df_ == EaxDirtyFlags{})
return;
eax_context_commit_property<eax_primary_fx_slot_id_dirty_bit>(
@@ -954,7 +950,7 @@ void ALCcontext::eax5_context_commit(Eax5State& state, EaxDirtyFlags& dst_df)
eax_context_commit_property<eax_macro_fx_factor_dirty_bit>(
state, dst_df, &EAX50CONTEXTPROPERTIES::flMacroFXFactor);
- state.df = EaxDirtyFlags{};
+ eax_df_ = EaxDirtyFlags{};
}
void ALCcontext::eax_context_commit()
diff --git a/alc/context.h b/alc/context.h
index 9317455d..9095b00a 100644
--- a/alc/context.h
+++ b/alc/context.h
@@ -234,7 +234,6 @@ private:
struct Eax4State {
Eax4Props i; // Immediate.
Eax4Props d; // Deferred.
- EaxDirtyFlags df; // Dirty flags.
};
using Eax5Props = EAX50CONTEXTPROPERTIES;
@@ -242,7 +241,6 @@ private:
struct Eax5State {
Eax5Props i; // Immediate.
Eax5Props d; // Deferred.
- EaxDirtyFlags df; // Dirty flags.
};
class ContextException : public EaxException
@@ -397,6 +395,7 @@ private:
EaxFxSlots eax_fx_slots_{};
int eax_version_{}; // Current EAX version.
+ EaxDirtyFlags eax_df_{}; // Dirty flags for the current EAX version.
Eax5State eax123_{}; // EAX1/EAX2/EAX3 state.
Eax4State eax4_{}; // EAX4 state.
Eax5State eax5_{}; // EAX5 state.
@@ -432,10 +431,7 @@ private:
typename TMemberResult,
typename TProps,
typename TState>
- static void eax_defer(
- const EaxCall& call,
- TState& state,
- TMemberResult TProps::*member) noexcept
+ void eax_defer(const EaxCall& call, TState& state, TMemberResult TProps::*member) noexcept
{
const auto& src = call.get_value<ContextException, const TMemberResult>();
TValidator{}(src);
@@ -444,7 +440,7 @@ private:
dst_d = src;
if(dst_i != dst_d)
- state.df |= TDirtyBit;
+ eax_df_ |= TDirtyBit;
}
template<
@@ -452,18 +448,13 @@ private:
typename TMemberResult,
typename TProps,
typename TState>
- void eax_context_commit_property(
- TState& state,
- EaxDirtyFlags& dst_df,
+ void eax_context_commit_property(TState& state, EaxDirtyFlags& dst_df,
TMemberResult TProps::*member) noexcept
{
- auto& src_i = state.i;
- auto& src_df = state.df;
- auto& dst_i = eax_;
-
- if ((src_df & TDirtyBit) != EaxDirtyFlags{}) {
+ if((eax_df_ & TDirtyBit) != EaxDirtyFlags{})
+ {
dst_df |= TDirtyBit;
- dst_i.*member = src_i.*member;
+ eax_.*member = state.i.*member;
}
}