6d72ce14774cc524a73cc86116d9e483acc51091
[mesa.git] / src / gallium / state_trackers / egl / common / native_wayland_drm_bufmgr_helper.c
1 #include <stdint.h>
2 #include <string.h>
3
4 #include "native.h"
5 #include "util/u_inlines.h"
6 #include "state_tracker/drm_driver.h"
7
8 #ifdef HAVE_WAYLAND_BACKEND
9
10 #include <wayland-server.h>
11 #include <wayland-drm-server-protocol.h>
12
13 #include "native_wayland_drm_bufmgr_helper.h"
14
15 void
16 egl_g3d_wl_drm_helper_reference_buffer(void *user_data, uint32_t name,
17 struct wl_drm_buffer *buffer)
18 {
19 struct native_display *ndpy = user_data;
20 struct pipe_resource templ;
21 struct winsys_handle wsh;
22 enum pipe_format pf;
23
24 switch (buffer->format) {
25 case WL_DRM_FORMAT_ARGB8888:
26 pf = PIPE_FORMAT_B8G8R8A8_UNORM;
27 break;
28 case WL_DRM_FORMAT_XRGB8888:
29 pf = PIPE_FORMAT_B8G8R8X8_UNORM;
30 break;
31 default:
32 pf = PIPE_FORMAT_NONE;
33 break;
34 }
35
36 if (pf == PIPE_FORMAT_NONE)
37 return;
38
39 memset(&templ, 0, sizeof(templ));
40 templ.target = PIPE_TEXTURE_2D;
41 templ.format = pf;
42 templ.bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW;
43 templ.width0 = buffer->buffer.width;
44 templ.height0 = buffer->buffer.height;
45 templ.depth0 = 1;
46 templ.array_size = 1;
47
48 memset(&wsh, 0, sizeof(wsh));
49 wsh.handle = name;
50 wsh.stride = buffer->stride0;
51
52 buffer->driver_buffer =
53 ndpy->screen->resource_from_handle(ndpy->screen, &templ, &wsh);
54 }
55
56 void
57 egl_g3d_wl_drm_helper_unreference_buffer(void *user_data,
58 struct wl_drm_buffer *buffer)
59 {
60 struct pipe_resource *resource = buffer->driver_buffer;
61
62 pipe_resource_reference(&resource, NULL);
63 }
64
65 struct pipe_resource *
66 egl_g3d_wl_drm_common_wl_buffer_get_resource(struct native_display *ndpy,
67 struct wl_buffer *buffer)
68 {
69 return wayland_drm_buffer_get_buffer(buffer);
70 }
71
72 #endif