Skip to content

Commit

Permalink
Implement CompositorFrame StructTraits
Browse files Browse the repository at this point in the history
This CL implements CompositorFrame StructTraits. This CL
deletes surfaces type converters, and updates call sites.

In a subsequent CL, I'll add a perf test comparable to
ParamTraits.

CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel
TBR=ben@chromium.org for content/renderer/mus
BUG=611802

Review-Url: https://codereview.chromium.org/2092843002
Cr-Commit-Position: refs/heads/master@{#402199}
  • Loading branch information
fsamuel authored and Commit bot committed Jun 27, 2016
1 parent b16eada commit ce098fb
Show file tree
Hide file tree
Showing 38 changed files with 323 additions and 294 deletions.
2 changes: 2 additions & 0 deletions cc/ipc/DEPS
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,6 @@ include_rules = [
"+mojo/public",
"+skia/public",
"+ui/events/ipc",
"+ui/events/mojo",
"+ui/gfx/geometry/mojo",
]
15 changes: 15 additions & 0 deletions cc/ipc/compositor_frame.typemap
Original file line number Diff line number Diff line change
@@ -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 = "//cc/ipc/compositor_frame.mojom"
public_headers = [ "//cc/output/compositor_frame.h" ]
traits_headers = [ "//cc/ipc/compositor_frame_struct_traits.h" ]
sources = [
"//cc/ipc/compositor_frame_struct_traits.cc",
]
public_deps = [
"//cc",
]
type_mappings =
[ "cc.mojom.CompositorFrame=cc::CompositorFrame[pass_by_value]" ]
12 changes: 10 additions & 2 deletions cc/ipc/compositor_frame_metadata.typemap
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,13 @@
mojom = "//cc/ipc/compositor_frame_metadata.mojom"
public_headers = [ "//cc/output/compositor_frame_metadata.h" ]
traits_headers = [ "//cc/ipc/compositor_frame_metadata_struct_traits.h" ]
deps = [ "//cc", "//ui/gfx", "//ui/events:events_base" ]
type_mappings = [ "cc.mojom.CompositorFrameMetadata=cc::CompositorFrameMetadata" ]
sources = [
"//cc/ipc/compositor_frame_metadata_struct_traits.cc",
]
deps = [
"//cc",
"//ui/events:events_base",
"//ui/gfx",
]
type_mappings =
[ "cc.mojom.CompositorFrameMetadata=cc::CompositorFrameMetadata" ]
45 changes: 45 additions & 0 deletions cc/ipc/compositor_frame_metadata_struct_traits.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// 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.

#include "cc/ipc/compositor_frame_metadata_struct_traits.h"
#include "cc/ipc/selection_struct_traits.h"
#include "cc/ipc/surface_id_struct_traits.h"
#include "ui/events/mojo/latency_info_struct_traits.h"
#include "ui/gfx/mojo/selection_bound_struct_traits.h"

namespace mojo {

// static
bool StructTraits<cc::mojom::CompositorFrameMetadata,
cc::CompositorFrameMetadata>::
Read(cc::mojom::CompositorFrameMetadataDataView data,
cc::CompositorFrameMetadata* out) {
out->device_scale_factor = data.device_scale_factor();
if (!data.ReadRootScrollOffset(&out->root_scroll_offset))
return false;

out->page_scale_factor = data.page_scale_factor();
if (!data.ReadScrollableViewportSize(&out->scrollable_viewport_size) ||
!data.ReadRootLayerSize(&out->root_layer_size)) {
return false;
}

out->min_page_scale_factor = data.min_page_scale_factor();
out->max_page_scale_factor = data.max_page_scale_factor();
out->root_overflow_x_hidden = data.root_overflow_x_hidden();
out->root_overflow_y_hidden = data.root_overflow_y_hidden();
if (!data.ReadLocationBarOffset(&out->location_bar_offset) ||
!data.ReadLocationBarContentTranslation(
&out->location_bar_content_translation)) {
return false;
}

out->root_background_color = data.root_background_color();
return data.ReadSelection(&out->selection) &&
data.ReadLatencyInfo(&out->latency_info) &&
data.ReadSatisfiesSequences(&out->satisfies_sequences) &&
data.ReadReferencedSurfaces(&out->referenced_surfaces);
}

} // namespace mojo
31 changes: 1 addition & 30 deletions cc/ipc/compositor_frame_metadata_struct_traits.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,36 +93,7 @@ struct StructTraits<cc::mojom::CompositorFrameMetadata,
}

