etnaviv: Use hash table to track BO indexes
[mesa.git] / src / etnaviv / drm / etnaviv_priv.h
index d13cfe73686aa31d6b23d18f229f2159e8c8f5db..d8f053771e927ce0fcfd8ed087bcc2e1afef5a4d 100644 (file)
 #include <xf86drm.h>
 
 #include "util/list.h"
+#include "util/macros.h"
 #include "util/u_atomic.h"
+#include "util/u_debug.h"
 
 #include "etnaviv_drmif.h"
-#include "etnaviv_drm.h"
+#include "drm-uapi/etnaviv_drm.h"
 
 struct etna_bo_bucket {
        uint32_t size;
@@ -83,7 +85,7 @@ struct etna_bo *etna_bo_cache_alloc(struct etna_bo_cache *cache,
                uint32_t *size, uint32_t flags);
 int etna_bo_cache_free(struct etna_bo_cache *cache, struct etna_bo *bo);
 
-/* for where @table_lock is already held: */
+/* for where @etna_drm_table_lock is already held: */
 void etna_device_del_locked(struct etna_device *dev);
 
 /* a GEM buffer object allocated from the DRM device */
@@ -97,12 +99,10 @@ struct etna_bo {
        uint64_t        offset;         /* offset to mmap() */
        int             refcnt;
 
-       /* in the common case, a bo won't be referenced by more than a single
-        * command stream.  So to avoid looping over all the bo's in the
-        * reloc table to find the idx of a bo that might already be in the
-        * table, we cache the idx in the bo.  But in order to detect the
-        * slow-path where bo is ref'd in multiple streams, we also must track
-        * the current_stream for which the idx is valid.  See bo2idx().
+       /*
+        * To avoid excess hashtable lookups, cache the stream this bo was
+        * last emitted on (since that will probably also be the next ring
+        * it is emitted on).
         */
        struct etna_cmd_stream *current_stream;
        uint32_t idx;
@@ -152,6 +152,8 @@ struct etna_cmd_stream_priv {
        /* notify callback if buffer reset happened */
        void (*reset_notify)(struct etna_cmd_stream *stream, void *priv);
        void *reset_notify_priv;
+
+       void *bo_table;
 };
 
 struct etna_perfmon {
@@ -176,21 +178,20 @@ struct etna_perfmon_signal
 };
 
 #define ALIGN(v,a) (((v) + (a) - 1) & ~((a) - 1))
-#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
 
-#define enable_debug 1  /* TODO make dynamic */
+#define enable_debug 0  /* TODO make dynamic */
 
 #define INFO_MSG(fmt, ...) \
-               do { drmMsg("[I] "fmt " (%s:%d)\n", \
+               do { debug_printf("[I] "fmt " (%s:%d)\n", \
                                ##__VA_ARGS__, __FUNCTION__, __LINE__); } while (0)
 #define DEBUG_MSG(fmt, ...) \
-               do if (enable_debug) { drmMsg("[D] "fmt " (%s:%d)\n", \
+               do if (enable_debug) { debug_printf("[D] "fmt " (%s:%d)\n", \
                                ##__VA_ARGS__, __FUNCTION__, __LINE__); } while (0)
 #define WARN_MSG(fmt, ...) \
-               do { drmMsg("[W] "fmt " (%s:%d)\n", \
+               do { debug_printf("[W] "fmt " (%s:%d)\n", \
                                ##__VA_ARGS__, __FUNCTION__, __LINE__); } while (0)
 #define ERROR_MSG(fmt, ...) \
-               do { drmMsg("[E] " fmt " (%s:%d)\n", \
+               do { debug_printf("[E] " fmt " (%s:%d)\n", \
                                ##__VA_ARGS__, __FUNCTION__, __LINE__); } while (0)
 
 #define VOID2U64(x) ((uint64_t)(unsigned long)(x))