libdrm-radeon: new tracker tools
[platform/upstream/libdrm.git] / libdrm / radeon / radeon_bo.h
index c1f25fa..ed78503 100644 (file)
@@ -2,20 +2,21 @@
  * Copyright © 2008 Jérôme Glisse
  * All Rights Reserved.
  * 
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * copy of this software and associated documentation files (the
  * "Software"), to deal in the Software without restriction, including
  * without limitation 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 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 COPYRIGHT HOLDERS, AUTHORS AND/OR ITS 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 
+ * 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 COPYRIGHT HOLDERS, AUTHORS
+ * AND/OR ITS 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.
  *
  * The above copyright notice and this permission notice (including the
@@ -31,6 +32,7 @@
 
 #include <stdio.h>
 #include <stdint.h>
+#include "radeon_track.h"
 
 /* bo object */
 #define RADEON_BO_FLAGS_MACRO_TILE  1
@@ -42,8 +44,12 @@ struct radeon_bo {
     uint32_t                    alignment;
     uint32_t                    handle;
     uint32_t                    size;
+    uint32_t                    domains;
     uint32_t                    flags;
     unsigned                    cref;
+#ifdef RADEON_BO_TRACK
+    struct radeon_track         *track;
+#endif
     void                        *ptr;
     struct radeon_bo_manager    *bom;
 };
@@ -54,6 +60,7 @@ struct radeon_bo_funcs {
                                  uint32_t handle,
                                  uint32_t size,
                                  uint32_t alignment,
+                                 uint32_t domains,
                                  uint32_t flags);
     void (*bo_ref)(struct radeon_bo *bo);
     void (*bo_unref)(struct radeon_bo *bo);
@@ -64,6 +71,7 @@ struct radeon_bo_funcs {
 struct radeon_bo_manager {
     struct radeon_bo_funcs  *funcs;
     int                     fd;
+    struct radeon_tracker   tracker;
 };
     
 static inline void _radeon_bo_debug(struct radeon_bo *bo,
@@ -80,16 +88,19 @@ static inline struct radeon_bo *_radeon_bo_open(struct radeon_bo_manager *bom,
                                                 uint32_t handle,
                                                 uint32_t size,
                                                 uint32_t alignment,
+                                                uint32_t domains,
                                                 uint32_t flags,
                                                 const char *file,
                                                 const char *func,
                                                 int line)
 {
     struct radeon_bo *bo;
-    bo = bom->funcs->bo_open(bom, handle, size, alignment, flags);
-#ifdef RADEON_BO_TRACK_OPEN
+
+    bo = bom->funcs->bo_open(bom, handle, size, alignment, domains, flags);
+#ifdef RADEON_BO_TRACK
     if (bo) {
-        _radeon_bo_debug(bo, 1, file, func, line);
+        bo->track = radeon_tracker_add_track(&bom->tracker, bo->handle);
+        radeon_track_add_event(bo->track, file, func, "open", line);
     }
 #endif
     return bo;
@@ -101,8 +112,8 @@ static inline void _radeon_bo_ref(struct radeon_bo *bo,
                                   int line)
 {
     bo->cref++;
-#ifdef RADEON_BO_TRACK_REF
-    _radeon_bo_debug(bo, 2, file, func, line);
+#ifdef RADEON_BO_TRACK
+    radeon_track_add_event(bo->track, file, func, "ref", line); 
 #endif
     bo->bom->funcs->bo_ref(bo);
 }
@@ -113,8 +124,12 @@ static inline void _radeon_bo_unref(struct radeon_bo *bo,
                                     int line)
 {
     bo->cref--;
-#ifdef RADEON_BO_TRACK_REF
-    _radeon_bo_debug(bo, 3, file, func, line);
+#ifdef RADEON_BO_TRACK
+    radeon_track_add_event(bo->track, file, func, "unref", line);
+    if (bo->cref <= 0) {
+        radeon_tracker_remove_track(&bo->bom->tracker, bo->track);
+        bo->track = NULL;
+    }
 #endif
     bo->bom->funcs->bo_unref(bo);
 }
@@ -125,9 +140,6 @@ static inline int _radeon_bo_map(struct radeon_bo *bo,
                                  const char *func,
                                  int line)
 {
-#ifdef RADEON_BO_TRACK_MAP
-    _radeon_bo_debug(bo, 4, file, func, line);
-#endif
     return bo->bom->funcs->bo_map(bo, write);
 }
 
@@ -136,14 +148,11 @@ static inline int _radeon_bo_unmap(struct radeon_bo *bo,
                                    const char *func,
                                    int line)
 {
-#ifdef RADEON_BO_TRACK_MAP
-    _radeon_bo_debug(bo, 5, file, func, line);
-#endif
     return bo->bom->funcs->bo_unmap(bo);
 }
 
-#define radeon_bo_open(bom, h, s, a, f)\
-    _radeon_bo_open(bom, h, s, a, f, __FILE__, __FUNCTION__, __LINE__)
+#define radeon_bo_open(bom, h, s, a, d, f)\
+    _radeon_bo_open(bom, h, s, a, d, f, __FILE__, __FUNCTION__, __LINE__)
 #define radeon_bo_ref(bo)\
     _radeon_bo_ref(bo, __FILE__, __FUNCTION__, __LINE__)
 #define radeon_bo_unref(bo)\