aboutsummaryrefslogtreecommitdiffstats
path: root/alc
diff options
context:
space:
mode:
Diffstat (limited to 'alc')
-rw-r--r--alc/alc.cpp7
-rw-r--r--alc/context.cpp105
-rw-r--r--alc/context.h7
-rw-r--r--alc/inprogext.h27
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