ws/i965: more debug output
[mesa.git] / src / gallium / winsys / drm / i965 / gem / i965_drm_api.c
1
2 #include <stdio.h>
3 #include "state_tracker/drm_api.h"
4
5 #include "i965_drm_winsys.h"
6 #include "util/u_memory.h"
7
8 #include "i965/brw_context.h" /* XXX: shouldn't be doing this */
9 #include "i965/brw_screen.h" /* XXX: shouldn't be doing this */
10
11 #include "trace/tr_drm.h"
12
13 /*
14 * Helper functions
15 */
16
17
18 static void
19 i965_libdrm_get_device_id(unsigned int *device_id)
20 {
21 char path[512];
22 FILE *file;
23 void *shutup_gcc;
24
25 /*
26 * FIXME: Fix this up to use a drm ioctl or whatever.
27 */
28
29 snprintf(path, sizeof(path), "/sys/class/drm/card0/device/device");
30 file = fopen(path, "r");
31 if (!file) {
32 return;
33 }
34
35 shutup_gcc = fgets(path, sizeof(path), file);
36 sscanf(path, "%x", device_id);
37 fclose(file);
38 }
39
40 static struct i965_libdrm_buffer *
41 i965_libdrm_buffer_from_handle(struct i965_libdrm_winsys *idws,
42 const char* name, unsigned handle)
43 {
44 struct i965_libdrm_buffer *buf = CALLOC_STRUCT(i965_libdrm_buffer);
45 uint32_t tile = 0, swizzle = 0;
46
47 if (BRW_DUMP)
48 debug_printf("%s\n", __FUNCTION__);
49
50 if (!buf)
51 return NULL;
52 pipe_reference_init(&buf->base.reference, 1);
53 buf->bo = drm_intel_bo_gem_create_from_name(idws->gem, name, handle);
54 buf->base.size = buf->bo->size;
55 buf->base.sws = &idws->base;
56 buf->flinked = TRUE;
57 buf->flink = handle;
58
59
60 if (!buf->bo)
61 goto err;
62
63 drm_intel_bo_get_tiling(buf->bo, &tile, &swizzle);
64 if (tile != 0)
65 buf->map_gtt = TRUE;
66
67 return buf;
68
69 err:
70 FREE(buf);
71 return NULL;
72 }
73
74
75 /*
76 * Exported functions
77 */
78
79
80 static struct pipe_texture *
81 i965_libdrm_texture_from_shared_handle(struct drm_api *api,
82 struct pipe_screen *screen,
83 struct pipe_texture *template,
84 const char* name,
85 unsigned pitch,
86 unsigned handle)
87 {
88 /* XXX: this is silly -- there should be a way to get directly from
89 * the "drm_api" struct to ourselves, without peering into
90 * unrelated code:
91 */
92 struct i965_libdrm_winsys *idws = i965_libdrm_winsys(brw_screen(screen)->sws);
93 struct i965_libdrm_buffer *buffer;
94
95 if (BRW_DUMP)
96 debug_printf("%s %s pitch %d handle 0x%x\n", __FUNCTION__,
97 name, pitch, handle);
98
99 buffer = i965_libdrm_buffer_from_handle(idws, name, handle);
100 if (!buffer)
101 return NULL;
102
103 return brw_texture_blanket_winsys_buffer(screen, template, pitch, &buffer->base);
104 }
105
106
107 static boolean
108 i965_libdrm_shared_handle_from_texture(struct drm_api *api,
109 struct pipe_screen *screen,
110 struct pipe_texture *texture,
111 unsigned *pitch,
112 unsigned *handle)
113 {
114 struct i965_libdrm_buffer *buf = NULL;
115 struct brw_winsys_buffer *buffer = NULL;
116
117 if (BRW_DUMP)
118 debug_printf("%s\n", __FUNCTION__);
119
120 if (!brw_texture_get_winsys_buffer(texture, &buffer, pitch))
121 return FALSE;
122
123 buf = i965_libdrm_buffer(buffer);
124 if (!buf->flinked) {
125 if (drm_intel_bo_flink(buf->bo, &buf->flink))
126 return FALSE;
127 buf->flinked = TRUE;
128 }
129
130 *handle = buf->flink;
131
132 if (BRW_DUMP)
133 debug_printf(" -> pitch %d handle 0x%x\n", *pitch, *handle);
134
135 return TRUE;
136 }
137
138 static boolean
139 i965_libdrm_local_handle_from_texture(struct drm_api *api,
140 struct pipe_screen *screen,
141 struct pipe_texture *texture,
142 unsigned *pitch,
143 unsigned *handle)
144 {
145 struct brw_winsys_buffer *buffer = NULL;
146
147 if (BRW_DUMP)
148 debug_printf("%s\n", __FUNCTION__);
149
150 if (!brw_texture_get_winsys_buffer(texture, &buffer, pitch))
151 return FALSE;
152
153 *handle = i965_libdrm_buffer(buffer)->bo->handle;
154
155 if (BRW_DUMP)
156 debug_printf(" -> pitch %d handle 0x%x\n", *pitch, *handle);
157
158 return TRUE;
159 }
160
161 static void
162 i965_libdrm_winsys_destroy(struct brw_winsys_screen *iws)
163 {
164 struct i965_libdrm_winsys *idws = i965_libdrm_winsys(iws);
165
166 if (BRW_DUMP)
167 debug_printf("%s\n", __FUNCTION__);
168
169 drm_intel_bufmgr_destroy(idws->gem);
170
171 FREE(idws);
172 }
173
174 static struct pipe_screen *
175 i965_libdrm_create_screen(struct drm_api *api, int drmFD,
176 struct drm_create_screen_arg *arg)
177 {
178 struct i965_libdrm_winsys *idws;
179 unsigned int deviceID;
180
181 debug_printf("%s\n", __FUNCTION__);
182
183 if (arg != NULL) {
184 switch(arg->mode) {
185 case DRM_CREATE_NORMAL:
186 break;
187 default:
188 return NULL;
189 }
190 }
191
192 idws = CALLOC_STRUCT(i965_libdrm_winsys);
193 if (!idws)
194 return NULL;
195
196 i965_libdrm_get_device_id(&deviceID);
197
198 i965_libdrm_winsys_init_buffer_functions(idws);
199
200 idws->fd = drmFD;
201 idws->id = deviceID;
202
203 idws->base.destroy = i965_libdrm_winsys_destroy;
204
205 idws->gem = drm_intel_bufmgr_gem_init(idws->fd, BRW_BATCH_SIZE);
206 drm_intel_bufmgr_gem_enable_reuse(idws->gem);
207
208 idws->send_cmd = !debug_get_bool_option("BRW_NO_HW", FALSE);
209
210 return brw_create_screen(&idws->base, deviceID);
211 }
212
213 static struct pipe_context *
214 i965_libdrm_create_context(struct drm_api *api, struct pipe_screen *screen)
215 {
216 return brw_create_context(screen);
217 }
218
219 static void
220 destroy(struct drm_api *api)
221 {
222 if (BRW_DUMP)
223 debug_printf("%s\n", __FUNCTION__);
224
225 }
226
227 struct drm_api i965_libdrm_api =
228 {
229 .create_context = i965_libdrm_create_context,
230 .create_screen = i965_libdrm_create_screen,
231 .texture_from_shared_handle = i965_libdrm_texture_from_shared_handle,
232 .shared_handle_from_texture = i965_libdrm_shared_handle_from_texture,
233 .local_handle_from_texture = i965_libdrm_local_handle_from_texture,
234 .destroy = destroy,
235 };
236
237 struct drm_api *
238 drm_api_create()
239 {
240 return trace_drm_create(&i965_libdrm_api);
241 }