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