]> git.cworth.org Git - apitrace/blobdiff - common/trace_writer.cpp
retrace: Implement glxCopySubBufferMESA
[apitrace] / common / trace_writer.cpp
index 9ecfa2ca27d3500fee3083fb753c0b6c7d991948..e7e3df212cd393cd6801672a97d47cc982335b4f 100644 (file)
@@ -35,7 +35,6 @@
 #include "trace_file.hpp"
 #include "trace_writer.hpp"
 #include "trace_format.hpp"
-#include "trace_backtrace.hpp"
 
 namespace trace {
 
@@ -72,6 +71,7 @@ Writer::open(const char *filename) {
     structs.clear();
     enums.clear();
     bitmasks.clear();
+    frames.clear();
 
     _writeUInt(TRACE_VERSION);
 
@@ -142,28 +142,32 @@ void Writer::beginBacktrace(unsigned num_frames) {
     }
 }
 
-void Writer::writeStackFrame(const RawStackFrame &frame) {
-    if (frame.module != NULL) {
-        _writeByte(trace::BACKTRACE_MODULE);
-        _writeString(frame.module);
-    }
-    if (frame.function != NULL) {
-        _writeByte(trace::BACKTRACE_FUNCTION);
-        _writeString(frame.function);
-    }
-    if (frame.filename != NULL) {
-        _writeByte(trace::BACKTRACE_FILENAME);
-        _writeString(frame.filename);
-    }
-    if (frame.linenumber >= 0) {
-        _writeByte(trace::BACKTRACE_LINENUMBER);
-        _writeUInt(frame.linenumber);
-    }
-    if (frame.offset >= 0) {
-        _writeByte(trace::BACKTRACE_OFFSET);
-        _writeUInt(frame.offset);
+void Writer::writeStackFrame(const RawStackFrame *frame) {
+    _writeUInt(frame->id);
+    if (!lookup(frames, frame->id)) {
+        if (frame->module != NULL) {
+            _writeByte(trace::BACKTRACE_MODULE);
+            _writeString(frame->module);
+        }
+        if (frame->function != NULL) {
+            _writeByte(trace::BACKTRACE_FUNCTION);
+            _writeString(frame->function);
+        }
+        if (frame->filename != NULL) {
+            _writeByte(trace::BACKTRACE_FILENAME);
+            _writeString(frame->filename);
+        }
+        if (frame->linenumber >= 0) {
+            _writeByte(trace::BACKTRACE_LINENUMBER);
+            _writeUInt(frame->linenumber);
+        }
+        if (frame->offset >= 0) {
+            _writeByte(trace::BACKTRACE_OFFSET);
+            _writeUInt(frame->offset);
+        }
+        _writeByte(trace::BACKTRACE_END);
+        frames[frame->id] = true;
     }
-    _writeByte(trace::BACKTRACE_END);
 }
 
 unsigned Writer::beginEnter(const FunctionSig *sig, unsigned thread_id) {