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