Merge branch '7.8'
[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 void
41 i965_libdrm_winsys_destroy(struct brw_winsys_screen *iws)
42 {
43 struct i965_libdrm_winsys *idws = i965_libdrm_winsys(iws);
44
45 if (BRW_DUMP)
46 debug_printf("%s\n", __FUNCTION__);
47
48 drm_intel_bufmgr_destroy(idws->gem);
49
50 FREE(idws);
51 }
52
53 static struct pipe_screen *
54 i965_libdrm_create_screen(struct drm_api *api, int drmFD,
55 struct drm_create_screen_arg *arg)
56 {
57 struct i965_libdrm_winsys *idws;
58 unsigned int deviceID;
59
60 debug_printf("%s\n", __FUNCTION__);
61
62 if (arg != NULL) {
63 switch(arg->mode) {
64 case DRM_CREATE_NORMAL:
65 break;
66 default:
67 return NULL;
68 }
69 }
70
71 idws = CALLOC_STRUCT(i965_libdrm_winsys);
72 if (!idws)
73 return NULL;
74
75 i965_libdrm_get_device_id(&deviceID);
76
77 i965_libdrm_winsys_init_buffer_functions(idws);
78
79 idws->fd = drmFD;
80 idws->id = deviceID;
81
82 idws->base.destroy = i965_libdrm_winsys_destroy;
83
84 idws->gem = drm_intel_bufmgr_gem_init(idws->fd, BRW_BATCH_SIZE);
85 drm_intel_bufmgr_gem_enable_reuse(idws->gem);
86
87 idws->send_cmd = !debug_get_bool_option("BRW_NO_HW", FALSE);
88
89 return brw_create_screen(&idws->base, deviceID);
90 }
91
92
93 static void
94 destroy(struct drm_api *api)
95 {
96 if (BRW_DUMP)
97 debug_printf("%s\n", __FUNCTION__);
98
99 }
100
101 struct drm_api i965_libdrm_api =
102 {
103 .name = "i965",
104 .create_screen = i965_libdrm_create_screen,
105 .destroy = destroy,
106 };
107
108 struct drm_api *
109 drm_api_create()
110 {
111 return trace_drm_create(&i965_libdrm_api);
112 }