diff options
Diffstat (limited to 'src/3rdparty/angle/src/common/debug.cpp')
-rw-r--r-- | src/3rdparty/angle/src/common/debug.cpp | 53 |
1 files changed, 34 insertions, 19 deletions
diff --git a/src/3rdparty/angle/src/common/debug.cpp b/src/3rdparty/angle/src/common/debug.cpp index 05d3dc62ad..d6eecf7157 100644 --- a/src/3rdparty/angle/src/common/debug.cpp +++ b/src/3rdparty/angle/src/common/debug.cpp @@ -7,11 +7,12 @@ // debug.cpp: Debugging utilities. #include "common/debug.h" -#include <stdarg.h> +#include "common/platform.h" -#if defined(ANGLE_ENABLE_PERF) -#include <d3d9.h> -#endif +#include <stdarg.h> +#include <vector> +#include <fstream> +#include <cstdio> namespace gl { @@ -23,25 +24,38 @@ typedef void (*PerfOutputFunction)(unsigned int, const wchar_t*); static void output(bool traceFileDebugOnly, PerfOutputFunction perfFunc, const char *format, va_list vararg) { +#if defined(ANGLE_ENABLE_PERF) || defined(ANGLE_ENABLE_TRACE) + static std::vector<char> asciiMessageBuffer(512); + + // Attempt to just print to the current buffer + int len = vsnprintf(&asciiMessageBuffer[0], asciiMessageBuffer.size(), format, vararg); + if (len < 0 || static_cast<size_t>(len) >= asciiMessageBuffer.size()) + { + // Buffer was not large enough, calculate the required size and resize the buffer + len = vsnprintf(NULL, 0, format, vararg); + asciiMessageBuffer.resize(len + 1); + + // Print again + vsnprintf(&asciiMessageBuffer[0], asciiMessageBuffer.size(), format, vararg); + } + + // NULL terminate the buffer to be safe + asciiMessageBuffer[len] = '\0'; +#endif + #if defined(ANGLE_ENABLE_PERF) if (perfActive()) { - char message[32768]; - int len = vsprintf_s(message, format, vararg); - if (len < 0) + // The perf function only accepts wide strings, widen the ascii message + static std::wstring wideMessage; + if (wideMessage.capacity() < asciiMessageBuffer.size()) { - return; + wideMessage.reserve(asciiMessageBuffer.size()); } - // There are no ASCII variants of these D3DPERF functions. - wchar_t wideMessage[32768]; - for (int i = 0; i < len; ++i) - { - wideMessage[i] = message[i]; - } - wideMessage[len] = 0; + wideMessage.assign(asciiMessageBuffer.begin(), asciiMessageBuffer.begin() + len); - perfFunc(0, wideMessage); + perfFunc(0, wideMessage.c_str()); } #endif // ANGLE_ENABLE_PERF @@ -53,12 +67,13 @@ static void output(bool traceFileDebugOnly, PerfOutputFunction perfFunc, const c } #endif // NDEBUG - FILE* file = fopen(TRACE_OUTPUT_FILE, "a"); + static std::ofstream file(TRACE_OUTPUT_FILE, std::ofstream::app); if (file) { - vfprintf(file, format, vararg); - fclose(file); + file.write(&asciiMessageBuffer[0], len); + file.flush(); } + #endif // ANGLE_ENABLE_TRACE } |