OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/exo/wayland/server.h" | 5 #include "components/exo/wayland/server.h" |
6 | 6 |
7 #include <grp.h> | 7 #include <grp.h> |
8 #include <linux/input.h> | 8 #include <linux/input.h> |
9 #include <stddef.h> | 9 #include <stddef.h> |
10 #include <stdint.h> | 10 #include <stdint.h> |
(...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
514 [format](const drm_supported_format& supported_format) { | 514 [format](const drm_supported_format& supported_format) { |
515 return supported_format.drm_format == format; | 515 return supported_format.drm_format == format; |
516 }); | 516 }); |
517 if (supported_format == | 517 if (supported_format == |
518 (drm_supported_formats + arraysize(drm_supported_formats))) { | 518 (drm_supported_formats + arraysize(drm_supported_formats))) { |
519 wl_resource_post_error(resource, WL_DRM_ERROR_INVALID_FORMAT, | 519 wl_resource_post_error(resource, WL_DRM_ERROR_INVALID_FORMAT, |
520 "invalid format 0x%x", format); | 520 "invalid format 0x%x", format); |
521 return; | 521 return; |
522 } | 522 } |
523 | 523 |
524 std::vector<int> strides{stride0, stride1, stride2}; | 524 std::vector<gfx::NativePixmapPlane> planes; |
525 std::vector<int> offsets{offset0, offset1, offset2}; | 525 planes.emplace_back(stride0, offset0, 0); |
| 526 planes.emplace_back(stride1, offset1, 0); |
| 527 planes.emplace_back(stride2, offset2, 0); |
526 std::vector<base::ScopedFD> fds; | 528 std::vector<base::ScopedFD> fds; |
527 | 529 |
528 int planes = | 530 size_t num_planes = |
529 gfx::NumberOfPlanesForBufferFormat(supported_format->buffer_format); | 531 gfx::NumberOfPlanesForBufferFormat(supported_format->buffer_format); |
530 strides.resize(planes); | 532 planes.resize(num_planes); |
531 offsets.resize(planes); | |
532 fds.push_back(base::ScopedFD(name)); | 533 fds.push_back(base::ScopedFD(name)); |
533 | 534 |
534 std::unique_ptr<Buffer> buffer = | 535 std::unique_ptr<Buffer> buffer = |
535 GetUserDataAs<Display>(resource)->CreateLinuxDMABufBuffer( | 536 GetUserDataAs<Display>(resource)->CreateLinuxDMABufBuffer( |
536 gfx::Size(width, height), supported_format->buffer_format, strides, | 537 gfx::Size(width, height), supported_format->buffer_format, planes, |
537 offsets, std::move(fds)); | 538 std::move(fds)); |
538 if (!buffer) { | 539 if (!buffer) { |
539 wl_resource_post_no_memory(resource); | 540 wl_resource_post_no_memory(resource); |
540 return; | 541 return; |
541 } | 542 } |
542 | 543 |
543 wl_resource* buffer_resource = | 544 wl_resource* buffer_resource = |
544 wl_resource_create(client, &wl_buffer_interface, 1, id); | 545 wl_resource_create(client, &wl_buffer_interface, 1, id); |
545 | 546 |
546 buffer->set_release_callback(base::Bind(&HandleBufferReleaseCallback, | 547 buffer->set_release_callback(base::Bind(&HandleBufferReleaseCallback, |
547 base::Unretained(buffer_resource))); | 548 base::Unretained(buffer_resource))); |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
660 | 661 |
661 size_t num_planes = | 662 size_t num_planes = |
662 gfx::NumberOfPlanesForBufferFormat(supported_format->buffer_format); | 663 gfx::NumberOfPlanesForBufferFormat(supported_format->buffer_format); |
663 | 664 |
664 if (linux_buffer_params->planes.size() != num_planes) { | 665 if (linux_buffer_params->planes.size() != num_planes) { |
665 wl_resource_post_error(resource, ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_PLANE_IDX, | 666 wl_resource_post_error(resource, ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_PLANE_IDX, |
666 "plane idx out of bounds"); | 667 "plane idx out of bounds"); |
667 return; | 668 return; |
668 } | 669 } |
669 | 670 |
670 std::vector<int> strides; | 671 std::vector<gfx::NativePixmapPlane> planes; |
671 std::vector<int> offsets; | |
672 std::vector<base::ScopedFD> fds; | 672 std::vector<base::ScopedFD> fds; |
673 | 673 |
674 for (uint32_t i = 0; i < num_planes; ++i) { | 674 for (uint32_t i = 0; i < num_planes; ++i) { |
675 auto plane_it = linux_buffer_params->planes.find(i); | 675 auto plane_it = linux_buffer_params->planes.find(i); |
676 if (plane_it == linux_buffer_params->planes.end()) { | 676 if (plane_it == linux_buffer_params->planes.end()) { |
677 wl_resource_post_error(resource, | 677 wl_resource_post_error(resource, |
678 ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_INCOMPLETE, | 678 ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_INCOMPLETE, |
679 "missing a plane"); | 679 "missing a plane"); |
680 return; | 680 return; |
681 } | 681 } |
682 LinuxBufferParams::Plane& plane = plane_it->second; | 682 LinuxBufferParams::Plane& plane = plane_it->second; |
683 strides.push_back(plane.stride); | 683 planes.emplace_back(plane.stride, plane.offset, 0); |
684 offsets.push_back(plane.offset); | |
685 if (plane.fd.is_valid()) | 684 if (plane.fd.is_valid()) |
686 fds.push_back(std::move(plane.fd)); | 685 fds.push_back(std::move(plane.fd)); |
687 } | 686 } |
688 | 687 |
689 std::unique_ptr<Buffer> buffer = | 688 std::unique_ptr<Buffer> buffer = |
690 linux_buffer_params->display->CreateLinuxDMABufBuffer( | 689 linux_buffer_params->display->CreateLinuxDMABufBuffer( |
691 gfx::Size(width, height), supported_format->buffer_format, strides, | 690 gfx::Size(width, height), supported_format->buffer_format, planes, |
692 offsets, std::move(fds)); | 691 std::move(fds)); |
693 if (!buffer) { | 692 if (!buffer) { |
694 zwp_linux_buffer_params_v1_send_failed(resource); | 693 zwp_linux_buffer_params_v1_send_failed(resource); |
695 return; | 694 return; |
696 } | 695 } |
697 | 696 |
698 wl_resource* buffer_resource = | 697 wl_resource* buffer_resource = |
699 wl_resource_create(client, &wl_buffer_interface, 1, 0); | 698 wl_resource_create(client, &wl_buffer_interface, 1, 0); |
700 | 699 |
701 buffer->set_release_callback(base::Bind(&HandleBufferReleaseCallback, | 700 buffer->set_release_callback(base::Bind(&HandleBufferReleaseCallback, |
702 base::Unretained(buffer_resource))); | 701 base::Unretained(buffer_resource))); |
(...skipping 2167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2870 DCHECK(event_loop); | 2869 DCHECK(event_loop); |
2871 wl_event_loop_dispatch(event_loop, timeout.InMilliseconds()); | 2870 wl_event_loop_dispatch(event_loop, timeout.InMilliseconds()); |
2872 } | 2871 } |
2873 | 2872 |
2874 void Server::Flush() { | 2873 void Server::Flush() { |
2875 wl_display_flush_clients(wl_display_.get()); | 2874 wl_display_flush_clients(wl_display_.get()); |
2876 } | 2875 } |
2877 | 2876 |
2878 } // namespace wayland | 2877 } // namespace wayland |
2879 } // namespace exo | 2878 } // namespace exo |
OLD | NEW |