aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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;
}
}