blob: 6f9486983e87f3d3b110cc3ae3e9ae872069aebe [file] [log] [blame]
// 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 "base/message_loop/message_loop.h"
#include "cc/input/selection.h"
#include "cc/ipc/traits_test_service.mojom.h"
#include "cc/quads/debug_border_draw_quad.h"
#include "cc/quads/render_pass.h"
#include "cc/quads/render_pass_draw_quad.h"
#include "cc/quads/render_pass_id.h"
#include "cc/quads/solid_color_draw_quad.h"
#include "cc/quads/surface_draw_quad.h"
#include "cc/quads/yuv_video_draw_quad.h"
#include "mojo/public/cpp/bindings/binding_set.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/skia/include/core/SkString.h"
#include "third_party/skia/include/effects/SkDropShadowImageFilter.h"
namespace cc {
namespace {
class StructTraitsTest : public testing::Test, public mojom::TraitsTestService {
public:
StructTraitsTest() {}
protected:
mojom::TraitsTestServicePtr GetTraitsTestProxy() {
return traits_test_bindings_.CreateInterfacePtrAndBind(this);
}
private:
// TraitsTestService:
void EchoBeginFrameArgs(const BeginFrameArgs& b,
const EchoBeginFrameArgsCallback& callback) override {
callback.Run(b);
}
void EchoCompositorFrameMetadata(
const CompositorFrameMetadata& c,
const EchoCompositorFrameMetadataCallback& callback) override {
callback.Run(c);
}
void EchoFilterOperation(
const FilterOperation& f,
const EchoFilterOperationCallback& callback) override {
callback.Run(f);
}
void EchoFilterOperations(
const FilterOperations& f,
const EchoFilterOperationsCallback& callback) override {
callback.Run(f);
}
void EchoQuadList(const QuadList& q,
const EchoQuadListCallback& callback) override {
callback.Run(q);
}
void EchoRenderPassId(const RenderPassId& r,
const EchoRenderPassIdCallback& callback) override {
callback.Run(r);
}
void EchoReturnedResource(
const ReturnedResource& r,
const EchoReturnedResourceCallback& callback) override {
callback.Run(r);
}
void EchoSelection(const Selection<gfx::SelectionBound>& s,
const EchoSelectionCallback& callback) override {
callback.Run(s);
}
void EchoSharedQuadState(
const SharedQuadState& s,
const EchoSharedQuadStateCallback& callback) override {
callback.Run(s);
}
void EchoSurfaceId(const SurfaceId& s,
const EchoSurfaceIdCallback& callback) override {
callback.Run(s);
}
void EchoSurfaceSequence(
const SurfaceSequence& s,
const EchoSurfaceSequenceCallback& callback) override {
callback.Run(s);
}
void EchoTransferableResource(
const TransferableResource& t,
const EchoTransferableResourceCallback& callback) override {
callback.Run(t);
}
mojo::BindingSet<TraitsTestService> traits_test_bindings_;
DISALLOW_COPY_AND_ASSIGN(StructTraitsTest);
};
} // namespace
TEST_F(StructTraitsTest, BeginFrameArgs) {
const base::TimeTicks frame_time = base::TimeTicks::Now();
const base::TimeTicks deadline = base::TimeTicks::Now();
const base::TimeDelta interval = base::TimeDelta::FromMilliseconds(1337);
const BeginFrameArgs::BeginFrameArgsType type = BeginFrameArgs::NORMAL;
const bool on_critical_path = true;
BeginFrameArgs input;
input.frame_time = frame_time;
input.deadline = deadline;
input.interval = interval;
input.type = type;
input.on_critical_path = on_critical_path;
mojom::TraitsTestServicePtr proxy = GetTraitsTestProxy();
BeginFrameArgs output;
proxy->EchoBeginFrameArgs(input, &output);
EXPECT_EQ(frame_time, output.frame_time);
EXPECT_EQ(deadline, output.deadline);
EXPECT_EQ(interval, output.interval);
EXPECT_EQ(type, output.type);
EXPECT_EQ(on_critical_path, output.on_critical_path);
}
TEST_F(StructTraitsTest, CompositorFrameMetadata) {
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 gfx::SizeF root_layer_size(1234.5f, 5432.1f);
const float min_page_scale_factor = 3.5f;
const float max_page_scale_factor = 4.6f;
const bool root_overflow_x_hidden = true;
const bool root_overflow_y_hidden = true;
const gfx::Vector2dF location_bar_offset(1234.5f, 5432.1f);
const gfx::Vector2dF location_bar_content_translation(1234.5f, 5432.1f);
const uint32_t root_background_color = 1337;
Selection<gfx::SelectionBound> selection;
selection.start.SetEdge(gfx::PointF(1234.5f, 67891.f),
gfx::PointF(5432.1f, 1987.6f));
selection.start.set_visible(true);
selection.start.set_type(gfx::SelectionBound::CENTER);
selection.end.SetEdge(gfx::PointF(1337.5f, 52124.f),
gfx::PointF(1234.3f, 8765.6f));
selection.end.set_visible(false);
selection.end.set_type(gfx::SelectionBound::RIGHT);
selection.is_editable = true;
selection.is_empty_text_form_control = true;
ui::LatencyInfo latency_info;
latency_info.AddLatencyNumber(
ui::LATENCY_BEGIN_SCROLL_LISTENER_UPDATE_MAIN_COMPONENT, 1337, 7331);
std::vector<ui::LatencyInfo> latency_infos = {latency_info};
std::vector<uint32_t> satisfies_sequences = {1234, 1337};
std::vector<SurfaceId> referenced_surfaces;
SurfaceId id(1234, 5678, 9101112);
referenced_surfaces.push_back(id);
CompositorFrameMetadata input;
input.device_scale_factor = device_scale_factor;
input.root_scroll_offset = root_scroll_offset;
input.page_scale_factor = page_scale_factor;
input.scrollable_viewport_size = scrollable_viewport_size;
input.root_layer_size = root_layer_size;
input.min_page_scale_factor = min_page_scale_factor;
input.max_page_scale_factor = max_page_scale_factor;
input.root_overflow_x_hidden = root_overflow_x_hidden;
input.root_overflow_y_hidden = root_overflow_y_hidden;
input.location_bar_offset = location_bar_offset;
input.location_bar_content_translation = location_bar_content_translation;
input.root_background_color = root_background_color;
input.selection = selection;
input.latency_info = latency_infos;
input.satisfies_sequences = satisfies_sequences;
input.referenced_surfaces = referenced_surfaces;
mojom::TraitsTestServicePtr proxy = GetTraitsTestProxy();
CompositorFrameMetadata output;
proxy->EchoCompositorFrameMetadata(input, &output);
EXPECT_EQ(device_scale_factor, output.device_scale_factor);
EXPECT_EQ(root_scroll_offset, output.root_scroll_offset);
EXPECT_EQ(page_scale_factor, output.page_scale_factor);
EXPECT_EQ(scrollable_viewport_size, output.scrollable_viewport_size);
EXPECT_EQ(root_layer_size, output.root_layer_size);
EXPECT_EQ(min_page_scale_factor, output.min_page_scale_factor);
EXPECT_EQ(max_page_scale_factor, output.max_page_scale_factor);
EXPECT_EQ(root_overflow_x_hidden, output.root_overflow_x_hidden);
EXPECT_EQ(root_overflow_y_hidden, output.root_overflow_y_hidden);
EXPECT_EQ(location_bar_offset, output.location_bar_offset);
EXPECT_EQ(location_bar_content_translation,
output.location_bar_content_translation);
EXPECT_EQ(root_background_color, output.root_background_color);
EXPECT_EQ(selection, output.selection);
EXPECT_EQ(latency_infos.size(), output.latency_info.size());
ui::LatencyInfo::LatencyComponent component;
EXPECT_TRUE(output.latency_info[0].FindLatency(
ui::LATENCY_BEGIN_SCROLL_LISTENER_UPDATE_MAIN_COMPONENT, 1337,
&component));
EXPECT_EQ(7331, component.sequence_number);
EXPECT_EQ(satisfies_sequences.size(), output.satisfies_sequences.size());
for (uint32_t i = 0; i < satisfies_sequences.size(); ++i)
EXPECT_EQ(satisfies_sequences[i], output.satisfies_sequences[i]);
EXPECT_EQ(referenced_surfaces.size(), output.referenced_surfaces.size());
for (uint32_t i = 0; i < referenced_surfaces.size(); ++i)
EXPECT_EQ(referenced_surfaces[i], output.referenced_surfaces[i]);
}
TEST_F(StructTraitsTest, FilterOperation) {
const FilterOperation inputs[] = {
FilterOperation::CreateBlurFilter(20),
FilterOperation::CreateDropShadowFilter(gfx::Point(4, 4), 4.0f,
SkColorSetARGB(255, 40, 0, 0)),
FilterOperation::CreateReferenceFilter(SkDropShadowImageFilter::Make(
SkIntToScalar(3), SkIntToScalar(8), SkIntToScalar(4),
SkIntToScalar(9), SK_ColorBLACK,
SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode,
nullptr))};
mojom::TraitsTestServicePtr proxy = GetTraitsTestProxy();
for (const auto& input : inputs) {
FilterOperation output;
proxy->EchoFilterOperation(input, &output);
EXPECT_EQ(input.type(), output.type());
switch (input.type()) {
case FilterOperation::GRAYSCALE:
case FilterOperation::SEPIA:
case FilterOperation::SATURATE:
case FilterOperation::HUE_ROTATE:
case FilterOperation::INVERT:
case FilterOperation::BRIGHTNESS:
case FilterOperation::SATURATING_BRIGHTNESS:
case FilterOperation::CONTRAST:
case FilterOperation::OPACITY:
case FilterOperation::BLUR:
EXPECT_EQ(input.amount(), output.amount());
break;
case FilterOperation::DROP_SHADOW:
EXPECT_EQ(input.amount(), output.amount());
EXPECT_EQ(input.drop_shadow_offset(), output.drop_shadow_offset());
EXPECT_EQ(input.drop_shadow_color(), output.drop_shadow_color());
break;
case FilterOperation::COLOR_MATRIX:
EXPECT_EQ(0, memcmp(input.matrix(), output.matrix(), 20));
break;
case FilterOperation::ZOOM:
EXPECT_EQ(input.amount(), output.amount());
EXPECT_EQ(input.zoom_inset(), output.zoom_inset());
break;
case FilterOperation::REFERENCE: {
SkString input_str;
input.image_filter()->toString(&input_str);
SkString output_str;
output.image_filter()->toString(&output_str);
EXPECT_EQ(input_str, output_str);
break;
}
case FilterOperation::ALPHA_THRESHOLD:
NOTREACHED();
break;
}
}
}
TEST_F(StructTraitsTest, FilterOperations) {
FilterOperations input;
input.Append(FilterOperation::CreateBlurFilter(0.f));
input.Append(FilterOperation::CreateSaturateFilter(4.f));
input.Append(FilterOperation::CreateZoomFilter(2.0f, 1));
mojom::TraitsTestServicePtr proxy = GetTraitsTestProxy();
FilterOperations output;
proxy->EchoFilterOperations(input, &output);
EXPECT_EQ(input.size(), output.size());
for (size_t i = 0; i < input.size(); ++i) {
EXPECT_EQ(input.at(i), output.at(i));
}
}
TEST_F(StructTraitsTest, QuadListBasic) {
const DrawQuad::Material material1 = DrawQuad::DEBUG_BORDER;
const DrawQuad::Material material2 = DrawQuad::SOLID_COLOR;
const DrawQuad::Material material3 = DrawQuad::SURFACE_CONTENT;
const DrawQuad::Material material4 = DrawQuad::RENDER_PASS;
const gfx::Rect rect1(1234, 4321, 1357, 7531);
const gfx::Rect rect2(2468, 8642, 4321, 1234);
const gfx::Rect rect3(1029, 3847, 5610, 2938);
const gfx::Rect rect4(1234, 5678, 9101112, 13141516);
const int32_t width1 = 1337;
const uint32_t color2 = 0xffffffff;
const SurfaceId surface_id(1234, 5678, 2468);
const RenderPassId render_pass_id(1234, 5678);
QuadList input;
DebugBorderDrawQuad* debug_quad =
input.AllocateAndConstruct<DebugBorderDrawQuad>();
debug_quad->material = material1;
debug_quad->rect = rect1;
debug_quad->width = width1;
SolidColorDrawQuad* solid_quad =
input.AllocateAndConstruct<SolidColorDrawQuad>();
solid_quad->material = material2;
solid_quad->rect = rect2;
solid_quad->color = color2;
SurfaceDrawQuad* surface_quad = input.AllocateAndConstruct<SurfaceDrawQuad>();
surface_quad->material = material3;
surface_quad->rect = rect3;
surface_quad->surface_id = surface_id;
RenderPassDrawQuad* render_pass_quad =
input.AllocateAndConstruct<RenderPassDrawQuad>();
render_pass_quad->material = material4;
render_pass_quad->rect = rect4;
render_pass_quad->render_pass_id = render_pass_id;
mojom::TraitsTestServicePtr proxy = GetTraitsTestProxy();
QuadList output;
proxy->EchoQuadList(input, &output);
ASSERT_EQ(input.size(), output.size());
ASSERT_EQ(material1, output.ElementAt(0)->material);
EXPECT_EQ(rect1, output.ElementAt(0)->rect);
EXPECT_EQ(width1,
static_cast<DebugBorderDrawQuad*>(output.ElementAt(0))->width);
ASSERT_EQ(material2, output.ElementAt(1)->material);
EXPECT_EQ(rect2, output.ElementAt(1)->rect);
EXPECT_EQ(color2,
static_cast<SolidColorDrawQuad*>(output.ElementAt(1))->color);
ASSERT_EQ(material3, output.ElementAt(2)->material);
EXPECT_EQ(rect3, output.ElementAt(2)->rect);
EXPECT_EQ(surface_id,
static_cast<SurfaceDrawQuad*>(output.ElementAt(2))->surface_id);
ASSERT_EQ(material4, output.ElementAt(3)->material);
EXPECT_EQ(rect4, output.ElementAt(3)->rect);
EXPECT_EQ(
render_pass_id,
static_cast<RenderPassDrawQuad*>(output.ElementAt(3))->render_pass_id);
}
TEST_F(StructTraitsTest, RenderPassId) {
const int layer_id = 1337;
const uint32_t index = 0xdeadbeef;
RenderPassId input(layer_id, index);
mojom::TraitsTestServicePtr proxy = GetTraitsTestProxy();
RenderPassId output;
proxy->EchoRenderPassId(input, &output);
EXPECT_EQ(layer_id, output.layer_id);
EXPECT_EQ(index, output.index);
}
TEST_F(StructTraitsTest, ReturnedResource) {
const uint32_t id = 1337;
const gpu::CommandBufferNamespace command_buffer_namespace = gpu::IN_PROCESS;
const int32_t extra_data_field = 0xbeefbeef;
const gpu::CommandBufferId command_buffer_id(
gpu::CommandBufferId::FromUnsafeValue(0xdeadbeef));
const uint64_t release_count = 0xdeadbeefdead;
const gpu::SyncToken sync_token(command_buffer_namespace, extra_data_field,
command_buffer_id, release_count);
const int count = 1234;
const bool lost = true;
ReturnedResource input;
input.id = id;
input.sync_token = sync_token;
input.count = count;
input.lost = lost;
mojom::TraitsTestServicePtr proxy = GetTraitsTestProxy();
ReturnedResource output;
proxy->EchoReturnedResource(input, &output);
EXPECT_EQ(id, output.id);
EXPECT_EQ(sync_token, output.sync_token);
EXPECT_EQ(count, output.count);
EXPECT_EQ(lost, output.lost);
}
TEST_F(StructTraitsTest, Selection) {
gfx::SelectionBound start;
start.SetEdge(gfx::PointF(1234.5f, 67891.f), gfx::PointF(5432.1f, 1987.6f));
start.set_visible(true);
start.set_type(gfx::SelectionBound::CENTER);
gfx::SelectionBound end;
end.SetEdge(gfx::PointF(1337.5f, 52124.f), gfx::PointF(1234.3f, 8765.6f));
end.set_visible(false);
end.set_type(gfx::SelectionBound::RIGHT);
const bool is_editable = true;
const bool is_empty_text_form_control = true;
Selection<gfx::SelectionBound> input;
input.start = start;
input.end = end;
input.is_editable = is_editable;
input.is_empty_text_form_control = is_empty_text_form_control;
mojom::TraitsTestServicePtr proxy = GetTraitsTestProxy();
Selection<gfx::SelectionBound> output;
proxy->EchoSelection(input, &output);
EXPECT_EQ(start, output.start);
EXPECT_EQ(end, output.end);
EXPECT_EQ(is_editable, output.is_editable);
EXPECT_EQ(is_empty_text_form_control, output.is_empty_text_form_control);
}
TEST_F(StructTraitsTest, SurfaceId) {
const uint32_t id_namespace = 1337;
const uint32_t local_id = 0xfbadbeef;
const uint64_t nonce = 0xdeadbeef;
SurfaceId input(id_namespace, local_id, nonce);
mojom::TraitsTestServicePtr proxy = GetTraitsTestProxy();
SurfaceId output;
proxy->EchoSurfaceId(input, &output);
EXPECT_EQ(id_namespace, output.id_namespace());
EXPECT_EQ(local_id, output.local_id());
EXPECT_EQ(nonce, output.nonce());
}
TEST_F(StructTraitsTest, SurfaceSequence) {
const uint32_t id_namespace = 2016;
const uint32_t sequence = 0xfbadbeef;
SurfaceSequence input(id_namespace, sequence);
mojom::TraitsTestServicePtr proxy = GetTraitsTestProxy();
SurfaceSequence output;
proxy->EchoSurfaceSequence(input, &output);
EXPECT_EQ(id_namespace, output.id_namespace);
EXPECT_EQ(sequence, output.sequence);
}
TEST_F(StructTraitsTest, SharedQuadState) {
const gfx::Transform 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 layer_bounds(1234, 5678);
const gfx::Rect visible_layer_rect(12, 34, 56, 78);
const gfx::Rect clip_rect(123, 456, 789, 101112);
const bool is_clipped = true;
const float opacity = 0.9f;
const SkXfermode::Mode blend_mode = SkXfermode::kSrcOver_Mode;
const int sorting_context_id = 1337;
SharedQuadState input_sqs;
input_sqs.SetAll(quad_to_target_transform, layer_bounds, visible_layer_rect,
clip_rect, is_clipped, opacity, blend_mode,
sorting_context_id);
mojom::TraitsTestServicePtr proxy = GetTraitsTestProxy();
SharedQuadState output_sqs;
proxy->EchoSharedQuadState(input_sqs, &output_sqs);
EXPECT_EQ(quad_to_target_transform, output_sqs.quad_to_target_transform);
EXPECT_EQ(layer_bounds, output_sqs.quad_layer_bounds);
EXPECT_EQ(visible_layer_rect, output_sqs.visible_quad_layer_rect);
EXPECT_EQ(clip_rect, output_sqs.clip_rect);
EXPECT_EQ(is_clipped, output_sqs.is_clipped);
EXPECT_EQ(opacity, output_sqs.opacity);
EXPECT_EQ(blend_mode, output_sqs.blend_mode);
EXPECT_EQ(sorting_context_id, output_sqs.sorting_context_id);
}
TEST_F(StructTraitsTest, TransferableResource) {
const uint32_t id = 1337;
const ResourceFormat format = ALPHA_8;
const uint32_t filter = 1234;
const gfx::Size size(1234, 5678);
const int8_t mailbox_name[GL_MAILBOX_SIZE_CHROMIUM] = {
0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 9, 7, 5, 3, 1, 2, 4, 6, 8, 0, 0, 9,
8, 7, 6, 5, 4, 3, 2, 1, 9, 7, 5, 3, 1, 2, 4, 6, 8, 0, 0, 9, 8, 7,
6, 5, 4, 3, 2, 1, 9, 7, 5, 3, 1, 2, 4, 6, 8, 0, 0, 9, 8, 7};
const gpu::CommandBufferNamespace command_buffer_namespace = gpu::IN_PROCESS;
const int32_t extra_data_field = 0xbeefbeef;
const gpu::CommandBufferId command_buffer_id(
gpu::CommandBufferId::FromUnsafeValue(0xdeadbeef));
const uint64_t release_count = 0xdeadbeefdeadL;
const uint32_t texture_target = 1337;
const bool read_lock_fences_enabled = true;
const bool is_software = false;
const bool is_overlay_candidate = true;
gpu::MailboxHolder mailbox_holder;
mailbox_holder.mailbox.SetName(mailbox_name);
mailbox_holder.sync_token =
gpu::SyncToken(command_buffer_namespace, extra_data_field,
command_buffer_id, release_count);
mailbox_holder.texture_target = texture_target;
TransferableResource input;
input.id = id;
input.format = format;
input.filter = filter;
input.size = size;
input.mailbox_holder = mailbox_holder;
input.read_lock_fences_enabled = read_lock_fences_enabled;
input.is_software = is_software;
input.is_overlay_candidate = is_overlay_candidate;
mojom::TraitsTestServicePtr proxy = GetTraitsTestProxy();
TransferableResource output;
proxy->EchoTransferableResource(input, &output);
EXPECT_EQ(id, output.id);
EXPECT_EQ(format, output.format);
EXPECT_EQ(filter, output.filter);
EXPECT_EQ(size, output.size);
EXPECT_EQ(mailbox_holder.mailbox, output.mailbox_holder.mailbox);
EXPECT_EQ(mailbox_holder.sync_token, output.mailbox_holder.sync_token);
EXPECT_EQ(mailbox_holder.texture_target,
output.mailbox_holder.texture_target);
EXPECT_EQ(read_lock_fences_enabled, output.read_lock_fences_enabled);
EXPECT_EQ(is_software, output.is_software);
EXPECT_EQ(is_overlay_candidate, output.is_overlay_candidate);
}
TEST_F(StructTraitsTest, YUVDrawQuad) {
const DrawQuad::Material material = DrawQuad::YUV_VIDEO_CONTENT;
const gfx::Rect rect(1234, 4321, 1357, 7531);
const gfx::Rect opaque_rect(1357, 8642, 432, 123);
const gfx::Rect visible_rect(1337, 7331, 561, 293);
const bool needs_blending = true;
const gfx::RectF ya_tex_coord_rect(1234.1f, 5678.2f, 9101112.3f, 13141516.4f);
const gfx::RectF uv_tex_coord_rect(1234.1f, 4321.2f, 1357.3f, 7531.4f);
const gfx::Size ya_tex_size(1234, 5678);
const gfx::Size uv_tex_size(4321, 8765);
const uint32_t y_plane_resource_id = 1337;
const uint32_t u_plane_resource_id = 1234;
const uint32_t v_plane_resource_id = 2468;
const uint32_t a_plane_resource_id = 7890;
const YUVVideoDrawQuad::ColorSpace color_space = YUVVideoDrawQuad::JPEG;
const float resource_offset = 1337.5f;
const float resource_multiplier = 1234.6f;
SharedQuadState sqs;
QuadList input;
YUVVideoDrawQuad* quad = input.AllocateAndConstruct<YUVVideoDrawQuad>();
quad->SetAll(&sqs, rect, opaque_rect, visible_rect, needs_blending,
ya_tex_coord_rect, uv_tex_coord_rect, ya_tex_size, uv_tex_size,
y_plane_resource_id, u_plane_resource_id, v_plane_resource_id,
a_plane_resource_id, color_space, resource_offset,
resource_multiplier);
mojom::TraitsTestServicePtr proxy = GetTraitsTestProxy();
QuadList output;
proxy->EchoQuadList(input, &output);
ASSERT_EQ(input.size(), output.size());
ASSERT_EQ(material, output.ElementAt(0)->material);
const YUVVideoDrawQuad* out_quad =
YUVVideoDrawQuad::MaterialCast(output.ElementAt(0));
EXPECT_EQ(rect, out_quad->rect);
EXPECT_EQ(opaque_rect, out_quad->opaque_rect);
EXPECT_EQ(visible_rect, out_quad->visible_rect);
EXPECT_EQ(needs_blending, out_quad->needs_blending);
EXPECT_EQ(ya_tex_coord_rect, out_quad->ya_tex_coord_rect);
EXPECT_EQ(uv_tex_coord_rect, out_quad->uv_tex_coord_rect);
EXPECT_EQ(ya_tex_size, out_quad->ya_tex_size);
EXPECT_EQ(uv_tex_size, out_quad->uv_tex_size);
EXPECT_EQ(y_plane_resource_id, out_quad->y_plane_resource_id());
EXPECT_EQ(u_plane_resource_id, out_quad->u_plane_resource_id());
EXPECT_EQ(v_plane_resource_id, out_quad->v_plane_resource_id());
EXPECT_EQ(a_plane_resource_id, out_quad->a_plane_resource_id());
EXPECT_EQ(color_space, out_quad->color_space);
EXPECT_EQ(resource_offset, out_quad->resource_offset);
EXPECT_EQ(resource_multiplier, out_quad->resource_multiplier);
}
} // namespace cc