1848b8605Smrg#ifndef NOUVEAU_WINSYS_H
2848b8605Smrg#define NOUVEAU_WINSYS_H
3848b8605Smrg
4848b8605Smrg#include <stdint.h>
5848b8605Smrg#include <inttypes.h>
6848b8605Smrg
7848b8605Smrg#include "pipe/p_defines.h"
8848b8605Smrg
9b8e80941Smrg#include "drm-uapi/drm.h"
10848b8605Smrg#include <nouveau.h>
11848b8605Smrg
12848b8605Smrg#ifndef NV04_PFIFO_MAX_PACKET_LEN
13848b8605Smrg#define NV04_PFIFO_MAX_PACKET_LEN 2047
14848b8605Smrg#endif
15848b8605Smrg
16848b8605Smrg#define NOUVEAU_MIN_BUFFER_MAP_ALIGN      64
17848b8605Smrg#define NOUVEAU_MIN_BUFFER_MAP_ALIGN_MASK (NOUVEAU_MIN_BUFFER_MAP_ALIGN - 1)
18848b8605Smrg
19b8e80941Smrgstatic inline uint32_t
20848b8605SmrgPUSH_AVAIL(struct nouveau_pushbuf *push)
21848b8605Smrg{
22848b8605Smrg   return push->end - push->cur;
23848b8605Smrg}
24848b8605Smrg
25b8e80941Smrgstatic inline bool
26848b8605SmrgPUSH_SPACE(struct nouveau_pushbuf *push, uint32_t size)
27848b8605Smrg{
28b8e80941Smrg   /* Provide a buffer so that fences always have room to be emitted */
29b8e80941Smrg   size += 8;
30848b8605Smrg   if (PUSH_AVAIL(push) < size)
31848b8605Smrg      return nouveau_pushbuf_space(push, size, 0, 0) == 0;
32b8e80941Smrg   return true;
33848b8605Smrg}
34848b8605Smrg
35b8e80941Smrgstatic inline void
36848b8605SmrgPUSH_DATA(struct nouveau_pushbuf *push, uint32_t data)
37848b8605Smrg{
38848b8605Smrg   *push->cur++ = data;
39848b8605Smrg}
40848b8605Smrg
41b8e80941Smrgstatic inline void
42848b8605SmrgPUSH_DATAp(struct nouveau_pushbuf *push, const void *data, uint32_t size)
43848b8605Smrg{
44848b8605Smrg   memcpy(push->cur, data, size * 4);
45848b8605Smrg   push->cur += size;
46848b8605Smrg}
47848b8605Smrg
48b8e80941Smrgstatic inline void
49848b8605SmrgPUSH_DATAf(struct nouveau_pushbuf *push, float f)
50848b8605Smrg{
51848b8605Smrg   union { float f; uint32_t i; } u;
52848b8605Smrg   u.f = f;
53848b8605Smrg   PUSH_DATA(push, u.i);
54848b8605Smrg}
55848b8605Smrg
56b8e80941Smrgstatic inline void
57848b8605SmrgPUSH_KICK(struct nouveau_pushbuf *push)
58848b8605Smrg{
59848b8605Smrg   nouveau_pushbuf_kick(push, push->channel);
60848b8605Smrg}
61848b8605Smrg
62848b8605Smrg
63848b8605Smrg#define NOUVEAU_RESOURCE_FLAG_LINEAR   (PIPE_RESOURCE_FLAG_DRV_PRIV << 0)
64848b8605Smrg#define NOUVEAU_RESOURCE_FLAG_DRV_PRIV (PIPE_RESOURCE_FLAG_DRV_PRIV << 1)
65848b8605Smrg
66b8e80941Smrgstatic inline uint32_t
67848b8605Smrgnouveau_screen_transfer_flags(unsigned pipe)
68848b8605Smrg{
69b8e80941Smrg   uint32_t flags = 0;
70b8e80941Smrg
71b8e80941Smrg   if (!(pipe & PIPE_TRANSFER_UNSYNCHRONIZED)) {
72b8e80941Smrg      if (pipe & PIPE_TRANSFER_READ)
73b8e80941Smrg         flags |= NOUVEAU_BO_RD;
74b8e80941Smrg      if (pipe & PIPE_TRANSFER_WRITE)
75b8e80941Smrg         flags |= NOUVEAU_BO_WR;
76b8e80941Smrg      if (pipe & PIPE_TRANSFER_DONTBLOCK)
77b8e80941Smrg         flags |= NOUVEAU_BO_NOBLOCK;
78b8e80941Smrg   }
79b8e80941Smrg
80b8e80941Smrg   return flags;
81848b8605Smrg}
82848b8605Smrg
83b8e80941Smrgextern struct nouveau_screen *
84848b8605Smrgnv30_screen_create(struct nouveau_device *);
85848b8605Smrg
86b8e80941Smrgextern struct nouveau_screen *
87848b8605Smrgnv50_screen_create(struct nouveau_device *);
88848b8605Smrg
89b8e80941Smrgextern struct nouveau_screen *
90848b8605Smrgnvc0_screen_create(struct nouveau_device *);
91848b8605Smrg
92848b8605Smrg#endif
93