std::string FormatString(const char *fmt, va_list vararg) { // Note: this needs to be thread-safe, since the D3D11 renderer uses some multithreading std::vector<char> buffer(512); size_t len = FormatStringIntoVector(fmt, vararg, buffer); return std::string(&buffer[0], len); }
ScopedPerfEventHelper::ScopedPerfEventHelper(const char *format, ...) { #if !defined(ANGLE_ENABLE_DEBUG_TRACE) if (!DebugAnnotationsActive()) { return; } #endif // !ANGLE_ENABLE_DEBUG_TRACE va_list vararg; va_start(vararg, format); std::vector<char> buffer(512); size_t len = FormatStringIntoVector(format, vararg, buffer); ANGLE_LOG(EVENT) << std::string(&buffer[0], len); va_end(vararg); }
static void output(bool traceInDebugOnly, DebugTraceOutputType outputType, const char *format, va_list vararg) { #if defined(ANGLE_ENABLE_DEBUG_ANNOTATIONS) static std::vector<char> buffer(512); if (perfActive()) { size_t len = FormatStringIntoVector(format, vararg, buffer); std::wstring formattedWideMessage(buffer.begin(), buffer.begin() + len); switch (outputType) { case DebugTraceOutputTypeNone: break; case DebugTraceOutputTypeBeginEvent: g_DebugAnnotationWrapper->beginEvent(formattedWideMessage); break; case DebugTraceOutputTypeSetMarker: g_DebugAnnotationWrapper->setMarker(formattedWideMessage); break; } } #endif // ANGLE_ENABLE_DEBUG_ANNOTATIONS #if defined(ANGLE_ENABLE_DEBUG_TRACE) #if defined(NDEBUG) if (traceInDebugOnly) { return; } #endif // NDEBUG std::string formattedMessage = FormatString(format, vararg); static std::ofstream file(TRACE_OUTPUT_FILE, std::ofstream::app); if (file) { file.write(formattedMessage.c_str(), formattedMessage.length()); file.flush(); } #if defined(ANGLE_ENABLE_DEBUG_TRACE_TO_DEBUGGER) OutputDebugStringA(formattedMessage.c_str()); #endif // ANGLE_ENABLE_DEBUG_TRACE_TO_DEBUGGER #endif // ANGLE_ENABLE_DEBUG_TRACE }