• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef __NV50_SCREEN_H__
2 #define __NV50_SCREEN_H__
3 
4 #include "nouveau_screen.h"
5 #include "nouveau_fence.h"
6 #include "nouveau_mm.h"
7 #include "nouveau_heap.h"
8 
9 #include "nv50/nv50_winsys.h"
10 #include "nv50/nv50_stateobj.h"
11 
12 #define NV50_TIC_MAX_ENTRIES 2048
13 #define NV50_TSC_MAX_ENTRIES 2048
14 
15 /* doesn't count reserved slots (for auxiliary constants, immediates, etc.) */
16 #define NV50_MAX_PIPE_CONSTBUFS 14
17 
18 struct nv50_context;
19 
20 #define NV50_CODE_BO_SIZE_LOG2 19
21 
22 #define NV50_SCREEN_RESIDENT_BO_COUNT 5
23 
24 #define NV50_MAX_VIEWPORTS 16
25 
26 #define NV50_MAX_WINDOW_RECTANGLES 8
27 
28 #define NV50_MAX_GLOBALS 16
29 
30 #define ONE_TEMP_SIZE (4/*vector*/ * sizeof(float))
31 
32 struct nv50_blitter;
33 
34 struct nv50_graph_state {
35    uint32_t instance_elts; /* bitmask of per-instance elements */
36    uint32_t instance_base;
37    uint32_t interpolant_ctrl;
38    uint32_t semantic_color;
39    uint32_t semantic_psize;
40    int32_t index_bias;
41    uint32_t clip_mode;
42    bool uniform_buffer_bound[3];
43    bool prim_restart;
44    bool point_sprite;
45    bool rt_serialize;
46    bool flushed;
47    bool rasterizer_discard;
48    uint8_t tls_required;
49    bool new_tls_space;
50    uint8_t num_vtxbufs;
51    uint8_t num_vtxelts;
52    uint8_t num_textures[3];
53    uint8_t num_samplers[3];
54    uint8_t prim_size;
55    uint16_t scissor;
56    bool seamless_cube_map;
57 };
58 
59 struct nv50_screen {
60    struct nouveau_screen base;
61 
62    struct nv50_context *cur_ctx;
63    struct nv50_graph_state save_state;
64 
65    int num_occlusion_queries_active;
66 
67    struct nouveau_bo *code;
68    struct nouveau_bo *uniforms;
69    struct nouveau_bo *txc; /* TIC (offset 0) and TSC (65536) */
70    struct nouveau_bo *stack_bo;
71    struct nouveau_bo *tls_bo;
72 
73    unsigned TPs;
74    unsigned MPsInTP;
75    unsigned max_tls_space;
76    unsigned cur_tls_space;
77    unsigned mp_count;
78 
79    struct nouveau_heap *vp_code_heap;
80    struct nouveau_heap *gp_code_heap;
81    struct nouveau_heap *fp_code_heap;
82 
83    struct nv50_blitter *blitter;
84 
85    struct {
86       void **entries;
87       int next;
88       uint32_t lock[NV50_TIC_MAX_ENTRIES / 32];
89    } tic;
90 
91    struct {
92       void **entries;
93       int next;
94       uint32_t lock[NV50_TSC_MAX_ENTRIES / 32];
95    } tsc;
96 
97    struct {
98       uint32_t *map;
99       struct nouveau_bo *bo;
100    } fence;
101 
102    struct {
103       struct nv50_program *prog; /* compute state object to read MP counters */
104       struct nv50_hw_sm_query *mp_counter[4]; /* counter to query allocation */
105       uint8_t num_hw_sm_active;
106    } pm;
107 
108    struct nouveau_object *sync;
109 
110    struct nouveau_object *tesla;
111    struct nouveau_object *compute;
112    struct nouveau_object *eng2d;
113    struct nouveau_object *m2mf;
114 };
115 
116 static inline struct nv50_screen *
nv50_screen(struct pipe_screen * screen)117 nv50_screen(struct pipe_screen *screen)
118 {
119    return (struct nv50_screen *)screen;
120 }
121 
122 int nv50_screen_get_driver_query_info(struct pipe_screen *, unsigned,
123                                       struct pipe_driver_query_info *);
124 int nv50_screen_get_driver_query_group_info(struct pipe_screen *, unsigned,
125                                             struct pipe_driver_query_group_info *);
126 
127 bool nv50_blitter_create(struct nv50_screen *);
128 void nv50_blitter_destroy(struct nv50_screen *);
129 
130 int nv50_screen_tic_alloc(struct nv50_screen *, void *);
131 int nv50_screen_tsc_alloc(struct nv50_screen *, void *);
132 
133 int nv50_screen_compute_setup(struct nv50_screen *, struct nouveau_pushbuf *);
134 
135 static inline void
nv50_resource_fence(struct nv04_resource * res,uint32_t flags)136 nv50_resource_fence(struct nv04_resource *res, uint32_t flags)
137 {
138    struct nv50_screen *screen = nv50_screen(res->base.screen);
139 
140    if (res->mm) {
141       nouveau_fence_ref(screen->base.fence.current, &res->fence);
142       if (flags & NOUVEAU_BO_WR)
143          nouveau_fence_ref(screen->base.fence.current, &res->fence_wr);
144    }
145 }
146 
147 static inline void
nv50_resource_validate(struct nv04_resource * res,uint32_t flags)148 nv50_resource_validate(struct nv04_resource *res, uint32_t flags)
149 {
150    if (likely(res->bo)) {
151       if (flags & NOUVEAU_BO_WR)
152          res->status |= NOUVEAU_BUFFER_STATUS_GPU_WRITING |
153             NOUVEAU_BUFFER_STATUS_DIRTY;
154       if (flags & NOUVEAU_BO_RD)
155          res->status |= NOUVEAU_BUFFER_STATUS_GPU_READING;
156 
157       nv50_resource_fence(res, flags);
158    }
159 }
160 
161 struct nv50_format {
162    uint32_t rt;
163    struct {
164       unsigned format:6;
165       unsigned type_r:3;
166       unsigned type_g:3;
167       unsigned type_b:3;
168       unsigned type_a:3;
169       unsigned src_x:3;
170       unsigned src_y:3;
171       unsigned src_z:3;
172       unsigned src_w:3;
173    } tic;
174    uint32_t usage;
175 };
176 
177 struct nv50_vertex_format {
178    uint32_t vtx;
179    uint32_t usage;
180 };
181 
182 extern const struct nv50_format nv50_format_table[];
183 extern const struct nv50_vertex_format nv50_vertex_format[];
184 
185 static inline void
nv50_screen_tic_unlock(struct nv50_screen * screen,struct nv50_tic_entry * tic)186 nv50_screen_tic_unlock(struct nv50_screen *screen, struct nv50_tic_entry *tic)
187 {
188    if (tic->id >= 0)
189       screen->tic.lock[tic->id / 32] &= ~(1 << (tic->id % 32));
190 }
191 
192 static inline void
nv50_screen_tsc_unlock(struct nv50_screen * screen,struct nv50_tsc_entry * tsc)193 nv50_screen_tsc_unlock(struct nv50_screen *screen, struct nv50_tsc_entry *tsc)
194 {
195    if (tsc->id >= 0)
196       screen->tsc.lock[tsc->id / 32] &= ~(1 << (tsc->id % 32));
197 }
198 
199 static inline void
nv50_screen_tic_free(struct nv50_screen * screen,struct nv50_tic_entry * tic)200 nv50_screen_tic_free(struct nv50_screen *screen, struct nv50_tic_entry *tic)
201 {
202    if (tic->id >= 0) {
203       screen->tic.entries[tic->id] = NULL;
204       screen->tic.lock[tic->id / 32] &= ~(1 << (tic->id % 32));
205    }
206 }
207 
208 static inline void
nv50_screen_tsc_free(struct nv50_screen * screen,struct nv50_tsc_entry * tsc)209 nv50_screen_tsc_free(struct nv50_screen *screen, struct nv50_tsc_entry *tsc)
210 {
211    if (tsc->id >= 0) {
212       screen->tsc.entries[tsc->id] = NULL;
213       screen->tsc.lock[tsc->id / 32] &= ~(1 << (tsc->id % 32));
214    }
215 }
216 
217 extern int nv50_tls_realloc(struct nv50_screen *screen, unsigned tls_space);
218 
219 #endif
220