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