1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/output/compositor_frame.h" 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/output/delegated_frame_data.h" 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/surfaces/surface.h" 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/surfaces/surface_factory.h" 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/surfaces/surface_factory_client.h" 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "cc/surfaces/surface_manager.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "testing/gtest/include/gtest/gtest.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gfx/size.h" 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace cc { 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace { 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass TestSurfaceFactoryClient : public SurfaceFactoryClient { 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TestSurfaceFactoryClient() {} 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual ~TestSurfaceFactoryClient() {} 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void ReturnResources( 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ReturnedResourceArray& resources) OVERRIDE { 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch returned_resources_.insert( 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch returned_resources_.end(), resources.begin(), resources.end()); 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ReturnedResourceArray& returned_resources() const { 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return returned_resources_; 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void clear_returned_resources() { returned_resources_.clear(); } 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private: 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ReturnedResourceArray returned_resources_; 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DISALLOW_COPY_AND_ASSIGN(TestSurfaceFactoryClient); 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass SurfaceFactoryTest : public testing::Test { 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SurfaceFactoryTest() : factory_(&manager_, &client_), surface_id_(3) { 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch factory_.Create(surface_id_, gfx::Size(5, 5)); 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual ~SurfaceFactoryTest() { factory_.Destroy(surface_id_); } 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void SubmitFrameWithResources(ResourceProvider::ResourceId* resource_ids, 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch size_t num_resource_ids) { 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (size_t i = 0u; i < num_resource_ids; ++i) { 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TransferableResource resource; 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch resource.id = resource_ids[i]; 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch resource.mailbox_holder.texture_target = GL_TEXTURE_2D; 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch frame_data->resource_list.push_back(resource); 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<CompositorFrame> frame(new CompositorFrame); 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch frame->delegated_frame_data = frame_data.Pass(); 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci factory_.SubmitFrame(surface_id_, frame.Pass(), base::Closure()); 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void UnrefResources(ResourceProvider::ResourceId* ids_to_unref, 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int* counts_to_unref, 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch size_t num_ids_to_unref) { 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ReturnedResourceArray unref_array; 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (size_t i = 0; i < num_ids_to_unref; ++i) { 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ReturnedResource resource; 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch resource.id = ids_to_unref[i]; 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch resource.count = counts_to_unref[i]; 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch unref_array.push_back(resource); 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch factory_.UnrefResources(unref_array); 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void CheckReturnedResourcesMatchExpected( 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ResourceProvider::ResourceId* expected_returned_ids, 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int* expected_returned_counts, 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch size_t expected_resources) { 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ReturnedResourceArray& actual_resources = 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch client_.returned_resources(); 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_EQ(expected_resources, actual_resources.size()); 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (size_t i = 0; i < expected_resources; ++i) { 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ReturnedResource resource = actual_resources[i]; 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(expected_returned_ids[i], resource.id); 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(expected_returned_counts[i], resource.count); 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch client_.clear_returned_resources(); 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void RefCurrentFrameResources() { 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Surface* surface = manager_.GetSurfaceForId(surface_id_); 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch factory_.RefResources( 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch surface->GetEligibleFrame()->delegated_frame_data->resource_list); 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch protected: 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SurfaceManager manager_; 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TestSurfaceFactoryClient client_; 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SurfaceFactory factory_; 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SurfaceId surface_id_; 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Tests submitting a frame with resources followed by one with no resources 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// with no resource provider action in between. 105116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(SurfaceFactoryTest, ResourceLifetimeSimple) { 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ResourceProvider::ResourceId first_frame_ids[] = {1, 2, 3}; 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SubmitFrameWithResources(first_frame_ids, arraysize(first_frame_ids)); 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // All of the resources submitted in the first frame are still in use at this 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // time by virtue of being in the pending frame, so none can be returned to 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // the client yet. 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(0u, client_.returned_resources().size()); 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch client_.clear_returned_resources(); 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // The second frame references no resources and thus should make all resources 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // available to be returned. 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SubmitFrameWithResources(NULL, 0); 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ResourceProvider::ResourceId expected_returned_ids[] = {1, 2, 3}; 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int expected_returned_counts[] = {1, 1, 1}; 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CheckReturnedResourcesMatchExpected(expected_returned_ids, 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch expected_returned_counts, 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch arraysize(expected_returned_counts)); 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Tests submitting a frame with resources followed by one with no resources 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// with the resource provider holding everything alive. 128116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(SurfaceFactoryTest, ResourceLifetimeSimpleWithProviderHoldingAlive) { 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ResourceProvider::ResourceId first_frame_ids[] = {1, 2, 3}; 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SubmitFrameWithResources(first_frame_ids, arraysize(first_frame_ids)); 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // All of the resources submitted in the first frame are still in use at this 133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // time by virtue of being in the pending frame, so none can be returned to 134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // the client yet. 135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(0u, client_.returned_resources().size()); 136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch client_.clear_returned_resources(); 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Hold on to everything. 139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RefCurrentFrameResources(); 140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // The second frame references no resources and thus should make all resources 142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // available to be returned as soon as the resource provider releases them. 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SubmitFrameWithResources(NULL, 0); 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(0u, client_.returned_resources().size()); 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch client_.clear_returned_resources(); 147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int release_counts[] = {1, 1, 1}; 149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UnrefResources(first_frame_ids, release_counts, arraysize(first_frame_ids)); 150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ResourceProvider::ResourceId expected_returned_ids[] = {1, 2, 3}; 152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int expected_returned_counts[] = {1, 1, 1}; 153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CheckReturnedResourcesMatchExpected(expected_returned_ids, 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch expected_returned_counts, 155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch arraysize(expected_returned_counts)); 156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Tests referencing a resource, unref'ing it to zero, then using it again 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// before returning it to the client. 160116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(SurfaceFactoryTest, ResourceReusedBeforeReturn) { 161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ResourceProvider::ResourceId first_frame_ids[] = {7}; 162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SubmitFrameWithResources(first_frame_ids, arraysize(first_frame_ids)); 163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // This removes all references to resource id 7. 165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SubmitFrameWithResources(NULL, 0); 166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // This references id 7 again. 168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SubmitFrameWithResources(first_frame_ids, arraysize(first_frame_ids)); 169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // This removes it again. 171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SubmitFrameWithResources(NULL, 0); 172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Now it should be returned. 174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // We don't care how many entries are in the returned array for 7, so long as 175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // the total returned count matches the submitted count. 176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ReturnedResourceArray& returned = client_.returned_resources(); 177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch size_t return_count = 0; 178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (size_t i = 0; i < returned.size(); ++i) { 179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(7u, returned[i].id); 180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return_count += returned[i].count; 181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(2u, return_count); 183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Tests having resources referenced multiple times, as if referenced by 186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// multiple providers. 187116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(SurfaceFactoryTest, ResourceRefMultipleTimes) { 188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ResourceProvider::ResourceId first_frame_ids[] = {3, 4}; 189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SubmitFrameWithResources(first_frame_ids, arraysize(first_frame_ids)); 190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Ref resources from the first frame twice. 192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RefCurrentFrameResources(); 193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RefCurrentFrameResources(); 194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ResourceProvider::ResourceId second_frame_ids[] = {4, 5}; 196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SubmitFrameWithResources(second_frame_ids, arraysize(second_frame_ids)); 197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Ref resources from the second frame 3 times. 199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RefCurrentFrameResources(); 200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RefCurrentFrameResources(); 201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RefCurrentFrameResources(); 202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Submit a frame with no resources to remove all current frame refs from 204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // submitted resources. 205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SubmitFrameWithResources(NULL, 0); 206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(0u, client_.returned_resources().size()); 208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch client_.clear_returned_resources(); 209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Expected current refs: 211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 3 -> 2 212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 4 -> 2 + 3 = 5 213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 5 -> 3 214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SCOPED_TRACE("unref all 3"); 216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ResourceProvider::ResourceId ids_to_unref[] = {3, 4, 5}; 217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int counts[] = {1, 1, 1}; 218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UnrefResources(ids_to_unref, counts, arraysize(ids_to_unref)); 219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(0u, client_.returned_resources().size()); 221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch client_.clear_returned_resources(); 222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UnrefResources(ids_to_unref, counts, arraysize(ids_to_unref)); 224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ResourceProvider::ResourceId expected_returned_ids[] = {3}; 226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int expected_returned_counts[] = {1}; 227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CheckReturnedResourcesMatchExpected(expected_returned_ids, 228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch expected_returned_counts, 229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch arraysize(expected_returned_counts)); 230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Expected refs remaining: 233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 4 -> 3 234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 5 -> 1 235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SCOPED_TRACE("unref 4 and 5"); 237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ResourceProvider::ResourceId ids_to_unref[] = {4, 5}; 238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int counts[] = {1, 1}; 239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UnrefResources(ids_to_unref, counts, arraysize(ids_to_unref)); 240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ResourceProvider::ResourceId expected_returned_ids[] = {5}; 242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int expected_returned_counts[] = {1}; 243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CheckReturnedResourcesMatchExpected(expected_returned_ids, 244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch expected_returned_counts, 245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch arraysize(expected_returned_counts)); 246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Now, just 2 refs remaining on resource 4. Unref both at once and make sure 249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // the returned count is correct. 250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SCOPED_TRACE("unref only 4"); 252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ResourceProvider::ResourceId ids_to_unref[] = {4}; 253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int counts[] = {2}; 254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UnrefResources(ids_to_unref, counts, arraysize(ids_to_unref)); 255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ResourceProvider::ResourceId expected_returned_ids[] = {4}; 257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int expected_returned_counts[] = {2}; 258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CheckReturnedResourcesMatchExpected(expected_returned_ids, 259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch expected_returned_counts, 260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch arraysize(expected_returned_counts)); 261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 264116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(SurfaceFactoryTest, ResourceLifetime) { 265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ResourceProvider::ResourceId first_frame_ids[] = {1, 2, 3}; 266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SubmitFrameWithResources(first_frame_ids, arraysize(first_frame_ids)); 267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // All of the resources submitted in the first frame are still in use at this 269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // time by virtue of being in the pending frame, so none can be returned to 270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // the client yet. 271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(0u, client_.returned_resources().size()); 272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch client_.clear_returned_resources(); 273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // The second frame references some of the same resources, but some different 275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // ones. We expect to receive back resource 1 with a count of 1 since it was 276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // only referenced by the first frame. 277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ResourceProvider::ResourceId second_frame_ids[] = {2, 3, 4}; 278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SubmitFrameWithResources(second_frame_ids, arraysize(second_frame_ids)); 279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 280116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 281116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SCOPED_TRACE("second frame"); 282116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ResourceProvider::ResourceId expected_returned_ids[] = {1}; 283116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int expected_returned_counts[] = {1}; 284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CheckReturnedResourcesMatchExpected(expected_returned_ids, 285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch expected_returned_counts, 286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch arraysize(expected_returned_counts)); 287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // The third frame references a disjoint set of resources, so we expect to 290116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // receive back all resources from the first and second frames. Resource IDs 2 291116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // and 3 will have counts of 2, since they were used in both frames, and 292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // resource ID 4 will have a count of 1. 293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ResourceProvider::ResourceId third_frame_ids[] = {10, 11, 12, 13}; 294116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SubmitFrameWithResources(third_frame_ids, arraysize(third_frame_ids)); 295116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 296116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SCOPED_TRACE("third frame"); 298116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ResourceProvider::ResourceId expected_returned_ids[] = {2, 3, 4}; 299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int expected_returned_counts[] = {2, 2, 1}; 300116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CheckReturnedResourcesMatchExpected(expected_returned_ids, 301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch expected_returned_counts, 302116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch arraysize(expected_returned_counts)); 303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 305116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Simulate a ResourceProvider taking a ref on all of the resources. 306116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RefCurrentFrameResources(); 307116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 308116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ResourceProvider::ResourceId fourth_frame_ids[] = {12, 13}; 309116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SubmitFrameWithResources(fourth_frame_ids, arraysize(fourth_frame_ids)); 310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(0u, client_.returned_resources().size()); 312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RefCurrentFrameResources(); 314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // All resources are still being used by the external reference, so none can 316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // be returned to the client. 317116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(0u, client_.returned_resources().size()); 318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Release resources associated with the first RefCurrentFrameResources() call 320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // first. 321116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 322116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ResourceProvider::ResourceId ids_to_unref[] = {10, 11, 12, 13}; 323116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int counts[] = {1, 1, 1, 1}; 324116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UnrefResources(ids_to_unref, counts, arraysize(ids_to_unref)); 325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 326116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 327116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 328116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SCOPED_TRACE("fourth frame, first unref"); 329116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ResourceProvider::ResourceId expected_returned_ids[] = {10, 11}; 330116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int expected_returned_counts[] = {1, 1}; 331116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CheckReturnedResourcesMatchExpected(expected_returned_ids, 332116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch expected_returned_counts, 333116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch arraysize(expected_returned_counts)); 334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ResourceProvider::ResourceId ids_to_unref[] = {12, 13}; 338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int counts[] = {1, 1}; 339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UnrefResources(ids_to_unref, counts, arraysize(ids_to_unref)); 340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 342116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Resources 12 and 13 are still in use by the current frame, so they 343116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // shouldn't be available to be returned. 344116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(0u, client_.returned_resources().size()); 345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 346116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // If we submit an empty frame, however, they should become available. 347116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SubmitFrameWithResources(NULL, 0u); 348116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 349116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SCOPED_TRACE("fourth frame, second unref"); 351116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ResourceProvider::ResourceId expected_returned_ids[] = {12, 13}; 352116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int expected_returned_counts[] = {2, 2}; 353116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CheckReturnedResourcesMatchExpected(expected_returned_ids, 354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch expected_returned_counts, 355116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch arraysize(expected_returned_counts)); 356116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 357116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 358116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 3591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Tests shutting down the factory with a surface with outstanding refs still in 3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// the map. 3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(SurfaceFactoryTest, DestroyWithResourceRefs) { 3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SurfaceId id(7); 3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci factory_.Create(id, gfx::Size(1, 1)); 3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); 3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TransferableResource resource; 3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci resource.id = 1; 3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci resource.mailbox_holder.texture_target = GL_TEXTURE_2D; 3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci frame_data->resource_list.push_back(resource); 3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<CompositorFrame> frame(new CompositorFrame); 3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci frame->delegated_frame_data = frame_data.Pass(); 3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci factory_.SubmitFrame(id, frame.Pass(), base::Closure()); 3731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 375116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace 376116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace cc 377