nvc0: implement MP performance counters for nvc0:nvd9
[mesa.git] / src / gallium / drivers / nv50 / nv50_screen.h
index c78ed50fe351224cc6376133be4038ae805493fc..2e8af436e3682739a842a2d409a92f7739e8c7ea 100644 (file)
@@ -1,25 +1,30 @@
 #ifndef __NV50_SCREEN_H__
 #define __NV50_SCREEN_H__
 
-#define NOUVEAU_NVC0
 #include "nouveau/nouveau_screen.h"
-#undef NOUVEAU_NVC0
+#include "nouveau/nouveau_fence.h"
+#include "nouveau/nouveau_mm.h"
+#include "nouveau/nouveau_heap.h"
+
 #include "nv50_winsys.h"
 #include "nv50_stateobj.h"
 
 #define NV50_TIC_MAX_ENTRIES 2048
 #define NV50_TSC_MAX_ENTRIES 2048
 
-struct nv50_mman;
+/* doesn't count reserved slots (for auxiliary constants, immediates, etc.) */
+#define NV50_MAX_PIPE_CONSTBUFS 14
+
 struct nv50_context;
-struct nv50_fence;
 
-#define NV50_SCRATCH_SIZE (2 << 20)
-#define NV50_SCRATCH_NR_BUFFERS 2
+#define NV50_CODE_BO_SIZE_LOG2 19
+
+#define NV50_SCREEN_RESIDENT_BO_COUNT 5
+
+struct nv50_blitter;
 
 struct nv50_screen {
    struct nouveau_screen base;
-   struct nouveau_winsys *nvws;
 
    struct nv50_context *cur_ctx;
 
@@ -29,11 +34,16 @@ struct nv50_screen {
    struct nouveau_bo *stack_bo;
    struct nouveau_bo *tls_bo;
 
-   uint64_t tls_size;
+   unsigned TPs;
+   unsigned MPsInTP;
+   unsigned max_tls_space;
+   unsigned cur_tls_space;
 
-   struct nouveau_resource *vp_code_heap;
-   struct nouveau_resource *gp_code_heap;
-   struct nouveau_resource *fp_code_heap;
+   struct nouveau_heap *vp_code_heap;
+   struct nouveau_heap *gp_code_heap;
+   struct nouveau_heap *fp_code_heap;
+
+   struct nv50_blitter *blitter;
 
    struct {
       void **entries;
@@ -49,23 +59,14 @@ struct nv50_screen {
 
    struct {
       uint32_t *map;
-      struct nv50_fence *head;
-      struct nv50_fence *tail;
-      struct nv50_fence *current;
-      uint32_t sequence;
-      uint32_t sequence_ack;
       struct nouveau_bo *bo;
    } fence;
 
-   struct nouveau_notifier *sync;
-
-   struct nv50_mman *mm_GART;
-   struct nv50_mman *mm_VRAM;
-   struct nv50_mman *mm_VRAM_fe0;
+   struct nouveau_object *sync;
 
-   struct nouveau_grobj *tesla;
-   struct nouveau_grobj *eng2d;
-   struct nouveau_grobj *m2mf;
+   struct nouveau_object *tesla;
+   struct nouveau_object *eng2d;
+   struct nouveau_object *m2mf;
 };
 
 static INLINE struct nv50_screen *
@@ -74,81 +75,38 @@ nv50_screen(struct pipe_screen *screen)
    return (struct nv50_screen *)screen;
 }
 
-/* Since a resource can be migrated, we need to decouple allocations from
- * them. This struct is linked with fences for delayed freeing of allocs.
- */
-struct nv50_mm_allocation {
-   struct nv50_mm_allocation *next;
-   void *priv;
-   uint32_t offset;
-};
-
-static INLINE void
-nv50_fence_sched_release(struct nv50_fence *nf, struct nv50_mm_allocation *mm)
-{
-   mm->next = nf->buffers;
-   nf->buffers = mm;
-}
-
-extern struct nv50_mman *
-nv50_mm_create(struct nouveau_device *, uint32_t domain, uint32_t storage_type);
-
-extern void
-nv50_mm_destroy(struct nv50_mman *);
-
-extern struct nv50_mm_allocation *
-nv50_mm_allocate(struct nv50_mman *,
-                 uint32_t size, struct nouveau_bo **, uint32_t *offset);
-extern void
-nv50_mm_free(struct nv50_mm_allocation *);
-
-void nv50_screen_make_buffers_resident(struct nv50_screen *);
+boolean nv50_blitter_create(struct nv50_screen *);
+void nv50_blitter_destroy(struct nv50_screen *);
 
 int nv50_screen_tic_alloc(struct nv50_screen *, void *);
 int nv50_screen_tsc_alloc(struct nv50_screen *, void *);
 
 static INLINE void
-nv50_resource_fence(struct nv50_resource *res, uint32_t flags)
+nv50_resource_fence(struct nv04_resource *res, uint32_t flags)
 {
    struct nv50_screen *screen = nv50_screen(res->base.screen);
 
    if (res->mm) {
-      nv50_fence_reference(&res->fence, screen->fence.current);
-
+      nouveau_fence_ref(screen->base.fence.current, &res->fence);
       if (flags & NOUVEAU_BO_WR)
-         nv50_fence_reference(&res->fence_wr, screen->fence.current);
+         nouveau_fence_ref(screen->base.fence.current, &res->fence_wr);
    }
 }
 
 static INLINE void
-nv50_resource_validate(struct nv50_resource *res, uint32_t flags)
+nv50_resource_validate(struct nv04_resource *res, uint32_t flags)
 {
-   struct nv50_screen *screen = nv50_screen(res->base.screen);
-
    if (likely(res->bo)) {
-      nouveau_bo_validate(screen->base.channel, res->bo, flags);
+      if (flags & NOUVEAU_BO_WR)
+         res->status |= NOUVEAU_BUFFER_STATUS_GPU_WRITING |
+            NOUVEAU_BUFFER_STATUS_DIRTY;
+      if (flags & NOUVEAU_BO_RD)
+         res->status |= NOUVEAU_BUFFER_STATUS_GPU_READING;
 
       nv50_resource_fence(res, flags);
    }
 }
 
-
-boolean
-nv50_screen_fence_new(struct nv50_screen *, struct nv50_fence **, boolean emit);
-
-void
-nv50_screen_fence_next(struct nv50_screen *);
-void
-nv50_screen_fence_update(struct nv50_screen *, boolean flushed);
-
-static INLINE boolean
-nv50_screen_fence_emit(struct nv50_screen *screen)
-{
-   nv50_fence_emit(screen->fence.current);
-
-   return nv50_screen_fence_new(screen, &screen->fence.current, FALSE);
-}
-
 struct nv50_format {
    uint32_t rt;
    uint32_t tic;
@@ -190,4 +148,6 @@ nv50_screen_tsc_free(struct nv50_screen *screen, struct nv50_tsc_entry *tsc)
    }
 }
 
+extern int nv50_tls_realloc(struct nv50_screen *screen, unsigned tls_space);
+
 #endif