static bool Read(cc::mojom::CompositorFrameMetadataDataView data,
cc::CompositorFrameMetadata* out) {
out->device_scale_factor = data.device_scale_factor();
if (!data.ReadRootScrollOffset(&out->root_scroll_offset))
return false;

out->page_scale_factor = data.page_scale_factor();
if (!data.ReadScrollableViewportSize(&out->scrollable_viewport_size) ||
!data.ReadRootLayerSize(&out->root_layer_size)) {
return false;
}

out->min_page_scale_factor = data.min_page_scale_factor();
out->max_page_scale_factor = data.max_page_scale_factor();
out->root_overflow_x_hidden = data.root_overflow_x_hidden();
out->root_overflow_y_hidden = data.root_overflow_y_hidden();
if (!data.ReadLocationBarOffset(&out->location_bar_offset) ||
!data.ReadLocationBarContentTranslation(
&out->location_bar_content_translation)) {
return false;
}

out->root_background_color = data.root_background_color();
if (!data.ReadSelection(&out->selection) ||
!data.ReadLatencyInfo(&out->latency_info) ||
!data.ReadSatisfiesSequences(&out->satisfies_sequences) ||
!data.ReadReferencedSurfaces(&out->referenced_surfaces)) {
return false;
}
return true;
}
cc::CompositorFrameMetadata* out);
};

} // namespace mojo
Expand Down
24 changes: 24 additions & 0 deletions cc/ipc/compositor_frame_struct_traits.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// 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.

#include "cc/ipc/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"

namespace mojo {

// static
bool StructTraits<cc::mojom::CompositorFrame, cc::CompositorFrame>::Read(
cc::mojom::CompositorFrameDataView data,
cc::CompositorFrame* out) {
if (!data.ReadMetadata(&out->metadata))
return false;

out->delegated_frame_data.reset(new cc::DelegatedFrameData());
return data.ReadResources(&out->delegated_frame_data->resource_list) &&
data.ReadPasses(&out->delegated_frame_data->render_pass_list);
}

} // namespace mojo
35 changes: 35 additions & 0 deletions cc/ipc/compositor_frame_struct_traits.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// 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.

#ifndef CC_IPC_COMPOSITOR_FRAME_STRUCT_TRAITS_H_
#define CC_IPC_COMPOSITOR_FRAME_STRUCT_TRAITS_H_

#include "cc/ipc/compositor_frame.mojom.h"
#include "cc/output/compositor_frame.h"

namespace mojo {

template <>
struct StructTraits<cc::mojom::CompositorFrame, cc::CompositorFrame> {
static const cc::CompositorFrameMetadata& metadata(
const cc::CompositorFrame& input) {
return input.metadata;
}

static const cc::TransferableResourceArray& resources(
const cc::CompositorFrame& input) {
return input.delegated_frame_data->resource_list;
}

static const cc::RenderPassList& passes(const cc::CompositorFrame& input) {
return input.delegated_frame_data->render_pass_list;
}

static bool Read(cc::mojom::CompositorFrameDataView data,
cc::CompositorFrame* out);
};

} // namespace mojo

#endif // CC_IPC_COMPOSITOR_FRAME_STRUCT_TRAITS_H_
123 changes: 123 additions & 0 deletions cc/ipc/struct_traits_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,12 @@ class StructTraitsTest : public testing::Test, public mojom::TraitsTestService {
callback.Run(b);
}

void EchoCompositorFrame(
CompositorFrame c,
const EchoCompositorFrameCallback& callback) override {
callback.Run(std::move(c));
}

