5 #include "util/u_inlines.h"
6 #include "state_tracker/drm_driver.h"
8 #ifdef HAVE_WAYLAND_BACKEND
10 #include <wayland-server.h>
11 #include <wayland-drm-server-protocol.h>
13 #include "native_wayland_drm_bufmgr.h"
15 #include "wayland-drm.h"
17 struct wayland_drm_bufmgr
{
18 struct native_display_wayland_bufmgr base
;
20 struct wl_drm
*wl_server_drm
;
25 wayland_drm_bufmgr_authenticate_func authenticate
;
28 static INLINE
struct wayland_drm_bufmgr
*
29 wayland_drm_bufmgr(const struct native_display_wayland_bufmgr
*base
)
31 return (struct wayland_drm_bufmgr
*) base
;
35 wayland_drm_bufmgr_authenticate(void *user_data
, uint32_t magic
)
37 struct native_display
*ndpy
= user_data
;
38 struct wayland_drm_bufmgr
*bufmgr
;
40 bufmgr
= wayland_drm_bufmgr(ndpy
->wayland_bufmgr
);
42 return bufmgr
->authenticate(user_data
, magic
);
46 wayland_drm_bufmgr_reference_buffer(void *user_data
, uint32_t name
, int fd
,
47 struct wl_drm_buffer
*buffer
)
49 struct native_display
*ndpy
= user_data
;
50 struct pipe_resource templ
;
51 struct winsys_handle wsh
;
54 switch (buffer
->format
) {
55 case WL_DRM_FORMAT_ARGB8888
:
56 pf
= PIPE_FORMAT_B8G8R8A8_UNORM
;
58 case WL_DRM_FORMAT_XRGB8888
:
59 pf
= PIPE_FORMAT_B8G8R8X8_UNORM
;
62 pf
= PIPE_FORMAT_NONE
;
66 if (pf
== PIPE_FORMAT_NONE
)
69 memset(&templ
, 0, sizeof(templ
));
70 templ
.target
= PIPE_TEXTURE_2D
;
72 templ
.bind
= PIPE_BIND_RENDER_TARGET
| PIPE_BIND_SAMPLER_VIEW
;
73 templ
.width0
= buffer
->width
;
74 templ
.height0
= buffer
->height
;
78 memset(&wsh
, 0, sizeof(wsh
));
80 wsh
.stride
= buffer
->stride
[0];
82 buffer
->driver_buffer
=
83 ndpy
->screen
->resource_from_handle(ndpy
->screen
, &templ
, &wsh
);
87 wayland_drm_bufmgr_unreference_buffer(void *user_data
,
88 struct wl_drm_buffer
*buffer
)
90 struct pipe_resource
*resource
= buffer
->driver_buffer
;
92 pipe_resource_reference(&resource
, NULL
);
95 static struct wayland_drm_callbacks wl_drm_callbacks
= {
96 wayland_drm_bufmgr_authenticate
,
97 wayland_drm_bufmgr_reference_buffer
,
98 wayland_drm_bufmgr_unreference_buffer
102 wayland_drm_bufmgr_bind_display(struct native_display
*ndpy
,
103 struct wl_display
*wl_dpy
)
105 struct wayland_drm_bufmgr
*bufmgr
;
107 bufmgr
= wayland_drm_bufmgr(ndpy
->wayland_bufmgr
);
109 if (bufmgr
->wl_server_drm
)
112 bufmgr
->wl_server_drm
= wayland_drm_init(wl_dpy
, bufmgr
->device_name
,
113 &wl_drm_callbacks
, ndpy
, 0);
115 if (!bufmgr
->wl_server_drm
)
122 wayland_drm_bufmgr_unbind_display(struct native_display
*ndpy
,
123 struct wl_display
*wl_dpy
)
125 struct wayland_drm_bufmgr
*bufmgr
;
127 bufmgr
= wayland_drm_bufmgr(ndpy
->wayland_bufmgr
);
129 if (!bufmgr
->wl_server_drm
)
132 wayland_drm_uninit(bufmgr
->wl_server_drm
);
133 bufmgr
->wl_server_drm
= NULL
;
138 static struct pipe_resource
*
139 wayland_drm_bufmgr_wl_buffer_get_resource(struct native_display
*ndpy
,
140 struct wl_resource
*buffer_resource
)
142 struct wayland_drm_bufmgr
*bufmgr
;
143 struct wl_drm_buffer
*buffer
;
145 bufmgr
= wayland_drm_bufmgr(ndpy
->wayland_bufmgr
);
146 buffer
= wayland_drm_buffer_get(bufmgr
->wl_server_drm
, buffer_resource
);
151 return wayland_drm_buffer_get_buffer(buffer
);
155 wayland_drm_bufmgr_query_buffer(struct native_display
*ndpy
,
156 struct wl_resource
*buffer_resource
,
157 int attribute
, int *value
)
159 struct wayland_drm_bufmgr
*bufmgr
;
160 struct wl_drm_buffer
*buffer
;
161 struct pipe_resource
*resource
;
163 bufmgr
= wayland_drm_bufmgr(ndpy
->wayland_bufmgr
);
164 buffer
= wayland_drm_buffer_get(bufmgr
->wl_server_drm
, buffer_resource
);
168 resource
= buffer
->driver_buffer
;
171 case EGL_TEXTURE_FORMAT
:
172 switch (resource
->format
) {
173 case PIPE_FORMAT_B8G8R8A8_UNORM
:
174 *value
= EGL_TEXTURE_RGBA
;
176 case PIPE_FORMAT_B8G8R8X8_UNORM
:
177 *value
= EGL_TEXTURE_RGB
;
183 *value
= buffer
->width
;
186 *value
= buffer
->height
;
194 struct native_display_wayland_bufmgr
*
195 wayland_drm_bufmgr_create(wayland_drm_bufmgr_authenticate_func authenticate
,
196 void *user_data
, char *device_name
)
198 struct wayland_drm_bufmgr
*bufmgr
;
200 bufmgr
= calloc(1, sizeof *bufmgr
);
204 bufmgr
->user_data
= user_data
;
205 bufmgr
->authenticate
= authenticate
;
206 bufmgr
->device_name
= strdup(device_name
);
208 bufmgr
->base
.bind_display
= wayland_drm_bufmgr_bind_display
;
209 bufmgr
->base
.unbind_display
= wayland_drm_bufmgr_unbind_display
;
210 bufmgr
->base
.buffer_get_resource
= wayland_drm_bufmgr_wl_buffer_get_resource
;
211 bufmgr
->base
.query_buffer
= wayland_drm_bufmgr_query_buffer
;
213 return &bufmgr
->base
;
217 wayland_drm_bufmgr_destroy(struct native_display_wayland_bufmgr
*_bufmgr
)
219 struct wayland_drm_bufmgr
*bufmgr
= wayland_drm_bufmgr(_bufmgr
);
224 free(bufmgr
->device_name
);