7 #include "egl_tracker.h"
10 #include "state_tracker/drm_api.h"
12 #include "pipe/p_screen.h"
13 #include "pipe/internal/p_winsys_screen.h"
17 extern const struct dri_extension card_extensions
[];
25 * The bootstrap function. Return a new drm_driver object and
26 * plug in API functions.
29 _eglMain(_EGLDisplay
*dpy
, const char *args
)
31 struct drm_device
*drm
;
33 drm
= (struct drm_device
*) calloc(1, sizeof(struct drm_device
));
38 /* First fill in the dispatch table with defaults */
39 _eglInitDriverFallbacks(&drm
->base
);
40 /* then plug in our Drm-specific functions */
41 drm
->base
.API
.Initialize
= drm_initialize
;
42 drm
->base
.API
.Terminate
= drm_terminate
;
43 drm
->base
.API
.CreateContext
= drm_create_context
;
44 drm
->base
.API
.MakeCurrent
= drm_make_current
;
45 drm
->base
.API
.CreateWindowSurface
= drm_create_window_surface
;
46 drm
->base
.API
.CreatePixmapSurface
= drm_create_pixmap_surface
;
47 drm
->base
.API
.CreatePbufferSurface
= drm_create_pbuffer_surface
;
48 drm
->base
.API
.DestroySurface
= drm_destroy_surface
;
49 drm
->base
.API
.DestroyContext
= drm_destroy_context
;
50 drm
->base
.API
.CreateScreenSurfaceMESA
= drm_create_screen_surface_mesa
;
51 drm
->base
.API
.ShowScreenSurfaceMESA
= drm_show_screen_surface_mesa
;
52 drm
->base
.API
.SwapBuffers
= drm_swap_buffers
;
54 drm
->base
.ClientAPIsMask
= EGL_OPENGL_BIT
/*| EGL_OPENGL_ES_BIT*/;
55 drm
->base
.Name
= "DRM/Gallium/Win";
57 /* enable supported extensions */
58 drm
->base
.Extensions
.MESA_screen_surface
= EGL_TRUE
;
59 drm
->base
.Extensions
.MESA_copy_context
= EGL_TRUE
;
65 drm_get_device_id(struct drm_device
*device
)
70 /* TODO get the real minor */
73 snprintf(path
, sizeof(path
), "/sys/class/drm/card%d/device/device", minor
);
74 file
= fopen(path
, "r");
76 _eglLog(_EGL_WARNING
, "Could not retrive device ID\n");
80 fgets(path
, sizeof( path
), file
);
81 sscanf(path
, "%x", &device
->deviceID
);
86 drm_update_res(struct drm_device
*dev
)
88 drmModeFreeResources(dev
->res
);
89 dev
->res
= drmModeGetResources(dev
->drmFD
);
93 drm_add_modes_from_connector(_EGLScreen
*screen
, drmModeConnectorPtr connector
)
95 drmModeModeInfoPtr m
= NULL
;
98 for (i
= 0; i
< connector
->count_modes
; i
++) {
99 m
= &connector
->modes
[i
];
100 _eglAddNewMode(screen
, m
->hdisplay
, m
->vdisplay
, m
->vrefresh
, m
->name
);
105 drm_initialize(_EGLDriver
*drv
, EGLDisplay dpy
, EGLint
*major
, EGLint
*minor
)
107 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
108 struct drm_device
*dev
= (struct drm_device
*)drv
;
109 struct drm_screen
*screen
= NULL
;
110 drmModeConnectorPtr connector
= NULL
;
111 drmModeResPtr res
= NULL
;
112 unsigned count_connectors
= 0;
117 fd
= drmOpen("i915", NULL
);
122 drm_get_device_id(dev
);
124 dev
->screen
= drm_api_hooks
.create_screen(dev
->drmFD
, dev
->deviceID
);
127 dev
->winsys
= dev
->screen
->winsys
;
130 driInitExtensions(NULL
, card_extensions
, GL_FALSE
);
135 count_connectors
= res
->count_connectors
;
137 _eglLog(_EGL_WARNING
, "Could not retrive kms information\n");
139 for(i
= 0; i
< count_connectors
&& i
< MAX_SCREENS
; i
++) {
140 connector
= drmModeGetConnector(fd
, res
->connectors
[i
]);
145 if (connector
->connection
!= DRM_MODE_CONNECTED
) {
146 drmModeFreeConnector(connector
);
150 screen
= malloc(sizeof(struct drm_screen
));
151 memset(screen
, 0, sizeof(*screen
));
152 screen
->connector
= connector
;
153 screen
->connectorID
= connector
->connector_id
;
154 _eglInitScreen(&screen
->base
);
155 _eglAddScreen(disp
, &screen
->base
);
156 drm_add_modes_from_connector(&screen
->base
, connector
);
157 dev
->screens
[num_screens
++] = screen
;
159 dev
->count_screens
= num_screens
;
161 /* for now we only have one config */
162 _EGLConfig
*config
= calloc(1, sizeof(*config
));
163 memset(config
, 1, sizeof(*config
));
164 _eglInitConfig(config
, 1);
165 _eglSetConfigAttrib(config
, EGL_RED_SIZE
, 8);
166 _eglSetConfigAttrib(config
, EGL_GREEN_SIZE
, 8);
167 _eglSetConfigAttrib(config
, EGL_BLUE_SIZE
, 8);
168 _eglSetConfigAttrib(config
, EGL_ALPHA_SIZE
, 8);
169 _eglSetConfigAttrib(config
, EGL_BUFFER_SIZE
, 32);
170 _eglSetConfigAttrib(config
, EGL_DEPTH_SIZE
, 24);
171 _eglSetConfigAttrib(config
, EGL_STENCIL_SIZE
, 8);
172 _eglSetConfigAttrib(config
, EGL_SURFACE_TYPE
, EGL_PBUFFER_BIT
);
173 _eglAddConfig(disp
, config
);
175 drv
->Initialized
= EGL_TRUE
;
189 drm_terminate(_EGLDriver
*drv
, EGLDisplay dpy
)
191 struct drm_device
*dev
= (struct drm_device
*)drv
;
192 struct drm_screen
*screen
;
195 drmFreeVersion(dev
->version
);
197 for (i
= 0; i
< dev
->count_screens
; i
++) {
198 screen
= dev
->screens
[i
];
201 drm_takedown_shown_screen(drv
, screen
);
203 drmModeFreeConnector(screen
->connector
);
204 _eglDestroyScreen(&screen
->base
);
205 dev
->screens
[i
] = NULL
;
208 dev
->screen
->destroy(dev
->screen
);
211 drmClose(dev
->drmFD
);
213 _eglCleanupDisplay(_eglLookupDisplay(dpy
));