Squashed commit of the following:
[mesa.git] / src / gallium / drivers / trace / tr_screen.h
index 93fefdb9a5f69df2ce8a9656adfda05cc8b59149..05ff9ef61f1e9820ebb144855bbe6e60a2b2c722 100644 (file)
 
 
 #include "pipe/p_screen.h"
+#include "os/os_thread.h"
 
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-   
+
+struct tr_list {
+   struct tr_list *next;
+   struct tr_list *prev;
+};
+
+/**
+ * It often happens that new data is written directly to the user buffers
+ * without mapping/unmapping. This flag marks user buffers, so that their
+ * contents can be dumpped before being used by the pipe context.
+ */
+#define TRACE_FLAG_USER_BUFFER  (1 << 31)
+
+
 struct trace_screen
 {
    struct pipe_screen base;
-   
+
    struct pipe_screen *screen;
+   struct pipe_context *private_context;
+
+   /* remote debugger */
+   struct trace_rbug *rbug;
+
+   pipe_mutex list_mutex;
+   int num_buffers;
+   int num_contexts;
+   int num_textures;
+   int num_surfaces;
+   int num_transfers;
+   struct tr_list buffers;
+   struct tr_list contexts;
+   struct tr_list textures;
+   struct tr_list surfaces;
+   struct tr_list transfers;
 };
 
 
+/*
+ * tr_rbug.c
+ */
+
+
+struct trace_rbug;
+
+struct trace_rbug *
+trace_rbug_start(struct trace_screen *tr_scr);
+
+void
+trace_rbug_stop(struct trace_rbug *tr_rbug);
+
+
+/*
+ * tr_screen.c
+ */
+
+
+boolean
+trace_enabled(void);
+
 struct trace_screen *
 trace_screen(struct pipe_screen *screen);
 
+#define trace_screen_add_to_list(tr_scr, name, obj) \
+   do {                                             \
+      pipe_mutex_lock(tr_scr->list_mutex);          \
+      insert_at_head(&tr_scr->name, &obj->list);    \
+      tr_scr->num_##name++;                         \
+      pipe_mutex_unlock(tr_scr->list_mutex);        \
+   } while (0)
 
-struct pipe_screen *
-trace_screen_create(struct pipe_screen *screen);
+#define trace_screen_remove_from_list(tr_scr, name, obj) \
+   do {                                                  \
+      pipe_mutex_lock(tr_scr->list_mutex);               \
+      remove_from_list(&obj->list);                      \
+      tr_scr->num_##name--;                              \
+      pipe_mutex_unlock(tr_scr->list_mutex);             \
+   } while (0)
 
 
 #ifdef __cplusplus