native_drm.c revision 34fd282b270dbaf0ce87e342b3183eb3a4bf4a44
1755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org/*
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org * Mesa 3-D graphics library
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org * Version:  7.11
4755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org *
5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * Copyright (C) 2011 Benjamin Franzke <benjaminfranzke@googlemail.com>
6755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org *
7196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org * copy of this software and associated documentation files (the "Software"),
9755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org * to deal in the Software without restriction, including without limitation
10755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
12755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org * Software is furnished to do so, subject to the following conditions:
13755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org *
147c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org * The above copyright notice and this permission notice shall be included
1510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org * in all copies or substantial portions of the Software.
16755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org *
17755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * DEALINGS IN THE SOFTWARE.
24ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org */
25ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
2610480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#include "util/u_memory.h"
27755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org#include "util/u_inlines.h"
28ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
29ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "pipe/p_compiler.h"
30ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "pipe/p_screen.h"
31ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "pipe/p_context.h"
32ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "pipe/p_state.h"
33ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "state_tracker/drm_driver.h"
34ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
35ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "egllog.h"
36ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include <errno.h>
3732280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org
38ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "native_wayland.h"
39ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
40ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org/* see get_drm_screen_name */
41ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include <radeon_drm.h>
42ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "radeon/drm/radeon_drm_public.h"
43ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
44ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org#include <wayland-client.h>
4510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#include "wayland-drm-client-protocol.h"
46ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "wayland-egl-priv.h"
4710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org
48030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org#include <xf86drm.h>
49030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org#include <sys/types.h>
5010480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#include <sys/stat.h>
51ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include <fcntl.h>
52ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
53755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgstruct wayland_drm_display {
54755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   struct wayland_display base;
55755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
56755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   struct native_event_handler *event_handler;
57e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org
58755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   struct wl_drm *wl_drm;
59030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org   int fd;
60030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org   char *device_name;
61030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org   boolean authenticated;
62030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org};
63e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org
645de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.orgstatic INLINE struct wayland_drm_display *
65755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgwayland_drm_display(const struct native_display *ndpy)
66755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org{
67755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   return (struct wayland_drm_display *) ndpy;
68755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org}
69e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org
705de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.orgstatic void
71755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgsync_callback(void *data)
72755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org{
73755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   int *done = data;
74030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org
75030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org   *done = 1;
76030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org}
77030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org
78030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.orgstatic void
79030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.orgforce_roundtrip(struct wl_display *display)
80030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org{
81030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org   int done = 0;
82755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
83030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org   wl_display_sync_callback(display, sync_callback, &done);
84755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   wl_display_iterate(display, WL_DISPLAY_WRITABLE);
85eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org   while (!done)
86eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      wl_display_iterate(display, WL_DISPLAY_READABLE);
87eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org}
88755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
89030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.orgstatic void
90755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgwayland_drm_display_destroy(struct native_display *ndpy)
91755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org{
92755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   struct wayland_drm_display *drmdpy = wayland_drm_display(ndpy);
93ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
94ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org   if (drmdpy->fd)
95dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org      close(drmdpy->fd);
96ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   if (drmdpy->wl_drm)
97e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      wl_drm_destroy(drmdpy->wl_drm);
98755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   if (drmdpy->device_name)
99755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org      FREE(drmdpy->device_name);
100755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   if (drmdpy->base.config)
101ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org      FREE(drmdpy->base.config);
102ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
103755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   ndpy_uninit(ndpy);
104755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
105755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   FREE(drmdpy);
106eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org}
107755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
108e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.orgstatic struct wl_buffer *
109755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgwayland_create_drm_buffer(struct wayland_display *display,
110755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org                          struct wayland_surface *surface,
111755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org                          enum native_attachment attachment)
112ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org{
113ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   struct wayland_drm_display *drmdpy = (struct wayland_drm_display *) display;
114755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   struct pipe_screen *screen = drmdpy->base.base.screen;
11570ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org   struct pipe_resource *resource;
116755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   struct winsys_handle wsh;
117755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   uint width, height;
118755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   struct wl_visual *visual;
119755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
120755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   resource = resource_surface_get_single_resource(surface->rsurf, attachment);
121755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   resource_surface_get_size(surface->rsurf, &width, &height);
122755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
123e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org   wsh.type = DRM_API_HANDLE_TYPE_SHARED;
124755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   screen->resource_get_handle(screen, resource, &wsh);
125755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
126755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   pipe_resource_reference(&resource, NULL);
127ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
128755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   switch (surface->type) {
129ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   case WL_WINDOW_SURFACE:
130755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org      visual = surface->win->visual;
131e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      break;
132755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   case WL_PIXMAP_SURFACE:
133755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org      visual = surface->pix->visual;
134755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org      break;
135ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org   default:
1361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      return NULL;
1371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   }
1381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
1391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   return wl_drm_create_buffer(drmdpy->wl_drm, wsh.handle,
1401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                               width, height, wsh.stride, visual);
1411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
1421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
1431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgstatic const char *
1441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgget_drm_screen_name(int fd, drmVersionPtr version)
1451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org{
1461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org   const char *name = version->name;
147ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
14879e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org   if (name && !strcmp(name, "radeon")) {
149755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org      int chip_id;
150755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org      struct drm_radeon_info info;
151755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
152755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org      memset(&info, 0, sizeof(info));
153755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org      info.request = RADEON_INFO_DEVICE_ID;
154755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org      info.value = pointer_to_intptr(&chip_id);
155755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org      if (drmCommandWriteRead(fd, DRM_RADEON_INFO, &info, sizeof(info)) != 0)
156ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org         return NULL;
1575f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org
158eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org      name = is_r3xx(chip_id) ? "r300" : "r600";
159eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org   }
160eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
161ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org   return name;
162e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org}
163ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
164ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic void
165ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgdrm_handle_device(void *data, struct wl_drm *drm, const char *device)
166ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org{
167ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org   struct wayland_drm_display *drmdpy = data;
168ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org   drm_magic_t magic;
169ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
170ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org   drmdpy->device_name = strdup(device);
171ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org   if (!drmdpy->device_name)
172ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org      return;
173ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
1748e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org   drmdpy->fd = open(drmdpy->device_name, O_RDWR);
17579e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org   if (drmdpy->fd == -1) {
176755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org      _eglLog(_EGL_WARNING, "wayland-egl: could not open %s (%s)",
177755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org              drmdpy->device_name, strerror(errno));
178755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org      return;
179755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   }
1808e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
181755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   drmGetMagic(drmdpy->fd, &magic);
182755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   wl_drm_authenticate(drmdpy->wl_drm, magic);
1834a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org}
184755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
185755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgstatic void
186755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgdrm_handle_authenticated(void *data, struct wl_drm *drm)
187755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org{
188755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   struct wayland_drm_display *drmdpy = data;
189755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
190755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   drmdpy->authenticated = true;
191755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org}
192755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
193755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgstatic const struct wl_drm_listener drm_listener = {
194755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   drm_handle_device,
195755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   drm_handle_authenticated
196755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org};
1973a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
1983a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgstatic boolean
199755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgwayland_drm_display_init_screen(struct native_display *ndpy)
200755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org{
201755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   struct wayland_drm_display *drmdpy = wayland_drm_display(ndpy);
202755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   drmVersionPtr version;
203755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   const char *driver_name;
204755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   uint32_t id;
205755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
206ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org   id = wl_display_get_global(drmdpy->base.dpy, "wl_drm", 1);
2072bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com   if (id == 0)
2082bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com      wl_display_iterate(drmdpy->base.dpy, WL_DISPLAY_READABLE);
209e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org   id = wl_display_get_global(drmdpy->base.dpy, "wl_drm", 1);
2102bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com   if (id == 0)
2112bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com      return FALSE;
212ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
2132bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com   drmdpy->wl_drm = wl_drm_create(drmdpy->base.dpy, id, 1);
21470ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org   if (!drmdpy->wl_drm)
2152bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com      return FALSE;
216e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org
2172bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com   wl_drm_add_listener(drmdpy->wl_drm, &drm_listener, drmdpy);
2182bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com   force_roundtrip(drmdpy->base.dpy);
2192bc58ef330b2d92ba287754282872699c151db4achristian.plesner.hansen@gmail.com   if (drmdpy->fd == -1)
220ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org      return FALSE;
221e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org
2229bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org   force_roundtrip(drmdpy->base.dpy);
223e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org   if (!drmdpy->authenticated)
2249bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org      return FALSE;
2259bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org
226030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org   version = drmGetVersion(drmdpy->fd);
227ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   if (!version) {
228ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      _eglLog(_EGL_WARNING, "invalid fd %d", drmdpy->fd);
229ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      return FALSE;
230755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   }
231755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
232755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org   /* FIXME: share this with native_drm or egl_dri2 */
233ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org   driver_name = get_drm_screen_name(drmdpy->fd, version);
234755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org
235   drmdpy->base.base.screen =
236      drmdpy->event_handler->new_drm_screen(&drmdpy->base.base,
237                                            driver_name, drmdpy->fd);
238   drmFreeVersion(version);
239
240   if (!drmdpy->base.base.screen) {
241      _eglLog(_EGL_WARNING, "failed to create DRM screen");
242      return FALSE;
243   }
244
245   return TRUE;
246}
247
248static struct pipe_resource *
249wayland_drm_display_import_buffer(struct native_display *ndpy,
250                                  const struct pipe_resource *templ,
251                                  void *buf)
252{
253   return ndpy->screen->resource_from_handle(ndpy->screen,
254                                             templ, (struct winsys_handle *) buf);
255}
256
257static boolean
258wayland_drm_display_export_buffer(struct native_display *ndpy,
259                                  struct pipe_resource *res,
260                                  void *buf)
261{
262   return ndpy->screen->resource_get_handle(ndpy->screen,
263                                            res, (struct winsys_handle *) buf);
264}
265
266static struct native_display_buffer wayland_drm_display_buffer = {
267   wayland_drm_display_import_buffer,
268   wayland_drm_display_export_buffer
269};
270
271struct wayland_display *
272wayland_create_drm_display(struct wl_display *dpy,
273                           struct native_event_handler *event_handler,
274                           void *user_data)
275{
276   struct wayland_drm_display *drmdpy;
277
278   drmdpy = CALLOC_STRUCT(wayland_drm_display);
279   if (!drmdpy)
280      return NULL;
281
282   drmdpy->event_handler = event_handler;
283   drmdpy->base.base.user_data = user_data;
284
285   drmdpy->base.dpy = dpy;
286   if (!drmdpy->base.dpy) {
287      wayland_drm_display_destroy(&drmdpy->base.base);
288      return NULL;
289   }
290
291   if (!wayland_drm_display_init_screen(&drmdpy->base.base)) {
292      wayland_drm_display_destroy(&drmdpy->base.base);
293      return NULL;
294   }
295   drmdpy->base.base.destroy = wayland_drm_display_destroy;
296   drmdpy->base.base.buffer = &wayland_drm_display_buffer;
297
298   drmdpy->base.create_buffer = wayland_create_drm_buffer;
299
300   return &drmdpy->base;
301}
302
303/* vim: set sw=3 ts=8 sts=3 expandtab: */
304