void EchoCompositorFrameMetadata(
const CompositorFrameMetadata& c,
const EchoCompositorFrameMetadataCallback& callback) override {
Expand Down Expand Up @@ -133,6 +139,123 @@ TEST_F(StructTraitsTest, BeginFrameArgs) {
EXPECT_EQ(on_critical_path, output.on_critical_path);
}

// 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<RenderPass> render_pass = RenderPass::Create();

// 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::Size sqs_layer_bounds(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 SkXfermode::Mode sqs_blend_mode = SkXfermode::kSrcOver_Mode;
const int sqs_sorting_context_id = 1337;
SharedQuadState* sqs = render_pass->CreateAndAppendSharedQuadState();
sqs->SetAll(sqs_quad_to_target_transform, sqs_layer_bounds,
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<DebugBorderDrawQuad>();
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<SolidColorDrawQuad>();
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 uint32_t tr_filter = 1234;
const gfx::Size tr_size(1234, 5678);
TransferableResource resource;
resource.id = tr_id;
resource.format = tr_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);

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.delegated_frame_data.reset(new DelegatedFrameData);
input.delegated_frame_data->render_pass_list.push_back(
std::move(render_pass));
input.delegated_frame_data->resource_list.push_back(resource);

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_NE(nullptr, output.delegated_frame_data);
ASSERT_EQ(1u, output.delegated_frame_data->resource_list.size());
TransferableResource out_resource =
output.delegated_frame_data->resource_list[0];
EXPECT_EQ(tr_id, out_resource.id);
EXPECT_EQ(tr_format, out_resource.format);
EXPECT_EQ(tr_filter, out_resource.filter);
EXPECT_EQ(tr_size, out_resource.size);

EXPECT_EQ(1u, output.delegated_frame_data->render_pass_list.size());
const RenderPass* out_render_pass =
output.delegated_frame_data->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_bounds, out_sqs->quad_layer_bounds);
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);
Expand Down
4 changes: 4 additions & 0 deletions cc/ipc/traits_test_service.mojom
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
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/filter_operation.mojom";
import "cc/ipc/filter_operations.mojom";
Expand All @@ -24,6 +25,9 @@ interface TraitsTestService {
[Sync]
EchoBeginFrameArgs(BeginFrameArgs b) => (BeginFrameArgs pass);

[Sync]
EchoCompositorFrame(CompositorFrame c) => (CompositorFrame pass);

[Sync]
EchoCompositorFrameMetadata(CompositorFrameMetadata c) =>
(CompositorFrameMetadata pass);
Expand Down
12 changes: 10 additions & 2 deletions cc/ipc/transferable_resource.typemap
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,19 @@
mojom = "//cc/ipc/transferable_resource.mojom"
public_headers = [ "//cc/resources/transferable_resource.h" ]
traits_headers = [ "//cc/ipc/transferable_resource_struct_traits.h" ]
deps = [ "//cc", "//gpu/command_buffer/common", "//skia",]
sources = [
"//cc/ipc/transferable_resource_struct_traits.cc",
]
deps = [
"//cc",
"//gpu/command_buffer/common",
"//skia",
]
public_deps = [
"//cc",
"//gpu/command_buffer/common",
"//skia", "//ui/gfx",
"//skia",
"//ui/gfx",
"//ui/gfx/geometry",
]
type_mappings = [ "cc.mojom.TransferableResource=cc::TransferableResource" ]
29 changes: 29 additions & 0 deletions cc/ipc/transferable_resource_struct_traits.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// 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.

#include "cc/ipc/transferable_resource_struct_traits.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 "ui/gfx/geometry/mojo/geometry_struct_traits.h"

namespace mojo {

// static
bool StructTraits<cc::mojom::TransferableResource, cc::TransferableResource>::
Read(cc::mojom::TransferableResourceDataView data,
cc::TransferableResource* out) {
if (!data.ReadSize(&out->size) ||
!data.ReadMailboxHolder(&out->mailbox_holder))
return false;
out->id = data.id();
out->format = static_cast<cc::ResourceFormat>(data.format());
out->filter = data.filter();
out->read_lock_fences_enabled = data.read_lock_fences_enabled();
out->is_software = data.is_software();
out->is_overlay_candidate = data.is_overlay_candidate();
return true;
}

} // namespace mojo
Loading

0 comments on commit ce098fb

Please sign in to comment.