Merge branch '7.8'
[mesa.git] / src / gallium / drivers / trace / tr_screen.h
index 8c65516b509731829b30445d981235321ca3cd08..05ff9ef61f1e9820ebb144855bbe6e60a2b2c722 100644 (file)
@@ -30,6 +30,7 @@
 
 
 #include "pipe/p_screen.h"
+#include "os/os_thread.h"
 
 
 #ifdef __cplusplus
@@ -37,12 +38,17 @@ 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_BUFFER_USAGE_USER  (1 << 31)
+#define TRACE_FLAG_USER_BUFFER  (1 << 31)
 
 
 struct trace_screen
@@ -50,20 +56,65 @@ 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;
 };
 
 
-struct trace_screen *
-trace_screen(struct pipe_screen *screen);
+/*
+ * tr_rbug.c
+ */
 
 
-struct pipe_screen *
-trace_screen_create(struct pipe_screen *screen);
+struct trace_rbug;
 
+struct trace_rbug *
+trace_rbug_start(struct trace_screen *tr_scr);
 
 void
-trace_screen_user_buffer_update(struct pipe_screen *screen,
-                                struct pipe_buffer *buffer);
+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)
+
+#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