i915g: kill buf->map_gtt
[mesa.git] / src / gallium / winsys / i915 / drm / i915_drm_buffer.c
1
2 #include "state_tracker/drm_driver.h"
3 #include "i915_drm_winsys.h"
4 #include "util/u_memory.h"
5
6 #include "i915_drm.h"
7
8 static struct i915_winsys_buffer *
9 i915_drm_buffer_create(struct i915_winsys *iws,
10 unsigned size, unsigned alignment,
11 enum i915_winsys_buffer_type type)
12 {
13 struct i915_drm_buffer *buf = CALLOC_STRUCT(i915_drm_buffer);
14 struct i915_drm_winsys *idws = i915_drm_winsys(iws);
15 drm_intel_bufmgr *pool;
16 char *name;
17
18 if (!buf)
19 return NULL;
20
21 buf->magic = 0xDEAD1337;
22 buf->flinked = FALSE;
23 buf->flink = 0;
24
25 if (type == I915_NEW_TEXTURE) {
26 name = "gallium3d_texture";
27 pool = idws->pools.gem;
28 } else if (type == I915_NEW_VERTEX) {
29 name = "gallium3d_vertex";
30 pool = idws->pools.gem;
31 } else if (type == I915_NEW_SCANOUT) {
32 name = "gallium3d_scanout";
33 pool = idws->pools.gem;
34 } else {
35 assert(0);
36 name = "gallium3d_unknown";
37 pool = idws->pools.gem;
38 }
39
40 buf->bo = drm_intel_bo_alloc(pool, name, size, alignment);
41
42 if (!buf->bo)
43 goto err;
44
45 return (struct i915_winsys_buffer *)buf;
46
47 err:
48 assert(0);
49 FREE(buf);
50 return NULL;
51 }
52
53 static struct i915_winsys_buffer *
54 i915_drm_buffer_from_handle(struct i915_winsys *iws,
55 struct winsys_handle *whandle,
56 unsigned *stride)
57 {
58 struct i915_drm_winsys *idws = i915_drm_winsys(iws);
59 struct i915_drm_buffer *buf = CALLOC_STRUCT(i915_drm_buffer);
60 uint32_t tile = 0, swizzle = 0;
61
62 if (!buf)
63 return NULL;
64
65 buf->magic = 0xDEAD1337;
66 buf->bo = drm_intel_bo_gem_create_from_name(idws->pools.gem, "gallium3d_from_handle", whandle->handle);
67 buf->flinked = TRUE;
68 buf->flink = whandle->handle;
69
70 if (!buf->bo)
71 goto err;
72
73 drm_intel_bo_get_tiling(buf->bo, &tile, &swizzle);
74
75 *stride = whandle->stride;
76
77 return (struct i915_winsys_buffer *)buf;
78
79 err:
80 FREE(buf);
81 return NULL;
82 }
83
84 static boolean
85 i915_drm_buffer_get_handle(struct i915_winsys *iws,
86 struct i915_winsys_buffer *buffer,
87 struct winsys_handle *whandle,
88 unsigned stride)
89 {
90 struct i915_drm_buffer *buf = i915_drm_buffer(buffer);
91
92 if (whandle->type == DRM_API_HANDLE_TYPE_SHARED) {
93 if (!buf->flinked) {
94 if (drm_intel_bo_flink(buf->bo, &buf->flink))
95 return FALSE;
96 buf->flinked = TRUE;
97 }
98
99 whandle->handle = buf->flink;
100 } else if (whandle->type == DRM_API_HANDLE_TYPE_KMS) {
101 whandle->handle = buf->bo->handle;
102 } else {
103 assert(!"unknown usage");
104 return FALSE;
105 }
106
107 whandle->stride = stride;
108 return TRUE;
109 }
110
111 static int
112 i915_drm_buffer_set_fence_reg(struct i915_winsys *iws,
113 struct i915_winsys_buffer *buffer,
114 unsigned stride,
115 enum i915_winsys_buffer_tile tile)
116 {
117 struct i915_drm_buffer *buf = i915_drm_buffer(buffer);
118 assert(I915_TILING_NONE == I915_TILE_NONE);
119 assert(I915_TILING_X == I915_TILE_X);
120 assert(I915_TILING_Y == I915_TILE_Y);
121
122 if (tile != I915_TILE_NONE) {
123 assert(buf->map_count == 0);
124 }
125
126 return drm_intel_bo_set_tiling(buf->bo, &tile, stride);
127 }
128
129 static void *
130 i915_drm_buffer_map(struct i915_winsys *iws,
131 struct i915_winsys_buffer *buffer,
132 boolean write)
133 {
134 struct i915_drm_buffer *buf = i915_drm_buffer(buffer);
135 drm_intel_bo *bo = intel_bo(buffer);
136 int ret = 0;
137
138 assert(bo);
139
140 if (buf->map_count)
141 goto out;
142
143 ret = drm_intel_gem_bo_map_gtt(bo);
144
145 buf->ptr = bo->virtual;
146
147 assert(ret == 0);
148 out:
149 if (ret)
150 return NULL;
151
152 buf->map_count++;
153 return buf->ptr;
154 }
155
156 static void
157 i915_drm_buffer_unmap(struct i915_winsys *iws,
158 struct i915_winsys_buffer *buffer)
159 {
160 struct i915_drm_buffer *buf = i915_drm_buffer(buffer);
161
162 if (--buf->map_count)
163 return;
164
165 drm_intel_gem_bo_unmap_gtt(intel_bo(buffer));
166 }
167
168 static int
169 i915_drm_buffer_write(struct i915_winsys *iws,
170 struct i915_winsys_buffer *buffer,
171 size_t offset,
172 size_t size,
173 const void *data)
174 {
175 struct i915_drm_buffer *buf = i915_drm_buffer(buffer);
176
177 return drm_intel_bo_subdata(buf->bo, offset, size, (void*)data);
178 }
179
180 static void
181 i915_drm_buffer_destroy(struct i915_winsys *iws,
182 struct i915_winsys_buffer *buffer)
183 {
184 drm_intel_bo_unreference(intel_bo(buffer));
185
186 #ifdef DEBUG
187 i915_drm_buffer(buffer)->magic = 0;
188 i915_drm_buffer(buffer)->bo = NULL;
189 #endif
190
191 FREE(buffer);
192 }
193
194 void
195 i915_drm_winsys_init_buffer_functions(struct i915_drm_winsys *idws)
196 {
197 idws->base.buffer_create = i915_drm_buffer_create;
198 idws->base.buffer_from_handle = i915_drm_buffer_from_handle;
199 idws->base.buffer_get_handle = i915_drm_buffer_get_handle;
200 idws->base.buffer_set_fence_reg = i915_drm_buffer_set_fence_reg;
201 idws->base.buffer_map = i915_drm_buffer_map;
202 idws->base.buffer_unmap = i915_drm_buffer_unmap;
203 idws->base.buffer_write = i915_drm_buffer_write;
204 idws->base.buffer_destroy = i915_drm_buffer_destroy;
205 }