1 #include <pipe/p_defines.h>
2 #include <pipe/p_screen.h>
3 #include <pipe/p_state.h>
5 #include <util/u_memory.h>
7 #include "nouveau/nouveau_bo.h"
8 #include "nouveau_winsys.h"
9 #include "nouveau_screen.h"
12 nouveau_screen_get_name(struct pipe_screen
*pscreen
)
14 struct nouveau_device
*dev
= nouveau_screen(pscreen
)->device
;
15 static char buffer
[128];
17 snprintf(buffer
, sizeof(buffer
), "NV%02X", dev
->chipset
);
22 nouveau_screen_get_vendor(struct pipe_screen
*pscreen
)
27 static struct pipe_buffer
*
28 nouveau_screen_bo_skel(struct pipe_screen
*pscreen
, struct nouveau_bo
*bo
,
29 unsigned alignment
, unsigned usage
, unsigned size
)
31 struct pipe_buffer
*pb
;
33 pb
= CALLOC(1, sizeof(struct pipe_buffer
)+sizeof(struct nouveau_bo
*));
35 nouveau_bo_ref(NULL
, &bo
);
39 pipe_reference_init(&pb
->reference
, 1);
41 pb
->alignment
= alignment
;
44 *(struct nouveau_bo
**)(pb
+ 1) = bo
;
48 static struct pipe_buffer
*
49 nouveau_screen_bo_new(struct pipe_screen
*pscreen
, unsigned alignment
,
50 unsigned usage
, unsigned size
)
52 struct nouveau_device
*dev
= nouveau_screen(pscreen
)->device
;
53 struct nouveau_bo
*bo
= NULL
;
54 uint32_t flags
= NOUVEAU_BO_MAP
;
57 if (usage
& NOUVEAU_BUFFER_USAGE_TRANSFER
)
58 flags
|= NOUVEAU_BO_GART
;
60 if (usage
& PIPE_BUFFER_USAGE_VERTEX
) {
61 if (pscreen
->get_param(pscreen
, NOUVEAU_CAP_HW_VTXBUF
))
62 flags
|= NOUVEAU_BO_GART
;
64 if (usage
& PIPE_BUFFER_USAGE_INDEX
) {
65 if (pscreen
->get_param(pscreen
, NOUVEAU_CAP_HW_IDXBUF
))
66 flags
|= NOUVEAU_BO_GART
;
69 if (usage
& PIPE_BUFFER_USAGE_PIXEL
) {
70 if (usage
& NOUVEAU_BUFFER_USAGE_TEXTURE
)
71 flags
|= NOUVEAU_BO_GART
;
72 if (!(usage
& PIPE_BUFFER_USAGE_CPU_READ_WRITE
))
73 flags
|= NOUVEAU_BO_VRAM
;
75 if (dev
->chipset
== 0x50 || dev
->chipset
>= 0x80) {
76 flags
|= NOUVEAU_BO_TILED
;
77 if (usage
& NOUVEAU_BUFFER_USAGE_ZETA
)
78 flags
|= NOUVEAU_BO_ZTILE
;
82 ret
= nouveau_bo_new(dev
, flags
, alignment
, size
, &bo
);
86 return nouveau_screen_bo_skel(pscreen
, bo
, alignment
, usage
, size
);
89 static struct pipe_buffer
*
90 nouveau_screen_bo_user(struct pipe_screen
*pscreen
, void *ptr
, unsigned bytes
)
92 struct nouveau_device
*dev
= nouveau_screen(pscreen
)->device
;
93 struct nouveau_bo
*bo
= NULL
;
96 ret
= nouveau_bo_user(dev
, ptr
, bytes
, &bo
);
100 return nouveau_screen_bo_skel(pscreen
, bo
, 0, 0, bytes
);
103 static inline uint32_t
104 nouveau_screen_map_flags(unsigned pipe
)
108 if (pipe
& PIPE_BUFFER_USAGE_CPU_READ
)
109 flags
|= NOUVEAU_BO_RD
;
110 if (pipe
& PIPE_BUFFER_USAGE_CPU_WRITE
)
111 flags
|= NOUVEAU_BO_WR
;
112 if (pipe
& PIPE_BUFFER_USAGE_DISCARD
)
113 flags
|= NOUVEAU_BO_INVAL
;
114 if (pipe
& PIPE_BUFFER_USAGE_DONTBLOCK
)
115 flags
|= NOUVEAU_BO_NOWAIT
;
117 if (pipe
& 0 /*PIPE_BUFFER_USAGE_UNSYNCHRONIZED*/)
118 flags
|= NOUVEAU_BO_NOSYNC
;
124 nouveau_screen_bo_map(struct pipe_screen
*pscreen
, struct pipe_buffer
*pb
,
127 struct nouveau_bo
*bo
= nouveau_bo(pb
);
130 ret
= nouveau_bo_map(bo
, nouveau_screen_map_flags(usage
));
132 debug_printf("map failed: %d\n", ret
);
140 nouveau_screen_bo_map_range(struct pipe_screen
*pscreen
, struct pipe_buffer
*pb
,
141 unsigned offset
, unsigned length
, unsigned usage
)
143 struct nouveau_bo
*bo
= nouveau_bo(pb
);
146 ret
= nouveau_bo_map_range(bo
, offset
, length
,
147 nouveau_screen_map_flags(usage
));
149 debug_printf("map_range failed: %d\n", ret
);
153 return (char *)bo
->map
- offset
; /* why gallium? why? */
157 nouveau_screen_bo_map_flush(struct pipe_screen
*pscreen
, struct pipe_buffer
*pb
,
158 unsigned offset
, unsigned length
)
160 struct nouveau_bo
*bo
= nouveau_bo(pb
);
162 nouveau_bo_map_flush(bo
, offset
, length
);
166 nouveau_screen_bo_unmap(struct pipe_screen
*pscreen
, struct pipe_buffer
*pb
)
168 struct nouveau_bo
*bo
= nouveau_bo(pb
);
170 nouveau_bo_unmap(bo
);
174 nouveau_screen_bo_del(struct pipe_buffer
*pb
)
176 struct nouveau_bo
*bo
= nouveau_bo(pb
);
178 nouveau_bo_ref(NULL
, &bo
);
183 nouveau_screen_fence_ref(struct pipe_screen
*pscreen
,
184 struct pipe_fence_handle
**ptr
,
185 struct pipe_fence_handle
*pfence
)
191 nouveau_screen_fence_signalled(struct pipe_screen
*screen
,
192 struct pipe_fence_handle
*pfence
,
199 nouveau_screen_fence_finish(struct pipe_screen
*screen
,
200 struct pipe_fence_handle
*pfence
,
207 nouveau_screen_init(struct nouveau_screen
*screen
, struct nouveau_device
*dev
)
209 struct pipe_screen
*pscreen
= &screen
->base
;
212 ret
= nouveau_channel_alloc(dev
, 0xbeef0201, 0xbeef0202,
216 screen
->device
= dev
;
218 pscreen
->get_name
= nouveau_screen_get_name
;
219 pscreen
->get_vendor
= nouveau_screen_get_vendor
;
221 pscreen
->buffer_create
= nouveau_screen_bo_new
;
222 pscreen
->user_buffer_create
= nouveau_screen_bo_user
;
223 pscreen
->buffer_map
= nouveau_screen_bo_map
;
224 pscreen
->buffer_map_range
= nouveau_screen_bo_map_range
;
225 pscreen
->buffer_flush_mapped_range
= nouveau_screen_bo_map_flush
;
226 pscreen
->buffer_unmap
= nouveau_screen_bo_unmap
;
227 pscreen
->buffer_destroy
= nouveau_screen_bo_del
;
229 pscreen
->fence_reference
= nouveau_screen_fence_ref
;
230 pscreen
->fence_signalled
= nouveau_screen_fence_signalled
;
231 pscreen
->fence_finish
= nouveau_screen_fence_finish
;
237 nouveau_screen_fini(struct nouveau_screen
*screen
)