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
11typedef uint32_t u32;
12typedef uint16_t u16;
13
14extern int nouveau_mesa_debug;
15
16struct nouveau_bo;
17
18struct 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
116static inline struct nouveau_screen *
117nouveau_screen(struct pipe_screen *pscreen)
118{
119   return (struct nouveau_screen *)pscreen;
120}
121
122bool nouveau_drm_screen_unref(struct nouveau_screen *screen);
123
124bool
125nouveau_screen_bo_get_handle(struct pipe_screen *pscreen,
126                             struct nouveau_bo *bo,
127                             unsigned stride,
128                             struct winsys_handle *whandle);
129struct nouveau_bo *
130nouveau_screen_bo_from_handle(struct pipe_screen *pscreen,
131                              struct winsys_handle *whandle,
132                              unsigned *out_stride);
133
134
135int nouveau_screen_init(struct nouveau_screen *, struct nouveau_device *);
136void nouveau_screen_fini(struct nouveau_screen *);
137
138void nouveau_screen_init_vdec(struct nouveau_screen *);
139
140#endif
141