1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// found in the LICENSE file.
4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "cc/output/output_surface.h"
67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/test/test_simple_task_runner.h"
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "cc/output/managed_memory_policy.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "cc/output/output_surface_client.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "cc/output/software_output_device.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "cc/test/begin_frame_args_test.h"
127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "cc/test/fake_output_surface.h"
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "cc/test/fake_output_surface_client.h"
140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "cc/test/test_context_provider.h"
150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "cc/test/test_web_graphics_context_3d.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/gfx/frame_time.h"
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace cc {
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace {
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class TestOutputSurface : public OutputSurface {
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  explicit TestOutputSurface(scoped_refptr<ContextProvider> context_provider)
265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      : OutputSurface(context_provider) {}
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  explicit TestOutputSurface(scoped_ptr<SoftwareOutputDevice> software_device)
295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      : OutputSurface(software_device.Pass()) {}
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  TestOutputSurface(scoped_refptr<ContextProvider> context_provider,
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                    scoped_ptr<SoftwareOutputDevice> software_device)
335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      : OutputSurface(context_provider, software_device.Pass()) {}
34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool InitializeNewContext3d(
363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      scoped_refptr<ContextProvider> new_context_provider) {
375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return InitializeAndSetContext3d(new_context_provider);
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  using OutputSurface::ReleaseGL;
417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void CommitVSyncParametersForTesting(base::TimeTicks timebase,
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       base::TimeDelta interval) {
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CommitVSyncParameters(timebase, interval);
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void BeginFrameForTesting() {
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    client_->BeginFrame(CreateExpiredBeginFrameArgsForTesting());
497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void DidSwapBuffersForTesting() { client_->DidSwapBuffers(); }
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void OnSwapBuffersCompleteForTesting() { client_->DidSwapBuffersComplete(); }
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch protected:
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class TestSoftwareOutputDevice : public SoftwareOutputDevice {
59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public:
60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  TestSoftwareOutputDevice();
61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual ~TestSoftwareOutputDevice();
62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Overriden from cc:SoftwareOutputDevice
64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual void DiscardBackbuffer() OVERRIDE;
65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual void EnsureBackbuffer() OVERRIDE;
66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  int discard_backbuffer_count() { return discard_backbuffer_count_; }
68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  int ensure_backbuffer_count() { return ensure_backbuffer_count_; }
69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
70d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private:
71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  int discard_backbuffer_count_;
72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  int ensure_backbuffer_count_;
73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)};
74d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TestSoftwareOutputDevice::TestSoftwareOutputDevice()
76d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    : discard_backbuffer_count_(0), ensure_backbuffer_count_(0) {}
77d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TestSoftwareOutputDevice::~TestSoftwareOutputDevice() {}
79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void TestSoftwareOutputDevice::DiscardBackbuffer() {
81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  SoftwareOutputDevice::DiscardBackbuffer();
82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  discard_backbuffer_count_++;
83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
84d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void TestSoftwareOutputDevice::EnsureBackbuffer() {
86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  SoftwareOutputDevice::EnsureBackbuffer();
87d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ensure_backbuffer_count_++;
88d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST(OutputSurfaceTest, ClientPointerIndicatesBindToClientSuccess) {
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<TestContextProvider> provider = TestContextProvider::Create();
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestOutputSurface output_surface(provider);
933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_FALSE(output_surface.HasClient());
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FakeOutputSurfaceClient client;
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(output_surface.BindToClient(&client));
973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(output_surface.HasClient());
98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(client.deferred_initialize_called());
99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Verify DidLoseOutputSurface callback is hooked up correctly.
101868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(client.did_lose_output_surface_called());
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  output_surface.context_provider()->ContextGL()->LoseContextCHROMIUM(
103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      GL_GUILTY_CONTEXT_RESET_ARB, GL_INNOCENT_CONTEXT_RESET_ARB);
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  output_surface.context_provider()->ContextGL()->Flush();
105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(client.did_lose_output_surface_called());
106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST(OutputSurfaceTest, ClientPointerIndicatesBindToClientFailure) {
1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_refptr<TestContextProvider> context_provider =
1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      TestContextProvider::Create();
111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Lose the context so BindToClient fails.
113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  context_provider->UnboundTestContext3d()->set_context_lost(true);
114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  TestOutputSurface output_surface(context_provider);
1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_FALSE(output_surface.HasClient());
117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FakeOutputSurfaceClient client;
119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(output_surface.BindToClient(&client));
1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_FALSE(output_surface.HasClient());
121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class OutputSurfaceTestInitializeNewContext3d : public ::testing::Test {
124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  OutputSurfaceTestInitializeNewContext3d()
1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      : context_provider_(TestContextProvider::Create()),
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        output_surface_(
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            scoped_ptr<SoftwareOutputDevice>(new SoftwareOutputDevice)),
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        client_(&output_surface_) {}
130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) protected:
132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void BindOutputSurface() {
133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_TRUE(output_surface_.BindToClient(&client_));
1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_TRUE(output_surface_.HasClient());
135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void InitializeNewContextExpectFail() {
1383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_FALSE(output_surface_.InitializeNewContext3d(context_provider_));
1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_TRUE(output_surface_.HasClient());
140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    EXPECT_FALSE(output_surface_.context_provider());
142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_TRUE(output_surface_.software_device());
143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_refptr<TestContextProvider> context_provider_;
146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TestOutputSurface output_surface_;
147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  FakeOutputSurfaceClient client_;
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(OutputSurfaceTestInitializeNewContext3d, Success) {
151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  BindOutputSurface();
152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(client_.deferred_initialize_called());
153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(output_surface_.InitializeNewContext3d(context_provider_));
155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(client_.deferred_initialize_called());
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(context_provider_.get(), output_surface_.context_provider());
157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(client_.did_lose_output_surface_called());
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  context_provider_->ContextGL()->LoseContextCHROMIUM(
160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      GL_GUILTY_CONTEXT_RESET_ARB, GL_INNOCENT_CONTEXT_RESET_ARB);
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  context_provider_->ContextGL()->Flush();
162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(client_.did_lose_output_surface_called());
1637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  output_surface_.ReleaseGL();
1653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_FALSE(output_surface_.context_provider());
166868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
167868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(OutputSurfaceTestInitializeNewContext3d, Context3dMakeCurrentFails) {
169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  BindOutputSurface();
1703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  context_provider_->UnboundTestContext3d()->set_context_lost(true);
172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  InitializeNewContextExpectFail();
173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(OutputSurfaceTest, MemoryAllocation) {
1763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_refptr<TestContextProvider> context_provider =
1773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      TestContextProvider::Create();
178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  TestOutputSurface output_surface(context_provider);
180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FakeOutputSurfaceClient client;
182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(output_surface.BindToClient(&client));
183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ManagedMemoryPolicy policy(0);
1853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  policy.bytes_limit_when_visible = 1234;
1863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  policy.priority_cutoff_when_visible =
1871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      gpu::MemoryAllocation::CUTOFF_ALLOW_REQUIRED_ONLY;
188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  context_provider->SetMemoryAllocation(policy);
190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(1234u, client.memory_policy().bytes_limit_when_visible);
1911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(gpu::MemoryAllocation::CUTOFF_ALLOW_REQUIRED_ONLY,
192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            client.memory_policy().priority_cutoff_when_visible);
193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  policy.priority_cutoff_when_visible =
1951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      gpu::MemoryAllocation::CUTOFF_ALLOW_EVERYTHING;
1960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  context_provider->SetMemoryAllocation(policy);
1971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EXPECT_EQ(gpu::MemoryAllocation::CUTOFF_ALLOW_EVERYTHING,
198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            client.memory_policy().priority_cutoff_when_visible);
199a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
200a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // 0 bytes limit should be ignored.
2013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  policy.bytes_limit_when_visible = 0;
2020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  context_provider->SetMemoryAllocation(policy);
203a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(1234u, client.memory_policy().bytes_limit_when_visible);
2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
206d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST(OutputSurfaceTest, SoftwareOutputDeviceBackbufferManagement) {
207d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  TestSoftwareOutputDevice* software_output_device =
208d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      new TestSoftwareOutputDevice();
209d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
210d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // TestOutputSurface now owns software_output_device and has responsibility to
211d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // free it.
212d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  scoped_ptr<TestSoftwareOutputDevice> p(software_output_device);
213d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  TestOutputSurface output_surface(p.PassAs<SoftwareOutputDevice>());
214d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
215d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, software_output_device->ensure_backbuffer_count());
216d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, software_output_device->discard_backbuffer_count());
217d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
218d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  output_surface.EnsureBackbuffer();
219d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(1, software_output_device->ensure_backbuffer_count());
220d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(0, software_output_device->discard_backbuffer_count());
221d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  output_surface.DiscardBackbuffer();
222d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
223d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(1, software_output_device->ensure_backbuffer_count());
224d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  EXPECT_EQ(1, software_output_device->discard_backbuffer_count());
225d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
226d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace
228868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace cc
229