Merge branch 'glsl2-head' into glsl2
[mesa.git] / src / gallium / winsys / i915 / drm / i915_drm_winsys.c
1 #include <stdio.h>
2
3 #include "state_tracker/drm_api.h"
4
5 #include "i915_drm_winsys.h"
6 #include "util/u_memory.h"
7
8 #include "i915/i915_context.h"
9 #include "i915/i915_screen.h"
10
11 #include "trace/tr_drm.h"
12
13 /*
14 * Helper functions
15 */
16
17
18 static void
19 i915_drm_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 (void) shutup_gcc;
37 sscanf(path, "%x", device_id);
38 fclose(file);
39 }
40
41 static void
42 i915_drm_winsys_destroy(struct i915_winsys *iws)
43 {
44 struct i915_drm_winsys *idws = i915_drm_winsys(iws);
45
46 drm_intel_bufmgr_destroy(idws->pools.gem);
47
48 FREE(idws);
49 }
50
51 static struct pipe_screen *
52 i915_drm_create_screen(struct drm_api *api, int drmFD)
53 {
54 struct i915_drm_winsys *idws;
55 unsigned int deviceID;
56
57 idws = CALLOC_STRUCT(i915_drm_winsys);
58 if (!idws)
59 return NULL;
60
61 i915_drm_get_device_id(&deviceID);
62
63 i915_drm_winsys_init_batchbuffer_functions(idws);
64 i915_drm_winsys_init_buffer_functions(idws);
65 i915_drm_winsys_init_fence_functions(idws);
66
67 idws->fd = drmFD;
68 idws->base.pci_id = deviceID;
69 idws->max_batch_size = 16 * 4096;
70
71 idws->base.destroy = i915_drm_winsys_destroy;
72
73 idws->pools.gem = drm_intel_bufmgr_gem_init(idws->fd, idws->max_batch_size);
74 drm_intel_bufmgr_gem_enable_reuse(idws->pools.gem);
75
76 idws->dump_cmd = debug_get_bool_option("INTEL_DUMP_CMD", FALSE);
77
78 return i915_screen_create(&idws->base);
79 }
80
81 static struct drm_api i915_drm_api =
82 {
83 .name = "i915",
84 .driver_name = "i915",
85 .create_screen = i915_drm_create_screen,
86 .destroy = NULL,
87 };
88
89 struct drm_api *
90 drm_api_create()
91 {
92 return trace_drm_create(&i915_drm_api);
93 }