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