#ifndef __NV50_SCREEN_H__
#define __NV50_SCREEN_H__
-#define NOUVEAU_NVC0
#include "nouveau/nouveau_screen.h"
#include "nouveau/nouveau_fence.h"
#include "nouveau/nouveau_mm.h"
-#undef NOUVEAU_NVC0
+#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
+/* doesn't count reserved slots (for auxiliary constants, immediates, etc.) */
+#define NV50_MAX_PIPE_CONSTBUFS 14
+
struct nv50_context;
#define NV50_CODE_BO_SIZE_LOG2 19
-#define NV50_SCRATCH_SIZE (2 << 20)
-#define NV50_SCRATCH_NR_BUFFERS 2
-
#define NV50_SCREEN_RESIDENT_BO_COUNT 5
-struct nv50_blitctx;
+struct nv50_blitter;
struct nv50_screen {
struct nouveau_screen base;
- struct nouveau_winsys *nvws;
struct nv50_context *cur_ctx;
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_blitctx *blitctx;
+ struct nv50_blitter *blitter;
struct {
void **entries;
struct nouveau_bo *bo;
} fence;
- struct nouveau_notifier *sync;
+ struct nouveau_object *sync;
- struct nouveau_mman *mm_VRAM_fe0;
-
- 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 *
return (struct nv50_screen *)screen;
}
-boolean nv50_blitctx_create(struct nv50_screen *);
-
-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 *);
if (res->mm) {
nouveau_fence_ref(screen->base.fence.current, &res->fence);
-
if (flags & NOUVEAU_BO_WR)
nouveau_fence_ref(screen->base.fence.current, &res->fence_wr);
}
static INLINE void
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;
+ res->status |= NOUVEAU_BUFFER_STATUS_GPU_WRITING |
+ NOUVEAU_BUFFER_STATUS_DIRTY;
if (flags & NOUVEAU_BO_RD)
res->status |= NOUVEAU_BUFFER_STATUS_GPU_READING;
}
}
+extern int nv50_tls_realloc(struct nv50_screen *screen, unsigned tls_space);
+
#endif