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