1 #ifndef __NVC0_SCREEN_H__
2 #define __NVC0_SCREEN_H__
3 
4 #include "nouveau_screen.h"
5 #include "nouveau_mm.h"
6 #include "nouveau_fence.h"
7 #include "nouveau_heap.h"
8 
9 #include "nv_object.xml.h"
10 
11 #include "nvc0/nvc0_winsys.h"
12 #include "nvc0/nvc0_stateobj.h"
13 
14 #define NVC0_TIC_MAX_ENTRIES 2048
15 #define NVC0_TSC_MAX_ENTRIES 2048
16 
17 /* doesn't count driver-reserved slot */
18 #define NVC0_MAX_PIPE_CONSTBUFS         15
19 
20 #define NVC0_MAX_SURFACE_SLOTS 16
21 
22 #define NVC0_MAX_VIEWPORTS 16
23 
24 #define NVC0_MAX_BUFFERS 32
25 
26 #define NVC0_MAX_IMAGES 8
27 
28 #define NVC0_MAX_WINDOW_RECTANGLES 8
29 
30 struct nvc0_context;
31 
32 struct nvc0_blitter;
33 
34 struct nvc0_graph_state {
35    bool flushed;
36    bool rasterizer_discard;
37    bool early_z_forced;
38    bool prim_restart;
39    uint32_t instance_elts; /* bitmask of per-instance elements */
40    uint32_t instance_base;
41    uint32_t constant_vbos;
42    uint32_t constant_elts;
43    int32_t index_bias;
44    uint16_t scissor;
45    bool flatshade;
46    uint8_t patch_vertices;
47    uint8_t vbo_mode; /* 0 = normal, 1 = translate, 3 = translate, forced */
48    uint8_t num_vtxbufs;
49    uint8_t num_vtxelts;
50    uint8_t num_textures[6];
51    uint8_t num_samplers[6];
52    uint8_t tls_required; /* bitmask of shader types using l[] */
53    uint8_t clip_enable;
54    uint32_t clip_mode;
55    uint32_t uniform_buffer_bound[6];
56    struct nvc0_transform_feedback_state *tfb;
57    bool seamless_cube_map;
58 };
59 
60 struct nvc0_screen {
61    struct nouveau_screen base;
62 
63    struct nvc0_context *cur_ctx;
64    struct nvc0_graph_state save_state;
65 
66    int num_occlusion_queries_active;
67 
68    struct nouveau_bo *text;
69    struct nouveau_bo *uniform_bo;
70    struct nouveau_bo *tls;
71    struct nouveau_bo *txc; /* TIC (offset 0) and TSC (65536) */
72    struct nouveau_bo *poly_cache;
73 
74    uint8_t gpc_count;
75    uint16_t mp_count;
76    uint16_t mp_count_compute; /* magic reg can make compute use fewer MPs */
77 
78    struct nouveau_heap *text_heap;
79    struct nouveau_heap *lib_code; /* allocated from text_heap */
80 
81    struct nvc0_blitter *blitter;
82 
83    struct nv50_tsc_entry *default_tsc;
84 
85    struct {
86       void **entries;
87       int next;
88       uint32_t lock[NVC0_TIC_MAX_ENTRIES / 32];
89       bool maxwell;
90    } tic;
91 
92    struct {
93       void **entries;
94       int next;
95       uint32_t lock[NVC0_TSC_MAX_ENTRIES / 32];
96    } tsc;
97 
98    struct {
99       struct nouveau_bo *bo;
100       uint32_t *map;
101    } fence;
102 
103    struct {
104       struct nvc0_program *prog; /* compute state object to read MP counters */
105       struct nvc0_hw_sm_query *mp_counter[8]; /* counter to query allocation */
106       uint8_t num_hw_sm_active[2];
107       bool mp_counters_enabled;
108    } pm;
109 
110    struct nouveau_object *eng3d; /* sqrt(1/2)|kepler> + sqrt(1/2)|fermi> */
111    struct nouveau_object *eng2d;
112    struct nouveau_object *m2mf;
113    struct nouveau_object *compute;
114    struct nouveau_object *nvsw;
115 };
116 
117 static inline struct nvc0_screen *
nvc0_screen(struct pipe_screen * screen)118 nvc0_screen(struct pipe_screen *screen)
119 {
120    return (struct nvc0_screen *)screen;
121 }
122 
123 int nvc0_screen_get_driver_query_info(struct pipe_screen *, unsigned,
124                                       struct pipe_driver_query_info *);
125 
126 int nvc0_screen_get_driver_query_group_info(struct pipe_screen *, unsigned,
127                                             struct pipe_driver_query_group_info *);
128 
129 bool nvc0_blitter_create(struct nvc0_screen *);
130 void nvc0_blitter_destroy(struct nvc0_screen *);
131 
132 void nvc0_screen_make_buffers_resident(struct nvc0_screen *);
133 
134 int nvc0_screen_tic_alloc(struct nvc0_screen *, void *);
135 int nvc0_screen_tsc_alloc(struct nvc0_screen *, void *);
136 
137 int nve4_screen_compute_setup(struct nvc0_screen *, struct nouveau_pushbuf *);
138 int nvc0_screen_compute_setup(struct nvc0_screen *, struct nouveau_pushbuf *);
139 
140 int nvc0_screen_resize_text_area(struct nvc0_screen *, uint64_t);
141 
142 static inline void
nvc0_resource_fence(struct nv04_resource * res,uint32_t flags)143 nvc0_resource_fence(struct nv04_resource *res, uint32_t flags)
144 {
145    struct nvc0_screen *screen = nvc0_screen(res->base.screen);
146 
147    if (res->mm) {
148       nouveau_fence_ref(screen->base.fence.current, &res->fence);
149       if (flags & NOUVEAU_BO_WR)
150          nouveau_fence_ref(screen->base.fence.current, &res->fence_wr);
151    }
152 }
153 
154 static inline void
nvc0_resource_validate(struct nv04_resource * res,uint32_t flags)155 nvc0_resource_validate(struct nv04_resource *res, uint32_t flags)
156 {
157    if (likely(res->bo)) {
158       if (flags & NOUVEAU_BO_WR)
159          res->status |= NOUVEAU_BUFFER_STATUS_GPU_WRITING |
160             NOUVEAU_BUFFER_STATUS_DIRTY;
161       if (flags & NOUVEAU_BO_RD)
162          res->status |= NOUVEAU_BUFFER_STATUS_GPU_READING;
163 
164       nvc0_resource_fence(res, flags);
165    }
166 }
167 
168 struct nvc0_format {
169    uint32_t rt;
170    struct {
171       unsigned format:7;
172       unsigned type_r:3;
173       unsigned type_g:3;
174       unsigned type_b:3;
175       unsigned type_a:3;
176       unsigned src_x:3;
177       unsigned src_y:3;
178       unsigned src_z:3;
179       unsigned src_w:3;
180    } tic;
181    uint32_t usage;
182 };
183 
184 struct nvc0_vertex_format {
185    uint32_t vtx;
186    uint32_t usage;
187 };
188 
189 extern const struct nvc0_format nvc0_format_table[];
190 extern const struct nvc0_vertex_format nvc0_vertex_format[];
191 
192 static inline void
nvc0_screen_tic_unlock(struct nvc0_screen * screen,struct nv50_tic_entry * tic)193 nvc0_screen_tic_unlock(struct nvc0_screen *screen, struct nv50_tic_entry *tic)
194 {
195    if (tic->id >= 0)
196       screen->tic.lock[tic->id / 32] &= ~(1 << (tic->id % 32));
197 }
198 
199 static inline void
nvc0_screen_tsc_unlock(struct nvc0_screen * screen,struct nv50_tsc_entry * tsc)200 nvc0_screen_tsc_unlock(struct nvc0_screen *screen, struct nv50_tsc_entry *tsc)
201 {
202    if (tsc->id >= 0)
203       screen->tsc.lock[tsc->id / 32] &= ~(1 << (tsc->id % 32));
204 }
205 
206 static inline void
nvc0_screen_tic_free(struct nvc0_screen * screen,struct nv50_tic_entry * tic)207 nvc0_screen_tic_free(struct nvc0_screen *screen, struct nv50_tic_entry *tic)
208 {
209    if (tic->id >= 0) {
210       screen->tic.entries[tic->id] = NULL;
211       screen->tic.lock[tic->id / 32] &= ~(1 << (tic->id % 32));
212    }
213 }
214 
215 static inline void
nvc0_screen_tsc_free(struct nvc0_screen * screen,struct nv50_tsc_entry * tsc)216 nvc0_screen_tsc_free(struct nvc0_screen *screen, struct nv50_tsc_entry *tsc)
217 {
218    if (tsc->id >= 0) {
219       screen->tsc.entries[tsc->id] = NULL;
220       screen->tsc.lock[tsc->id / 32] &= ~(1 << (tsc->id % 32));
221    }
222 }
223 
224 #endif
225