1 #ifndef NOUVEAU_WINSYS_H 2 #define NOUVEAU_WINSYS_H 3 4 #include <stdint.h> 5 #include <inttypes.h> 6 7 #include "pipe/p_defines.h" 8 9 #include <libdrm/nouveau.h> 10 11 #ifndef NV04_PFIFO_MAX_PACKET_LEN 12 #define NV04_PFIFO_MAX_PACKET_LEN 2047 13 #endif 14 15 static INLINE uint32_t 16 PUSH_AVAIL(struct nouveau_pushbuf *push) 17 { 18 return push->end - push->cur; 19 } 20 21 static INLINE boolean 22 PUSH_SPACE(struct nouveau_pushbuf *push, uint32_t size) 23 { 24 if (PUSH_AVAIL(push) < size) 25 return nouveau_pushbuf_space(push, size, 0, 0) == 0; 26 return TRUE; 27 } 28 29 static INLINE void 30 PUSH_DATA(struct nouveau_pushbuf *push, uint32_t data) 31 { 32 *push->cur++ = data; 33 } 34 35 static INLINE void 36 PUSH_DATAp(struct nouveau_pushbuf *push, const void *data, uint32_t size) 37 { 38 memcpy(push->cur, data, size * 4); 39 push->cur += size; 40 } 41 42 static INLINE void 43 PUSH_DATAf(struct nouveau_pushbuf *push, float f) 44 { 45 union { float f; uint32_t i; } u; 46 u.f = f; 47 PUSH_DATA(push, u.i); 48 } 49 50 static INLINE void 51 PUSH_KICK(struct nouveau_pushbuf *push) 52 { 53 nouveau_pushbuf_kick(push, push->channel); 54 } 55 56 57 #define NOUVEAU_RESOURCE_FLAG_LINEAR (PIPE_RESOURCE_FLAG_DRV_PRIV << 0) 58 #define NOUVEAU_RESOURCE_FLAG_DRV_PRIV (PIPE_RESOURCE_FLAG_DRV_PRIV << 1) 59 60 static INLINE uint32_t 61 nouveau_screen_transfer_flags(unsigned pipe) 62 { 63 uint32_t flags = 0; 64 65 if (!(pipe & PIPE_TRANSFER_UNSYNCHRONIZED)) { 66 if (pipe & PIPE_TRANSFER_READ) 67 flags |= NOUVEAU_BO_RD; 68 if (pipe & PIPE_TRANSFER_WRITE) 69 flags |= NOUVEAU_BO_WR; 70 if (pipe & PIPE_TRANSFER_DONTBLOCK) 71 flags |= NOUVEAU_BO_NOBLOCK; 72 } 73 74 return flags; 75 } 76 77 extern struct pipe_screen * 78 nv30_screen_create(struct nouveau_device *); 79 80 extern struct pipe_screen * 81 nv50_screen_create(struct nouveau_device *); 82 83 extern struct pipe_screen * 84 nvc0_screen_create(struct nouveau_device *); 85 86 #endif 87