Index: components/exo/wayland/server.cc |
diff --git a/components/exo/wayland/server.cc b/components/exo/wayland/server.cc |
index 0d27ff60d55be550aef2945f2011f1ee3685a9be..aae71272ec346aa50273e3f760705016722064c4 100644 |
--- a/components/exo/wayland/server.cc |
+++ b/components/exo/wayland/server.cc |
@@ -646,12 +646,13 @@ void linux_buffer_params_add(wl_client* client, |
} |
} |
-void linux_buffer_params_create(wl_client* client, |
- wl_resource* resource, |
- int32_t width, |
- int32_t height, |
- uint32_t format, |
- uint32_t flags) { |
+void linux_buffer_params_create_impl(wl_client* client, |
reveman
2017/04/28 17:21:24
I think the code will be easier to read if you did
|
+ wl_resource* resource, |
+ uint32_t buffer_id, |
+ int32_t width, |
+ int32_t height, |
+ uint32_t format, |
+ uint32_t flags) { |
if (width <= 0 || height <= 0) { |
wl_resource_post_error(resource, |
ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_INVALID_DIMENSIONS, |
@@ -712,25 +713,57 @@ void linux_buffer_params_create(wl_client* client, |
gfx::Size(width, height), supported_format->buffer_format, planes, |
std::move(fds)); |
if (!buffer) { |
- zwp_linux_buffer_params_v1_send_failed(resource); |
- return; |
+ // buffer_id != 0 indicates a create_immed request. on import failure |
+ // in that case, the protocol allows us to raise a fatal error from |
+ // zwp_linux_dmabuf_v1 version 2+. |
+ if (buffer_id == 0) |
+ zwp_linux_buffer_params_v1_send_failed(resource); |
+ else { |
+ wl_resource_post_error(resource, |
+ ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_INVALID_WL_BUFFER, |
+ "dmabuf import failed"); |
+ return; |
+ } |
} |
wl_resource* buffer_resource = |
- wl_resource_create(client, &wl_buffer_interface, 1, 0); |
+ wl_resource_create(client, &wl_buffer_interface, 1, buffer_id); |
buffer->set_release_callback(base::Bind(&HandleBufferReleaseCallback, |
base::Unretained(buffer_resource))); |
SetImplementation(buffer_resource, &buffer_implementation, std::move(buffer)); |
- zwp_linux_buffer_params_v1_send_created(resource, buffer_resource); |
+ // for a create_immed request, no event is triggered. |
+ if (buffer_id == 0) |
+ zwp_linux_buffer_params_v1_send_created(resource, buffer_resource); |
+} |
+ |
+void linux_buffer_params_create(wl_client* client, |
+ wl_resource* resource, |
+ int32_t width, |
+ int32_t height, |
+ uint32_t format, |
+ uint32_t flags) { |
+ linux_buffer_params_create_impl(client, resource, 0, width, height, format, |
+ flags); |
+} |
+ |
+void linux_buffer_params_create_immed(wl_client* client, |
+ wl_resource* resource, |
+ uint32_t buffer_id, |
+ int32_t width, |
+ int32_t height, |
+ uint32_t format, |
+ uint32_t flags) { |
+ linux_buffer_params_create_impl(client, resource, buffer_id, width, height, |
+ format, flags); |
} |
const struct zwp_linux_buffer_params_v1_interface |
- linux_buffer_params_implementation = {linux_buffer_params_destroy, |
- linux_buffer_params_add, |
- linux_buffer_params_create}; |
+ linux_buffer_params_implementation = { |
+ linux_buffer_params_destroy, linux_buffer_params_add, |
+ linux_buffer_params_create, linux_buffer_params_create_immed}; |
//////////////////////////////////////////////////////////////////////////////// |
// linux_dmabuf_interface: |
@@ -746,7 +779,7 @@ void linux_dmabuf_create_params(wl_client* client, |
base::MakeUnique<LinuxBufferParams>(GetUserDataAs<Display>(resource)); |
wl_resource* linux_buffer_params_resource = |
- wl_resource_create(client, &zwp_linux_buffer_params_v1_interface, 1, id); |
+ wl_resource_create(client, &zwp_linux_buffer_params_v1_interface, 2, id); |
SetImplementation(linux_buffer_params_resource, |
&linux_buffer_params_implementation, |
@@ -761,7 +794,7 @@ void bind_linux_dmabuf(wl_client* client, |
uint32_t version, |
uint32_t id) { |
wl_resource* resource = |
- wl_resource_create(client, &zwp_linux_dmabuf_v1_interface, 1, id); |
+ wl_resource_create(client, &zwp_linux_dmabuf_v1_interface, version, id); |
wl_resource_set_implementation(resource, &linux_dmabuf_implementation, data, |
nullptr); |
@@ -3853,7 +3886,7 @@ Server::Server(Display* display) |
#if defined(USE_OZONE) |
wl_global_create(wl_display_.get(), &wl_drm_interface, drm_version, display_, |
bind_drm); |
- wl_global_create(wl_display_.get(), &zwp_linux_dmabuf_v1_interface, 1, |
+ wl_global_create(wl_display_.get(), &zwp_linux_dmabuf_v1_interface, 2, |
display_, bind_linux_dmabuf); |
#endif |
wl_global_create(wl_display_.get(), &wl_subcompositor_interface, 1, display_, |