1 #ifndef __NOUVEAU_SCREEN_H__
2 #define __NOUVEAU_SCREEN_H__
3
4 #include "pipe/p_screen.h"
5 #include "util/u_memory.h"
6
7 #ifdef DEBUG
8 # define NOUVEAU_ENABLE_DRIVER_STATISTICS
9 #endif
10
11 typedef uint32_t u32;
12 typedef uint16_t u16;
13
14 extern int nouveau_mesa_debug;
15
16 struct nouveau_bo;
17
18 struct nouveau_screen {
19 struct pipe_screen base;
20 struct nouveau_drm *drm;
21 struct nouveau_device *device;
22 struct nouveau_object *channel;
23 struct nouveau_client *client;
24 struct nouveau_pushbuf *pushbuf;
25
26 int refcount;
27
28 unsigned vidmem_bindings; /* PIPE_BIND_* where VRAM placement is desired */
29 unsigned sysmem_bindings; /* PIPE_BIND_* where GART placement is desired */
30 unsigned lowmem_bindings; /* PIPE_BIND_* that require an address < 4 GiB */
31 /*
32 * For bindings with (vidmem & sysmem) bits set, PIPE_USAGE_* decides
33 * placement.
34 */
35
36 uint16_t class_3d;
37
38 struct {
39 struct nouveau_fence *head;
40 struct nouveau_fence *tail;
41 struct nouveau_fence *current;
42 u32 sequence;
43 u32 sequence_ack;
44 void (*emit)(struct pipe_screen *, u32 *sequence);
45 u32 (*update)(struct pipe_screen *);
46 } fence;
47
48 struct nouveau_mman *mm_VRAM;
49 struct nouveau_mman *mm_GART;
50
51 int64_t cpu_gpu_time_delta;
52
53 bool hint_buf_keep_sysmem_copy;
54
55 unsigned vram_domain;
56
57 struct {
58 unsigned profiles_checked;
59 unsigned profiles_present;
60 } firmware_info;
61
62 #ifdef NOUVEAU_ENABLE_DRIVER_STATISTICS
63 union {
64 uint64_t v[29];
65 struct {
66 uint64_t tex_obj_current_count;
67 uint64_t tex_obj_current_bytes;
68 uint64_t buf_obj_current_count;
69 uint64_t buf_obj_current_bytes_vid;
70 uint64_t buf_obj_current_bytes_sys;
71 uint64_t tex_transfers_rd;
72 uint64_t tex_transfers_wr;
73 uint64_t tex_copy_count;
74 uint64_t tex_blit_count;
75 uint64_t tex_cache_flush_count;
76 uint64_t buf_transfers_rd;
77 uint64_t buf_transfers_wr;
78 uint64_t buf_read_bytes_staging_vid;
79 uint64_t buf_write_bytes_direct;
80 uint64_t buf_write_bytes_staging_vid;
81 uint64_t buf_write_bytes_staging_sys;
82 uint64_t buf_copy_bytes;
83 uint64_t buf_non_kernel_fence_sync_count;
84 uint64_t any_non_kernel_fence_sync_count;
85 uint64_t query_sync_count;
86 uint64_t gpu_serialize_count;
87 uint64_t draw_calls_array;
88 uint64_t draw_calls_indexed;
89 uint64_t draw_calls_fallback_count;
90 uint64_t user_buffer_upload_bytes;
91 uint64_t constbuf_upload_count;
92 uint64_t constbuf_upload_bytes;
93 uint64_t pushbuf_count;
94 uint64_t resource_validate_count;
95 } named;
96 } stats;
97 #endif
98 };
99
100 #define NV_VRAM_DOMAIN(screen) ((screen)->vram_domain)
101
102 #ifdef NOUVEAU_ENABLE_DRIVER_STATISTICS
103 # define NOUVEAU_DRV_STAT(s, n, v) do { \
104 (s)->stats.named.n += (v); \
105 } while(0)
106 # define NOUVEAU_DRV_STAT_RES(r, n, v) do { \
107 nouveau_screen((r)->base.screen)->stats.named.n += (v); \
108 } while(0)
109 # define NOUVEAU_DRV_STAT_IFD(x) x
110 #else
111 # define NOUVEAU_DRV_STAT(s, n, v) do { } while(0)
112 # define NOUVEAU_DRV_STAT_RES(r, n, v) do { } while(0)
113 # define NOUVEAU_DRV_STAT_IFD(x)
114 #endif
115
116 static inline struct nouveau_screen *
nouveau_screen(struct pipe_screen * pscreen)117 nouveau_screen(struct pipe_screen *pscreen)
118 {
119 return (struct nouveau_screen *)pscreen;
120 }
121
122 bool nouveau_drm_screen_unref(struct nouveau_screen *screen);
123
124 bool
125 nouveau_screen_bo_get_handle(struct pipe_screen *pscreen,
126 struct nouveau_bo *bo,
127 unsigned stride,
128 struct winsys_handle *whandle);
129 struct nouveau_bo *
130 nouveau_screen_bo_from_handle(struct pipe_screen *pscreen,
131 struct winsys_handle *whandle,
132 unsigned *out_stride);
133
134
135 int nouveau_screen_init(struct nouveau_screen *, struct nouveau_device *);
136 void nouveau_screen_fini(struct nouveau_screen *);
137
138 void nouveau_screen_init_vdec(struct nouveau_screen *);
139
140 #endif
141