summaryrefslogtreecommitdiffstats
path: root/chromium/cc/surfaces/surfaces_pixeltest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/cc/surfaces/surfaces_pixeltest.cc')
-rw-r--r--chromium/cc/surfaces/surfaces_pixeltest.cc312
1 files changed, 312 insertions, 0 deletions
diff --git a/chromium/cc/surfaces/surfaces_pixeltest.cc b/chromium/cc/surfaces/surfaces_pixeltest.cc
new file mode 100644
index 00000000000..9afb4c639ad
--- /dev/null
+++ b/chromium/cc/surfaces/surfaces_pixeltest.cc
@@ -0,0 +1,312 @@
+// Copyright 2014 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/output/compositor_frame.h"
+#include "cc/quads/render_pass.h"
+#include "cc/quads/solid_color_draw_quad.h"
+#include "cc/quads/surface_draw_quad.h"
+#include "cc/surfaces/surface.h"
+#include "cc/surfaces/surface_aggregator.h"
+#include "cc/surfaces/surface_manager.h"
+#include "cc/test/pixel_comparator.h"
+#include "cc/test/pixel_test.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+#if !defined(OS_ANDROID)
+
+namespace cc {
+namespace {
+
+class SurfacesPixelTest : public RendererPixelTest<GLRenderer> {
+ protected:
+ SurfaceManager manager_;
+};
+
+SharedQuadState* CreateAndAppendTestSharedQuadState(
+ RenderPass* render_pass,
+ const gfx::Transform& transform,
+ const gfx::Size& size) {
+ const gfx::Size content_bounds = size;
+ const gfx::Rect visible_content_rect = gfx::Rect(size);
+ const gfx::Rect clip_rect = gfx::Rect(size);
+ bool is_clipped = false;
+ float opacity = 1.f;
+ const SkXfermode::Mode blend_mode = SkXfermode::kSrcOver_Mode;
+ SharedQuadState* shared_state = render_pass->CreateAndAppendSharedQuadState();
+ shared_state->SetAll(transform,
+ content_bounds,
+ visible_content_rect,
+ clip_rect,
+ is_clipped,
+ opacity,
+ blend_mode,
+ 0);
+ return shared_state;
+}
+
+// Draws a very simple frame with no surface references.
+TEST_F(SurfacesPixelTest, DrawSimpleFrame) {
+ gfx::Rect rect(device_viewport_size_);
+ RenderPass::Id id(1, 1);
+ scoped_ptr<RenderPass> pass = RenderPass::Create();
+ pass->SetNew(id, rect, rect, gfx::Transform());
+
+ CreateAndAppendTestSharedQuadState(
+ pass.get(), gfx::Transform(), device_viewport_size_);
+
+ scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
+ bool force_anti_aliasing_off = false;
+ color_quad->SetNew(pass->shared_quad_state_list.back(),
+ rect,
+ rect,
+ SK_ColorGREEN,
+ force_anti_aliasing_off);
+ pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
+
+ scoped_ptr<DelegatedFrameData> delegated_frame_data(new DelegatedFrameData);
+ delegated_frame_data->render_pass_list.push_back(pass.Pass());
+
+ scoped_ptr<CompositorFrame> root_frame(new CompositorFrame);
+ root_frame->delegated_frame_data = delegated_frame_data.Pass();
+
+ Surface root_surface(&manager_, NULL, device_viewport_size_);
+ root_surface.QueueFrame(root_frame.Pass());
+
+ SurfaceAggregator aggregator(&manager_);
+ scoped_ptr<CompositorFrame> aggregated_frame =
+ aggregator.Aggregate(root_surface.surface_id());
+
+ bool discard_alpha = false;
+ ExactPixelComparator pixel_comparator(discard_alpha);
+ RenderPassList* pass_list =
+ &aggregated_frame->delegated_frame_data->render_pass_list;
+ EXPECT_TRUE(RunPixelTest(pass_list,
+ base::FilePath(FILE_PATH_LITERAL("green.png")),
+ pixel_comparator));
+}
+
+// Draws a frame with simple surface embedding.
+TEST_F(SurfacesPixelTest, DrawSimpleAggregatedFrame) {
+ gfx::Size child_size(200, 100);
+ Surface child_surface(&manager_, NULL, child_size);
+ Surface root_surface(&manager_, NULL, device_viewport_size_);
+
+ {
+ gfx::Rect rect(device_viewport_size_);
+ RenderPass::Id id(1, 1);
+ scoped_ptr<RenderPass> pass = RenderPass::Create();
+ pass->SetNew(id, rect, rect, gfx::Transform());
+
+ CreateAndAppendTestSharedQuadState(
+ pass.get(), gfx::Transform(), device_viewport_size_);
+
+ scoped_ptr<SurfaceDrawQuad> surface_quad = SurfaceDrawQuad::Create();
+ surface_quad->SetNew(pass->shared_quad_state_list.back(),
+ gfx::Rect(child_size),
+ gfx::Rect(child_size),
+ child_surface.surface_id());
+ pass->quad_list.push_back(surface_quad.PassAs<DrawQuad>());
+
+ scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
+ bool force_anti_aliasing_off = false;
+ color_quad->SetNew(pass->shared_quad_state_list.back(),
+ rect,
+ rect,
+ SK_ColorYELLOW,
+ force_anti_aliasing_off);
+ pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
+
+ scoped_ptr<DelegatedFrameData> delegated_frame_data(new DelegatedFrameData);
+ delegated_frame_data->render_pass_list.push_back(pass.Pass());
+
+ scoped_ptr<CompositorFrame> root_frame(new CompositorFrame);
+ root_frame->delegated_frame_data = delegated_frame_data.Pass();
+
+ root_surface.QueueFrame(root_frame.Pass());
+ }
+
+ {
+ gfx::Rect rect(child_size);
+ RenderPass::Id id(1, 1);
+ scoped_ptr<RenderPass> pass = RenderPass::Create();
+ pass->SetNew(id, rect, rect, gfx::Transform());
+
+ CreateAndAppendTestSharedQuadState(
+ pass.get(), gfx::Transform(), child_size);
+
+ scoped_ptr<SolidColorDrawQuad> color_quad = SolidColorDrawQuad::Create();
+ bool force_anti_aliasing_off = false;
+ color_quad->SetNew(pass->shared_quad_state_list.back(),
+ rect,
+ rect,
+ SK_ColorBLUE,
+ force_anti_aliasing_off);
+ pass->quad_list.push_back(color_quad.PassAs<DrawQuad>());
+
+ scoped_ptr<DelegatedFrameData> delegated_frame_data(new DelegatedFrameData);
+ delegated_frame_data->render_pass_list.push_back(pass.Pass());
+
+ scoped_ptr<CompositorFrame> child_frame(new CompositorFrame);
+ child_frame->delegated_frame_data = delegated_frame_data.Pass();
+
+ child_surface.QueueFrame(child_frame.Pass());
+ }
+
+ SurfaceAggregator aggregator(&manager_);
+ scoped_ptr<CompositorFrame> aggregated_frame =
+ aggregator.Aggregate(root_surface.surface_id());
+
+ bool discard_alpha = false;
+ ExactPixelComparator pixel_comparator(discard_alpha);
+ RenderPassList* pass_list =
+ &aggregated_frame->delegated_frame_data->render_pass_list;
+ EXPECT_TRUE(RunPixelTest(pass_list,
+ base::FilePath(FILE_PATH_LITERAL("blue_yellow.png")),
+ pixel_comparator));
+}
+
+// Tests a surface quad that has a non-identity transform into its pass.
+TEST_F(SurfacesPixelTest, DrawAggregatedFrameWithSurfaceTransforms) {
+ gfx::Size child_size(100, 200);
+ gfx::Size quad_size(100, 100);
+ // Structure:
+ // root (200x200) -> left_child (100x200 @ 0x0,
+ // right_child (100x200 @ 0x100)
+ // left_child -> top_green_quad (100x100 @ 0x0),
+ // bottom_blue_quad (100x100 @ 0x100)
+ // right_child -> top_blue_quad (100x100 @ 0x0),
+ // bottom_green_quad (100x100 @ 0x100)
+ Surface left_child(&manager_, NULL, child_size);
+ Surface right_child(&manager_, NULL, child_size);
+ Surface root_surface(&manager_, NULL, device_viewport_size_);
+
+ {
+ gfx::Rect rect(device_viewport_size_);
+ RenderPass::Id id(1, 1);
+ scoped_ptr<RenderPass> pass = RenderPass::Create();
+ pass->SetNew(id, rect, rect, gfx::Transform());
+
+ gfx::Transform surface_transform;
+ CreateAndAppendTestSharedQuadState(
+ pass.get(), surface_transform, device_viewport_size_);
+
+ scoped_ptr<SurfaceDrawQuad> left_surface_quad = SurfaceDrawQuad::Create();
+ left_surface_quad->SetNew(pass->shared_quad_state_list.back(),
+ gfx::Rect(child_size),
+ gfx::Rect(child_size),
+ left_child.surface_id());
+ pass->quad_list.push_back(left_surface_quad.PassAs<DrawQuad>());
+
+ surface_transform.Translate(100, 0);
+ CreateAndAppendTestSharedQuadState(
+ pass.get(), surface_transform, device_viewport_size_);
+
+ scoped_ptr<SurfaceDrawQuad> right_surface_quad = SurfaceDrawQuad::Create();
+ right_surface_quad->SetNew(pass->shared_quad_state_list.back(),
+ gfx::Rect(child_size),
+ gfx::Rect(child_size),
+ right_child.surface_id());
+ pass->quad_list.push_back(right_surface_quad.PassAs<DrawQuad>());
+
+ scoped_ptr<DelegatedFrameData> delegated_frame_data(new DelegatedFrameData);
+ delegated_frame_data->render_pass_list.push_back(pass.Pass());
+
+ scoped_ptr<CompositorFrame> root_frame(new CompositorFrame);
+ root_frame->delegated_frame_data = delegated_frame_data.Pass();
+
+ root_surface.QueueFrame(root_frame.Pass());
+ }
+
+ {
+ gfx::Rect rect(child_size);
+ RenderPass::Id id(1, 1);
+ scoped_ptr<RenderPass> pass = RenderPass::Create();
+ pass->SetNew(id, rect, rect, gfx::Transform());
+
+ CreateAndAppendTestSharedQuadState(
+ pass.get(), gfx::Transform(), child_size);
+
+ scoped_ptr<SolidColorDrawQuad> top_color_quad =
+ SolidColorDrawQuad::Create();
+ bool force_anti_aliasing_off = false;
+ top_color_quad->SetNew(pass->shared_quad_state_list.back(),
+ gfx::Rect(quad_size),
+ gfx::Rect(quad_size),
+ SK_ColorGREEN,
+ force_anti_aliasing_off);
+ pass->quad_list.push_back(top_color_quad.PassAs<DrawQuad>());
+
+ scoped_ptr<SolidColorDrawQuad> bottom_color_quad =
+ SolidColorDrawQuad::Create();
+ bottom_color_quad->SetNew(pass->shared_quad_state_list.back(),
+ gfx::Rect(0, 100, 100, 100),
+ gfx::Rect(0, 100, 100, 100),
+ SK_ColorBLUE,
+ force_anti_aliasing_off);
+ pass->quad_list.push_back(bottom_color_quad.PassAs<DrawQuad>());
+
+ scoped_ptr<DelegatedFrameData> delegated_frame_data(new DelegatedFrameData);
+ delegated_frame_data->render_pass_list.push_back(pass.Pass());
+
+ scoped_ptr<CompositorFrame> child_frame(new CompositorFrame);
+ child_frame->delegated_frame_data = delegated_frame_data.Pass();
+
+ left_child.QueueFrame(child_frame.Pass());
+ }
+
+ {
+ gfx::Rect rect(child_size);
+ RenderPass::Id id(1, 1);
+ scoped_ptr<RenderPass> pass = RenderPass::Create();
+ pass->SetNew(id, rect, rect, gfx::Transform());
+
+ CreateAndAppendTestSharedQuadState(
+ pass.get(), gfx::Transform(), child_size);
+
+ scoped_ptr<SolidColorDrawQuad> top_color_quad =
+ SolidColorDrawQuad::Create();
+ bool force_anti_aliasing_off = false;
+ top_color_quad->SetNew(pass->shared_quad_state_list.back(),
+ gfx::Rect(quad_size),
+ gfx::Rect(quad_size),
+ SK_ColorBLUE,
+ force_anti_aliasing_off);
+ pass->quad_list.push_back(top_color_quad.PassAs<DrawQuad>());
+
+ scoped_ptr<SolidColorDrawQuad> bottom_color_quad =
+ SolidColorDrawQuad::Create();
+ bottom_color_quad->SetNew(pass->shared_quad_state_list.back(),
+ gfx::Rect(0, 100, 100, 100),
+ gfx::Rect(0, 100, 100, 100),
+ SK_ColorGREEN,
+ force_anti_aliasing_off);
+ pass->quad_list.push_back(bottom_color_quad.PassAs<DrawQuad>());
+
+ scoped_ptr<DelegatedFrameData> delegated_frame_data(new DelegatedFrameData);
+ delegated_frame_data->render_pass_list.push_back(pass.Pass());
+
+ scoped_ptr<CompositorFrame> child_frame(new CompositorFrame);
+ child_frame->delegated_frame_data = delegated_frame_data.Pass();
+
+ right_child.QueueFrame(child_frame.Pass());
+ }
+
+ SurfaceAggregator aggregator(&manager_);
+ scoped_ptr<CompositorFrame> aggregated_frame =
+ aggregator.Aggregate(root_surface.surface_id());
+
+ bool discard_alpha = false;
+ ExactPixelComparator pixel_comparator(discard_alpha);
+ RenderPassList* pass_list =
+ &aggregated_frame->delegated_frame_data->render_pass_list;
+ EXPECT_TRUE(RunPixelTest(
+ pass_list,
+ base::FilePath(FILE_PATH_LITERAL("four_blue_green_checkers.png")),
+ pixel_comparator));
+}
+
+} // namespace
+} // namespace cc
+
+#endif // !defined(OS_ANDROID)