Chromium Code Reviews| 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_, |