184cc07dc89c0ebce4ad55b4b3684d4420a202683Ben Skeggs#ifndef __NV50_SCREEN_H__
284cc07dc89c0ebce4ad55b4b3684d4420a202683Ben Skeggs#define __NV50_SCREEN_H__
384cc07dc89c0ebce4ad55b4b3684d4420a202683Ben Skeggs
4bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs#include "nouveau/nouveau_screen.h"
57a8ee058a83f1eda2c783d83fc5967fd9ef75660Ben Skeggs#include "nouveau/nouveau_fence.h"
62f30a5bdaad480118e23ac4243de3b4a11ba62a8Ben Skeggs#include "nouveau/nouveau_mm.h"
76d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller#include "nouveau/nouveau_heap.h"
86d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller
9f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#include "nv50_winsys.h"
10f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#include "nv50_stateobj.h"
1157e71b85020fff33d3e5701d0ef61e9fb84b0af4Vinson Lee
12f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#define NV50_TIC_MAX_ENTRIES 2048
13f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller#define NV50_TSC_MAX_ENTRIES 2048
14f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
15fcb28682101dfa127486373411043d5d97a0ff8fChristoph Bumiller/* doesn't count reserved slots (for auxiliary constants, immediates, etc.) */
16fcb28682101dfa127486373411043d5d97a0ff8fChristoph Bumiller#define NV50_MAX_PIPE_CONSTBUFS 14
17fcb28682101dfa127486373411043d5d97a0ff8fChristoph Bumiller
1857e71b85020fff33d3e5701d0ef61e9fb84b0af4Vinson Leestruct nv50_context;
19f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
207048ad62f89289c9e642203c009dca38ce8753f8Christoph Bumiller#define NV50_CODE_BO_SIZE_LOG2 19
217048ad62f89289c9e642203c009dca38ce8753f8Christoph Bumiller
229c5d15e929f47f517f90977f5420e11dfbd3db67Christoph Bumiller#define NV50_SCREEN_RESIDENT_BO_COUNT 5
239c5d15e929f47f517f90977f5420e11dfbd3db67Christoph Bumiller
24e9d84dab8817a0a7e463229b9a2820b00a9ce667Christoph Bumillerstruct nv50_blitctx;
25e9d84dab8817a0a7e463229b9a2820b00a9ce667Christoph Bumiller
2684cc07dc89c0ebce4ad55b4b3684d4420a202683Ben Skeggsstruct nv50_screen {
27f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   struct nouveau_screen base;
28f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
29f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   struct nv50_context *cur_ctx;
30f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
31f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   struct nouveau_bo *code;
32f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   struct nouveau_bo *uniforms;
33f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   struct nouveau_bo *txc; /* TIC (offset 0) and TSC (65536) */
34f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   struct nouveau_bo *stack_bo;
35f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   struct nouveau_bo *tls_bo;
36f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
371906d2b46b21a8e7496409e0639d8463ad86dcfeMarcin Slusarz   unsigned TPs;
381906d2b46b21a8e7496409e0639d8463ad86dcfeMarcin Slusarz   unsigned MPsInTP;
391906d2b46b21a8e7496409e0639d8463ad86dcfeMarcin Slusarz   unsigned max_tls_space;
401906d2b46b21a8e7496409e0639d8463ad86dcfeMarcin Slusarz   unsigned cur_tls_space;
41f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
426d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   struct nouveau_heap *vp_code_heap;
436d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   struct nouveau_heap *gp_code_heap;
446d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   struct nouveau_heap *fp_code_heap;
45f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
46e9d84dab8817a0a7e463229b9a2820b00a9ce667Christoph Bumiller   struct nv50_blitctx *blitctx;
47e9d84dab8817a0a7e463229b9a2820b00a9ce667Christoph Bumiller
48f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   struct {
49f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      void **entries;
50f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      int next;
51f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      uint32_t lock[NV50_TIC_MAX_ENTRIES / 32];
52f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   } tic;
53f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
54f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   struct {
55f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      void **entries;
56f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      int next;
57f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      uint32_t lock[NV50_TSC_MAX_ENTRIES / 32];
58f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   } tsc;
59f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
60f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   struct {
61f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      uint32_t *map;
62f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      struct nouveau_bo *bo;
63f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   } fence;
64f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
656d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   struct nouveau_object *sync;
66f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
676d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   struct nouveau_object *tesla;
686d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   struct nouveau_object *eng2d;
696d1cdec3ba151168bfc3aef222fba6265dfb41fbChristoph Bumiller   struct nouveau_object *m2mf;
70f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller};
71baaae562f02563c5966b857c61b3eae7341950e3Ben Skeggs
72f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic INLINE struct nv50_screen *
73f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_screen(struct pipe_screen *screen)
74f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{
75f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   return (struct nv50_screen *)screen;
76f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller}
77b2e48f848496d5e315e536688c8c33dfb1fab7ebBen Skeggs
78e9d84dab8817a0a7e463229b9a2820b00a9ce667Christoph Bumillerboolean nv50_blitctx_create(struct nv50_screen *);
79e9d84dab8817a0a7e463229b9a2820b00a9ce667Christoph Bumiller
80f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerint nv50_screen_tic_alloc(struct nv50_screen *, void *);
81f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerint nv50_screen_tsc_alloc(struct nv50_screen *, void *);
8284cc07dc89c0ebce4ad55b4b3684d4420a202683Ben Skeggs
83f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic INLINE void
8479079141fa7cbf395d1ffc77364ac301d9824211Ben Skeggsnv50_resource_fence(struct nv04_resource *res, uint32_t flags)
8584cc07dc89c0ebce4ad55b4b3684d4420a202683Ben Skeggs{
86f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   struct nv50_screen *screen = nv50_screen(res->base.screen);
87f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
88f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   if (res->mm) {
897a8ee058a83f1eda2c783d83fc5967fd9ef75660Ben Skeggs      nouveau_fence_ref(screen->base.fence.current, &res->fence);
90f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      if (flags & NOUVEAU_BO_WR)
917a8ee058a83f1eda2c783d83fc5967fd9ef75660Ben Skeggs         nouveau_fence_ref(screen->base.fence.current, &res->fence_wr);
92f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   }
9384cc07dc89c0ebce4ad55b4b3684d4420a202683Ben Skeggs}
9484cc07dc89c0ebce4ad55b4b3684d4420a202683Ben Skeggs
95f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic INLINE void
9679079141fa7cbf395d1ffc77364ac301d9824211Ben Skeggsnv50_resource_validate(struct nv04_resource *res, uint32_t flags)
97f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{
98f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   if (likely(res->bo)) {
99be68782d9aebf6f6575bb8cc9cfc66b7bad79644Ben Skeggs      if (flags & NOUVEAU_BO_WR)
100be68782d9aebf6f6575bb8cc9cfc66b7bad79644Ben Skeggs         res->status |= NOUVEAU_BUFFER_STATUS_GPU_WRITING;
101be68782d9aebf6f6575bb8cc9cfc66b7bad79644Ben Skeggs      if (flags & NOUVEAU_BO_RD)
102be68782d9aebf6f6575bb8cc9cfc66b7bad79644Ben Skeggs         res->status |= NOUVEAU_BUFFER_STATUS_GPU_READING;
103be68782d9aebf6f6575bb8cc9cfc66b7bad79644Ben Skeggs
104f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      nv50_resource_fence(res, flags);
105f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   }
106f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller}
107272bbbffb0138024564cbf8410a30ea9e25eb179Christoph Bumiller
108d7aac107e64e1c4c1af30806817a2888e7a4a96cChristoph Bumillerstruct nv50_format {
109f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   uint32_t rt;
110f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   uint32_t tic;
111f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   uint32_t vtx;
112f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   uint32_t usage;
113d7aac107e64e1c4c1af30806817a2888e7a4a96cChristoph Bumiller};
114d7aac107e64e1c4c1af30806817a2888e7a4a96cChristoph Bumiller
115d7aac107e64e1c4c1af30806817a2888e7a4a96cChristoph Bumillerextern const struct nv50_format nv50_format_table[];
116d7aac107e64e1c4c1af30806817a2888e7a4a96cChristoph Bumiller
117f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic INLINE void
118f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_screen_tic_unlock(struct nv50_screen *screen, struct nv50_tic_entry *tic)
119f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{
120f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   if (tic->id >= 0)
121f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      screen->tic.lock[tic->id / 32] &= ~(1 << (tic->id % 32));
122f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller}
123f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
124f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic INLINE void
125f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_screen_tsc_unlock(struct nv50_screen *screen, struct nv50_tsc_entry *tsc)
126f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{
127f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   if (tsc->id >= 0)
128f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      screen->tsc.lock[tsc->id / 32] &= ~(1 << (tsc->id % 32));
129f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller}
130f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
131f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic INLINE void
132f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_screen_tic_free(struct nv50_screen *screen, struct nv50_tic_entry *tic)
133f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{
134f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   if (tic->id >= 0) {
135f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      screen->tic.entries[tic->id] = NULL;
136f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      screen->tic.lock[tic->id / 32] &= ~(1 << (tic->id % 32));
137f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   }
138f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller}
139f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
140f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillerstatic INLINE void
141f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumillernv50_screen_tsc_free(struct nv50_screen *screen, struct nv50_tsc_entry *tsc)
142f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller{
143f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   if (tsc->id >= 0) {
144f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      screen->tsc.entries[tsc->id] = NULL;
145f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller      screen->tsc.lock[tsc->id / 32] &= ~(1 << (tsc->id % 32));
146f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller   }
147f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller}
148f80c03e1875fe96ff2f4c022e3cb76357828140dChristoph Bumiller
1491906d2b46b21a8e7496409e0639d8463ad86dcfeMarcin Slusarzextern int nv50_tls_realloc(struct nv50_screen *screen, unsigned tls_space);
1501906d2b46b21a8e7496409e0639d8463ad86dcfeMarcin Slusarz
15184cc07dc89c0ebce4ad55b4b3684d4420a202683Ben Skeggs#endif
152