12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 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/test/pixel_test.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/command_line.h" 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/path_service.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/run_loop.h" 111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "cc/base/switches.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/compositor_frame_metadata.h" 1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "cc/output/copy_output_request.h" 147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "cc/output/copy_output_result.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/gl_renderer.h" 167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "cc/output/output_surface_client.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/output/software_renderer.h" 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/resources/raster_worker_pool.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/resource_provider.h" 2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "cc/resources/texture_mailbox_deleter.h" 21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "cc/test/fake_output_surface_client.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/paths.h" 237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "cc/test/pixel_test_output_surface.h" 247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "cc/test/pixel_test_software_output_device.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/pixel_test_utils.h" 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "cc/test/test_in_process_context_provider.h" 2723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/test/test_shared_bitmap_manager.h" 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "cc/trees/blocking_task_runner.h" 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "gpu/command_buffer/client/gles2_interface.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PixelTest::PixelTest() 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : device_viewport_size_(gfx::Size(200, 200)), 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) disable_picture_quad_image_filtering_(false), 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output_surface_client_(new FakeOutputSurfaceClient), 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci main_thread_task_runner_( 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BlockingTaskRunner::Create(base::MessageLoopProxy::current())) { 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PixelTest::~PixelTest() {} 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool PixelTest::RunPixelTest(RenderPassList* pass_list, 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& ref_file, 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const PixelComparator& comparator) { 46b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return RunPixelTestWithReadbackTarget(pass_list, 47b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) pass_list->back(), 48b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ref_file, 49b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) comparator); 50b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 51b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 52b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)bool PixelTest::RunPixelTestWithReadbackTarget( 53b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) RenderPassList* pass_list, 54b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) RenderPass* target, 55b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const base::FilePath& ref_file, 56b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const PixelComparator& comparator) { 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::RunLoop run_loop; 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) target->copy_requests.push_back(CopyOutputRequest::CreateBitmapRequest( 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&PixelTest::ReadbackResult, 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(this), 6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) run_loop.QuitClosure()))); 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) float device_scale_factor = 1.f; 65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Rect device_viewport_rect = 66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Rect(device_viewport_size_) + external_device_viewport_offset_; 67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Rect device_clip_rect = external_device_clip_rect_.IsEmpty() 68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ? device_viewport_rect 69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : external_device_clip_rect_; 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) renderer_->DecideRenderPassAllocationsForFrame(*pass_list); 7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) renderer_->DrawFrame(pass_list, 7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) device_scale_factor, 73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) device_viewport_rect, 74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) device_clip_rect, 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) disable_picture_quad_image_filtering_); 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Wait for the readback to complete. 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (output_surface_->context_provider()) 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch output_surface_->context_provider()->ContextGL()->Finish(); 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) run_loop.Run(); 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return PixelsMatchReference(ref_file, comparator); 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PixelTest::ReadbackResult(base::Closure quit_run_loop, 867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) scoped_ptr<CopyOutputResult> result) { 877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_TRUE(result->HasBitmap()); 887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) result_bitmap_ = result->TakeBitmap().Pass(); 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) quit_run_loop.Run(); 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool PixelTest::PixelsMatchReference(const base::FilePath& ref_file, 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const PixelComparator& comparator) { 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath test_data_dir; 95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!PathService::Get(CCPaths::DIR_TEST_DATA, &test_data_dir)) 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If this is false, we didn't set up a readback on a render pass. 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!result_bitmap_) 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) CommandLine* cmd = CommandLine::ForCurrentProcess(); 1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (cmd->HasSwitch(switches::kCCRebaselinePixeltests)) 1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return WritePNGFile(*result_bitmap_, test_data_dir.Append(ref_file), true); 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return MatchesPNGFile( 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *result_bitmap_, test_data_dir.Append(ref_file), comparator); 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void PixelTest::SetUpGLRenderer(bool use_skia_gpu_backend) { 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) enable_pixel_output_.reset(new gfx::DisableNullDrawGLBindings); 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) output_surface_.reset( 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new PixelTestOutputSurface(new TestInProcessContextProvider)); 115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) output_surface_->BindToClient(output_surface_client_.get()); 1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 11723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) shared_bitmap_manager_.reset(new TestSharedBitmapManager()); 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci resource_provider_ = ResourceProvider::Create(output_surface_.get(), 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci shared_bitmap_manager_.get(), 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci main_thread_task_runner_.get(), 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0, 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1, 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false); 12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) texture_mailbox_deleter_ = make_scoped_ptr( 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new TextureMailboxDeleter(base::MessageLoopProxy::current())); 12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) renderer_ = GLRenderer::Create(this, 13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) &settings_, 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output_surface_.get(), 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) resource_provider_.get(), 13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) texture_mailbox_deleter_.get(), 134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 0).PassAs<DirectRenderer>(); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PixelTest::ForceExpandedViewport(const gfx::Size& surface_expansion) { 138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static_cast<PixelTestOutputSurface*>(output_surface_.get()) 1397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ->set_surface_expansion_size(surface_expansion); 140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SoftwareOutputDevice* device = output_surface_->software_device(); 141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (device) { 142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static_cast<PixelTestSoftwareOutputDevice*>(device) 1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ->set_surface_expansion_size(surface_expansion); 144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PixelTest::ForceViewportOffset(const gfx::Vector2d& viewport_offset) { 148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) external_device_viewport_offset_ = viewport_offset; 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PixelTest::ForceDeviceClip(const gfx::Rect& clip) { 152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) external_device_clip_rect_ = clip; 15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 155fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdochvoid PixelTest::EnableExternalStencilTest() { 15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static_cast<PixelTestOutputSurface*>(output_surface_.get()) 15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ->set_has_external_stencil_test(true); 158fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch} 159fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PixelTest::SetUpSoftwareRenderer() { 161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<SoftwareOutputDevice> device(new PixelTestSoftwareOutputDevice()); 162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) output_surface_.reset(new PixelTestOutputSurface(device.Pass())); 163a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) output_surface_->BindToClient(output_surface_client_.get()); 16423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) shared_bitmap_manager_.reset(new TestSharedBitmapManager()); 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci resource_provider_ = ResourceProvider::Create(output_surface_.get(), 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci shared_bitmap_manager_.get(), 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci main_thread_task_runner_.get(), 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 0, 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1, 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false); 17223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) renderer_ = 17323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SoftwareRenderer::Create( 17423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) this, &settings_, output_surface_.get(), resource_provider_.get()) 17523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) .PassAs<DirectRenderer>(); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 179