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