12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/gl_renderer.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include <set>
890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "cc/base/math_util.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/compositor_frame_metadata.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/resource_provider.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_impl_proxy.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_impl.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_output_surface.h"
153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/test/fake_output_surface_client.h"
165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "cc/test/fake_renderer_client.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/pixel_test.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/render_pass_test_common.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/render_pass_test_utils.h"
2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/test/test_shared_bitmap_manager.h"
210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "cc/test/test_web_graphics_context_3d.h"
22b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h"
238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "gpu/command_buffer/client/context_support.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "third_party/skia/include/core/SkImageFilter.h"
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "third_party/skia/include/core/SkMatrix.h"
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "third_party/skia/include/effects/SkColorFilterImageFilter.h"
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "third_party/skia/include/effects/SkColorMatrixFilter.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/transform.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::_;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::AnyNumber;
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using testing::Args;
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::AtLeast;
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using testing::ElementsAre;
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::Expectation;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::InSequence;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::Mock;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::Return;
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::StrictMock;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class GLRendererTest : public testing::Test {
46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) protected:
47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  RenderPass* root_render_pass() { return render_passes_in_draw_order_.back(); }
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  RenderPassList render_passes_in_draw_order_;
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define EXPECT_PROGRAM_VALID(program_binding)      \
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  do {                                             \
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE((program_binding)->program());     \
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE((program_binding)->initialized()); \
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } while (false)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Explicitly named to be a friend in GLRenderer for shader access.
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class GLRendererShaderPixelTest : public GLRendererPixelTest {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void TestShaders() {
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_FALSE(renderer()->IsContextLost());
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_PROGRAM_VALID(renderer()->GetTileCheckerboardProgram());
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_PROGRAM_VALID(renderer()->GetDebugBorderProgram());
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_PROGRAM_VALID(renderer()->GetSolidColorProgram());
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_PROGRAM_VALID(renderer()->GetSolidColorProgramAA());
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TestShadersWithTexCoordPrecision(TexCoordPrecisionMedium);
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TestShadersWithTexCoordPrecision(TexCoordPrecisionHigh);
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_FALSE(renderer()->IsContextLost());
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void TestShadersWithTexCoordPrecision(TexCoordPrecision precision) {
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_PROGRAM_VALID(renderer()->GetRenderPassProgram(precision));
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_PROGRAM_VALID(renderer()->GetRenderPassProgramAA(precision));
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_PROGRAM_VALID(renderer()->GetRenderPassMaskProgram(precision));
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_PROGRAM_VALID(renderer()->GetRenderPassMaskProgramAA(precision));
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_PROGRAM_VALID(
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        renderer()->GetRenderPassColorMatrixProgram(precision));
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_PROGRAM_VALID(
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        renderer()->GetRenderPassMaskColorMatrixProgramAA(precision));
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_PROGRAM_VALID(
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        renderer()->GetRenderPassColorMatrixProgramAA(precision));
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_PROGRAM_VALID(
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        renderer()->GetRenderPassMaskColorMatrixProgram(precision));
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_PROGRAM_VALID(renderer()->GetTextureProgram(precision));
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_PROGRAM_VALID(
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        renderer()->GetNonPremultipliedTextureProgram(precision));
887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_PROGRAM_VALID(renderer()->GetTextureBackgroundProgram(precision));
897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_PROGRAM_VALID(
907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        renderer()->GetNonPremultipliedTextureBackgroundProgram(precision));
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_PROGRAM_VALID(renderer()->GetTextureIOSurfaceProgram(precision));
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_PROGRAM_VALID(renderer()->GetVideoYUVProgram(precision));
93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_PROGRAM_VALID(renderer()->GetVideoYUVAProgram(precision));
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // This is unlikely to be ever true in tests due to usage of osmesa.
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (renderer()->Capabilities().using_egl_image)
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_PROGRAM_VALID(renderer()->GetVideoStreamTextureProgram(precision));
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_FALSE(renderer()->GetVideoStreamTextureProgram(precision));
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    TestShadersWithSamplerType(precision, SamplerType2D);
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    TestShadersWithSamplerType(precision, SamplerType2DRect);
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // This is unlikely to be ever true in tests due to usage of osmesa.
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (renderer()->Capabilities().using_egl_image)
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      TestShadersWithSamplerType(precision, SamplerTypeExternalOES);
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void TestShadersWithSamplerType(TexCoordPrecision precision,
107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                  SamplerType sampler) {
108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_PROGRAM_VALID(renderer()->GetTileProgram(precision, sampler));
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_PROGRAM_VALID(renderer()->GetTileProgramOpaque(precision, sampler));
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_PROGRAM_VALID(renderer()->GetTileProgramAA(precision, sampler));
111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_PROGRAM_VALID(renderer()->GetTileProgramSwizzle(precision, sampler));
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_PROGRAM_VALID(
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        renderer()->GetTileProgramSwizzleOpaque(precision, sampler));
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_PROGRAM_VALID(
115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        renderer()->GetTileProgramSwizzleAA(precision, sampler));
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_ANDROID)
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(GLRendererShaderPixelTest, AllShadersCompile) { TestShaders(); }
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FakeRendererGL : public GLRenderer {
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FakeRendererGL(RendererClient* client,
12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 const LayerTreeSettings* settings,
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 OutputSurface* output_surface,
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 ResourceProvider* resource_provider)
13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      : GLRenderer(client,
13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   settings,
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   output_surface,
13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   resource_provider,
13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   NULL,
13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   0) {}
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // GLRenderer methods.
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Changing visibility to public.
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  using GLRenderer::IsBackbufferDiscarded;
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  using GLRenderer::DoDrawQuad;
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  using GLRenderer::BeginDrawingFrame;
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  using GLRenderer::FinishDrawingQuadList;
145fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  using GLRenderer::stencil_enabled;
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class GLRendererWithDefaultHarnessTest : public GLRendererTest {
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  GLRendererWithDefaultHarnessTest() {
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    output_surface_ =
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        FakeOutputSurface::Create3d(TestWebGraphicsContext3D::Create()).Pass();
1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    CHECK(output_surface_->BindToClient(&output_surface_client_));
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    shared_bitmap_manager_.reset(new TestSharedBitmapManager());
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    resource_provider_ = ResourceProvider::Create(output_surface_.get(),
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  shared_bitmap_manager_.get(),
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  NULL,
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  0,
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  false,
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  1,
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  false).Pass();
16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    renderer_ = make_scoped_ptr(new FakeRendererGL(&renderer_client_,
16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                                   &settings_,
16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                                   output_surface_.get(),
16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                                   resource_provider_.get()));
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void SwapBuffers() { renderer_->SwapBuffers(CompositorFrameMetadata()); }
1703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LayerTreeSettings settings_;
1723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeOutputSurfaceClient output_surface_client_;
1733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<FakeOutputSurface> output_surface_;
1743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeRendererClient renderer_client_;
17523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<SharedBitmapManager> shared_bitmap_manager_;
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ResourceProvider> resource_provider_;
1773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<FakeRendererGL> renderer_;
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Closing the namespace here so that GLRendererShaderTest can take advantage
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// of the friend relationship with GLRenderer and all of the mock classes
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// declared above it.
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class GLRendererShaderTest : public GLRendererTest {
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
1873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  GLRendererShaderTest() {
188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    output_surface_ = FakeOutputSurface::Create3d().Pass();
1893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    CHECK(output_surface_->BindToClient(&output_surface_client_));
1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
19123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    shared_bitmap_manager_.reset(new TestSharedBitmapManager());
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    resource_provider_ = ResourceProvider::Create(output_surface_.get(),
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  shared_bitmap_manager_.get(),
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  NULL,
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  0,
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  false,
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  1,
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  false).Pass();
1993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    renderer_.reset(new FakeRendererGL(&renderer_client_,
20058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                       &settings_,
2013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                       output_surface_.get(),
2023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                       resource_provider_.get()));
20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void TestRenderPassProgram(TexCoordPrecision precision) {
206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_PROGRAM_VALID(&renderer_->render_pass_program_[precision]);
207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(renderer_->render_pass_program_[precision].program(),
2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)              renderer_->program_shadow_);
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void TestRenderPassColorMatrixProgram(TexCoordPrecision precision) {
212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_PROGRAM_VALID(
213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        &renderer_->render_pass_color_matrix_program_[precision]);
214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(renderer_->render_pass_color_matrix_program_[precision].program(),
215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              renderer_->program_shadow_);
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void TestRenderPassMaskProgram(TexCoordPrecision precision) {
219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_PROGRAM_VALID(&renderer_->render_pass_mask_program_[precision]);
220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(renderer_->render_pass_mask_program_[precision].program(),
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)              renderer_->program_shadow_);
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void TestRenderPassMaskColorMatrixProgram(TexCoordPrecision precision) {
225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_PROGRAM_VALID(
226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        &renderer_->render_pass_mask_color_matrix_program_[precision]);
227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(
228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        renderer_->render_pass_mask_color_matrix_program_[precision].program(),
229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        renderer_->program_shadow_);
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void TestRenderPassProgramAA(TexCoordPrecision precision) {
233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_PROGRAM_VALID(&renderer_->render_pass_program_aa_[precision]);
234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(renderer_->render_pass_program_aa_[precision].program(),
2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)              renderer_->program_shadow_);
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void TestRenderPassColorMatrixProgramAA(TexCoordPrecision precision) {
239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_PROGRAM_VALID(
240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        &renderer_->render_pass_color_matrix_program_aa_[precision]);
241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(
242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        renderer_->render_pass_color_matrix_program_aa_[precision].program(),
243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        renderer_->program_shadow_);
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void TestRenderPassMaskProgramAA(TexCoordPrecision precision) {
247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_PROGRAM_VALID(&renderer_->render_pass_mask_program_aa_[precision]);
248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(renderer_->render_pass_mask_program_aa_[precision].program(),
2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)              renderer_->program_shadow_);
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void TestRenderPassMaskColorMatrixProgramAA(TexCoordPrecision precision) {
253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_PROGRAM_VALID(
254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        &renderer_->render_pass_mask_color_matrix_program_aa_[precision]);
255a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(renderer_->render_pass_mask_color_matrix_program_aa_[precision]
256a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                  .program(),
2577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)              renderer_->program_shadow_);
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void TestSolidColorProgramAA() {
261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_PROGRAM_VALID(&renderer_->solid_color_program_aa_);
262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(renderer_->solid_color_program_aa_.program(),
2637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)              renderer_->program_shadow_);
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
26658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LayerTreeSettings settings_;
2673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeOutputSurfaceClient output_surface_client_;
2683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<FakeOutputSurface> output_surface_;
2693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeRendererClient renderer_client_;
27023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<SharedBitmapManager> shared_bitmap_manager_;
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<ResourceProvider> resource_provider_;
27290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scoped_ptr<FakeRendererGL> renderer_;
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test GLRenderer DiscardBackbuffer functionality:
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Suggest discarding framebuffer when one exists and the renderer is not
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// visible.
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Expected: it is discarded and damage tracker is reset.
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(
282a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    GLRendererWithDefaultHarnessTest,
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SuggestBackbufferNoShouldDiscardBackbufferAndDamageRootLayerIfNotVisible) {
2843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  renderer_->SetVisible(false);
2853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(1, renderer_client_.set_full_root_layer_damage_count());
2863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(renderer_->IsBackbufferDiscarded());
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test GLRenderer DiscardBackbuffer functionality:
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Suggest discarding framebuffer when one exists and the renderer is visible.
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Expected: the allocation is ignored.
292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(GLRendererWithDefaultHarnessTest,
293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)       SuggestBackbufferNoDoNothingWhenVisible) {
2943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  renderer_->SetVisible(true);
2953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(0, renderer_client_.set_full_root_layer_damage_count());
2963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_FALSE(renderer_->IsBackbufferDiscarded());
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test GLRenderer DiscardBackbuffer functionality:
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Suggest discarding framebuffer when one does not exist.
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Expected: it does nothing.
302a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(GLRendererWithDefaultHarnessTest,
303a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)       SuggestBackbufferNoWhenItDoesntExistShouldDoNothing) {
3043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  renderer_->SetVisible(false);
3053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(1, renderer_client_.set_full_root_layer_damage_count());
3063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(renderer_->IsBackbufferDiscarded());
3073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(1, renderer_client_.set_full_root_layer_damage_count());
3093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(renderer_->IsBackbufferDiscarded());
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test GLRenderer DiscardBackbuffer functionality:
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Begin drawing a frame while a framebuffer is discarded.
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Expected: will recreate framebuffer.
315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(GLRendererWithDefaultHarnessTest,
316a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)       DiscardedBackbufferIsRecreatedForScopeDuration) {
317a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Rect viewport_rect(1, 1);
3183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  renderer_->SetVisible(false);
3193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(renderer_->IsBackbufferDiscarded());
3203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(1, renderer_client_.set_full_root_layer_damage_count());
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  AddRenderPass(&render_passes_in_draw_order_,
32303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                RenderPassId(1, 0),
324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                viewport_rect,
325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                gfx::Transform());
326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
3273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  renderer_->SetVisible(true);
328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer_->DrawFrame(&render_passes_in_draw_order_,
329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       1.f,
330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
331a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       false);
3333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_FALSE(renderer_->IsBackbufferDiscarded());
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SwapBuffers();
336a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ(1u, output_surface_->num_sent_frames());
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(GLRendererWithDefaultHarnessTest, ExternalStencil) {
340a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Rect viewport_rect(1, 1);
3413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_FALSE(renderer_->stencil_enabled());
342fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
34358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  output_surface_->set_has_external_stencil_test(true);
344fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  TestRenderPass* root_pass = AddRenderPass(&render_passes_in_draw_order_,
34603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                            RenderPassId(1, 0),
347a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                            viewport_rect,
348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                            gfx::Transform());
349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  root_pass->has_transparent_background = false;
350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer_->DrawFrame(&render_passes_in_draw_order_,
352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       1.f,
353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
354a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
355a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       false);
3563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(renderer_->stencil_enabled());
357fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch}
358fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ForbidSynchronousCallContext : public TestWebGraphicsContext3D {
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ForbidSynchronousCallContext() {}
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void getAttachedShaders(GLuint program,
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  GLsizei max_count,
3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  GLsizei* count,
3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  GLuint* shaders) OVERRIDE {
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ADD_FAILURE();
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual GLint getAttribLocation(GLuint program, const GLchar* name) OVERRIDE {
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ADD_FAILURE();
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return 0;
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void getBooleanv(GLenum pname, GLboolean* value) OVERRIDE {
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ADD_FAILURE();
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void getBufferParameteriv(GLenum target,
3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                    GLenum pname,
3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                    GLint* value) OVERRIDE {
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ADD_FAILURE();
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual GLenum getError() OVERRIDE {
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ADD_FAILURE();
3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return GL_NO_ERROR;
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void getFloatv(GLenum pname, GLfloat* value) OVERRIDE {
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ADD_FAILURE();
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void getFramebufferAttachmentParameteriv(GLenum target,
3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                   GLenum attachment,
3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                   GLenum pname,
3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                   GLint* value) OVERRIDE {
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ADD_FAILURE();
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void getIntegerv(GLenum pname, GLint* value) OVERRIDE {
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (pname == GL_MAX_TEXTURE_SIZE) {
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // MAX_TEXTURE_SIZE is cached client side, so it's OK to query.
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      *value = 1024;
398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } else {
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ADD_FAILURE();
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We allow querying the shader compilation and program link status in debug
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // mode, but not release.
4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void getProgramiv(GLuint program,
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            GLenum pname,
4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            GLint* value) OVERRIDE {
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef NDEBUG
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *value = 1;
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ADD_FAILURE();
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void getShaderiv(GLuint shader, GLenum pname, GLint* value) OVERRIDE {
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef NDEBUG
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *value = 1;
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ADD_FAILURE();
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void getRenderbufferParameteriv(GLenum target,
4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                          GLenum pname,
4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                          GLint* value) OVERRIDE {
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ADD_FAILURE();
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void getShaderPrecisionFormat(GLenum shadertype,
4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        GLenum precisiontype,
4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        GLint* range,
4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        GLint* precision) OVERRIDE {
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ADD_FAILURE();
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void getTexParameterfv(GLenum target,
4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 GLenum pname,
4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 GLfloat* value) OVERRIDE {
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ADD_FAILURE();
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void getTexParameteriv(GLenum target,
4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 GLenum pname,
4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 GLint* value) OVERRIDE {
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ADD_FAILURE();
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void getUniformfv(GLuint program,
4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            GLint location,
4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            GLfloat* value) OVERRIDE {
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ADD_FAILURE();
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void getUniformiv(GLuint program,
4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            GLint location,
4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            GLint* value) OVERRIDE {
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ADD_FAILURE();
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual GLint getUniformLocation(GLuint program,
4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   const GLchar* name) OVERRIDE {
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ADD_FAILURE();
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return 0;
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void getVertexAttribfv(GLuint index,
4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 GLenum pname,
4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 GLfloat* value) OVERRIDE {
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ADD_FAILURE();
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void getVertexAttribiv(GLuint index,
4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 GLenum pname,
4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 GLint* value) OVERRIDE {
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ADD_FAILURE();
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual GLsizeiptr getVertexAttribOffset(GLuint index,
4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                           GLenum pname) OVERRIDE {
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ADD_FAILURE();
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return 0;
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
476a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(GLRendererTest, InitializationDoesNotMakeSynchronousCalls) {
4773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeOutputSurfaceClient output_surface_client;
4783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<OutputSurface> output_surface(FakeOutputSurface::Create3d(
4793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      scoped_ptr<TestWebGraphicsContext3D>(new ForbidSynchronousCallContext)));
4803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  CHECK(output_surface->BindToClient(&output_surface_client));
4813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
48223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<SharedBitmapManager> shared_bitmap_manager(
48323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      new TestSharedBitmapManager());
4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<ResourceProvider> resource_provider(
4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ResourceProvider::Create(output_surface.get(),
4861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               shared_bitmap_manager.get(),
4871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               NULL,
4881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               0,
4891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               false,
4901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               1,
4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               false));
4923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
49358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LayerTreeSettings settings;
4943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeRendererClient renderer_client;
49558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FakeRendererGL renderer(&renderer_client,
49658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          &settings,
49758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          output_surface.get(),
49858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          resource_provider.get());
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LoseContextOnFirstGetContext : public TestWebGraphicsContext3D {
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  LoseContextOnFirstGetContext() {}
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void getProgramiv(GLuint program,
5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            GLenum pname,
5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            GLint* value) OVERRIDE {
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    context_lost_ = true;
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *value = 0;
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void getShaderiv(GLuint shader, GLenum pname, GLint* value) OVERRIDE {
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    context_lost_ = true;
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *value = 0;
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
518a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(GLRendererTest, InitializationWithQuicklyLostContextDoesNotAssert) {
5193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeOutputSurfaceClient output_surface_client;
5203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<OutputSurface> output_surface(FakeOutputSurface::Create3d(
5213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      scoped_ptr<TestWebGraphicsContext3D>(new LoseContextOnFirstGetContext)));
5223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  CHECK(output_surface->BindToClient(&output_surface_client));
5233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
52423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<SharedBitmapManager> shared_bitmap_manager(
52523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      new TestSharedBitmapManager());
5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<ResourceProvider> resource_provider(
5271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ResourceProvider::Create(output_surface.get(),
5281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               shared_bitmap_manager.get(),
5291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               NULL,
5301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               0,
5311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               false,
5321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               1,
5331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               false));
5343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
53558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LayerTreeSettings settings;
5363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeRendererClient renderer_client;
53758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FakeRendererGL renderer(&renderer_client,
53858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          &settings,
53958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          output_surface.get(),
54058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          resource_provider.get());
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ClearCountingContext : public TestWebGraphicsContext3D {
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
5455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ClearCountingContext() { test_capabilities_.gpu.discard_framebuffer = true; }
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
54758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  MOCK_METHOD3(discardFramebufferEXT,
5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               void(GLenum target,
5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    GLsizei numAttachments,
5505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    const GLenum* attachments));
5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MOCK_METHOD1(clear, void(GLbitfield mask));
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
554a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(GLRendererTest, OpaqueBackground) {
5553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<ClearCountingContext> context_owned(new ClearCountingContext);
5563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ClearCountingContext* context = context_owned.get();
5573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeOutputSurfaceClient output_surface_client;
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<OutputSurface> output_surface(FakeOutputSurface::Create3d(
5603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      context_owned.PassAs<TestWebGraphicsContext3D>()));
5613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  CHECK(output_surface->BindToClient(&output_surface_client));
5623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
56323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<SharedBitmapManager> shared_bitmap_manager(
56423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      new TestSharedBitmapManager());
5651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<ResourceProvider> resource_provider(
5661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ResourceProvider::Create(output_surface.get(),
5671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               shared_bitmap_manager.get(),
5681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               NULL,
5691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               0,
5701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               false,
5711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               1,
5721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               false));
5733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
57458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LayerTreeSettings settings;
5753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeRendererClient renderer_client;
57658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FakeRendererGL renderer(&renderer_client,
57758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          &settings,
57858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          output_surface.get(),
57958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          resource_provider.get());
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
581a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Rect viewport_rect(1, 1);
582a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  TestRenderPass* root_pass = AddRenderPass(&render_passes_in_draw_order_,
58303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                            RenderPassId(1, 0),
584a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                            viewport_rect,
585a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                            gfx::Transform());
586a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  root_pass->has_transparent_background = false;
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
58858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // On DEBUG builds, render passes with opaque background clear to blue to
58958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // easily see regions that were not drawn on the screen.
59058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_CALL(*context, discardFramebufferEXT(GL_FRAMEBUFFER, _, _))
59158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      .With(Args<2, 1>(ElementsAre(GL_COLOR_EXT)))
59258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      .Times(1);
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifdef NDEBUG
59458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_CALL(*context, clear(_)).Times(0);
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
59658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_CALL(*context, clear(_)).Times(1);
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
598a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer.DrawFrame(&render_passes_in_draw_order_,
599a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     1.f,
600a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     viewport_rect,
601a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     viewport_rect,
602a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     false);
60358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Mock::VerifyAndClearExpectations(context);
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
606a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(GLRendererTest, TransparentBackground) {
6073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<ClearCountingContext> context_owned(new ClearCountingContext);
6083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ClearCountingContext* context = context_owned.get();
6093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
6103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeOutputSurfaceClient output_surface_client;
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<OutputSurface> output_surface(FakeOutputSurface::Create3d(
6123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      context_owned.PassAs<TestWebGraphicsContext3D>()));
6133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  CHECK(output_surface->BindToClient(&output_surface_client));
6143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
61523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<SharedBitmapManager> shared_bitmap_manager(
61623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      new TestSharedBitmapManager());
6171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<ResourceProvider> resource_provider(
6181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ResourceProvider::Create(output_surface.get(),
6191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               shared_bitmap_manager.get(),
6201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               NULL,
6211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               0,
6221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               false,
6231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               1,
6241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               false));
6253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
62658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LayerTreeSettings settings;
6273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeRendererClient renderer_client;
62858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FakeRendererGL renderer(&renderer_client,
62958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          &settings,
63058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          output_surface.get(),
63158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          resource_provider.get());
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
633a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Rect viewport_rect(1, 1);
634a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  TestRenderPass* root_pass = AddRenderPass(&render_passes_in_draw_order_,
63503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                            RenderPassId(1, 0),
636a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                            viewport_rect,
637a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                            gfx::Transform());
638a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  root_pass->has_transparent_background = true;
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
640a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_CALL(*context, discardFramebufferEXT(GL_FRAMEBUFFER, 1, _)).Times(1);
64158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_CALL(*context, clear(_)).Times(1);
642a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer.DrawFrame(&render_passes_in_draw_order_,
643a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     1.f,
644a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     viewport_rect,
645a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     viewport_rect,
646a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     false);
64758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
64858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Mock::VerifyAndClearExpectations(context);
64958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
65058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
651a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(GLRendererTest, OffscreenOutputSurface) {
65258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<ClearCountingContext> context_owned(new ClearCountingContext);
65358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ClearCountingContext* context = context_owned.get();
65458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
65558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FakeOutputSurfaceClient output_surface_client;
65658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<OutputSurface> output_surface(FakeOutputSurface::CreateOffscreen(
65758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      context_owned.PassAs<TestWebGraphicsContext3D>()));
65858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  CHECK(output_surface->BindToClient(&output_surface_client));
65958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
66023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<SharedBitmapManager> shared_bitmap_manager(
66123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      new TestSharedBitmapManager());
6621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<ResourceProvider> resource_provider(
6631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ResourceProvider::Create(output_surface.get(),
6641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               shared_bitmap_manager.get(),
6651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               NULL,
6661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               0,
6671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               false,
6681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               1,
6691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               false));
67058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
67158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LayerTreeSettings settings;
67258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FakeRendererClient renderer_client;
67358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FakeRendererGL renderer(&renderer_client,
67458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          &settings,
67558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          output_surface.get(),
67658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          resource_provider.get());
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
678a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Rect viewport_rect(1, 1);
679a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  AddRenderPass(&render_passes_in_draw_order_,
68003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                RenderPassId(1, 0),
681a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                viewport_rect,
682a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                gfx::Transform());
68358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
68458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_CALL(*context, discardFramebufferEXT(GL_FRAMEBUFFER, _, _))
68558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      .With(Args<2, 1>(ElementsAre(GL_COLOR_ATTACHMENT0)))
68658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      .Times(1);
68758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_CALL(*context, clear(_)).Times(AnyNumber());
688a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer.DrawFrame(&render_passes_in_draw_order_,
689a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     1.f,
690a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     viewport_rect,
691a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     viewport_rect,
692a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     false);
69358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Mock::VerifyAndClearExpectations(context);
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class VisibilityChangeIsLastCallTrackingContext
697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public TestWebGraphicsContext3D {
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VisibilityChangeIsLastCallTrackingContext()
700a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      : last_call_was_set_visibility_(false) {}
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TestWebGraphicsContext3D methods.
7035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void flush() OVERRIDE { last_call_was_set_visibility_ = false; }
7045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void deleteTexture(GLuint) OVERRIDE {
705eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    last_call_was_set_visibility_ = false;
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void deleteFramebuffer(GLuint) OVERRIDE {
708eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    last_call_was_set_visibility_ = false;
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void deleteQueryEXT(GLuint) OVERRIDE {
711eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    last_call_was_set_visibility_ = false;
712eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void deleteRenderbuffer(GLuint) OVERRIDE {
714eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    last_call_was_set_visibility_ = false;
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Methods added for test.
718a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void set_last_call_was_visibility(bool visible) {
719a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    DCHECK(last_call_was_set_visibility_ == false);
720a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    last_call_was_set_visibility_ = true;
721a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
722eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool last_call_was_set_visibility() const {
723eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return last_call_was_set_visibility_;
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
727eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool last_call_was_set_visibility_;
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
730a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(GLRendererTest, VisibilityChangeIsLastCall) {
7313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<VisibilityChangeIsLastCallTrackingContext> context_owned(
7323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      new VisibilityChangeIsLastCallTrackingContext);
7333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  VisibilityChangeIsLastCallTrackingContext* context = context_owned.get();
7343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
735a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_refptr<TestContextProvider> provider = TestContextProvider::Create(
736a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      context_owned.PassAs<TestWebGraphicsContext3D>());
737a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
738a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  provider->support()->SetSurfaceVisibleCallback(base::Bind(
739a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      &VisibilityChangeIsLastCallTrackingContext::set_last_call_was_visibility,
740a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::Unretained(context)));
741a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
7423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeOutputSurfaceClient output_surface_client;
7435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<OutputSurface> output_surface(
7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      FakeOutputSurface::Create3d(provider));
7453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  CHECK(output_surface->BindToClient(&output_surface_client));
7463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
74723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<SharedBitmapManager> shared_bitmap_manager(
74823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      new TestSharedBitmapManager());
7491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<ResourceProvider> resource_provider(
7501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ResourceProvider::Create(output_surface.get(),
7511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               shared_bitmap_manager.get(),
7521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               NULL,
7531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               0,
7541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               false,
7551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               1,
7561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               false));
7573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
75858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LayerTreeSettings settings;
7593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeRendererClient renderer_client;
76058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FakeRendererGL renderer(&renderer_client,
76158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          &settings,
76258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          output_surface.get(),
76358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          resource_provider.get());
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
765a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Rect viewport_rect(1, 1);
766a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  AddRenderPass(&render_passes_in_draw_order_,
76703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                RenderPassId(1, 0),
768a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                viewport_rect,
769a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                gfx::Transform());
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
771a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Ensure that the call to SetSurfaceVisible is the last call issue to the
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // GPU process, after glFlush is called, and after the RendererClient's
773eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // SetManagedMemoryPolicy is called. Plumb this tracking between both the
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // RenderClient and the Context by giving them both a pointer to a variable on
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the stack.
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  renderer.SetVisible(true);
777a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer.DrawFrame(&render_passes_in_draw_order_,
778a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     1.f,
779a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     viewport_rect,
780a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     viewport_rect,
781a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     false);
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  renderer.SetVisible(false);
783eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(context->last_call_was_set_visibility());
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TextureStateTrackingContext : public TestWebGraphicsContext3D {
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
788a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  TextureStateTrackingContext() : active_texture_(GL_INVALID_ENUM) {
7895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    test_capabilities_.gpu.egl_image_external = true;
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
79203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  MOCK_METHOD1(waitSyncPoint, void(unsigned sync_point));
7935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MOCK_METHOD3(texParameteri, void(GLenum target, GLenum pname, GLint param));
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD4(drawElements,
7955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               void(GLenum mode, GLsizei count, GLenum type, GLintptr offset));
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void activeTexture(GLenum texture) {
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_NE(texture, active_texture_);
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    active_texture_ = texture;
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GLenum active_texture() const { return active_texture_; }
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GLenum active_texture_;
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
808a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(GLRendererTest, ActiveTextureState) {
8093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<TextureStateTrackingContext> context_owned(
8103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      new TextureStateTrackingContext);
8113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  TextureStateTrackingContext* context = context_owned.get();
8123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
8133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeOutputSurfaceClient output_surface_client;
8143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<OutputSurface> output_surface(FakeOutputSurface::Create3d(
8153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      context_owned.PassAs<TestWebGraphicsContext3D>()));
8163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  CHECK(output_surface->BindToClient(&output_surface_client));
8173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
81823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<SharedBitmapManager> shared_bitmap_manager(
81923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      new TestSharedBitmapManager());
8201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<ResourceProvider> resource_provider(
8211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ResourceProvider::Create(output_surface.get(),
8221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               shared_bitmap_manager.get(),
8231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               NULL,
8241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               0,
8251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               false,
8261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               1,
8271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               false));
8283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
82958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LayerTreeSettings settings;
8303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeRendererClient renderer_client;
83158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FakeRendererGL renderer(&renderer_client,
83258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          &settings,
83358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          output_surface.get(),
83458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          resource_provider.get());
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // During initialization we are allowed to set any texture parameters.
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(*context, texParameteri(_, _, _)).Times(AnyNumber());
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
83903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId id(1, 1);
840a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  TestRenderPass* root_pass = AddRenderPass(
841a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      &render_passes_in_draw_order_, id, gfx::Rect(100, 100), gfx::Transform());
842a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  root_pass->AppendOneOfEveryQuadType(resource_provider.get(),
84303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                      RenderPassId(2, 1));
844a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
845a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_);
8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set up expected texture filter state transitions that match the quads
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // created in AppendOneOfEveryQuadType().
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(context);
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InSequence sequence;
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
85303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // The sync points for all quads are waited on first. This sync point is
85403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // for a texture quad drawn later in the frame.
85503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    EXPECT_CALL(*context,
85603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                waitSyncPoint(TestRenderPass::kSyncPointForMailboxTextureQuad))
85703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        .Times(1);
85803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // yuv_quad is drawn with the default linear filter.
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*context, drawElements(_, _, _, _));
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // tile_quad is drawn with GL_NEAREST because it is not transformed or
8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // scaled.
8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(
8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        *context,
8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST));
8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(
8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        *context,
8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST));
8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*context, drawElements(_, _, _, _));
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // transformed_tile_quad uses GL_LINEAR.
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*context, drawElements(_, _, _, _));
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // scaled_tile_quad also uses GL_LINEAR.
8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(*context, drawElements(_, _, _, _));
8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The remaining quads also use GL_LINEAR because nearest neighbor
8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // filtering is currently only used with tile quads.
88003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    EXPECT_CALL(*context, drawElements(_, _, _, _)).Times(7);
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
883a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Rect viewport_rect(100, 100);
884a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer.DrawFrame(&render_passes_in_draw_order_,
885a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     1.f,
886a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     viewport_rect,
887a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     viewport_rect,
888a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     false);
8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(context);
8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NoClearRootRenderPassMockContext : public TestWebGraphicsContext3D {
8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
8945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MOCK_METHOD1(clear, void(GLbitfield mask));
8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD4(drawElements,
8965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               void(GLenum mode, GLsizei count, GLenum type, GLintptr offset));
8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
899a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(GLRendererTest, ShouldClearRootRenderPass) {
9003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<NoClearRootRenderPassMockContext> mock_context_owned(
9013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      new NoClearRootRenderPassMockContext);
9023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  NoClearRootRenderPassMockContext* mock_context = mock_context_owned.get();
9033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
9043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeOutputSurfaceClient output_surface_client;
9053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<OutputSurface> output_surface(FakeOutputSurface::Create3d(
906a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      mock_context_owned.PassAs<TestWebGraphicsContext3D>()));
9073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  CHECK(output_surface->BindToClient(&output_surface_client));
9083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
90923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<SharedBitmapManager> shared_bitmap_manager(
91023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      new TestSharedBitmapManager());
9111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<ResourceProvider> resource_provider(
9121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ResourceProvider::Create(output_surface.get(),
9131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               shared_bitmap_manager.get(),
9141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               NULL,
9151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               0,
9161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               false,
9171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               1,
9181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               false));
9193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
92058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LayerTreeSettings settings;
92158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  settings.should_clear_root_render_pass = false;
92258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
92358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FakeRendererClient renderer_client;
92458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FakeRendererGL renderer(&renderer_client,
92558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          &settings,
92658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          output_surface.get(),
92758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          resource_provider.get());
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
929a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Rect viewport_rect(10, 10);
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
93103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId root_pass_id(1, 0);
932a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  TestRenderPass* root_pass = AddRenderPass(&render_passes_in_draw_order_,
933a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                            root_pass_id,
934a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                            viewport_rect,
935a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                            gfx::Transform());
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddQuad(root_pass, viewport_rect, SK_ColorGREEN);
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
93803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId child_pass_id(2, 0);
939a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  TestRenderPass* child_pass = AddRenderPass(&render_passes_in_draw_order_,
940a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                             child_pass_id,
941a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                             viewport_rect,
942a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                             gfx::Transform());
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddQuad(child_pass, viewport_rect, SK_ColorBLUE);
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddRenderPassQuad(root_pass, child_pass);
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
947fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch#ifdef NDEBUG
948fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  GLint clear_bits = GL_COLOR_BUFFER_BIT;
949fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch#else
950fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  GLint clear_bits = GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT;
951fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch#endif
952fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // First render pass is not the root one, clearing should happen.
954fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  EXPECT_CALL(*mock_context, clear(clear_bits)).Times(AtLeast(1));
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Expectation first_render_pass =
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_CALL(*mock_context, drawElements(_, _, _, _)).Times(1);
9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The second render pass is the root one, clearing should be prevented.
960a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_CALL(*mock_context, clear(clear_bits)).Times(0).After(
961a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      first_render_pass);
9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
963a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_CALL(*mock_context, drawElements(_, _, _, _)).Times(AnyNumber()).After(
964a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      first_render_pass);
9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
966a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_);
967a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer.DrawFrame(&render_passes_in_draw_order_,
968a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     1.f,
969a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     viewport_rect,
970a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     viewport_rect,
971a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     false);
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // In multiple render passes all but the root pass should clear the
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // framebuffer.
9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Mock::VerifyAndClearExpectations(&mock_context);
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ScissorTestOnClearCheckingContext : public TestWebGraphicsContext3D {
9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScissorTestOnClearCheckingContext() : scissor_enabled_(false) {}
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void clear(GLbitfield) OVERRIDE { EXPECT_FALSE(scissor_enabled_); }
9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void enable(GLenum cap) OVERRIDE {
9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (cap == GL_SCISSOR_TEST)
9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scissor_enabled_ = true;
9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void disable(GLenum cap) OVERRIDE {
9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (cap == GL_SCISSOR_TEST)
9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scissor_enabled_ = false;
9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool scissor_enabled_;
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
998a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(GLRendererTest, ScissorTestWhenClearing) {
9993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<ScissorTestOnClearCheckingContext> context_owned(
10003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      new ScissorTestOnClearCheckingContext);
10013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
10023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeOutputSurfaceClient output_surface_client;
10033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<OutputSurface> output_surface(FakeOutputSurface::Create3d(
10043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      context_owned.PassAs<TestWebGraphicsContext3D>()));
10053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  CHECK(output_surface->BindToClient(&output_surface_client));
10063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
100723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<SharedBitmapManager> shared_bitmap_manager(
100823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      new TestSharedBitmapManager());
10091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<ResourceProvider> resource_provider(
10101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ResourceProvider::Create(output_surface.get(),
10111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               shared_bitmap_manager.get(),
10121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               NULL,
10131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               0,
10141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               false,
10151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               1,
10161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               false));
10173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
101858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LayerTreeSettings settings;
10193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeRendererClient renderer_client;
102058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FakeRendererGL renderer(&renderer_client,
102158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          &settings,
102258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          output_surface.get(),
102358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          resource_provider.get());
10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(renderer.Capabilities().using_partial_swap);
10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1026a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Rect viewport_rect(1, 1);
10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect grand_child_rect(25, 25);
102903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId grand_child_pass_id(3, 0);
1030a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  TestRenderPass* grand_child_pass =
1031a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      AddRenderPass(&render_passes_in_draw_order_,
1032a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    grand_child_pass_id,
1033a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    grand_child_rect,
1034a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    gfx::Transform());
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddClippedQuad(grand_child_pass, grand_child_rect, SK_ColorYELLOW);
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect child_rect(50, 50);
103803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId child_pass_id(2, 0);
1039a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  TestRenderPass* child_pass = AddRenderPass(&render_passes_in_draw_order_,
1040a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                             child_pass_id,
1041a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                             child_rect,
1042a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                             gfx::Transform());
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddQuad(child_pass, child_rect, SK_ColorBLUE);
10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
104503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId root_pass_id(1, 0);
1046a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  TestRenderPass* root_pass = AddRenderPass(&render_passes_in_draw_order_,
1047a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                            root_pass_id,
1048a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                            viewport_rect,
1049a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                            gfx::Transform());
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddQuad(root_pass, viewport_rect, SK_ColorGREEN);
10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddRenderPassQuad(root_pass, child_pass);
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddRenderPassQuad(child_pass, grand_child_pass);
10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1055a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_);
1056a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer.DrawFrame(&render_passes_in_draw_order_,
1057a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     1.f,
1058a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     viewport_rect,
1059a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     viewport_rect,
1060a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     false);
1061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
106368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class DiscardCheckingContext : public TestWebGraphicsContext3D {
106468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public:
106568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DiscardCheckingContext() : discarded_(0) {
106668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    set_have_post_sub_buffer(true);
106768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    set_have_discard_framebuffer(true);
106868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
106968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
10705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void discardFramebufferEXT(GLenum target,
10715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     GLsizei numAttachments,
10725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     const GLenum* attachments) OVERRIDE {
107368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ++discarded_;
107468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
107568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
107668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  int discarded() const { return discarded_; }
107768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void reset() { discarded_ = 0; }
107868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
107968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private:
108068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  int discarded_;
108168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)};
108268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1083868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class NonReshapableOutputSurface : public FakeOutputSurface {
1084868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
1085868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  explicit NonReshapableOutputSurface(
10863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      scoped_ptr<TestWebGraphicsContext3D> context3d)
108768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      : FakeOutputSurface(TestContextProvider::Create(context3d.Pass()),
108868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                          false) {
108968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    surface_size_ = gfx::Size(500, 500);
109068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
10915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void Reshape(const gfx::Size& size, float scale_factor) OVERRIDE {}
10925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void set_fixed_size(const gfx::Size& size) { surface_size_ = size; }
1093868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
1094868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1095a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(GLRendererTest, NoDiscardOnPartialUpdates) {
109668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_ptr<DiscardCheckingContext> context_owned(new DiscardCheckingContext);
109768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DiscardCheckingContext* context = context_owned.get();
109868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
109968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  FakeOutputSurfaceClient output_surface_client;
110068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_ptr<NonReshapableOutputSurface> output_surface(
110168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      new NonReshapableOutputSurface(
110268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          context_owned.PassAs<TestWebGraphicsContext3D>()));
110368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  CHECK(output_surface->BindToClient(&output_surface_client));
110468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  output_surface->set_fixed_size(gfx::Size(100, 100));
110568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
110623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<SharedBitmapManager> shared_bitmap_manager(
110723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      new TestSharedBitmapManager());
11081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<ResourceProvider> resource_provider(
11091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ResourceProvider::Create(output_surface.get(),
11101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               shared_bitmap_manager.get(),
11111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               NULL,
11121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               0,
11131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               false,
11141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               1,
11151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               false));
111668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
111768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  LayerTreeSettings settings;
111868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  settings.partial_swap_enabled = true;
111968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  FakeRendererClient renderer_client;
112068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  FakeRendererGL renderer(&renderer_client,
112168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                          &settings,
112268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                          output_surface.get(),
112368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                          resource_provider.get());
112468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(renderer.Capabilities().using_partial_swap);
112568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Rect viewport_rect(100, 100);
1127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Rect clip_rect(100, 100);
112868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
112968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  {
113068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // Partial frame, should not discard.
113103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    RenderPassId root_pass_id(1, 0);
1132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    TestRenderPass* root_pass = AddRenderPass(&render_passes_in_draw_order_,
1133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                              root_pass_id,
1134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                              viewport_rect,
1135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                              gfx::Transform());
113668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    AddQuad(root_pass, viewport_rect, SK_ColorGREEN);
1137c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    root_pass->damage_rect = gfx::Rect(2, 2, 3, 3);
113868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_);
1140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    renderer.DrawFrame(&render_passes_in_draw_order_,
1141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       1.f,
1142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
1143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       clip_rect,
1144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       false);
114568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(0, context->discarded());
114668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    context->reset();
1147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
114868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  {
114968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // Full frame, should discard.
115003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    RenderPassId root_pass_id(1, 0);
1151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    TestRenderPass* root_pass = AddRenderPass(&render_passes_in_draw_order_,
1152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                              root_pass_id,
1153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                              viewport_rect,
1154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                              gfx::Transform());
115568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    AddQuad(root_pass, viewport_rect, SK_ColorGREEN);
1156c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    root_pass->damage_rect = root_pass->output_rect;
115768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_);
1159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    renderer.DrawFrame(&render_passes_in_draw_order_,
1160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       1.f,
1161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
1162a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       clip_rect,
1163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       false);
116468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(1, context->discarded());
116568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    context->reset();
116668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
116768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  {
116868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // Full frame, external scissor is set, should not discard.
116968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    output_surface->set_has_external_stencil_test(true);
117003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    RenderPassId root_pass_id(1, 0);
1171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    TestRenderPass* root_pass = AddRenderPass(&render_passes_in_draw_order_,
1172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                              root_pass_id,
1173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                              viewport_rect,
1174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                              gfx::Transform());
117568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    AddQuad(root_pass, viewport_rect, SK_ColorGREEN);
1176c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    root_pass->damage_rect = root_pass->output_rect;
117768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    root_pass->has_transparent_background = false;
117868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_);
1180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    renderer.DrawFrame(&render_passes_in_draw_order_,
1181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       1.f,
1182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
1183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       clip_rect,
1184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       false);
118568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(0, context->discarded());
118668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    context->reset();
118768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    output_surface->set_has_external_stencil_test(false);
118868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
118968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  {
119068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // Full frame, clipped, should not discard.
1191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    clip_rect = gfx::Rect(10, 10, 10, 10);
119203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    RenderPassId root_pass_id(1, 0);
1193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    TestRenderPass* root_pass = AddRenderPass(&render_passes_in_draw_order_,
1194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                              root_pass_id,
1195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                              viewport_rect,
1196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                              gfx::Transform());
119768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    AddQuad(root_pass, viewport_rect, SK_ColorGREEN);
1198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    root_pass->damage_rect = root_pass->output_rect;
119968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_);
1201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    renderer.DrawFrame(&render_passes_in_draw_order_,
1202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       1.f,
1203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
1204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       clip_rect,
1205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       false);
120668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(0, context->discarded());
120768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    context->reset();
120868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
120968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  {
121068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // Full frame, doesn't cover the surface, should not discard.
1211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    viewport_rect = gfx::Rect(10, 10, 10, 10);
121203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    RenderPassId root_pass_id(1, 0);
1213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    TestRenderPass* root_pass = AddRenderPass(&render_passes_in_draw_order_,
1214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                              root_pass_id,
1215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                              viewport_rect,
1216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                              gfx::Transform());
121768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    AddQuad(root_pass, viewport_rect, SK_ColorGREEN);
1218c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    root_pass->damage_rect = root_pass->output_rect;
121968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_);
1221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    renderer.DrawFrame(&render_passes_in_draw_order_,
1222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       1.f,
1223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
1224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       clip_rect,
1225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       false);
122668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(0, context->discarded());
122768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    context->reset();
122868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
122968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  {
123068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // Full frame, doesn't cover the surface (no offset), should not discard.
1231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    clip_rect = gfx::Rect(100, 100);
1232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    viewport_rect = gfx::Rect(50, 50);
123303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    RenderPassId root_pass_id(1, 0);
1234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    TestRenderPass* root_pass = AddRenderPass(&render_passes_in_draw_order_,
1235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                              root_pass_id,
1236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                              viewport_rect,
1237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                              gfx::Transform());
123868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    AddQuad(root_pass, viewport_rect, SK_ColorGREEN);
1239c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    root_pass->damage_rect = root_pass->output_rect;
124068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_);
1242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    renderer.DrawFrame(&render_passes_in_draw_order_,
1243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       1.f,
1244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
1245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       clip_rect,
1246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       false);
124768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(0, context->discarded());
124868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    context->reset();
124968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
125068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
1251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class FlippedScissorAndViewportContext : public TestWebGraphicsContext3D {
1253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
1254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FlippedScissorAndViewportContext()
1255868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      : did_call_viewport_(false), did_call_scissor_(false) {}
1256868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual ~FlippedScissorAndViewportContext() {
1257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_TRUE(did_call_viewport_);
1258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_TRUE(did_call_scissor_);
1259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
1260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
12615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void viewport(GLint x, GLint y, GLsizei width, GLsizei height)
12625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      OVERRIDE {
1263868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(10, x);
1264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(390, y);
1265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(100, width);
1266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(100, height);
1267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    did_call_viewport_ = true;
1268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
1269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
12705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void scissor(GLint x, GLint y, GLsizei width, GLsizei height)
12715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      OVERRIDE {
1272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(30, x);
1273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(450, y);
1274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(20, width);
1275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(20, height);
1276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    did_call_scissor_ = true;
1277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
1278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private:
1280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool did_call_viewport_;
1281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool did_call_scissor_;
1282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
1283868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1284a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(GLRendererTest, ScissorAndViewportWithinNonreshapableSurface) {
1285868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // In Android WebView, the OutputSurface is unable to respect reshape() calls
1286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // and maintains a fixed size. This test verifies that glViewport and
1287868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // glScissor's Y coordinate is flipped correctly in this environment, and that
1288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // the glViewport can be at a nonzero origin within the surface.
12893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<FlippedScissorAndViewportContext> context_owned(
12903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      new FlippedScissorAndViewportContext);
12913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
12923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeOutputSurfaceClient output_surface_client;
12933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<OutputSurface> output_surface(new NonReshapableOutputSurface(
12943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      context_owned.PassAs<TestWebGraphicsContext3D>()));
12953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  CHECK(output_surface->BindToClient(&output_surface_client));
12963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
129723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<SharedBitmapManager> shared_bitmap_manager(
129823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      new TestSharedBitmapManager());
12991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<ResourceProvider> resource_provider(
13001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ResourceProvider::Create(output_surface.get(),
13011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               shared_bitmap_manager.get(),
13021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               NULL,
13031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               0,
13041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               false,
13051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               1,
13061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                               false));
13073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
130858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LayerTreeSettings settings;
130968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  FakeRendererClient renderer_client;
131058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FakeRendererGL renderer(&renderer_client,
131158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          &settings,
131258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          output_surface.get(),
131358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          resource_provider.get());
1314868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(renderer.Capabilities().using_partial_swap);
1315868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1316a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Rect device_viewport_rect(10, 10, 100, 100);
1317a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Rect viewport_rect(device_viewport_rect.size());
1318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  gfx::Rect quad_rect = gfx::Rect(20, 20, 20, 20);
1319868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
132003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId root_pass_id(1, 0);
1321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  TestRenderPass* root_pass = AddRenderPass(&render_passes_in_draw_order_,
1322a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                            root_pass_id,
1323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                            viewport_rect,
1324a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                            gfx::Transform());
1325868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  AddClippedQuad(root_pass, quad_rect, SK_ColorGREEN);
1326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_);
1328a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer.DrawFrame(&render_passes_in_draw_order_,
1329a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     1.f,
1330a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     device_viewport_rect,
1331a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     device_viewport_rect,
1332a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                     false);
1333868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
1334868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
13357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(GLRendererShaderTest, DrawRenderPassQuadShaderPermutations) {
1336a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Rect viewport_rect(1, 1);
1337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Rect child_rect(50, 50);
133903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId child_pass_id(2, 0);
1340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestRenderPass* child_pass;
1341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
134203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId root_pass_id(1, 0);
1343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestRenderPass* root_pass;
1344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ResourceProvider::ResourceId mask = resource_provider_->CreateResource(
1346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      gfx::Size(20, 12),
1347a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      GL_CLAMP_TO_EDGE,
134803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      ResourceProvider::TextureHintImmutable,
1349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      resource_provider_->best_texture_format());
1350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  resource_provider_->AllocateForTesting(mask);
1351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SkScalar matrix[20];
1353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float amount = 0.5f;
1354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[0] = 0.213f + 0.787f * amount;
1355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[1] = 0.715f - 0.715f * amount;
1356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[2] = 1.f - (matrix[0] + matrix[1]);
1357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[3] = matrix[4] = 0;
1358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[5] = 0.213f - 0.213f * amount;
1359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[6] = 0.715f + 0.285f * amount;
1360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[7] = 1.f - (matrix[5] + matrix[6]);
1361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[8] = matrix[9] = 0;
1362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[10] = 0.213f - 0.213f * amount;
1363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[11] = 0.715f - 0.715f * amount;
1364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[12] = 1.f - (matrix[10] + matrix[11]);
1365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[13] = matrix[14] = 0;
1366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[15] = matrix[16] = matrix[17] = matrix[19] = 0;
1367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  matrix[18] = 1;
1368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  skia::RefPtr<SkColorFilter> color_filter(
1369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      skia::AdoptRef(SkColorMatrixFilter::Create(matrix)));
1370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  skia::RefPtr<SkImageFilter> filter = skia::AdoptRef(
1371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SkColorFilterImageFilter::Create(color_filter.get(), NULL));
137268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  FilterOperations filters;
137368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  filters.Append(FilterOperation::CreateReferenceFilter(filter));
1374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform transform_causing_aa;
1376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  transform_causing_aa.Rotate(20.0);
1377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // RenderPassProgram
1379a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  child_pass = AddRenderPass(&render_passes_in_draw_order_,
1380a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             child_pass_id,
1381a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             child_rect,
1382a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             gfx::Transform());
1383a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1384a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  root_pass = AddRenderPass(&render_passes_in_draw_order_,
1385a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            root_pass_id,
1386a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            viewport_rect,
1387a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            gfx::Transform());
1388a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1389a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  AddRenderPassQuad(
1390a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      root_pass, child_pass, 0, FilterOperations(), gfx::Transform());
1391a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1392a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer_->DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_);
1393a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer_->DrawFrame(&render_passes_in_draw_order_,
1394a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       1.f,
1395a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
1396a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
1397a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       false);
1398f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestRenderPassProgram(TexCoordPrecisionMedium);
1399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // RenderPassColorMatrixProgram
1401a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  render_passes_in_draw_order_.clear();
1402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1403a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  child_pass = AddRenderPass(&render_passes_in_draw_order_,
1404a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             child_pass_id,
1405a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             child_rect,
1406a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             transform_causing_aa);
1407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1408a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  root_pass = AddRenderPass(&render_passes_in_draw_order_,
1409a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            root_pass_id,
1410a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            viewport_rect,
1411a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            gfx::Transform());
1412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
141368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  AddRenderPassQuad(root_pass, child_pass, 0, filters, gfx::Transform());
1414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1415a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer_->DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_);
1416a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer_->DrawFrame(&render_passes_in_draw_order_,
1417a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       1.f,
1418a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
1419a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
1420a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       false);
1421f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestRenderPassColorMatrixProgram(TexCoordPrecisionMedium);
1422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // RenderPassMaskProgram
1424a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  render_passes_in_draw_order_.clear();
1425a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1426a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  child_pass = AddRenderPass(&render_passes_in_draw_order_,
1427a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             child_pass_id,
1428a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             child_rect,
1429a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             gfx::Transform());
1430a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1431a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  root_pass = AddRenderPass(&render_passes_in_draw_order_,
1432a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            root_pass_id,
1433a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            viewport_rect,
1434a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            gfx::Transform());
1435a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1436a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  AddRenderPassQuad(
1437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      root_pass, child_pass, mask, FilterOperations(), gfx::Transform());
1438a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1439a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer_->DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_);
1440a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer_->DrawFrame(&render_passes_in_draw_order_,
1441a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       1.f,
1442a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
1443a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
1444a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       false);
1445f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestRenderPassMaskProgram(TexCoordPrecisionMedium);
1446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // RenderPassMaskColorMatrixProgram
1448a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  render_passes_in_draw_order_.clear();
1449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1450a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  child_pass = AddRenderPass(&render_passes_in_draw_order_,
1451a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             child_pass_id,
1452a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             child_rect,
1453a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             gfx::Transform());
1454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1455a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  root_pass = AddRenderPass(&render_passes_in_draw_order_,
1456a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            root_pass_id,
1457a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            viewport_rect,
1458a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            gfx::Transform());
1459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
146068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  AddRenderPassQuad(root_pass, child_pass, mask, filters, gfx::Transform());
1461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1462a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer_->DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_);
1463a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer_->DrawFrame(&render_passes_in_draw_order_,
1464a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       1.f,
1465a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
1466a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
1467a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       false);
1468f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestRenderPassMaskColorMatrixProgram(TexCoordPrecisionMedium);
1469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // RenderPassProgramAA
1471a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  render_passes_in_draw_order_.clear();
1472a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1473a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  child_pass = AddRenderPass(&render_passes_in_draw_order_,
1474a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             child_pass_id,
1475a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             child_rect,
1476a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             transform_causing_aa);
1477a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1478a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  root_pass = AddRenderPass(&render_passes_in_draw_order_,
1479a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            root_pass_id,
1480a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            viewport_rect,
1481a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            gfx::Transform());
1482a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1483a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  AddRenderPassQuad(
1484a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      root_pass, child_pass, 0, FilterOperations(), transform_causing_aa);
1485a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1486a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer_->DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_);
1487a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer_->DrawFrame(&render_passes_in_draw_order_,
1488a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       1.f,
1489a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
1490a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
1491a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       false);
1492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestRenderPassProgramAA(TexCoordPrecisionMedium);
1493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1494c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // RenderPassColorMatrixProgramAA
1495a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  render_passes_in_draw_order_.clear();
1496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1497a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  child_pass = AddRenderPass(&render_passes_in_draw_order_,
1498a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             child_pass_id,
1499a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             child_rect,
1500a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             transform_causing_aa);
1501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1502a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  root_pass = AddRenderPass(&render_passes_in_draw_order_,
1503a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            root_pass_id,
1504a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            viewport_rect,
1505a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            gfx::Transform());
1506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
150768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  AddRenderPassQuad(root_pass, child_pass, 0, filters, transform_causing_aa);
1508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1509a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer_->DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_);
1510a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer_->DrawFrame(&render_passes_in_draw_order_,
1511a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       1.f,
1512a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
1513a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
1514a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       false);
1515f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestRenderPassColorMatrixProgramAA(TexCoordPrecisionMedium);
1516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // RenderPassMaskProgramAA
1518a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  render_passes_in_draw_order_.clear();
1519a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1520a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  child_pass = AddRenderPass(&render_passes_in_draw_order_,
1521a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             child_pass_id,
1522a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             child_rect,
1523a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             transform_causing_aa);
1524a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1525a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  root_pass = AddRenderPass(&render_passes_in_draw_order_,
1526a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            root_pass_id,
1527a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            viewport_rect,
1528a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            gfx::Transform());
1529a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1530a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  AddRenderPassQuad(
1531a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      root_pass, child_pass, mask, FilterOperations(), transform_causing_aa);
1532a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1533a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer_->DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_);
1534a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer_->DrawFrame(&render_passes_in_draw_order_,
1535a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       1.f,
1536a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
1537a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
1538a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       false);
1539f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestRenderPassMaskProgramAA(TexCoordPrecisionMedium);
1540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // RenderPassMaskColorMatrixProgramAA
1542a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  render_passes_in_draw_order_.clear();
1543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1544a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  child_pass = AddRenderPass(&render_passes_in_draw_order_,
1545a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             child_pass_id,
1546a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             child_rect,
1547a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             transform_causing_aa);
1548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1549a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  root_pass = AddRenderPass(&render_passes_in_draw_order_,
1550a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            root_pass_id,
1551a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            viewport_rect,
1552a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            transform_causing_aa);
1553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
155468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  AddRenderPassQuad(root_pass, child_pass, mask, filters, transform_causing_aa);
1555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1556a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer_->DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_);
1557a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer_->DrawFrame(&render_passes_in_draw_order_,
1558a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       1.f,
1559a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
1560a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
1561a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       false);
1562f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestRenderPassMaskColorMatrixProgramAA(TexCoordPrecisionMedium);
1563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
156590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// At this time, the AA code path cannot be taken if the surface's rect would
156690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// project incorrectly by the given transform, because of w<0 clipping.
156790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(GLRendererShaderTest, DrawRenderPassQuadSkipsAAForClippingTransform) {
156890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Rect child_rect(50, 50);
156903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId child_pass_id(2, 0);
157090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TestRenderPass* child_pass;
157190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1572a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Rect viewport_rect(1, 1);
157303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId root_pass_id(1, 0);
157490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  TestRenderPass* root_pass;
157590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
157690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Transform transform_preventing_aa;
157790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  transform_preventing_aa.ApplyPerspectiveDepth(40.0);
157890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  transform_preventing_aa.RotateAboutYAxis(-20.0);
157990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  transform_preventing_aa.Scale(30.0, 1.0);
158090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
158190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Verify that the test transform and test rect actually do cause the clipped
158290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // flag to trigger. Otherwise we are not testing the intended scenario.
158390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool clipped = false;
1584a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  MathUtil::MapQuad(transform_preventing_aa, gfx::QuadF(child_rect), &clipped);
158590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(clipped);
158690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1587a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  child_pass = AddRenderPass(&render_passes_in_draw_order_,
1588a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             child_pass_id,
1589a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             child_rect,
1590a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             transform_preventing_aa);
159190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1592a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  root_pass = AddRenderPass(&render_passes_in_draw_order_,
1593a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            root_pass_id,
1594a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            viewport_rect,
1595a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            gfx::Transform());
159690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1597a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  AddRenderPassQuad(
1598a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      root_pass, child_pass, 0, FilterOperations(), transform_preventing_aa);
159990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1600a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer_->DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_);
1601a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer_->DrawFrame(&render_passes_in_draw_order_,
1602a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       1.f,
1603a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
1604a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
1605a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       false);
160690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
160790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // If use_aa incorrectly ignores clipping, it will use the
160890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // RenderPassProgramAA shader instead of the RenderPassProgram.
1609f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TestRenderPassProgram(TexCoordPrecisionMedium);
161090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
161190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(GLRendererShaderTest, DrawSolidColorShader) {
1613a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Rect viewport_rect(1, 1);
161403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RenderPassId root_pass_id(1, 0);
1615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestRenderPass* root_pass;
1616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Transform pixel_aligned_transform_causing_aa;
1618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pixel_aligned_transform_causing_aa.Translate(25.5f, 25.5f);
1619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pixel_aligned_transform_causing_aa.Scale(0.5f, 0.5f);
1620c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1621a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  root_pass = AddRenderPass(&render_passes_in_draw_order_,
1622a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            root_pass_id,
1623a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            viewport_rect,
1624a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            gfx::Transform());
1625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AddTransformedQuad(root_pass,
1626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     viewport_rect,
1627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     SK_ColorYELLOW,
1628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     pixel_aligned_transform_causing_aa);
1629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1630a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer_->DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_);
1631a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  renderer_->DrawFrame(&render_passes_in_draw_order_,
1632a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       1.f,
1633a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
1634a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       viewport_rect,
1635a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                       false);
1636c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1637c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TestSolidColorProgramAA();
16382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class OutputSurfaceMockContext : public TestWebGraphicsContext3D {
16412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
16425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  OutputSurfaceMockContext() { test_capabilities_.gpu.post_sub_buffer = true; }
1643424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Specifically override methods even if they are unused (used in conjunction
16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // with StrictMock). We need to make sure that GLRenderer does not issue
16465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // framebuffer-related GLuint calls directly. Instead these are supposed to go
16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // through the OutputSurface abstraction.
16485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MOCK_METHOD2(bindFramebuffer, void(GLenum target, GLuint framebuffer));
164990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MOCK_METHOD3(reshapeWithScaleFactor,
165090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)               void(int width, int height, float scale_factor));
16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD4(drawElements,
16525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               void(GLenum mode, GLsizei count, GLenum type, GLintptr offset));
16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockOutputSurface : public OutputSurface {
16562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockOutputSurface()
1658a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      : OutputSurface(
1659a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            TestContextProvider::Create(scoped_ptr<TestWebGraphicsContext3D>(
1660a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                new StrictMock<OutputSurfaceMockContext>))) {
1661868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    surface_size_ = gfx::Size(100, 100);
1662868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~MockOutputSurface() {}
16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD0(EnsureBackbuffer, void());
16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD0(DiscardBackbuffer, void());
16675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MOCK_METHOD2(Reshape, void(const gfx::Size& size, float scale_factor));
16682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MOCK_METHOD0(BindFramebuffer, void());
16695e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)  MOCK_METHOD1(SwapBuffers, void(CompositorFrame* frame));
16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
16712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1672a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class MockOutputSurfaceTest : public GLRendererTest {
16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
16743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual void SetUp() {
16753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    FakeOutputSurfaceClient output_surface_client_;
16763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    CHECK(output_surface_.BindToClient(&output_surface_client_));
16773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
167823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    shared_bitmap_manager_.reset(new TestSharedBitmapManager());
16791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    resource_provider_ = ResourceProvider::Create(&output_surface_,
16801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  shared_bitmap_manager_.get(),
16811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  NULL,
16821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  0,
16831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  false,
16841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  1,
16851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                  false).Pass();
16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1687a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    renderer_.reset(new FakeRendererGL(&renderer_client_,
1688a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       &settings_,
1689a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       &output_surface_,
1690a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       resource_provider_.get()));
16913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1693f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void SwapBuffers() { renderer_->SwapBuffers(CompositorFrameMetadata()); }
16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void DrawFrame(float device_scale_factor,
16965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 const gfx::Rect& device_viewport_rect) {
169703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    RenderPassId render_pass_id(1, 0);
1698a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    TestRenderPass* render_pass = AddRenderPass(&render_passes_in_draw_order_,
1699a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                render_pass_id,
1700a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                device_viewport_rect,
1701a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                gfx::Transform());
1702a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    AddQuad(render_pass, device_viewport_rect, SK_ColorGREEN);
17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(output_surface_, EnsureBackbuffer()).WillRepeatedly(Return());
17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1706868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_CALL(output_surface_,
1707a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                Reshape(device_viewport_rect.size(), device_scale_factor))
1708a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        .Times(1);
17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(output_surface_, BindFramebuffer()).Times(1);
17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_CALL(*Context(), drawElements(_, _, _, _)).Times(1);
17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    renderer_->DecideRenderPassAllocationsForFrame(
1715a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        render_passes_in_draw_order_);
1716a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    renderer_->DrawFrame(&render_passes_in_draw_order_,
1717a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                         device_scale_factor,
1718a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                         device_viewport_rect,
1719a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                         device_viewport_rect,
1720a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                         false);
17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  OutputSurfaceMockContext* Context() {
17243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return static_cast<OutputSurfaceMockContext*>(
17251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        static_cast<TestContextProvider*>(output_surface_.context_provider())
17261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            ->TestContext3d());
17272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
17282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LayerTreeSettings settings_;
17303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FakeOutputSurfaceClient output_surface_client_;
17312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StrictMock<MockOutputSurface> output_surface_;
173223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  scoped_ptr<SharedBitmapManager> shared_bitmap_manager_;
17332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ResourceProvider> resource_provider_;
1734a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  FakeRendererClient renderer_client_;
17353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<FakeRendererGL> renderer_;
17362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
17372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(MockOutputSurfaceTest, DrawFrameAndSwap) {
1739a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Rect device_viewport_rect(1, 1);
1740a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DrawFrame(1.f, device_viewport_rect);
17412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_CALL(output_surface_, SwapBuffers(_)).Times(1);
1743f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  renderer_->SwapBuffers(CompositorFrameMetadata());
174490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
174590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
174690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(MockOutputSurfaceTest, DrawFrameAndResizeAndSwap) {
1747a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Rect device_viewport_rect(1, 1);
1748a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1749a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DrawFrame(1.f, device_viewport_rect);
175090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(output_surface_, SwapBuffers(_)).Times(1);
1751f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  renderer_->SwapBuffers(CompositorFrameMetadata());
175290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1753a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  device_viewport_rect = gfx::Rect(2, 2);
175490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1755a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DrawFrame(2.f, device_viewport_rect);
175690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(output_surface_, SwapBuffers(_)).Times(1);
1757f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  renderer_->SwapBuffers(CompositorFrameMetadata());
175890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1759a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DrawFrame(2.f, device_viewport_rect);
176090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(output_surface_, SwapBuffers(_)).Times(1);
1761f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  renderer_->SwapBuffers(CompositorFrameMetadata());
176290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1763a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  device_viewport_rect = gfx::Rect(1, 1);
176490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1765a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DrawFrame(1.f, device_viewport_rect);
176690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_CALL(output_surface_, SwapBuffers(_)).Times(1);
1767f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  renderer_->SwapBuffers(CompositorFrameMetadata());
17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1770b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class GLRendererTestSyncPoint : public GLRendererPixelTest {
1771b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) protected:
1772b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  static void SyncPointCallback(int* callback_count) {
1773b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    ++(*callback_count);
1774b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoop::current()->QuitWhenIdle();
1775b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
1776b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1777b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  static void OtherCallback(int* callback_count) {
1778b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    ++(*callback_count);
1779b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoop::current()->QuitWhenIdle();
1780b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
1781b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)};
1782b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1783b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#if !defined(OS_ANDROID)
1784b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST_F(GLRendererTestSyncPoint, SignalSyncPointOnLostContext) {
1785b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  int sync_point_callback_count = 0;
1786b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  int other_callback_count = 0;
17875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gpu::gles2::GLES2Interface* gl =
17885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      output_surface_->context_provider()->ContextGL();
17898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  gpu::ContextSupport* context_support =
17908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      output_surface_->context_provider()->ContextSupport();
1791b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
17925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  uint32 sync_point = gl->InsertSyncPointCHROMIUM();
1793b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
17945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gl->LoseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB,
17955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                          GL_INNOCENT_CONTEXT_RESET_ARB);
17968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
17978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  context_support->SignalSyncPoint(
17988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      sync_point, base::Bind(&SyncPointCallback, &sync_point_callback_count));
1799b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(0, sync_point_callback_count);
1800b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(0, other_callback_count);
1801b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1802b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Make the sync point happen.
18035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gl->Finish();
1804b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Post a task after the sync point.
1805b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop::current()->PostTask(
1806a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      FROM_HERE, base::Bind(&OtherCallback, &other_callback_count));
1807b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1808b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop::current()->Run();
1809b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1810b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // The sync point shouldn't have happened since the context was lost.
1811b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(0, sync_point_callback_count);
1812b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(1, other_callback_count);
1813b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1814b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1815b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST_F(GLRendererTestSyncPoint, SignalSyncPoint) {
1816b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  int sync_point_callback_count = 0;
1817b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  int other_callback_count = 0;
1818b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
18195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gpu::gles2::GLES2Interface* gl =
18205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      output_surface_->context_provider()->ContextGL();
18218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  gpu::ContextSupport* context_support =
18228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      output_surface_->context_provider()->ContextSupport();
18238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
18245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  uint32 sync_point = gl->InsertSyncPointCHROMIUM();
18258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
18268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  context_support->SignalSyncPoint(
18278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      sync_point, base::Bind(&SyncPointCallback, &sync_point_callback_count));
1828b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(0, sync_point_callback_count);
1829b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(0, other_callback_count);
1830b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1831b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Make the sync point happen.
18325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gl->Finish();
1833b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Post a task after the sync point.
1834b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop::current()->PostTask(
1835a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      FROM_HERE, base::Bind(&OtherCallback, &other_callback_count));
1836b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1837b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop::current()->Run();
1838b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1839b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // The sync point should have happened.
1840b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(1, sync_point_callback_count);
1841b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(1, other_callback_count);
1842b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1843b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#endif  // OS_ANDROID
1844b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
18452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
18462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
1847