From 46845e60bee0dc6f03857a7ba6e8fa84acdb59a3 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Tue, 10 Oct 2017 23:44:06 +0200 Subject: [PATCH] [dxvk] Re-implemented logger --- src/dxvk/dxvk_main.cpp | 6 ++--- src/dxvk/dxvk_main.h | 6 +---- src/util/log/log.cpp | 35 ++++++++++++++++-------- src/util/log/log.h | 25 +++++++++-------- src/util/log/log_debug.cpp | 11 ++++++++ src/util/log/log_debug.h | 45 +++++++++++++++++++++++++++++++ src/util/meson.build | 1 + tests/dxvk/test_dxvk_triangle.cpp | 2 +- 8 files changed, 98 insertions(+), 33 deletions(-) create mode 100644 src/util/log/log_debug.cpp create mode 100644 src/util/log/log_debug.h diff --git a/src/dxvk/dxvk_main.cpp b/src/dxvk/dxvk_main.cpp index 0dbe3e0b..68ae9811 100644 --- a/src/dxvk/dxvk_main.cpp +++ b/src/dxvk/dxvk_main.cpp @@ -2,10 +2,10 @@ namespace dxvk { - Log g_logger("dxvk.log"); + Logger g_logger("dxvk.log"); - void log(const std::string& message) { - g_logger.log(message); + Logger* getGlobalLogger() { + return &g_logger; } } \ No newline at end of file diff --git a/src/dxvk/dxvk_main.h b/src/dxvk/dxvk_main.h index 6c271994..2dd50cf2 100644 --- a/src/dxvk/dxvk_main.h +++ b/src/dxvk/dxvk_main.h @@ -5,10 +5,6 @@ namespace dxvk { - /** - * \brief Adds a message to the global DXVK log - * \param [in] message Log message - */ - void log(const std::string& message); + Logger* getGlobalLogger(); } \ No newline at end of file diff --git a/src/util/log/log.cpp b/src/util/log/log.cpp index 537784fd..7408652d 100644 --- a/src/util/log/log.cpp +++ b/src/util/log/log.cpp @@ -1,26 +1,39 @@ #include "log.h" +#include "../../dxvk/dxvk_main.h" + namespace dxvk { - Log::Log(const std::string& filename) - : m_stream(filename, std::ios_base::out | std::ios_base::trunc) { - + Logger::Logger(const std::string& file_name) + : m_fileStream(file_name) { } + Logger::~Logger() { } + + + void Logger::trace(const std::string& message) { + getGlobalLogger()->log(std::string("trace: ") + message); } - Log::~Log() { - + void Logger::info(const std::string& message) { + getGlobalLogger()->log(std::string("info: ") + message); } - void Log::log(const std::string& message) { + void Logger::warn(const std::string& message) { + getGlobalLogger()->log(std::string("warn: ") + message); + } + + + void Logger::err(const std::string& message) { + getGlobalLogger()->log(std::string("err: ") + message); + } + + + void Logger::log(const std::string& message) { std::lock_guard lock(m_mutex); - std::cerr << message << std::endl; - std::cerr.flush(); - - m_stream << message << std::endl; - m_stream.flush(); + m_fileStream << message << std::endl; + m_fileStream.flush(); } } \ No newline at end of file diff --git a/src/util/log/log.h b/src/util/log/log.h index 7d3f454e..7359f543 100644 --- a/src/util/log/log.h +++ b/src/util/log/log.h @@ -12,29 +12,28 @@ namespace dxvk { /** * \brief Logger * - * Logs messages generated by DXVK and - * the client APIs using DXVK. + * Logger for one DLL. Creates a text file and + * writes all log messages to that file. */ - class Log : public RcObject { + class Logger { public: - Log(const std::string& filename); - ~Log(); + Logger(const std::string& file_name); + ~Logger(); - /** - * \brief Adds a message to the log - * - * Prints the message to stderr and appends - * it to the log file at the same time. - */ - void log(const std::string& message); + static void trace(const std::string& message); + static void info (const std::string& message); + static void warn (const std::string& message); + static void err (const std::string& message); private: std::mutex m_mutex; - std::fstream m_stream; + std::ofstream m_fileStream; + void log(const std::string& message); + }; } \ No newline at end of file diff --git a/src/util/log/log_debug.cpp b/src/util/log/log_debug.cpp new file mode 100644 index 00000000..c67742ab --- /dev/null +++ b/src/util/log/log_debug.cpp @@ -0,0 +1,11 @@ +#include "log_debug.h" + +namespace dxvk::debug { + + std::string methodName(const std::string& prettyName) { + size_t end = prettyName.find("("); + size_t begin = prettyName.substr(0, end).rfind(" ") + 1; + return prettyName.substr(begin,end - begin); + } + +} diff --git a/src/util/log/log_debug.h b/src/util/log/log_debug.h new file mode 100644 index 00000000..02b66651 --- /dev/null +++ b/src/util/log/log_debug.h @@ -0,0 +1,45 @@ +#pragma once + +#include + +#include "log.h" + +#define METHOD_NAME __PRETTY_FUNCTION__ + +#define TRACE_ENABLED + +#ifdef TRACE_ENABLED +#define TRACE(...) \ + do { dxvk::debug::trace(METHOD_NAME, __VA_ARGS__); } while (0) +#else +#define TRACE(...) \ + do { } while (0) +#endif + +namespace dxvk::debug { + + std::string methodName(const std::string& prettyName); + + inline void traceArgs(std::stringstream& stream) { } + + template + void traceArgs(std::stringstream& stream, const Arg1& arg1) { + stream << arg1; + } + + template + void traceArgs(std::stringstream& stream, const Arg1& arg1, const Arg2& arg2, const Args&... args) { + stream << arg1 << ","; + traceArgs(stream, arg2, args...); + } + + template + void trace(const std::string& funcName, const Args&... args) { + std::stringstream stream; + stream << methodName(funcName) << "("; + traceArgs(stream, args...); + stream << ")"; + Logger::trace(stream.str()); + } + +} diff --git a/src/util/meson.build b/src/util/meson.build index 0063094f..58cf74a3 100644 --- a/src/util/meson.build +++ b/src/util/meson.build @@ -1,5 +1,6 @@ util_src = files([ 'log/log.cpp', + 'log/log_debug.cpp', ]) util_lib = static_library('util', util_src, diff --git a/tests/dxvk/test_dxvk_triangle.cpp b/tests/dxvk/test_dxvk_triangle.cpp index 3ca060c5..59067c07 100644 --- a/tests/dxvk/test_dxvk_triangle.cpp +++ b/tests/dxvk/test_dxvk_triangle.cpp @@ -112,7 +112,7 @@ int WINAPI WinMain(HINSTANCE hInstance, } } } catch (const dxvk::DxvkError& e) { - dxvk::log(e.message()); + Logger::err(e.message()); return msg.wParam; } }