diff options
-rw-r--r-- | al/auxeffectslot.cpp | 68 | ||||
-rw-r--r-- | al/auxeffectslot.h | 14 | ||||
-rw-r--r-- | alc/context.cpp | 40 | ||||
-rw-r--r-- | alc/context.h | 23 |
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; } } |