1 #ifndef __NV50_SCREEN_H__ 2 #define __NV50_SCREEN_H__ 3 4 #include "nouveau/nouveau_screen.h" 5 #include "nouveau/nouveau_fence.h" 6 #include "nouveau/nouveau_mm.h" 7 #include "nouveau/nouveau_heap.h" 8 9 #include "nv50_winsys.h" 10 #include "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 struct nv50_blitctx; 25 26 struct nv50_screen { 27 struct nouveau_screen base; 28 29 struct nv50_context *cur_ctx; 30 31 struct nouveau_bo *code; 32 struct nouveau_bo *uniforms; 33 struct nouveau_bo *txc; /* TIC (offset 0) and TSC (65536) */ 34 struct nouveau_bo *stack_bo; 35 struct nouveau_bo *tls_bo; 36 37 unsigned TPs; 38 unsigned MPsInTP; 39 unsigned max_tls_space; 40 unsigned cur_tls_space; 41 42 struct nouveau_heap *vp_code_heap; 43 struct nouveau_heap *gp_code_heap; 44 struct nouveau_heap *fp_code_heap; 45 46 struct nv50_blitctx *blitctx; 47 48 struct { 49 void **entries; 50 int next; 51 uint32_t lock[NV50_TIC_MAX_ENTRIES / 32]; 52 } tic; 53 54 struct { 55 void **entries; 56 int next; 57 uint32_t lock[NV50_TSC_MAX_ENTRIES / 32]; 58 } tsc; 59 60 struct { 61 uint32_t *map; 62 struct nouveau_bo *bo; 63 } fence; 64 65 struct nouveau_object *sync; 66 67 struct nouveau_object *tesla; 68 struct nouveau_object *eng2d; 69 struct nouveau_object *m2mf; 70 }; 71 72 static INLINE struct nv50_screen * 73 nv50_screen(struct pipe_screen *screen) 74 { 75 return (struct nv50_screen *)screen; 76 } 77 78 boolean nv50_blitctx_create(struct nv50_screen *); 79 80 int nv50_screen_tic_alloc(struct nv50_screen *, void *); 81 int nv50_screen_tsc_alloc(struct nv50_screen *, void *); 82 83 static INLINE void 84 nv50_resource_fence(struct nv04_resource *res, uint32_t flags) 85 { 86 struct nv50_screen *screen = nv50_screen(res->base.screen); 87 88 if (res->mm) { 89 nouveau_fence_ref(screen->base.fence.current, &res->fence); 90 if (flags & NOUVEAU_BO_WR) 91 nouveau_fence_ref(screen->base.fence.current, &res->fence_wr); 92 } 93 } 94 95 static INLINE void 96 nv50_resource_validate(struct nv04_resource *res, uint32_t flags) 97 { 98 if (likely(res->bo)) { 99 if (flags & NOUVEAU_BO_WR) 100 res->status |= NOUVEAU_BUFFER_STATUS_GPU_WRITING; 101 if (flags & NOUVEAU_BO_RD) 102 res->status |= NOUVEAU_BUFFER_STATUS_GPU_READING; 103 104 nv50_resource_fence(res, flags); 105 } 106 } 107 108 struct nv50_format { 109 uint32_t rt; 110 uint32_t tic; 111 uint32_t vtx; 112 uint32_t usage; 113 }; 114 115 extern const struct nv50_format nv50_format_table[]; 116 117 static INLINE void 118 nv50_screen_tic_unlock(struct nv50_screen *screen, struct nv50_tic_entry *tic) 119 { 120 if (tic->id >= 0) 121 screen->tic.lock[tic->id / 32] &= ~(1 << (tic->id % 32)); 122 } 123 124 static INLINE void 125 nv50_screen_tsc_unlock(struct nv50_screen *screen, struct nv50_tsc_entry *tsc) 126 { 127 if (tsc->id >= 0) 128 screen->tsc.lock[tsc->id / 32] &= ~(1 << (tsc->id % 32)); 129 } 130 131 static INLINE void 132 nv50_screen_tic_free(struct nv50_screen *screen, struct nv50_tic_entry *tic) 133 { 134 if (tic->id >= 0) { 135 screen->tic.entries[tic->id] = NULL; 136 screen->tic.lock[tic->id / 32] &= ~(1 << (tic->id % 32)); 137 } 138 } 139 140 static INLINE void 141 nv50_screen_tsc_free(struct nv50_screen *screen, struct nv50_tsc_entry *tsc) 142 { 143 if (tsc->id >= 0) { 144 screen->tsc.entries[tsc->id] = NULL; 145 screen->tsc.lock[tsc->id / 32] &= ~(1 << (tsc->id % 32)); 146 } 147 } 148 149 extern int nv50_tls_realloc(struct nv50_screen *screen, unsigned tls_space); 150 151 #endif 152