summaryrefslogtreecommitdiff
path: root/src/gallium/state_trackers/egl/kms
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2010-07-26 17:47:59 -0700
committerEric Anholt <eric@anholt.net>2010-07-26 17:53:27 -0700
commitafe125e0a18ac3886c45c7e6b02b122fb2d327b5 (patch)
tree78621707e71154c0b388b0baacffc26432b7e992 /src/gallium/state_trackers/egl/kms
parentd64343f1ae84979bd154475badf11af8a9bfc2eb (diff)
parent5403ca79b225605c79f49866a6497c97da53be3b (diff)
Merge remote branch 'origin/master' into glsl2
This pulls in multiple i965 driver fixes which will help ensure better testing coverage during development, and also gets past the conflicts of the src/mesa/shader -> src/mesa/program move. Conflicts: src/mesa/Makefile src/mesa/main/shaderapi.c src/mesa/main/shaderobj.h
Diffstat (limited to 'src/gallium/state_trackers/egl/kms')
-rw-r--r--src/gallium/state_trackers/egl/kms/native_kms.c125
-rw-r--r--src/gallium/state_trackers/egl/kms/native_kms.h3
2 files changed, 37 insertions, 91 deletions
diff --git a/src/gallium/state_trackers/egl/kms/native_kms.c b/src/gallium/state_trackers/egl/kms/native_kms.c
index bfb4a9d258..d4e8fbc913 100644
--- a/src/gallium/state_trackers/egl/kms/native_kms.c
+++ b/src/gallium/state_trackers/egl/kms/native_kms.c
@@ -23,6 +23,10 @@
* DEALINGS IN THE SOFTWARE.
*/
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
#include "pipe/p_screen.h"
#include "pipe/p_context.h"
#include "util/u_debug.h"
@@ -655,10 +659,8 @@ kms_display_destroy(struct native_display *ndpy)
kdpy->base.screen->destroy(kdpy->base.screen);
if (kdpy->fd >= 0)
- drmClose(kdpy->fd);
+ close(kdpy->fd);
- if (kdpy->api && kdpy->api->destroy)
- kdpy->api->destroy(kdpy->api);
FREE(kdpy);
}
@@ -669,50 +671,23 @@ static boolean
kms_display_init_screen(struct native_display *ndpy)
{
struct kms_display *kdpy = kms_display(ndpy);
- int fd;
-
- fd = kdpy->fd;
- if (fd >= 0) {
- drmVersionPtr version = drmGetVersion(fd);
- if (!version || strcmp(version->name, kdpy->api->driver_name)) {
- if (version) {
- _eglLog(_EGL_WARNING, "unknown driver name %s", version->name);
- drmFreeVersion(version);
- }
- else {
- _eglLog(_EGL_WARNING, "invalid fd %d", fd);
- }
-
- return FALSE;
- }
-
- drmFreeVersion(version);
- }
- else {
- fd = drmOpen(kdpy->api->driver_name, NULL);
- }
+ drmVersionPtr version;
- if (fd < 0) {
- _eglLog(_EGL_WARNING, "failed to open DRM device");
+ version = drmGetVersion(kdpy->fd);
+ if (!version) {
+ _eglLog(_EGL_WARNING, "invalid fd %d", kdpy->fd);
return FALSE;
}
-#if 0
- if (drmSetMaster(fd)) {
- _eglLog(_EGL_WARNING, "failed to become DRM master");
- return FALSE;
- }
-#endif
+ kdpy->base.screen = kdpy->event_handler->new_drm_screen(&kdpy->base,
+ version->name, kdpy->fd);;
+ drmFreeVersion(version);
- kdpy->base.screen = kdpy->api->create_screen(kdpy->api, fd);
if (!kdpy->base.screen) {
_eglLog(_EGL_WARNING, "failed to create DRM screen");
- drmClose(fd);
return FALSE;
}
- kdpy->fd = fd;
-
return TRUE;
}
@@ -725,7 +700,7 @@ static struct native_display_modeset kms_display_modeset = {
static struct native_display *
kms_create_display(int fd, struct native_event_handler *event_handler,
- struct drm_api *api)
+ void *user_data)
{
struct kms_display *kdpy;
@@ -733,16 +708,10 @@ kms_create_display(int fd, struct native_event_handler *event_handler,
if (!kdpy)
return NULL;
+ kdpy->fd = fd;
kdpy->event_handler = event_handler;
+ kdpy->base.user_data = user_data;
- kdpy->api = api;
- if (!kdpy->api) {
- _eglLog(_EGL_WARNING, "failed to create DRM API");
- FREE(kdpy);
- return NULL;
- }
-
- kdpy->fd = fd;
if (!kms_display_init_screen(&kdpy->base)) {
kms_display_destroy(&kdpy->base);
return NULL;
@@ -778,53 +747,31 @@ kms_create_display(int fd, struct native_event_handler *event_handler,
return &kdpy->base;
}
-struct native_probe *
-native_create_probe(EGLNativeDisplayType dpy)
-{
- return NULL;
-}
-
-enum native_probe_result
-native_get_probe_result(struct native_probe *nprobe)
-{
- return NATIVE_PROBE_UNKNOWN;
-}
-
-/* the api is destroyed with the native display */
-static struct drm_api *drm_api;
-
-const char *
-native_get_name(void)
+static struct native_display *
+native_create_display(void *dpy, struct native_event_handler *event_handler,
+ void *user_data)
{
- static char kms_name[32];
-
- if (!drm_api)
- drm_api = drm_api_create();
+ int fd;
- if (drm_api)
- util_snprintf(kms_name, sizeof(kms_name), "KMS/%s", drm_api->name);
- else
- util_snprintf(kms_name, sizeof(kms_name), "KMS");
+ if (dpy) {
+ fd = dup((int) pointer_to_intptr(dpy));
+ }
+ else {
+ fd = open("/dev/dri/card0", O_RDWR);
+ }
+ if (fd < 0)
+ return NULL;
- return kms_name;
+ return kms_create_display(fd, event_handler, user_data);
}
-struct native_display *
-native_create_display(EGLNativeDisplayType dpy,
- struct native_event_handler *event_handler)
-{
- struct native_display *ndpy = NULL;
- int fd;
-
- if (!drm_api)
- drm_api = drm_api_create();
-
- if (drm_api) {
- /* well, this makes fd 0 being ignored */
- fd = (dpy != EGL_DEFAULT_DISPLAY) ?
- (int) pointer_to_intptr((void *) dpy) : -1;
- ndpy = kms_create_display(fd, event_handler, drm_api);
- }
+static const struct native_platform kms_platform = {
+ "KMS", /* name */
+ native_create_display
+};
- return ndpy;
+const struct native_platform *
+native_get_kms_platform(void)
+{
+ return &kms_platform;
}
diff --git a/src/gallium/state_trackers/egl/kms/native_kms.h b/src/gallium/state_trackers/egl/kms/native_kms.h
index d69c8d38c8..cd8e4ff0b2 100644
--- a/src/gallium/state_trackers/egl/kms/native_kms.h
+++ b/src/gallium/state_trackers/egl/kms/native_kms.h
@@ -32,7 +32,7 @@
#include "pipe/p_compiler.h"
#include "util/u_format.h"
#include "pipe/p_state.h"
-#include "state_tracker/drm_api.h"
+#include "state_tracker/drm_driver.h"
#include "common/native.h"
#include "common/native_helper.h"
@@ -53,7 +53,6 @@ struct kms_display {
struct native_event_handler *event_handler;
int fd;
- struct drm_api *api;
drmModeResPtr resources;
struct kms_config *config;