nouveau_screen.c revision b39bccbd4ed71e9585da4cf5acf7b887b2e90899
15ed444a7a4e8f74100a3678c007ac120e8569229Brian Paul#include "pipe/p_defines.h"
25ed444a7a4e8f74100a3678c007ac120e8569229Brian Paul#include "pipe/p_screen.h"
35ed444a7a4e8f74100a3678c007ac120e8569229Brian Paul#include "pipe/p_state.h"
4bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
55ed444a7a4e8f74100a3678c007ac120e8569229Brian Paul#include "util/u_memory.h"
65ed444a7a4e8f74100a3678c007ac120e8569229Brian Paul#include "util/u_inlines.h"
73bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz#include "util/u_format.h"
86ddd6403652231bacfe66f84d0ec7be38953b785Xavier Chantry#include "util/u_format_s3tc.h"
937648b86b1fefd37dc285486cfb18969eeaa8df1Vinson Lee#include "util/u_string.h"
10bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
113584a44270a7f3a04e187bd79b5373314514d383Dave Airlie#include <stdio.h>
12625bc0cfa2ffb67b797672f7fb3c083a863199d3Ben Skeggs#include <errno.h>
13625bc0cfa2ffb67b797672f7fb3c083a863199d3Ben Skeggs
14bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs#include "nouveau/nouveau_bo.h"
15bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs#include "nouveau_winsys.h"
16bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs#include "nouveau_screen.h"
175a0915870c7e994d20334042b7647db749e79224Ben Skeggs#include "nouveau_fence.h"
18bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
193bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz/* XXX this should go away */
209ca563a9a8573bf79821abc75ccf0fdade19c8a9Jakob Bornecrantz#include "state_tracker/drm_driver.h"
21287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell#include "util/u_simple_screen.h"
223bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz
23bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsstatic const char *
24bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsnouveau_screen_get_name(struct pipe_screen *pscreen)
25bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{
26bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	struct nouveau_device *dev = nouveau_screen(pscreen)->device;
27bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	static char buffer[128];
28bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
2937648b86b1fefd37dc285486cfb18969eeaa8df1Vinson Lee	util_snprintf(buffer, sizeof(buffer), "NV%02X", dev->chipset);
30bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	return buffer;
31bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs}
32bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
33bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsstatic const char *
34bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsnouveau_screen_get_vendor(struct pipe_screen *pscreen)
35bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{
36bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	return "nouveau";
37bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs}
38bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
39bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
40bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
41287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct nouveau_bo *
42bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsnouveau_screen_bo_new(struct pipe_screen *pscreen, unsigned alignment,
43287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell		      unsigned usage, unsigned bind, unsigned size)
44bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{
45bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	struct nouveau_device *dev = nouveau_screen(pscreen)->device;
46bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	struct nouveau_bo *bo = NULL;
476af75a0ff47acfe1e51c93637045affb770f00abBen Skeggs	uint32_t flags = NOUVEAU_BO_MAP, tile_mode = 0, tile_flags = 0;
48bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	int ret;
49bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
5042d9f2bb7bc21ff8c1a3fc4b4ceb4d294bccaabeLuca Barbieri	if (bind & PIPE_BIND_VERTEX_BUFFER)
5142d9f2bb7bc21ff8c1a3fc4b4ceb4d294bccaabeLuca Barbieri		flags |= nouveau_screen(pscreen)->vertex_buffer_flags;
5242d9f2bb7bc21ff8c1a3fc4b4ceb4d294bccaabeLuca Barbieri	else if (bind & PIPE_BIND_INDEX_BUFFER)
5342d9f2bb7bc21ff8c1a3fc4b4ceb4d294bccaabeLuca Barbieri		flags |= nouveau_screen(pscreen)->index_buffer_flags;
54bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
55287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell	if (bind & (PIPE_BIND_RENDER_TARGET |
56287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell			PIPE_BIND_DEPTH_STENCIL |
57287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell			PIPE_BIND_SCANOUT |
58287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell			PIPE_BIND_DISPLAY_TARGET |
59287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell			PIPE_BIND_SAMPLER_VIEW))
60287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell	{
61287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell		/* TODO: this may be incorrect or suboptimal */
62287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell		if (!(bind & PIPE_BIND_SCANOUT))
63bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs			flags |= NOUVEAU_BO_GART;
64287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell		if (usage != PIPE_USAGE_DYNAMIC)
65bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs			flags |= NOUVEAU_BO_VRAM;
66bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
67bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs		if (dev->chipset == 0x50 || dev->chipset >= 0x80) {
68287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell			if (bind & PIPE_BIND_DEPTH_STENCIL)
696af75a0ff47acfe1e51c93637045affb770f00abBen Skeggs				tile_flags = 0x2800;
706af75a0ff47acfe1e51c93637045affb770f00abBen Skeggs			else
716af75a0ff47acfe1e51c93637045affb770f00abBen Skeggs				tile_flags = 0x7000;
72bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs		}
73bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	}
74bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
756af75a0ff47acfe1e51c93637045affb770f00abBen Skeggs	ret = nouveau_bo_new_tile(dev, flags, alignment, size,
766af75a0ff47acfe1e51c93637045affb770f00abBen Skeggs				  tile_mode, tile_flags, &bo);
77bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	if (ret)
78bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs		return NULL;
79bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
80287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell	return bo;
81bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs}
82bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
83287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct nouveau_bo *
84bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsnouveau_screen_bo_user(struct pipe_screen *pscreen, void *ptr, unsigned bytes)
85bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{
86bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	struct nouveau_device *dev = nouveau_screen(pscreen)->device;
87bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	struct nouveau_bo *bo = NULL;
88bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	int ret;
89bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
90bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	ret = nouveau_bo_user(dev, ptr, bytes, &bo);
91bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	if (ret)
92bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs		return NULL;
93bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
94287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell	return bo;
95bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs}
96bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
97287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellvoid *
98287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellnouveau_screen_bo_map(struct pipe_screen *pscreen,
99287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell		      struct nouveau_bo *bo,
100287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell		      unsigned map_flags)
101bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{
102bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	int ret;
103bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
104287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell	ret = nouveau_bo_map(bo, map_flags);
105bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	if (ret) {
106bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs		debug_printf("map failed: %d\n", ret);
107bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs		return NULL;
108bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	}
109bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
110bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	return bo->map;
111bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs}
112bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
113287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellvoid *
114287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellnouveau_screen_bo_map_range(struct pipe_screen *pscreen, struct nouveau_bo *bo,
115287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell			    unsigned offset, unsigned length, unsigned flags)
116bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{
117bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	int ret;
118bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
119625bc0cfa2ffb67b797672f7fb3c083a863199d3Ben Skeggs	ret = nouveau_bo_map_range(bo, offset, length, flags);
120bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	if (ret) {
121c306ef5e81da5456d39a6e98cfc1f5f00b9c77a7Maarten Maathuis		nouveau_bo_unmap(bo);
122625bc0cfa2ffb67b797672f7fb3c083a863199d3Ben Skeggs		if (!(flags & NOUVEAU_BO_NOWAIT) || ret != -EBUSY)
123625bc0cfa2ffb67b797672f7fb3c083a863199d3Ben Skeggs			debug_printf("map_range failed: %d\n", ret);
124bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs		return NULL;
125bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	}
126bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
12736705ee044681da9899d0950c22ae7baa10c3d33Ben Skeggs	return (char *)bo->map - offset; /* why gallium? why? */
128bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs}
129bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
130287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellvoid
131287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellnouveau_screen_bo_map_flush_range(struct pipe_screen *pscreen, struct nouveau_bo *bo,
132287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell				  unsigned offset, unsigned length)
133bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{
134bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	nouveau_bo_map_flush(bo, offset, length);
135bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs}
136bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
137287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellvoid
138287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellnouveau_screen_bo_unmap(struct pipe_screen *pscreen, struct nouveau_bo *bo)
139bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{
140bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	nouveau_bo_unmap(bo);
141bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs}
142bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
143287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellvoid
144287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellnouveau_screen_bo_release(struct pipe_screen *pscreen, struct nouveau_bo *bo)
145bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{
146bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	nouveau_bo_ref(NULL, &bo);
147bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs}
148bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
149bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsstatic void
150bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsnouveau_screen_fence_ref(struct pipe_screen *pscreen,
151bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs			 struct pipe_fence_handle **ptr,
152bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs			 struct pipe_fence_handle *pfence)
153bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{
1545a0915870c7e994d20334042b7647db749e79224Ben Skeggs	nouveau_fence_ref(nouveau_fence(pfence), (struct nouveau_fence **)ptr);
155bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs}
156bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
157bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsstatic int
158bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsnouveau_screen_fence_signalled(struct pipe_screen *screen,
159bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs			       struct pipe_fence_handle *pfence,
160bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs			       unsigned flags)
161bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{
1625a0915870c7e994d20334042b7647db749e79224Ben Skeggs	return !nouveau_fence_signalled(nouveau_fence(pfence));
163bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs}
164bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
165bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsstatic int
166bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsnouveau_screen_fence_finish(struct pipe_screen *screen,
167bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs			    struct pipe_fence_handle *pfence,
168b39bccbd4ed71e9585da4cf5acf7b887b2e90899Marek Olšák                            unsigned flags,
169b39bccbd4ed71e9585da4cf5acf7b887b2e90899Marek Olšák                            uint64_t timeout)
170bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{
1715a0915870c7e994d20334042b7647db749e79224Ben Skeggs	return !nouveau_fence_wait(nouveau_fence(pfence));
172bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs}
173bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
1743bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz
175287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellstruct nouveau_bo *
176287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellnouveau_screen_bo_from_handle(struct pipe_screen *pscreen,
177287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell			      struct winsys_handle *whandle,
178287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell			      unsigned *out_stride)
1793bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz{
1803bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz	struct nouveau_device *dev = nouveau_screen(pscreen)->device;
181287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell	struct nouveau_bo *bo = 0;
1823bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz	int ret;
183287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
184287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell	ret = nouveau_bo_handle_ref(dev, whandle->handle, &bo);
1853bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz	if (ret) {
1863bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz		debug_printf("%s: ref name 0x%08x failed with %d\n",
187b5fcab976f702912bfb0edc8c67a8d07e0dfdcb0Vinson Lee			     __FUNCTION__, whandle->handle, ret);
1883bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz		return NULL;
1893bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz	}
1903bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz
191287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell	*out_stride = whandle->stride;
192287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell	return bo;
1933bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz}
1943bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz
1953bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz
196287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellboolean
197287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellnouveau_screen_bo_get_handle(struct pipe_screen *pscreen,
198287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell			     struct nouveau_bo *bo,
199287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell			     unsigned stride,
200287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell			     struct winsys_handle *whandle)
201287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{
202287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell	whandle->stride = stride;
2033bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz
2043bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz	if (whandle->type == DRM_API_HANDLE_TYPE_SHARED) {
205287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell		return nouveau_bo_handle_get(bo, &whandle->handle) == 0;
2063bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz	} else if (whandle->type == DRM_API_HANDLE_TYPE_KMS) {
207287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell		whandle->handle = bo->handle;
2083bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz		return TRUE;
2093bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz	} else {
2103bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz		return FALSE;
2113bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz	}
2123bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz}
2133bd622d64ec3826d3563a5cd9790cd7accc123b4Jakob Bornecrantz
214287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
215287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellunsigned int
216287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwellnouveau_reference_flags(struct nouveau_bo *bo)
217287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell{
218287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell	uint32_t bo_flags;
219287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell	int flags = 0;
220287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
221287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell	bo_flags = nouveau_bo_pending(bo);
222287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell	if (bo_flags & NOUVEAU_BO_RD)
223287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell		flags |= PIPE_REFERENCED_FOR_READ;
224287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell	if (bo_flags & NOUVEAU_BO_WR)
225287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell		flags |= PIPE_REFERENCED_FOR_WRITE;
226287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
227287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell	return flags;
228287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell}
229287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
230287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
231287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
232287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
233287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
234bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsint
235bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsnouveau_screen_init(struct nouveau_screen *screen, struct nouveau_device *dev)
236bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{
237bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	struct pipe_screen *pscreen = &screen->base;
23880e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs	int ret;
239bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
24080e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs	ret = nouveau_channel_alloc(dev, 0xbeef0201, 0xbeef0202,
241c25fcf5aa5beccd7731706b8f85682170a2eca56Francisco Jerez				    512*1024, &screen->channel);
24280e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs	if (ret)
24380e9e1ee8172d1e5a81d702681897dddd9d815f1Ben Skeggs		return ret;
244bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	screen->device = dev;
245bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
246bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	pscreen->get_name = nouveau_screen_get_name;
247bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	pscreen->get_vendor = nouveau_screen_get_vendor;
248bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
249bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	pscreen->fence_reference = nouveau_screen_fence_ref;
250bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	pscreen->fence_signalled = nouveau_screen_fence_signalled;
251bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	pscreen->fence_finish = nouveau_screen_fence_finish;
252bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
2536ddd6403652231bacfe66f84d0ec7be38953b785Xavier Chantry	util_format_s3tc_init();
2546ddd6403652231bacfe66f84d0ec7be38953b785Xavier Chantry
255cd24fcedecfc41d77047fb827a88db528ed292caBen Skeggs	screen->mm_GART = nouveau_mm_create(dev,
256cd24fcedecfc41d77047fb827a88db528ed292caBen Skeggs					    NOUVEAU_BO_GART | NOUVEAU_BO_MAP,
257cd24fcedecfc41d77047fb827a88db528ed292caBen Skeggs					    0x000);
258cd24fcedecfc41d77047fb827a88db528ed292caBen Skeggs	screen->mm_VRAM = nouveau_mm_create(dev, NOUVEAU_BO_VRAM, 0x000);
259bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs	return 0;
260bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs}
261bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
262bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsvoid
263bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggsnouveau_screen_fini(struct nouveau_screen *screen)
264bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs{
265283b21d02bff3d4bd6127f6b642331e06db41aceMarcin Slusarz	struct pipe_winsys *ws = screen->base.winsys;
266cd24fcedecfc41d77047fb827a88db528ed292caBen Skeggs
267cd24fcedecfc41d77047fb827a88db528ed292caBen Skeggs	nouveau_mm_destroy(screen->mm_GART);
268cd24fcedecfc41d77047fb827a88db528ed292caBen Skeggs	nouveau_mm_destroy(screen->mm_VRAM);
269cd24fcedecfc41d77047fb827a88db528ed292caBen Skeggs
27085dcc070719ef6a6bcf65dc4996b1733f63912d8Younes Manton	nouveau_channel_free(&screen->channel);
271cd24fcedecfc41d77047fb827a88db528ed292caBen Skeggs
272a49167c1c03dab9452165f503251e543dec2be9aMarcin Slusarz	if (ws)
273a49167c1c03dab9452165f503251e543dec2be9aMarcin Slusarz		ws->destroy(ws);
274bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs}
275bc466be695913cd504cefddd857ac1cefda87a04Ben Skeggs
276