OSDN Git Service

freedreno: valgrind support
[android-x86/external-libdrm.git] / freedreno / freedreno_priv.h
index cdfdbe8..8dd3ee6 100644 (file)
@@ -102,6 +102,9 @@ struct fd_device {
        struct fd_bo_cache bo_cache;
 
        int closefd;        /* call close(fd) upon destruction */
+
+       /* just for valgrind: */
+       int bo_size;
 };
 
 drm_private void fd_bo_cache_init(struct fd_bo_cache *cache, int coarse);
@@ -123,6 +126,7 @@ struct fd_pipe_funcs {
 struct fd_pipe {
        struct fd_device *dev;
        enum fd_pipe_id id;
+       uint32_t gpu_id;
        const struct fd_pipe_funcs *funcs;
 };
 
@@ -133,7 +137,8 @@ struct fd_ringmarker {
 
 struct fd_ringbuffer_funcs {
        void * (*hostptr)(struct fd_ringbuffer *ring);
-       int (*flush)(struct fd_ringbuffer *ring, uint32_t *last_start);
+       int (*flush)(struct fd_ringbuffer *ring, uint32_t *last_start,
+                       int in_fence_fd, int *out_fence_fd);
        void (*grow)(struct fd_ringbuffer *ring, uint32_t size);
        void (*reset)(struct fd_ringbuffer *ring);
        void (*emit_reloc)(struct fd_ringbuffer *ring,
@@ -194,4 +199,57 @@ offset_bytes(void *end, void *start)
        return ((char *)end) - ((char *)start);
 }
 
+#ifdef HAVE_VALGRIND
+#  include <memcheck.h>
+
+/*
+ * For tracking the backing memory (if valgrind enabled, we force a mmap
+ * for the purposes of tracking)
+ */
+static inline void VG_BO_ALLOC(struct fd_bo *bo)
+{
+       if (bo && RUNNING_ON_VALGRIND) {
+               VALGRIND_MALLOCLIKE_BLOCK(fd_bo_map(bo), bo->size, 0, 1);
+       }
+}
+
+static inline void VG_BO_FREE(struct fd_bo *bo)
+{
+       VALGRIND_FREELIKE_BLOCK(bo->map, 0);
+}
+
+/*
+ * For tracking bo structs that are in the buffer-cache, so that valgrind
+ * doesn't attribute ownership to the first one to allocate the recycled
+ * bo.
+ *
+ * Note that the list_head in fd_bo is used to track the buffers in cache
+ * so disable error reporting on the range while they are in cache so
+ * valgrind doesn't squawk about list traversal.
+ *
+ */
+static inline void VG_BO_RELEASE(struct fd_bo *bo)
+{
+       if (RUNNING_ON_VALGRIND) {
+               VALGRIND_DISABLE_ADDR_ERROR_REPORTING_IN_RANGE(bo, bo->dev->bo_size);
+               VALGRIND_MAKE_MEM_NOACCESS(bo, bo->dev->bo_size);
+               VALGRIND_FREELIKE_BLOCK(bo->map, 0);
+       }
+}
+static inline void VG_BO_OBTAIN(struct fd_bo *bo)
+{
+       if (RUNNING_ON_VALGRIND) {
+               VALGRIND_MAKE_MEM_DEFINED(bo, bo->dev->bo_size);
+               VALGRIND_ENABLE_ADDR_ERROR_REPORTING_IN_RANGE(bo, bo->dev->bo_size);
+               VALGRIND_MALLOCLIKE_BLOCK(bo->map, bo->size, 0, 1);
+       }
+}
+#else
+static inline void VG_BO_ALLOC(struct fd_bo *bo)   {}
+static inline void VG_BO_FREE(struct fd_bo *bo)    {}
+static inline void VG_BO_RELEASE(struct fd_bo *bo) {}
+static inline void VG_BO_OBTAIN(struct fd_bo *bo)  {}
+#endif
+
+
 #endif /* FREEDRENO_PRIV_H_ */