i915g: Silence unused value warning in intel_drm_get_device_id.
[mesa.git] / src / gallium / winsys / drm / intel / gem / intel_drm_api.c
1
2 #include "state_tracker/drm_api.h"
3
4 #include "intel_drm_winsys.h"
5 #include "util/u_memory.h"
6
7 #include "i915simple/i915_context.h"
8 #include "i915simple/i915_screen.h"
9
10
11 /*
12 * Helper functions
13 */
14
15
16 static void
17 intel_drm_get_device_id(unsigned int *device_id)
18 {
19 char path[512];
20 FILE *file;
21 void *shutup_gcc;
22
23 /*
24 * FIXME: Fix this up to use a drm ioctl or whatever.
25 */
26
27 snprintf(path, sizeof(path), "/sys/class/drm/card0/device/device");
28 file = fopen(path, "r");
29 if (!file) {
30 return;
31 }
32
33 shutup_gcc = fgets(path, sizeof(path), file);
34 (void) shutup_gcc;
35 sscanf(path, "%x", device_id);
36 fclose(file);
37 }
38
39 static struct intel_buffer *
40 intel_drm_buffer_from_handle(struct intel_drm_winsys *idws,
41 const char* name, unsigned handle)
42 {
43 struct intel_drm_buffer *buf = CALLOC_STRUCT(intel_drm_buffer);
44
45 if (!buf)
46 return NULL;
47
48 buf->magic = 0xDEAD1337;
49 buf->bo = drm_intel_bo_gem_create_from_name(idws->pools.gem, name, handle);
50 buf->flinked = TRUE;
51 buf->flink = handle;
52
53 if (!buf->bo)
54 goto err;
55
56 return (struct intel_buffer *)buf;
57
58 err:
59 FREE(buf);
60 return NULL;
61 }
62
63
64 /*
65 * Exported functions
66 */
67
68
69 static struct pipe_texture *
70 intel_drm_texture_from_shared_handle(struct drm_api *api,
71 struct pipe_screen *screen,
72 struct pipe_texture *templ,
73 const char* name,
74 unsigned pitch,
75 unsigned handle)
76 {
77 struct intel_drm_winsys *idws = intel_drm_winsys(i915_screen(screen)->iws);
78 struct intel_buffer *buffer;
79
80 buffer = intel_drm_buffer_from_handle(idws, name, handle);
81 if (!buffer)
82 return NULL;
83
84 return i915_texture_blanket_intel(screen, templ, pitch, buffer);
85 }
86
87 static boolean
88 intel_drm_shared_handle_from_texture(struct drm_api *api,
89 struct pipe_screen *screen,
90 struct pipe_texture *texture,
91 unsigned *pitch,
92 unsigned *handle)
93 {
94 struct intel_drm_buffer *buf = NULL;
95 struct intel_buffer *buffer = NULL;
96 if (!i915_get_texture_buffer_intel(texture, &buffer, pitch))
97 return FALSE;
98
99 buf = intel_drm_buffer(buffer);
100 if (!buf->flinked) {
101 if (drm_intel_bo_flink(buf->bo, &buf->flink))
102 return FALSE;
103 buf->flinked = TRUE;
104 }
105
106 *handle = buf->flink;
107
108 return TRUE;
109 }
110
111 static boolean
112 intel_drm_local_handle_from_texture(struct drm_api *api,
113 struct pipe_screen *screen,
114 struct pipe_texture *texture,
115 unsigned *pitch,
116 unsigned *handle)
117 {
118 struct intel_buffer *buffer = NULL;
119 if (!i915_get_texture_buffer_intel(texture, &buffer, pitch))
120 return FALSE;
121
122 *handle = intel_drm_buffer(buffer)->bo->handle;
123
124 return TRUE;
125 }
126
127 static void
128 intel_drm_winsys_destroy(struct intel_winsys *iws)
129 {
130 struct intel_drm_winsys *idws = intel_drm_winsys(iws);
131
132 drm_intel_bufmgr_destroy(idws->pools.gem);
133
134 FREE(idws);
135 }
136
137 static struct pipe_screen *
138 intel_drm_create_screen(struct drm_api *api, int drmFD,
139 struct drm_create_screen_arg *arg)
140 {
141 struct intel_drm_winsys *idws;
142 unsigned int deviceID;
143
144 if (arg != NULL) {
145 switch(arg->mode) {
146 case DRM_CREATE_NORMAL:
147 break;
148 default:
149 return NULL;
150 }
151 }
152
153 idws = CALLOC_STRUCT(intel_drm_winsys);
154 if (!idws)
155 return NULL;
156
157 intel_drm_get_device_id(&deviceID);
158
159 intel_drm_winsys_init_batchbuffer_functions(idws);
160 intel_drm_winsys_init_buffer_functions(idws);
161 intel_drm_winsys_init_fence_functions(idws);
162
163 idws->fd = drmFD;
164 idws->id = deviceID;
165 idws->max_batch_size = 16 * 4096;
166
167 idws->base.destroy = intel_drm_winsys_destroy;
168
169 idws->pools.gem = drm_intel_bufmgr_gem_init(idws->fd, idws->max_batch_size);
170
171 idws->softpipe = FALSE;
172 idws->dump_cmd = debug_get_bool_option("INTEL_DUMP_CMD", FALSE);
173
174 return i915_create_screen(&idws->base, deviceID);
175 }
176
177 static struct pipe_context *
178 intel_drm_create_context(struct drm_api *api, struct pipe_screen *screen)
179 {
180 return i915_create_context(screen);
181 }
182
183 static void
184 destroy(struct drm_api *api)
185 {
186
187 }
188
189 struct drm_api intel_drm_api =
190 {
191 .create_context = intel_drm_create_context,
192 .create_screen = intel_drm_create_screen,
193 .texture_from_shared_handle = intel_drm_texture_from_shared_handle,
194 .shared_handle_from_texture = intel_drm_shared_handle_from_texture,
195 .local_handle_from_texture = intel_drm_local_handle_from_texture,
196 .destroy = destroy,
197 };
198
199 struct drm_api *
200 drm_api_create()
201 {
202 return &intel_drm_api;
203 }