diff options
author | Chris Robinson <[email protected]> | 2023-05-01 19:11:26 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2023-05-01 19:11:26 -0700 |
commit | e1b573284b649c6fef42ab5b6ca51978c4a1329a (patch) | |
tree | 2bd2c30bebf142c969560a069417ceba57d4a953 /alc | |
parent | bb08a416f1b0e31292b896f2f8845e365daee6b1 (diff) |
Implement pushing/popping debug groups
Diffstat (limited to 'alc')
-rw-r--r-- | alc/alc.cpp | 7 | ||||
-rw-r--r-- | alc/context.cpp | 105 | ||||
-rw-r--r-- | alc/context.h | 7 | ||||
-rw-r--r-- | alc/inprogext.h | 27 |
4 files changed, 29 insertions, 117 deletions
diff --git a/alc/alc.cpp b/alc/alc.cpp index aa65222c..50982ed2 100644 --- a/alc/alc.cpp +++ b/alc/alc.cpp @@ -464,6 +464,8 @@ const struct { DECL(alDebugMessageCallbackSOFT), DECL(alDebugMessageInsertSOFT), DECL(alDebugMessageControlSOFT), + DECL(alPushDebugGroupSOFT), + DECL(alPopDebugGroupSOFT), DECL(alGetDebugMessageLogSOFT), #ifdef ALSOFT_EAX }, eaxFunctions[] = { @@ -936,6 +938,8 @@ constexpr struct { DECL(AL_DEBUG_TYPE_PORTABILITY_SOFT), DECL(AL_DEBUG_TYPE_PERFORMANCE_SOFT), DECL(AL_DEBUG_TYPE_MARKER_SOFT), + DECL(AL_DEBUG_TYPE_PUSH_GROUP_SOFT), + DECL(AL_DEBUG_TYPE_POP_GROUP_SOFT), DECL(AL_DEBUG_TYPE_OTHER_SOFT), DECL(AL_DEBUG_SEVERITY_HIGH_SOFT), DECL(AL_DEBUG_SEVERITY_MEDIUM_SOFT), @@ -945,6 +949,9 @@ constexpr struct { DECL(AL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_SOFT), DECL(AL_MAX_DEBUG_MESSAGE_LENGTH_SOFT), DECL(AL_MAX_DEBUG_LOGGED_MESSAGES_SOFT), + DECL(AL_MAX_DEBUG_GROUP_STACK_DEPTH_SOFT), + DECL(AL_STACK_OVERFLOW_SOFT), + DECL(AL_STACK_UNDERFLOW_SOFT), DECL(AL_STOP_SOURCES_ON_DISCONNECT_SOFT), diff --git a/alc/context.cpp b/alc/context.cpp index 755a1e41..0c8253fb 100644 --- a/alc/context.cpp +++ b/alc/context.cpp @@ -304,111 +304,6 @@ void ALCcontext::applyAllUpdates() } -void ALCcontext::sendDebugMessage(DebugSource source, DebugType type, ALuint id, - DebugSeverity severity, ALsizei length, const char *message) -{ - static_assert(DebugSeverityBase+DebugSeverityCount <= 32, "Too many debug bits"); - - /* MaxDebugMessageLength is the size including the null terminator, - * <length> does not include the null terminator. - */ - if(length < 0) - { - size_t newlen{std::strlen(message)}; - if(newlen >= MaxDebugMessageLength) UNLIKELY - { - ERR("Debug message too long (%zu >= %d)\n", newlen, MaxDebugMessageLength); - return; - } - length = static_cast<ALsizei>(newlen); - } - else if(length >= MaxDebugMessageLength) UNLIKELY - { - ERR("Debug message too long (%d >= %d)\n", length, MaxDebugMessageLength); - return; - } - - std::unique_lock<std::mutex> debuglock{mDebugCbLock}; - DebugGroup &debug = mDebugGroups.back(); - if(!mDebugEnabled.load()) UNLIKELY - return; - - auto get_source_enum = [source]() - { - switch(source) - { - case DebugSource::API: return AL_DEBUG_SOURCE_API_SOFT; - case DebugSource::System: return AL_DEBUG_SOURCE_AUDIO_SYSTEM_SOFT; - case DebugSource::ThirdParty: return AL_DEBUG_SOURCE_THIRD_PARTY_SOFT; - case DebugSource::Application: return AL_DEBUG_SOURCE_APPLICATION_SOFT; - case DebugSource::Other: return AL_DEBUG_SOURCE_OTHER_SOFT; - } - throw std::runtime_error{"Unexpected debug source value "+std::to_string(al::to_underlying(source))}; - }; - auto get_type_enum = [type]() - { - switch(type) - { - case DebugType::Error: return AL_DEBUG_TYPE_ERROR_SOFT; - case DebugType::DeprecatedBehavior: return AL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_SOFT; - case DebugType::UndefinedBehavior: return AL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_SOFT; - case DebugType::Portability: return AL_DEBUG_TYPE_PORTABILITY_SOFT; - case DebugType::Performance: return AL_DEBUG_TYPE_PERFORMANCE_SOFT; - case DebugType::Marker: return AL_DEBUG_TYPE_MARKER_SOFT; - case DebugType::Other: return AL_DEBUG_TYPE_OTHER_SOFT; - } - throw std::runtime_error{"Unexpected debug type value "+std::to_string(al::to_underlying(type))}; - }; - auto get_severity_enum = [severity]() - { - switch(severity) - { - case DebugSeverity::High: return AL_DEBUG_SEVERITY_HIGH_SOFT; - case DebugSeverity::Medium: return AL_DEBUG_SEVERITY_MEDIUM_SOFT; - case DebugSeverity::Low: return AL_DEBUG_SEVERITY_LOW_SOFT; - case DebugSeverity::Notification: return AL_DEBUG_SEVERITY_NOTIFICATION_SOFT; - } - throw std::runtime_error{"Unexpected debug severity value "+std::to_string(al::to_underlying(severity))}; - }; - - const uint64_t idfilter{(1_u64 << (DebugSourceBase+al::to_underlying(source))) - | (1_u64 << (DebugTypeBase+al::to_underlying(type))) - | (uint64_t{id} << 32)}; - auto iditer = std::lower_bound(debug.mIdFilters.cbegin(), debug.mIdFilters.cend(), idfilter); - if(iditer != debug.mIdFilters.cend() && *iditer == idfilter) - return; - - const uint filter{(1u << (DebugSourceBase+al::to_underlying(source))) - | (1u << (DebugTypeBase+al::to_underlying(type))) - | (1u << (DebugSeverityBase+al::to_underlying(severity)))}; - auto iter = std::lower_bound(debug.mFilters.cbegin(), debug.mFilters.cend(), filter); - if(iter != debug.mFilters.cend() && *iter == filter) - return; - - if(mDebugCb) - { - auto callback = mDebugCb; - auto param = mDebugParam; - debuglock.unlock(); - callback(get_source_enum(), get_type_enum(), id, get_severity_enum(), length, message, - param); - } - else - { - if(mDebugLog.size() < MaxDebugLoggedMessages) - mDebugLog.emplace_back(source, type, id, severity, message); - else UNLIKELY - ERR("Debug message log overflow. Lost message:\n" - " Source: 0x%04x\n" - " Type: 0x%04x\n" - " ID: %u\n" - " Severity: 0x%04x\n" - " Message: \"%s\"\n", - get_source_enum(), get_type_enum(), id, get_severity_enum(), message); - } -} - - #ifdef ALSOFT_EAX namespace { diff --git a/alc/context.h b/alc/context.h index 3e31c9b8..8757b041 100644 --- a/alc/context.h +++ b/alc/context.h @@ -166,15 +166,16 @@ struct ALCcontext : public al::intrusive_ref<ALCcontext>, ContextBase { #endif void setError(ALenum errorCode, const char *msg, ...); - void sendDebugMessage(DebugSource source, DebugType type, ALuint id, DebugSeverity severity, - ALsizei length, const char *message); + void sendDebugMessage(std::unique_lock<std::mutex> &debuglock, DebugSource source, + DebugType type, ALuint id, DebugSeverity severity, ALsizei length, const char *message); void debugMessage(DebugSource source, DebugType type, ALuint id, DebugSeverity severity, ALsizei length, const char *message) { if(!mDebugEnabled.load(std::memory_order_relaxed)) LIKELY return; - sendDebugMessage(source, type, id, severity, length, message); + std::unique_lock<std::mutex> debuglock{mDebugCbLock}; + sendDebugMessage(debuglock, source, type, id, severity, length, message); } /* Process-wide current context */ diff --git a/alc/inprogext.h b/alc/inprogext.h index f73963cb..7f9d7766 100644 --- a/alc/inprogext.h +++ b/alc/inprogext.h @@ -71,25 +71,34 @@ AL_API void AL_APIENTRY alAuxiliaryEffectSlotStopvSOFT(ALsizei n, const ALuint * #define AL_DEBUG_TYPE_PORTABILITY_SOFT 0x19BD #define AL_DEBUG_TYPE_PERFORMANCE_SOFT 0x19BE #define AL_DEBUG_TYPE_MARKER_SOFT 0x19BF -#define AL_DEBUG_TYPE_OTHER_SOFT 0x19C0 -#define AL_DEBUG_SEVERITY_HIGH_SOFT 0x19C1 -#define AL_DEBUG_SEVERITY_MEDIUM_SOFT 0x19C2 -#define AL_DEBUG_SEVERITY_LOW_SOFT 0x19C3 -#define AL_DEBUG_SEVERITY_NOTIFICATION_SOFT 0x19C4 -#define AL_DEBUG_LOGGED_MESSAGES_SOFT 0x19C5 -#define AL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_SOFT 0x19C6 -#define AL_MAX_DEBUG_MESSAGE_LENGTH_SOFT 0x19C7 -#define AL_MAX_DEBUG_LOGGED_MESSAGES_SOFT 0x19C8 +#define AL_DEBUG_TYPE_PUSH_GROUP_SOFT 0x19C0 +#define AL_DEBUG_TYPE_POP_GROUP_SOFT 0x19C1 +#define AL_DEBUG_TYPE_OTHER_SOFT 0x19C2 +#define AL_DEBUG_SEVERITY_HIGH_SOFT 0x19C3 +#define AL_DEBUG_SEVERITY_MEDIUM_SOFT 0x19C4 +#define AL_DEBUG_SEVERITY_LOW_SOFT 0x19C5 +#define AL_DEBUG_SEVERITY_NOTIFICATION_SOFT 0x19C6 +#define AL_DEBUG_LOGGED_MESSAGES_SOFT 0x19C7 +#define AL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_SOFT 0x19C8 +#define AL_MAX_DEBUG_MESSAGE_LENGTH_SOFT 0x19C9 +#define AL_MAX_DEBUG_LOGGED_MESSAGES_SOFT 0x19CA +#define AL_MAX_DEBUG_GROUP_STACK_DEPTH_SOFT 0x19CB +#define AL_STACK_OVERFLOW_SOFT 0x19CC +#define AL_STACK_UNDERFLOW_SOFT 0x19CD typedef void (AL_APIENTRY*ALDEBUGPROCSOFT)(ALenum source, ALenum type, ALuint id, ALenum severity, ALsizei length, const ALchar *message, void *userParam); typedef void (AL_APIENTRY*LPALDEBUGMESSAGECALLBACKSOFT)(ALDEBUGPROCSOFT callback, void *userParam); typedef void (AL_APIENTRY*LPALDEBUGMESSAGEINSERTSOFT)(ALenum source, ALenum type, ALuint id, ALenum severity, ALsizei length, const ALchar *message); typedef void (AL_APIENTRY*LPALDEBUGMESSAGECONTROLSOFT)(ALenum source, ALenum type, ALenum severity, ALsizei count, const ALuint *ids, ALboolean enable); +typedef void (AL_APIENTRY*LPALPUSHDEBUGGROUPSOFT)(ALenum source, ALuint id, ALsizei length, const ALchar *message); +typedef void (AL_APIENTRY*LPALPOPDEBUGGROUPSOFT)(void); typedef ALuint (AL_APIENTRY*LPALGETDEBUGMESSAGELOGSOFT)(ALuint count, ALsizei logBufSize, ALenum *sources, ALenum *types, ALuint *ids, ALenum *severities, ALsizei *lengths, ALchar *logBuf); #ifdef AL_ALEXT_PROTOTYPES void AL_APIENTRY alDebugMessageCallbackSOFT(ALDEBUGPROCSOFT callback, void *userParam) noexcept; void AL_APIENTRY alDebugMessageInsertSOFT(ALenum source, ALenum type, ALuint id, ALenum severity, ALsizei length, const ALchar *message) noexcept; void AL_APIENTRY alDebugMessageControlSOFT(ALenum source, ALenum type, ALenum severity, ALsizei count, const ALuint *ids, ALboolean enable) noexcept; +void AL_APIENTRY alPushDebugGroupSOFT(ALenum source, ALuint id, ALsizei length, const ALchar *message) noexcept; +void AL_APIENTRY alPopDebugGroupSOFT(void) noexcept; ALuint AL_APIENTRY alGetDebugMessageLogSOFT(ALuint count, ALsizei logBufSize, ALenum *sources, ALenum *types, ALuint *ids, ALenum *severities, ALsizei *lengths, ALchar *logBuf) noexcept; #endif #endif |