summaryrefslogtreecommitdiff
path: root/lib/mesa/src/gallium/drivers/r600/sfn/sfn_debug.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mesa/src/gallium/drivers/r600/sfn/sfn_debug.cpp')
-rw-r--r--lib/mesa/src/gallium/drivers/r600/sfn/sfn_debug.cpp139
1 files changed, 139 insertions, 0 deletions
diff --git a/lib/mesa/src/gallium/drivers/r600/sfn/sfn_debug.cpp b/lib/mesa/src/gallium/drivers/r600/sfn/sfn_debug.cpp
new file mode 100644
index 000000000..d993d42af
--- /dev/null
+++ b/lib/mesa/src/gallium/drivers/r600/sfn/sfn_debug.cpp
@@ -0,0 +1,139 @@
+/* -*- mesa-c++ -*-
+ *
+ * Copyright (c) 2019 Collabora LTD
+ *
+ * Author: Gert Wollny <gert.wollny@collabora.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "util/u_debug.h"
+#include "sfn_debug.h"
+
+namespace r600 {
+
+class stderr_streambuf : public std::streambuf
+{
+public:
+ stderr_streambuf();
+protected:
+ int sync();
+ int overflow(int c);
+ std::streamsize xsputn ( const char *s, std::streamsize n );
+};
+
+stderr_streambuf::stderr_streambuf()
+{
+
+}
+
+int stderr_streambuf::sync()
+{
+ fflush(stderr);
+ return 0;
+}
+
+int stderr_streambuf::overflow(int c)
+{
+ fputc(c, stderr);
+ return 0;
+}
+
+static const struct debug_named_value sfn_debug_options[] = {
+ {"instr", SfnLog::instr, "Log all consumed nir instructions"},
+ {"ir", SfnLog::r600ir, "Log created R600 IR"},
+ {"cc", SfnLog::cc, "Log R600 IR to assembly code creation"},
+ {"noerr", SfnLog::err, "Don't log shader conversion errors"},
+ {"si", SfnLog::shader_info, "Log shader info (non-zero values)"},
+ {"ts", SfnLog::test_shader, "Log shaders in tests"},
+ {"reg", SfnLog::reg, "Log register allocation and lookup"},
+ {"io", SfnLog::io, "Log shader in and output"},
+ {"ass", SfnLog::assembly, "Log IR to assembly conversion"},
+ {"flow", SfnLog::flow, "Log Flow instructions"},
+ {"merge", SfnLog::merge, "Log register merge operations"},
+ {"nomerge", SfnLog::nomerge, "Skip register merge step"},
+ {"tex", SfnLog::tex, "Log texture ops"},
+ {"trans", SfnLog::trans, "Log generic translation messages"},
+ DEBUG_NAMED_VALUE_END
+};
+
+SfnLog sfn_log;
+
+std::streamsize stderr_streambuf::xsputn ( const char *s, std::streamsize n )
+{
+ std::streamsize i = n;
+ while (i--)
+ fputc(*s++, stderr);
+ return n;
+}
+
+SfnLog::SfnLog():
+ m_active_log_flags(0),
+ m_log_mask(0),
+ m_output(new stderr_streambuf())
+{
+ m_log_mask = debug_get_flags_option("R600_NIR_DEBUG", sfn_debug_options, 0);
+ m_log_mask ^= err;
+}
+
+SfnLog& SfnLog::operator << (SfnLog::LogFlag const l)
+{
+ m_active_log_flags = l;
+ return *this;
+}
+
+SfnLog& SfnLog::operator << (UNUSED std::ostream & (*f)(std::ostream&))
+{
+ if (m_active_log_flags & m_log_mask)
+ m_output << f;
+ return *this;
+}
+
+SfnLog& SfnLog::operator << (nir_shader& sh)
+{
+ if (m_active_log_flags & m_log_mask)
+ nir_print_shader(&sh, stderr);
+ return *this;
+}
+
+SfnLog& SfnLog::operator << (nir_instr &instr)
+{
+ if (m_active_log_flags & m_log_mask)
+ nir_print_instr(&instr, stderr);
+ return *this;
+}
+
+SfnTrace::SfnTrace(SfnLog::LogFlag flag, const char *msg):
+ m_flag(flag),
+ m_msg(msg)
+{
+ sfn_log << m_flag << std::string(" ", 2 * m_indention++)
+ << "BEGIN: " << m_msg << "\n";
+}
+
+SfnTrace::~SfnTrace()
+{
+ sfn_log << m_flag << std::string(" ", 2 * m_indention--)
+ << "END: " << m_msg << "\n";
+}
+
+int SfnTrace::m_indention = 0;
+
+}