11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <set> 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "cc/test/test_context_provider.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "cc/test/test_web_graphics_context_3d.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/browser/compositor/buffer_queue.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "gpu/GLES2/gl2extchromium.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "testing/gmock/include/gmock/gmock.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "testing/gtest/include/gtest/gtest.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "third_party/khronos/GLES2/gl2ext.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing ::testing::_; 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing ::testing::Expectation; 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing ::testing::Ne; 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing ::testing::Return; 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace content { 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass MockBufferQueue : public BufferQueue { 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MockBufferQueue(scoped_refptr<cc::ContextProvider> context_provider, 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned int internalformat) 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : BufferQueue(context_provider, internalformat) {} 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MOCK_METHOD4(CopyBufferDamage, 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void(int, int, const gfx::Rect&, const gfx::Rect&)); 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass BufferQueueTest : public ::testing::Test { 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BufferQueueTest() : doublebuffering_(true), first_frame_(true) {} 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void SetUp() OVERRIDE { 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<cc::TestContextProvider> context_provider = 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cc::TestContextProvider::Create(cc::TestWebGraphicsContext3D::Create()); 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci context_provider->BindToCurrentThread(); 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output_surface_.reset(new MockBufferQueue(context_provider, GL_RGBA8_OES)); 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output_surface_->Initialize(); 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned current_surface() { return output_surface_->current_surface_.image; } 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::vector<BufferQueue::AllocatedSurface>& available_surfaces() { 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return output_surface_->available_surfaces_; 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::deque<BufferQueue::AllocatedSurface>& in_flight_surfaces() { 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return output_surface_->in_flight_surfaces_; 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const BufferQueue::AllocatedSurface& last_frame() { 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return output_surface_->in_flight_surfaces_.back(); 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const BufferQueue::AllocatedSurface& next_frame() { 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return output_surface_->available_surfaces_.back(); 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const gfx::Size size() { return output_surface_->size_; } 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int CountBuffers() { 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int n = available_surfaces().size() + in_flight_surfaces().size(); 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (current_surface()) 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci n++; 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return n; 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Check that each buffer is unique if present. 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void CheckUnique() { 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::set<unsigned> buffers; 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(InsertUnique(&buffers, current_surface())); 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (size_t i = 0; i < available_surfaces().size(); i++) 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(InsertUnique(&buffers, available_surfaces()[i].image)); 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (std::deque<BufferQueue::AllocatedSurface>::const_iterator it = 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci in_flight_surfaces().begin(); 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci it != in_flight_surfaces().end(); 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++it) 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(InsertUnique(&buffers, it->image)); 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SwapBuffers() { 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output_surface_->SwapBuffers(gfx::Rect(output_surface_->size_)); 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SendDamagedFrame(const gfx::Rect& damage) { 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // We don't care about the GL-level implementation here, just how it uses 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // damage rects. 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output_surface_->BindFramebuffer(); 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output_surface_->SwapBuffers(damage); 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (doublebuffering_ || !first_frame_) 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output_surface_->PageFlipComplete(); 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci first_frame_ = false; 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SendFullFrame() { SendDamagedFrame(gfx::Rect(output_surface_->size_)); } 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected: 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool InsertUnique(std::set<unsigned>* set, unsigned value) { 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!value) 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (set->find(value) != set->end()) 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci set->insert(value); 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<MockBufferQueue> output_surface_; 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool doublebuffering_; 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool first_frame_; 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace { 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst gfx::Size screen_size = gfx::Size(30, 30); 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst gfx::Rect screen_rect = gfx::Rect(screen_size); 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst gfx::Rect small_damage = gfx::Rect(gfx::Size(10, 10)); 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst gfx::Rect large_damage = gfx::Rect(gfx::Size(20, 20)); 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst gfx::Rect overlapping_damage = gfx::Rect(gfx::Size(5, 20)); 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass MockedContext : public cc::TestWebGraphicsContext3D { 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MOCK_METHOD2(bindFramebuffer, void(GLenum, GLuint)); 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MOCK_METHOD2(bindTexture, void(GLenum, GLuint)); 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MOCK_METHOD2(bindTexImage2DCHROMIUM, void(GLenum, GLint)); 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MOCK_METHOD4(createImageCHROMIUM, GLuint(GLsizei, GLsizei, GLenum, GLenum)); 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MOCK_METHOD1(destroyImageCHROMIUM, void(GLuint)); 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MOCK_METHOD5(framebufferTexture2D, 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void(GLenum, GLenum, GLenum, GLuint, GLint)); 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_ptr<BufferQueue> CreateOutputSurfaceWithMock(MockedContext** context) { 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *context = new MockedContext(); 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<cc::TestContextProvider> context_provider = 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cc::TestContextProvider::Create( 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<cc::TestWebGraphicsContext3D>(*context)); 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci context_provider->BindToCurrentThread(); 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<BufferQueue> buffer_queue( 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new BufferQueue(context_provider, GL_RGBA8_OES)); 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer_queue->Initialize(); 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return buffer_queue.Pass(); 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(BufferQueueStandaloneTest, FboInitialization) { 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MockedContext* context; 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<BufferQueue> output_surface = 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateOutputSurfaceWithMock(&context); 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(*context, bindFramebuffer(GL_FRAMEBUFFER, Ne(0U))); 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ON_CALL(*context, framebufferTexture2D(_, _, _, _, _)) 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .WillByDefault(Return()); 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output_surface->Reshape(gfx::Size(10, 20), 1.0f); 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(BufferQueueStandaloneTest, FboBinding) { 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MockedContext* context; 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<BufferQueue> output_surface = 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateOutputSurfaceWithMock(&context); 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, Ne(0U))); 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(*context, destroyImageCHROMIUM(1)); 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Expectation image = 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL( 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *context, 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci createImageCHROMIUM(0, 0, GL_RGBA8_OES, GL_IMAGE_SCANOUT_CHROMIUM)) 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .WillOnce(Return(1)); 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Expectation fb = 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(*context, bindFramebuffer(GL_FRAMEBUFFER, Ne(0U))); 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Expectation tex = EXPECT_CALL(*context, bindTexture(GL_TEXTURE_2D, Ne(0U))); 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Expectation bind_tex = 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(*context, bindTexImage2DCHROMIUM(GL_TEXTURE_2D, 1)) 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .After(tex, image); 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL( 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *context, 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci framebufferTexture2D( 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, Ne(0U), _)) 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .After(fb, bind_tex); 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output_surface->BindFramebuffer(); 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(BufferQueueTest, PartialSwapReuse) { 1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Check that 1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output_surface_->Reshape(screen_size, 1.0f); 1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(doublebuffering_); 1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(*output_surface_, 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CopyBufferDamage(_, _, small_damage, screen_rect)).Times(1); 1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(*output_surface_, 1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CopyBufferDamage(_, _, small_damage, small_damage)).Times(1); 1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(*output_surface_, 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CopyBufferDamage(_, _, large_damage, small_damage)).Times(1); 1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SendFullFrame(); 1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SendDamagedFrame(small_damage); 1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SendDamagedFrame(small_damage); 1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SendDamagedFrame(large_damage); 1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Verify that the damage has propagated. 1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(next_frame().damage, large_damage); 1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(BufferQueueTest, PartialSwapFullFrame) { 1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output_surface_->Reshape(screen_size, 1.0f); 1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(doublebuffering_); 1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(*output_surface_, 2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CopyBufferDamage(_, _, small_damage, screen_rect)).Times(1); 2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SendFullFrame(); 2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SendDamagedFrame(small_damage); 2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SendFullFrame(); 2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SendFullFrame(); 2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(next_frame().damage, screen_rect); 2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(BufferQueueTest, PartialSwapOverlapping) { 2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output_surface_->Reshape(screen_size, 1.0f); 2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(doublebuffering_); 2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(*output_surface_, 2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CopyBufferDamage(_, _, small_damage, screen_rect)).Times(1); 2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(*output_surface_, 2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CopyBufferDamage(_, _, overlapping_damage, small_damage)) 2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .Times(1); 2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SendFullFrame(); 2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SendDamagedFrame(small_damage); 2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SendDamagedFrame(overlapping_damage); 2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(next_frame().damage, overlapping_damage); 2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(BufferQueueTest, MultipleBindCalls) { 2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Check that multiple bind calls do not create or change surfaces. 2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output_surface_->BindFramebuffer(); 2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1, CountBuffers()); 2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned int fb = current_surface(); 2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output_surface_->BindFramebuffer(); 2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1, CountBuffers()); 2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(fb, current_surface()); 2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(BufferQueueTest, CheckDoubleBuffering) { 2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Check buffer flow through double buffering path. 2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0, CountBuffers()); 2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output_surface_->BindFramebuffer(); 2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1, CountBuffers()); 2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_NE(0U, current_surface()); 2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SwapBuffers(); 2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1U, in_flight_surfaces().size()); 2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output_surface_->PageFlipComplete(); 2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1U, in_flight_surfaces().size()); 2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output_surface_->BindFramebuffer(); 2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(2, CountBuffers()); 2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CheckUnique(); 2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_NE(0U, current_surface()); 2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1U, in_flight_surfaces().size()); 2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SwapBuffers(); 2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CheckUnique(); 2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(2U, in_flight_surfaces().size()); 2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output_surface_->PageFlipComplete(); 2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CheckUnique(); 2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1U, in_flight_surfaces().size()); 2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1U, available_surfaces().size()); 2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output_surface_->BindFramebuffer(); 2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(2, CountBuffers()); 2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CheckUnique(); 2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(available_surfaces().empty()); 2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(BufferQueueTest, CheckTripleBuffering) { 2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Check buffer flow through triple buffering path. 2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // This bit is the same sequence tested in the doublebuffering case. 2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output_surface_->BindFramebuffer(); 2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SwapBuffers(); 2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output_surface_->PageFlipComplete(); 2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output_surface_->BindFramebuffer(); 2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SwapBuffers(); 2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(2, CountBuffers()); 2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CheckUnique(); 2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(2U, in_flight_surfaces().size()); 2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output_surface_->BindFramebuffer(); 2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(3, CountBuffers()); 2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CheckUnique(); 2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_NE(0U, current_surface()); 2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(2U, in_flight_surfaces().size()); 2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci output_surface_->PageFlipComplete(); 2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(3, CountBuffers()); 2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CheckUnique(); 2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_NE(0U, current_surface()); 2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1U, in_flight_surfaces().size()); 2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1U, available_surfaces().size()); 2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace 2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace content 289