diff --git a/cc/BUILD.gn b/cc/BUILD.gn index 24cd3fb5f3be5e..ef4042c0d2186f 100644 --- a/cc/BUILD.gn +++ b/cc/BUILD.gn @@ -853,6 +853,7 @@ cc_test("cc_perftests") { "//media", "//mojo/edk/system", "//mojo/public/cpp/bindings", + "//services/viz/public/interfaces/compositing", "//skia", "//testing/gmock", "//testing/gtest", diff --git a/cc/ipc/BUILD.gn b/cc/ipc/BUILD.gn index 4df7c2e084777a..f3714f90f74446 100644 --- a/cc/ipc/BUILD.gn +++ b/cc/ipc/BUILD.gn @@ -40,7 +40,6 @@ cc_component("ipc") { mojom("interfaces") { sources = [ "begin_frame_args.mojom", - "compositor_frame.mojom", "compositor_frame_metadata.mojom", "copy_output_request.mojom", "copy_output_result.mojom", diff --git a/cc/ipc/DEPS b/cc/ipc/DEPS index 44e573a76e4332..a21ff764e82f28 100644 --- a/cc/ipc/DEPS +++ b/cc/ipc/DEPS @@ -6,4 +6,5 @@ include_rules = [ "+ui/gfx/geometry/mojo", "+ui/latency/ipc", "+ui/latency/mojo", + "+services/viz/public", ] diff --git a/cc/ipc/cc_serialization_perftest.cc b/cc/ipc/cc_serialization_perftest.cc index 4bd3d0ddcc04c5..5bcdf33e135032 100644 --- a/cc/ipc/cc_serialization_perftest.cc +++ b/cc/ipc/cc_serialization_perftest.cc @@ -10,7 +10,6 @@ #include "cc/ipc/cc_param_traits.h" #include "cc/ipc/compositor_frame.mojom.h" #include "cc/ipc/compositor_frame_metadata_struct_traits.h" -#include "cc/ipc/compositor_frame_struct_traits.h" #include "cc/ipc/render_pass_struct_traits.h" #include "cc/ipc/selection_struct_traits.h" #include "cc/ipc/shared_quad_state_struct_traits.h" @@ -23,6 +22,8 @@ #include "gpu/ipc/common/sync_token_struct_traits.h" #include "ipc/ipc_message.h" #include "mojo/public/cpp/bindings/message.h" +#include "services/viz/public/cpp/compositing/compositor_frame_struct_traits.h" +#include "services/viz/public/interfaces/compositing/compositor_frame.mojom.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/perf/perf_test.h" #include "third_party/skia/include/effects/SkBlurImageFilter.h" @@ -141,10 +142,11 @@ class CCSerializationPerfTest : public testing::Test { const std::string& test_name, const CompositorFrame& frame, UseSingleSharedQuadState single_sqs) { - mojo::Message message = mojom::CompositorFrame::SerializeAsMessage(&frame); + mojo::Message message = + viz::mojom::CompositorFrame::SerializeAsMessage(&frame); for (int i = 0; i < kNumWarmupRuns; ++i) { CompositorFrame compositor_frame; - mojom::CompositorFrame::Deserialize( + viz::mojom::CompositorFrame::Deserialize( message.payload(), message.payload_num_bytes(), &compositor_frame); } @@ -157,7 +159,7 @@ class CCSerializationPerfTest : public testing::Test { while (start < end) { for (int i = 0; i < kTimeCheckInterval; ++i) { CompositorFrame compositor_frame; - mojom::CompositorFrame::Deserialize( + viz::mojom::CompositorFrame::Deserialize( message.payload(), message.payload_num_bytes(), &compositor_frame); now = base::TimeTicks::Now(); // We don't count iterations after the end time. @@ -191,7 +193,7 @@ class CCSerializationPerfTest : public testing::Test { UseSingleSharedQuadState single_sqs) { for (int i = 0; i < kNumWarmupRuns; ++i) { mojo::Message message = - mojom::CompositorFrame::SerializeAsMessage(&frame); + viz::mojom::CompositorFrame::SerializeAsMessage(&frame); } base::TimeTicks start = base::TimeTicks::Now(); @@ -203,7 +205,7 @@ class CCSerializationPerfTest : public testing::Test { while (start < end) { for (int i = 0; i < kTimeCheckInterval; ++i) { mojo::Message message = - mojom::CompositorFrame::SerializeAsMessage(&frame); + viz::mojom::CompositorFrame::SerializeAsMessage(&frame); now = base::TimeTicks::Now(); // We don't count iterations after the end time. if (now < end) diff --git a/cc/ipc/compositor_frame.typemap b/cc/ipc/compositor_frame.typemap deleted file mode 100644 index 8908d1502e0746..00000000000000 --- a/cc/ipc/compositor_frame.typemap +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -mojom = "//cc/ipc/compositor_frame.mojom" -public_headers = [ "//cc/output/compositor_frame.h" ] -traits_headers = [ "//cc/ipc/compositor_frame_struct_traits.h" ] -sources = [ - "compositor_frame_struct_traits.cc", -] -deps = [ - "//cc", -] -type_mappings = [ "cc.mojom.CompositorFrame=cc::CompositorFrame[move_only]" ] diff --git a/cc/ipc/struct_traits_unittest.cc b/cc/ipc/struct_traits_unittest.cc index c7eb12067b7662..95877e8cf2dbd1 100644 --- a/cc/ipc/struct_traits_unittest.cc +++ b/cc/ipc/struct_traits_unittest.cc @@ -51,11 +51,6 @@ class StructTraitsTest : public testing::Test, public mojom::TraitsTestService { std::move(callback).Run(b); } - void EchoCompositorFrame(CompositorFrame c, - EchoCompositorFrameCallback callback) override { - std::move(callback).Run(std::move(c)); - } - void EchoCompositorFrameMetadata( CompositorFrameMetadata c, EchoCompositorFrameMetadataCallback callback) override { @@ -205,128 +200,6 @@ TEST_F(StructTraitsTest, BeginFrameAck) { EXPECT_FALSE(output.has_damage); } -// Note that this is a fairly trivial test of CompositorFrame serialization as -// most of the heavy lifting has already been done by CompositorFrameMetadata, -// RenderPass, and QuadListBasic unit tests. -TEST_F(StructTraitsTest, CompositorFrame) { - std::unique_ptr render_pass = RenderPass::Create(); - render_pass->SetNew(1, gfx::Rect(5, 6), gfx::Rect(2, 3), gfx::Transform()); - - // SharedQuadState. - const gfx::Transform sqs_quad_to_target_transform( - 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f, 9.f, 10.f, 11.f, 12.f, 13.f, 14.f, - 15.f, 16.f); - const gfx::Rect sqs_layer_rect(1234, 5678); - const gfx::Rect sqs_visible_layer_rect(12, 34, 56, 78); - const gfx::Rect sqs_clip_rect(123, 456, 789, 101112); - const bool sqs_is_clipped = true; - const float sqs_opacity = 0.9f; - const SkBlendMode sqs_blend_mode = SkBlendMode::kSrcOver; - const int sqs_sorting_context_id = 1337; - SharedQuadState* sqs = render_pass->CreateAndAppendSharedQuadState(); - sqs->SetAll(sqs_quad_to_target_transform, sqs_layer_rect, - sqs_visible_layer_rect, sqs_clip_rect, sqs_is_clipped, - sqs_opacity, sqs_blend_mode, sqs_sorting_context_id); - - // DebugBorderDrawQuad. - const gfx::Rect rect1(1234, 4321, 1357, 7531); - const SkColor color1 = SK_ColorRED; - const int32_t width1 = 1337; - DebugBorderDrawQuad* debug_quad = - render_pass->CreateAndAppendDrawQuad(); - debug_quad->SetNew(sqs, rect1, rect1, color1, width1); - - // SolidColorDrawQuad. - const gfx::Rect rect2(2468, 8642, 4321, 1234); - const uint32_t color2 = 0xffffffff; - const bool force_anti_aliasing_off = true; - SolidColorDrawQuad* solid_quad = - render_pass->CreateAndAppendDrawQuad(); - solid_quad->SetNew(sqs, rect2, rect2, color2, force_anti_aliasing_off); - - // viz::TransferableResource constants. - const uint32_t tr_id = 1337; - const viz::ResourceFormat tr_format = viz::ALPHA_8; - const gfx::BufferFormat tr_buffer_format = gfx::BufferFormat::R_8; - const uint32_t tr_filter = 1234; - const gfx::Size tr_size(1234, 5678); - viz::TransferableResource resource; - resource.id = tr_id; - resource.format = tr_format; - resource.buffer_format = tr_buffer_format; - resource.filter = tr_filter; - resource.size = tr_size; - - // CompositorFrameMetadata constants. - const float device_scale_factor = 2.6f; - const gfx::Vector2dF root_scroll_offset(1234.5f, 6789.1f); - const float page_scale_factor = 1337.5f; - const gfx::SizeF scrollable_viewport_size(1337.7f, 1234.5f); - const uint32_t content_source_id = 3; - const viz::BeginFrameAck begin_frame_ack(5, 10, false); - - CompositorFrame input; - input.metadata.device_scale_factor = device_scale_factor; - input.metadata.root_scroll_offset = root_scroll_offset; - input.metadata.page_scale_factor = page_scale_factor; - input.metadata.scrollable_viewport_size = scrollable_viewport_size; - input.render_pass_list.push_back(std::move(render_pass)); - input.resource_list.push_back(resource); - input.metadata.content_source_id = content_source_id; - input.metadata.begin_frame_ack = begin_frame_ack; - - mojom::TraitsTestServicePtr proxy = GetTraitsTestProxy(); - CompositorFrame output; - proxy->EchoCompositorFrame(std::move(input), &output); - - EXPECT_EQ(device_scale_factor, output.metadata.device_scale_factor); - EXPECT_EQ(root_scroll_offset, output.metadata.root_scroll_offset); - EXPECT_EQ(page_scale_factor, output.metadata.page_scale_factor); - EXPECT_EQ(scrollable_viewport_size, output.metadata.scrollable_viewport_size); - EXPECT_EQ(content_source_id, output.metadata.content_source_id); - EXPECT_EQ(begin_frame_ack, output.metadata.begin_frame_ack); - - ASSERT_EQ(1u, output.resource_list.size()); - viz::TransferableResource out_resource = output.resource_list[0]; - EXPECT_EQ(tr_id, out_resource.id); - EXPECT_EQ(tr_format, out_resource.format); - EXPECT_EQ(tr_buffer_format, out_resource.buffer_format); - EXPECT_EQ(tr_filter, out_resource.filter); - EXPECT_EQ(tr_size, out_resource.size); - - EXPECT_EQ(1u, output.render_pass_list.size()); - const RenderPass* out_render_pass = output.render_pass_list[0].get(); - ASSERT_EQ(2u, out_render_pass->quad_list.size()); - ASSERT_EQ(1u, out_render_pass->shared_quad_state_list.size()); - - const SharedQuadState* out_sqs = - out_render_pass->shared_quad_state_list.ElementAt(0); - EXPECT_EQ(sqs_quad_to_target_transform, out_sqs->quad_to_target_transform); - EXPECT_EQ(sqs_layer_rect, out_sqs->quad_layer_rect); - EXPECT_EQ(sqs_visible_layer_rect, out_sqs->visible_quad_layer_rect); - EXPECT_EQ(sqs_clip_rect, out_sqs->clip_rect); - EXPECT_EQ(sqs_is_clipped, out_sqs->is_clipped); - EXPECT_EQ(sqs_opacity, out_sqs->opacity); - EXPECT_EQ(sqs_blend_mode, out_sqs->blend_mode); - EXPECT_EQ(sqs_sorting_context_id, out_sqs->sorting_context_id); - - const DebugBorderDrawQuad* out_debug_border_draw_quad = - DebugBorderDrawQuad::MaterialCast( - out_render_pass->quad_list.ElementAt(0)); - EXPECT_EQ(rect1, out_debug_border_draw_quad->rect); - EXPECT_EQ(rect1, out_debug_border_draw_quad->visible_rect); - EXPECT_EQ(color1, out_debug_border_draw_quad->color); - EXPECT_EQ(width1, out_debug_border_draw_quad->width); - - const SolidColorDrawQuad* out_solid_color_draw_quad = - SolidColorDrawQuad::MaterialCast(out_render_pass->quad_list.ElementAt(1)); - EXPECT_EQ(rect2, out_solid_color_draw_quad->rect); - EXPECT_EQ(rect2, out_solid_color_draw_quad->visible_rect); - EXPECT_EQ(color2, out_solid_color_draw_quad->color); - EXPECT_EQ(force_anti_aliasing_off, - out_solid_color_draw_quad->force_anti_aliasing_off); -} - TEST_F(StructTraitsTest, CompositorFrameMetadata) { const float device_scale_factor = 2.6f; const gfx::Vector2dF root_scroll_offset(1234.5f, 6789.1f); diff --git a/cc/ipc/traits_test_service.mojom b/cc/ipc/traits_test_service.mojom index 71d2064a763a91..6ae693951acf74 100644 --- a/cc/ipc/traits_test_service.mojom +++ b/cc/ipc/traits_test_service.mojom @@ -5,7 +5,6 @@ module cc.mojom; import "cc/ipc/begin_frame_args.mojom"; -import "cc/ipc/compositor_frame.mojom"; import "cc/ipc/compositor_frame_metadata.mojom"; import "cc/ipc/copy_output_request.mojom"; import "cc/ipc/copy_output_result.mojom"; @@ -30,9 +29,6 @@ interface TraitsTestService { [Sync] EchoBeginFrameAck(BeginFrameAck b) => (BeginFrameAck pass); - [Sync] - EchoCompositorFrame(CompositorFrame c) => (CompositorFrame pass); - [Sync] EchoCompositorFrameMetadata(CompositorFrameMetadata c) => (CompositorFrameMetadata pass); diff --git a/cc/ipc/typemaps.gni b/cc/ipc/typemaps.gni index cca6caa4fd6890..b5d695cefc2c8a 100644 --- a/cc/ipc/typemaps.gni +++ b/cc/ipc/typemaps.gni @@ -4,7 +4,6 @@ typemaps = [ "//cc/ipc/begin_frame_args.typemap", - "//cc/ipc/compositor_frame.typemap", "//cc/ipc/compositor_frame_metadata.typemap", "//cc/ipc/copy_output_request.typemap", "//cc/ipc/copy_output_result.typemap", diff --git a/services/ui/ws/server_window_compositor_frame_sink_manager.h b/services/ui/ws/server_window_compositor_frame_sink_manager.h index aadeccac6c9b59..7256b1bb0fc308 100644 --- a/services/ui/ws/server_window_compositor_frame_sink_manager.h +++ b/services/ui/ws/server_window_compositor_frame_sink_manager.h @@ -6,12 +6,12 @@ #define SERVICES_UI_WS_SERVER_WINDOW_COMPOSITOR_FRAME_SINK_MANAGER_H_ #include "base/macros.h" -#include "cc/ipc/compositor_frame.mojom.h" #include "components/viz/common/gpu/context_provider.h" #include "components/viz/common/surfaces/surface_id.h" #include "mojo/public/cpp/bindings/binding.h" #include "services/ui/public/interfaces/window_tree.mojom.h" #include "services/viz/compositing/privileged/interfaces/frame_sink_manager.mojom.h" +#include "services/viz/public/interfaces/compositing/compositor_frame.mojom.h" namespace ui { namespace ws { diff --git a/services/viz/public/cpp/compositing/BUILD.gn b/services/viz/public/cpp/compositing/BUILD.gn index 07d43245aa7e8f..8ac67f59d99d4c 100644 --- a/services/viz/public/cpp/compositing/BUILD.gn +++ b/services/viz/public/cpp/compositing/BUILD.gn @@ -12,6 +12,7 @@ source_set("tests") { deps = [ "//base/test:test_support", "//components/viz/common:common", + "//components/viz/test:test_support", "//media/capture/mojo:capture_types", "//services/service_manager/public/cpp", "//services/service_manager/public/cpp:service_test_support", diff --git a/services/viz/public/cpp/compositing/DEPS b/services/viz/public/cpp/compositing/DEPS index 4debd2195b8f9d..d1586ba9ca7a55 100644 --- a/services/viz/public/cpp/compositing/DEPS +++ b/services/viz/public/cpp/compositing/DEPS @@ -1,3 +1,9 @@ include_rules = [ + "+ui/gfx/ipc", "+ui/gfx/mojo", + "+ui/gfx/geometry/mojo", + "+cc", + "+gpu/ipc", + "+skia/public/interfaces", + "+ui/latency/mojo", ] diff --git a/services/viz/public/cpp/compositing/compositor_frame.typemap b/services/viz/public/cpp/compositing/compositor_frame.typemap new file mode 100644 index 00000000000000..353a7af7b31201 --- /dev/null +++ b/services/viz/public/cpp/compositing/compositor_frame.typemap @@ -0,0 +1,15 @@ +# Copyright 2016 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +mojom = "//services/viz/public/interfaces/compositing/compositor_frame.mojom" +public_headers = [ "//cc/output/compositor_frame.h" ] +traits_headers = + [ "//services/viz/public/cpp/compositing/compositor_frame_struct_traits.h" ] +sources = [ + "//services/viz/public/cpp/compositing/compositor_frame_struct_traits.cc", +] +deps = [ + "//cc", +] +type_mappings = [ "viz.mojom.CompositorFrame=cc::CompositorFrame[move_only]" ] diff --git a/cc/ipc/compositor_frame_for_blink.typemap b/services/viz/public/cpp/compositing/compositor_frame_for_blink.typemap similarity index 81% rename from cc/ipc/compositor_frame_for_blink.typemap rename to services/viz/public/cpp/compositing/compositor_frame_for_blink.typemap index 9fbd8a96723b05..256c13ff84ce82 100644 --- a/cc/ipc/compositor_frame_for_blink.typemap +++ b/services/viz/public/cpp/compositing/compositor_frame_for_blink.typemap @@ -2,11 +2,10 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -mojom = "//cc/ipc/compositor_frame.mojom" +mojom = "//services/viz/public/interfaces/compositing/compositor_frame.mojom" public_headers = [ "//cc/output/compositor_frame.h" ] traits_headers = [ "//cc/ipc/compositor_frame_metadata_struct_traits.h", - "//cc/ipc/compositor_frame_struct_traits.h", "//cc/ipc/filter_operation_struct_traits.h", "//cc/ipc/filter_operations_struct_traits.h", "//cc/ipc/render_pass_struct_traits.h", @@ -19,6 +18,7 @@ traits_headers = [ "//gpu/ipc/common/sync_token_struct_traits.h", "//ipc/ipc_message_utils.h", "//mojo/common/common_custom_types_struct_traits.h", + "//services/viz/public/cpp/compositing/compositor_frame_struct_traits.h", "//skia/public/interfaces/image_filter_struct_traits.h", "//ui/gfx/mojo/selection_bound_struct_traits.h", "//ui/gfx/mojo/transform_struct_traits.h", @@ -29,9 +29,10 @@ public_deps = [ "//cc/ipc:interfaces", "//gpu/ipc/common:interfaces", "//mojo/common:common_custom_types", + "//services/viz/public/interfaces/compositing", "//skia/public/interfaces", "//ui/gfx/geometry/mojo", "//ui/gfx/mojo", "//ui/latency/mojo:interfaces", ] -type_mappings = [ "cc.mojom.CompositorFrame=cc::CompositorFrame[move_only]" ] +type_mappings = [ "viz.mojom.CompositorFrame=cc::CompositorFrame[move_only]" ] diff --git a/cc/ipc/compositor_frame_struct_traits.cc b/services/viz/public/cpp/compositing/compositor_frame_struct_traits.cc similarity index 64% rename from cc/ipc/compositor_frame_struct_traits.cc rename to services/viz/public/cpp/compositing/compositor_frame_struct_traits.cc index f06f3704e64e43..c9bfd12064451d 100644 --- a/cc/ipc/compositor_frame_struct_traits.cc +++ b/services/viz/public/cpp/compositing/compositor_frame_struct_traits.cc @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "cc/ipc/compositor_frame_struct_traits.h" +#include "services/viz/public/cpp/compositing/compositor_frame_struct_traits.h" + #include "cc/ipc/compositor_frame_metadata_struct_traits.h" #include "cc/ipc/render_pass_struct_traits.h" #include "cc/ipc/transferable_resource_struct_traits.h" @@ -10,10 +11,8 @@ namespace mojo { // static -bool StructTraits::Read(cc::mojom::CompositorFrameDataView - data, - cc::CompositorFrame* out) { +bool StructTraits:: + Read(viz::mojom::CompositorFrameDataView data, cc::CompositorFrame* out) { return data.ReadPasses(&out->render_pass_list) && !out->render_pass_list.empty() && data.ReadMetadata(&out->metadata) && data.ReadResources(&out->resource_list); diff --git a/cc/ipc/compositor_frame_struct_traits.h b/services/viz/public/cpp/compositing/compositor_frame_struct_traits.h similarity index 59% rename from cc/ipc/compositor_frame_struct_traits.h rename to services/viz/public/cpp/compositing/compositor_frame_struct_traits.h index a90dd6fa3c5c85..c85ce804d76aef 100644 --- a/cc/ipc/compositor_frame_struct_traits.h +++ b/services/viz/public/cpp/compositing/compositor_frame_struct_traits.h @@ -2,16 +2,18 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CC_IPC_COMPOSITOR_FRAME_STRUCT_TRAITS_H_ -#define CC_IPC_COMPOSITOR_FRAME_STRUCT_TRAITS_H_ +#ifndef SERVICES_VIZ_PUBLIC_CPP_COMPOSITING_COMPOSITOR_FRAME_STRUCT_TRAITS_H_ +#define SERVICES_VIZ_PUBLIC_CPP_COMPOSITING_COMPOSITOR_FRAME_STRUCT_TRAITS_H_ + +#include -#include "cc/ipc/compositor_frame.mojom-shared.h" #include "cc/output/compositor_frame.h" +#include "services/viz/public/interfaces/compositing/compositor_frame.mojom-shared.h" namespace mojo { template <> -struct StructTraits { +struct StructTraits { static const cc::CompositorFrameMetadata& metadata( const cc::CompositorFrame& input) { return input.metadata; @@ -26,10 +28,10 @@ struct StructTraits { return input.render_pass_list; } - static bool Read(cc::mojom::CompositorFrameDataView data, + static bool Read(viz::mojom::CompositorFrameDataView data, cc::CompositorFrame* out); }; } // namespace mojo -#endif // CC_IPC_COMPOSITOR_FRAME_STRUCT_TRAITS_H_ +#endif // SERVICES_VIZ_PUBLIC_CPP_COMPOSITING_COMPOSITOR_FRAME_STRUCT_TRAITS_H_ diff --git a/services/viz/public/cpp/compositing/struct_traits_unittest.cc b/services/viz/public/cpp/compositing/struct_traits_unittest.cc index 8b9eb28daace22..a989f48f0fd7e8 100644 --- a/services/viz/public/cpp/compositing/struct_traits_unittest.cc +++ b/services/viz/public/cpp/compositing/struct_traits_unittest.cc @@ -5,10 +5,51 @@ #include #include "base/message_loop/message_loop.h" +#include "cc/ipc/begin_frame_args_struct_traits.h" +#include "cc/ipc/compositor_frame_metadata_struct_traits.h" +#include "cc/ipc/copy_output_request_struct_traits.h" +#include "cc/ipc/copy_output_result_struct_traits.h" +#include "cc/ipc/filter_operation_struct_traits.h" +#include "cc/ipc/filter_operations_struct_traits.h" +#include "cc/ipc/frame_sink_id_struct_traits.h" +#include "cc/ipc/local_surface_id_struct_traits.h" +#include "cc/ipc/quads_struct_traits.h" +#include "cc/ipc/render_pass_struct_traits.h" +#include "cc/ipc/returned_resource_struct_traits.h" +#include "cc/ipc/selection_struct_traits.h" +#include "cc/ipc/shared_quad_state_struct_traits.h" +#include "cc/ipc/surface_id_struct_traits.h" +#include "cc/ipc/surface_sequence_struct_traits.h" +#include "cc/ipc/texture_mailbox_struct_traits.h" +#include "cc/ipc/transferable_resource_struct_traits.h" +#include "cc/output/compositor_frame.h" +#include "cc/quads/debug_border_draw_quad.h" +#include "cc/quads/render_pass.h" +#include "cc/quads/solid_color_draw_quad.h" +#include "components/viz/common/frame_sinks/begin_frame_args.h" +#include "components/viz/common/quads/resource_format.h" #include "components/viz/common/resources/resource_settings.h" +#include "components/viz/common/resources/transferable_resource.h" +#include "components/viz/test/begin_frame_args_test.h" +#include "gpu/ipc/common/mailbox_holder_struct_traits.h" +#include "gpu/ipc/common/mailbox_struct_traits.h" +#include "gpu/ipc/common/sync_token_struct_traits.h" +#include "ipc/ipc_message_utils.h" +#include "mojo/common/common_custom_types_struct_traits.h" #include "mojo/public/cpp/bindings/binding_set.h" +#include "services/viz/public/cpp/compositing/compositor_frame_struct_traits.h" #include "services/viz/public/cpp/compositing/resource_settings_struct_traits.h" +#include "services/viz/public/interfaces/compositing/compositor_frame.mojom.h" +#include "skia/public/interfaces/bitmap_skbitmap_struct_traits.h" +#include "skia/public/interfaces/blur_image_filter_tile_mode_struct_traits.h" +#include "skia/public/interfaces/image_filter_struct_traits.h" #include "testing/gtest/include/gtest/gtest.h" +#include "ui/gfx/geometry/mojo/geometry_struct_traits.h" +#include "ui/gfx/ipc/color/gfx_param_traits.h" +#include "ui/gfx/mojo/buffer_types_struct_traits.h" +#include "ui/gfx/mojo/selection_bound_struct_traits.h" +#include "ui/gfx/mojo/transform_struct_traits.h" +#include "ui/latency/mojo/latency_info_struct_traits.h" namespace viz { @@ -36,6 +77,129 @@ TEST_F(StructTraitsTest, ResourceSettings) { output.buffer_to_texture_target_map); } +// Note that this is a fairly trivial test of CompositorFrame serialization as +// most of the heavy lifting has already been done by CompositorFrameMetadata, +// RenderPass, and QuadListBasic unit tests. +TEST_F(StructTraitsTest, CompositorFrame) { + std::unique_ptr render_pass = cc::RenderPass::Create(); + render_pass->SetNew(1, gfx::Rect(5, 6), gfx::Rect(2, 3), gfx::Transform()); + + // SharedQuadState. + const gfx::Transform sqs_quad_to_target_transform( + 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f, 9.f, 10.f, 11.f, 12.f, 13.f, 14.f, + 15.f, 16.f); + const gfx::Rect sqs_layer_rect(1234, 5678); + const gfx::Rect sqs_visible_layer_rect(12, 34, 56, 78); + const gfx::Rect sqs_clip_rect(123, 456, 789, 101112); + const bool sqs_is_clipped = true; + const float sqs_opacity = 0.9f; + const SkBlendMode sqs_blend_mode = SkBlendMode::kSrcOver; + const int sqs_sorting_context_id = 1337; + cc::SharedQuadState* sqs = render_pass->CreateAndAppendSharedQuadState(); + sqs->SetAll(sqs_quad_to_target_transform, sqs_layer_rect, + sqs_visible_layer_rect, sqs_clip_rect, sqs_is_clipped, + sqs_opacity, sqs_blend_mode, sqs_sorting_context_id); + + // DebugBorderDrawQuad. + const gfx::Rect rect1(1234, 4321, 1357, 7531); + const SkColor color1 = SK_ColorRED; + const int32_t width1 = 1337; + cc::DebugBorderDrawQuad* debug_quad = + render_pass->CreateAndAppendDrawQuad(); + debug_quad->SetNew(sqs, rect1, rect1, color1, width1); + + // SolidColorDrawQuad. + const gfx::Rect rect2(2468, 8642, 4321, 1234); + const uint32_t color2 = 0xffffffff; + const bool force_anti_aliasing_off = true; + cc::SolidColorDrawQuad* solid_quad = + render_pass->CreateAndAppendDrawQuad(); + solid_quad->SetNew(sqs, rect2, rect2, color2, force_anti_aliasing_off); + + // TransferableResource constants. + const uint32_t tr_id = 1337; + const ResourceFormat tr_format = ALPHA_8; + const gfx::BufferFormat tr_buffer_format = gfx::BufferFormat::R_8; + const uint32_t tr_filter = 1234; + const gfx::Size tr_size(1234, 5678); + TransferableResource resource; + resource.id = tr_id; + resource.format = tr_format; + resource.buffer_format = tr_buffer_format; + resource.filter = tr_filter; + resource.size = tr_size; + + // CompositorFrameMetadata constants. + const float device_scale_factor = 2.6f; + const gfx::Vector2dF root_scroll_offset(1234.5f, 6789.1f); + const float page_scale_factor = 1337.5f; + const gfx::SizeF scrollable_viewport_size(1337.7f, 1234.5f); + const uint32_t content_source_id = 3; + const BeginFrameAck begin_frame_ack(5, 10, false); + + cc::CompositorFrame input; + input.metadata.device_scale_factor = device_scale_factor; + input.metadata.root_scroll_offset = root_scroll_offset; + input.metadata.page_scale_factor = page_scale_factor; + input.metadata.scrollable_viewport_size = scrollable_viewport_size; + input.render_pass_list.push_back(std::move(render_pass)); + input.resource_list.push_back(resource); + input.metadata.content_source_id = content_source_id; + input.metadata.begin_frame_ack = begin_frame_ack; + + cc::CompositorFrame output; + mojom::CompositorFrame::Deserialize(mojom::CompositorFrame::Serialize(&input), + &output); + + EXPECT_EQ(device_scale_factor, output.metadata.device_scale_factor); + EXPECT_EQ(root_scroll_offset, output.metadata.root_scroll_offset); + EXPECT_EQ(page_scale_factor, output.metadata.page_scale_factor); + EXPECT_EQ(scrollable_viewport_size, output.metadata.scrollable_viewport_size); + EXPECT_EQ(content_source_id, output.metadata.content_source_id); + EXPECT_EQ(begin_frame_ack, output.metadata.begin_frame_ack); + + ASSERT_EQ(1u, output.resource_list.size()); + TransferableResource out_resource = output.resource_list[0]; + EXPECT_EQ(tr_id, out_resource.id); + EXPECT_EQ(tr_format, out_resource.format); + EXPECT_EQ(tr_buffer_format, out_resource.buffer_format); + EXPECT_EQ(tr_filter, out_resource.filter); + EXPECT_EQ(tr_size, out_resource.size); + + EXPECT_EQ(1u, output.render_pass_list.size()); + const cc::RenderPass* out_render_pass = output.render_pass_list[0].get(); + ASSERT_EQ(2u, out_render_pass->quad_list.size()); + ASSERT_EQ(1u, out_render_pass->shared_quad_state_list.size()); + + const cc::SharedQuadState* out_sqs = + out_render_pass->shared_quad_state_list.ElementAt(0); + EXPECT_EQ(sqs_quad_to_target_transform, out_sqs->quad_to_target_transform); + EXPECT_EQ(sqs_layer_rect, out_sqs->quad_layer_rect); + EXPECT_EQ(sqs_visible_layer_rect, out_sqs->visible_quad_layer_rect); + EXPECT_EQ(sqs_clip_rect, out_sqs->clip_rect); + EXPECT_EQ(sqs_is_clipped, out_sqs->is_clipped); + EXPECT_EQ(sqs_opacity, out_sqs->opacity); + EXPECT_EQ(sqs_blend_mode, out_sqs->blend_mode); + EXPECT_EQ(sqs_sorting_context_id, out_sqs->sorting_context_id); + + const cc::DebugBorderDrawQuad* out_debug_border_draw_quad = + cc::DebugBorderDrawQuad::MaterialCast( + out_render_pass->quad_list.ElementAt(0)); + EXPECT_EQ(rect1, out_debug_border_draw_quad->rect); + EXPECT_EQ(rect1, out_debug_border_draw_quad->visible_rect); + EXPECT_EQ(color1, out_debug_border_draw_quad->color); + EXPECT_EQ(width1, out_debug_border_draw_quad->width); + + const cc::SolidColorDrawQuad* out_solid_color_draw_quad = + cc::SolidColorDrawQuad::MaterialCast( + out_render_pass->quad_list.ElementAt(1)); + EXPECT_EQ(rect2, out_solid_color_draw_quad->rect); + EXPECT_EQ(rect2, out_solid_color_draw_quad->visible_rect); + EXPECT_EQ(color2, out_solid_color_draw_quad->color); + EXPECT_EQ(force_anti_aliasing_off, + out_solid_color_draw_quad->force_anti_aliasing_off); +} + } // namespace } // namespace viz diff --git a/services/viz/public/cpp/compositing/typemaps.gni b/services/viz/public/cpp/compositing/typemaps.gni index 56c999e97c5478..7af5e5caf71776 100644 --- a/services/viz/public/cpp/compositing/typemaps.gni +++ b/services/viz/public/cpp/compositing/typemaps.gni @@ -2,4 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -typemaps = [ "//services/viz/public/cpp/compositing/resource_settings.typemap" ] +typemaps = [ + "//services/viz/public/cpp/compositing/compositor_frame.typemap", + "//services/viz/public/cpp/compositing/resource_settings.typemap", +] diff --git a/services/viz/public/interfaces/compositing/BUILD.gn b/services/viz/public/interfaces/compositing/BUILD.gn index a5b00cd41004c9..2f551cc7d6ea0e 100644 --- a/services/viz/public/interfaces/compositing/BUILD.gn +++ b/services/viz/public/interfaces/compositing/BUILD.gn @@ -6,6 +6,7 @@ import("//mojo/public/tools/bindings/mojom.gni") mojom("compositing") { sources = [ + "compositor_frame.mojom", "compositor_frame_sink.mojom", "resource_settings.mojom", ] diff --git a/cc/ipc/compositor_frame.mojom b/services/viz/public/interfaces/compositing/compositor_frame.mojom similarity index 96% rename from cc/ipc/compositor_frame.mojom rename to services/viz/public/interfaces/compositing/compositor_frame.mojom index e32e1ef1a72322..ad7d6bb6eeee85 100644 --- a/cc/ipc/compositor_frame.mojom +++ b/services/viz/public/interfaces/compositing/compositor_frame.mojom @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -module cc.mojom; +module viz.mojom; import "cc/ipc/compositor_frame_metadata.mojom"; import "cc/ipc/render_pass.mojom"; diff --git a/services/viz/public/interfaces/compositing/compositor_frame_sink.mojom b/services/viz/public/interfaces/compositing/compositor_frame_sink.mojom index fb7396e0309dbc..21c512c1dda8cf 100644 --- a/services/viz/public/interfaces/compositing/compositor_frame_sink.mojom +++ b/services/viz/public/interfaces/compositing/compositor_frame_sink.mojom @@ -5,13 +5,13 @@ module viz.mojom; import "cc/ipc/begin_frame_args.mojom"; -import "cc/ipc/compositor_frame.mojom"; import "cc/ipc/copy_output_request.mojom"; import "cc/ipc/frame_sink_id.mojom"; import "cc/ipc/local_surface_id.mojom"; import "cc/ipc/surface_id.mojom"; import "cc/ipc/returned_resource.mojom"; import "cc/ipc/surface_sequence.mojom"; +import "services/viz/public/interfaces/compositing/compositor_frame.mojom"; import "ui/gfx/geometry/mojo/geometry.mojom"; // A CompositorFrameSink is an interface for receiving CompositorFrame @@ -33,7 +33,7 @@ interface CompositorFrameSink { // DidReceiveCompositorFrameAck() asynchronously when the frame has been // processed in order to unthrottle the next frame. SubmitCompositorFrame(cc.mojom.LocalSurfaceId local_surface_id, - cc.mojom.CompositorFrame frame); + viz.mojom.CompositorFrame frame); // Notifies the frame sink that a BeginFrame was completed, but that no // CompositorFrame was produced as a result of it. diff --git a/third_party/WebKit/public/blink_typemaps.gni b/third_party/WebKit/public/blink_typemaps.gni index 26ee3c642d8e0f..689961043e2759 100644 --- a/third_party/WebKit/public/blink_typemaps.gni +++ b/third_party/WebKit/public/blink_typemaps.gni @@ -4,7 +4,7 @@ typemaps = [ "//cc/ipc/begin_frame_args_for_blink.typemap", - "//cc/ipc/compositor_frame_for_blink.typemap", + "//services/viz/public/cpp/compositing/compositor_frame_for_blink.typemap", "//cc/ipc/frame_sink_id.typemap", "//cc/ipc/local_surface_id.typemap", "//cc/ipc/returned_resource.typemap",