| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/output/gl_renderer.h" | 5 #include "cc/output/gl_renderer.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <set> | 9 #include <set> |
| 10 | 10 |
| (...skipping 2049 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2060 | 2060 |
| 2061 // Verify that overlay_quad actually gets turned into an overlay, and even | 2061 // Verify that overlay_quad actually gets turned into an overlay, and even |
| 2062 // though it's not drawn, that its sync point is waited on. | 2062 // though it's not drawn, that its sync point is waited on. |
| 2063 EXPECT_CALL(*context, waitSyncToken(MatchesSyncToken(sync_token))).Times(1); | 2063 EXPECT_CALL(*context, waitSyncToken(MatchesSyncToken(sync_token))).Times(1); |
| 2064 EXPECT_CALL(overlay_scheduler, | 2064 EXPECT_CALL(overlay_scheduler, |
| 2065 Schedule(1, gfx::OVERLAY_TRANSFORM_NONE, _, viewport_rect, | 2065 Schedule(1, gfx::OVERLAY_TRANSFORM_NONE, _, viewport_rect, |
| 2066 BoundingRect(uv_top_left, uv_bottom_right))).Times(1); | 2066 BoundingRect(uv_top_left, uv_bottom_right))).Times(1); |
| 2067 | 2067 |
| 2068 DrawFrame(&renderer, viewport_rect); | 2068 DrawFrame(&renderer, viewport_rect); |
| 2069 } | 2069 } |
| 2070 } // namespace |
| 2070 | 2071 |
| 2071 } // namespace | 2072 // Explicitly named to be a friend in GLRenderer. |
| 2073 class GLRendererRenderPassDrawQuadCopierTest : public testing::Test { |
| 2074 void SetUp() override { |
| 2075 settings_.release_overlay_resources_after_gpu_query = true; |
| 2076 output_surface_ = |
| 2077 FakeOutputSurface::Create3d(std::unique_ptr<TestWebGraphicsContext3D>( |
| 2078 new ForbidSynchronousCallContext)); |
| 2079 CHECK(output_surface_->BindToClient(&output_surface_client_)); |
| 2080 |
| 2081 shared_bitmap_manager_.reset(new TestSharedBitmapManager()); |
| 2082 resource_provider_ = FakeResourceProvider::Create( |
| 2083 output_surface_.get(), shared_bitmap_manager_.get()); |
| 2084 |
| 2085 renderer_.reset(new FakeRendererGL(&renderer_client_, &settings_, |
| 2086 output_surface_.get(), |
| 2087 resource_provider_.get())); |
| 2088 } |
| 2089 |
| 2090 protected: |
| 2091 FakeOutputSurfaceClient output_surface_client_; |
| 2092 std::unique_ptr<OutputSurface> output_surface_; |
| 2093 std::unique_ptr<SharedBitmapManager> shared_bitmap_manager_; |
| 2094 std::unique_ptr<ResourceProvider> resource_provider_; |
| 2095 RendererSettings settings_; |
| 2096 FakeRendererClient renderer_client_; |
| 2097 std::unique_ptr<FakeRendererGL> renderer_; |
| 2098 }; |
| 2099 |
| 2100 TEST_F(GLRendererRenderPassDrawQuadCopierTest, Reuse) { |
| 2101 // Make 4 resources of different sizes. |
| 2102 for (int i = 1; i < 5; ++i) { |
| 2103 std::unique_ptr<ScopedResource> resource = |
| 2104 ScopedResource::Create(resource_provider_.get()); |
| 2105 resource->Allocate(gfx::Size(i, i), ResourceProvider::TEXTURE_HINT_DEFAULT, |
| 2106 RGBA_8888); |
| 2107 renderer_->free_iosurfaces_.emplace_back(std::move(resource)); |
| 2108 } |
| 2109 ResourceId id = renderer_->CreateOrReuseIOSurface(gfx::Size(3, 3)); |
| 2110 EXPECT_EQ(3u, id); |
| 2111 EXPECT_EQ(3u, renderer_->free_iosurfaces_.size()); |
| 2112 id = renderer_->CreateOrReuseIOSurface(gfx::Size(3, 3)); |
| 2113 EXPECT_EQ(5u, id); |
| 2114 EXPECT_EQ(3u, renderer_->free_iosurfaces_.size()); |
| 2115 } |
| 2116 |
| 2117 TEST_F(GLRendererRenderPassDrawQuadCopierTest, ReleaseResources) { |
| 2118 // Set cache size to 6. |
| 2119 renderer_->UpdateCopyCountForFrame(3); |
| 2120 std::map<unsigned, GLRenderer::OverlayResourceLock>& swapped_resources = |
| 2121 renderer_->swapped_and_acked_overlay_resources_; |
| 2122 |
| 2123 // ResourceIds 1 through 6 are "in use" by the gpu process. |
| 2124 for (int i = 0; i < 6; ++i) { |
| 2125 std::unique_ptr<ScopedResource> resource = |
| 2126 ScopedResource::Create(resource_provider_.get()); |
| 2127 resource->Allocate(gfx::Size(1, 1), ResourceProvider::TEXTURE_HINT_DEFAULT, |
| 2128 RGBA_8888); |
| 2129 |
| 2130 // Force the resource to be allocated. |
| 2131 { |
| 2132 std::unique_ptr<ResourceProvider::ScopedWriteLockGL> lock( |
| 2133 new ResourceProvider::ScopedWriteLockGL(resource_provider_.get(), |
| 2134 resource->id(), false)); |
| 2135 } |
| 2136 |
| 2137 std::unique_ptr<ResourceProvider::ScopedReadLockGL> lock( |
| 2138 new ResourceProvider::ScopedReadLockGL(resource_provider_.get(), |
| 2139 resource->id())); |
| 2140 swapped_resources[resource->id()] = std::move(lock); |
| 2141 renderer_->in_use_iosurfaces_.emplace_back(std::move(resource)); |
| 2142 } |
| 2143 EXPECT_EQ(6u, swapped_resources.size()); |
| 2144 |
| 2145 // ResourceIds 7 through 11 are free. |
| 2146 for (int i = 0; i < 5; ++i) { |
| 2147 std::unique_ptr<ScopedResource> resource = |
| 2148 ScopedResource::Create(resource_provider_.get()); |
| 2149 resource->Allocate(gfx::Size(1, 1), ResourceProvider::TEXTURE_HINT_DEFAULT, |
| 2150 RGBA_8888); |
| 2151 renderer_->free_iosurfaces_.emplace_back(std::move(resource)); |
| 2152 } |
| 2153 |
| 2154 // Free ResourceId 3. |
| 2155 auto it = std::find_if( |
| 2156 swapped_resources.begin(), swapped_resources.end(), |
| 2157 [](std::pair<const unsigned, GLRenderer::OverlayResourceLock>& pair) { |
| 2158 return pair.second->resource_id() == 3; |
| 2159 }); |
| 2160 EXPECT_NE(it, swapped_resources.end()); |
| 2161 renderer_->OverlayResourceNoLongerInUse(it->first); |
| 2162 EXPECT_EQ(5u, renderer_->in_use_iosurfaces_.size()); |
| 2163 EXPECT_EQ(6u, renderer_->free_iosurfaces_.size()); |
| 2164 EXPECT_EQ(3u, renderer_->free_iosurfaces_[5]->id()); |
| 2165 |
| 2166 // Free two more resources. |
| 2167 renderer_->OverlayResourceNoLongerInUse(swapped_resources.begin()->first); |
| 2168 renderer_->OverlayResourceNoLongerInUse(swapped_resources.begin()->first); |
| 2169 EXPECT_EQ(3u, renderer_->in_use_iosurfaces_.size()); |
| 2170 EXPECT_EQ(6u, renderer_->free_iosurfaces_.size()); |
| 2171 EXPECT_EQ(9u, renderer_->free_iosurfaces_[0]->id()); |
| 2172 EXPECT_EQ(10u, renderer_->free_iosurfaces_[1]->id()); |
| 2173 EXPECT_EQ(11u, renderer_->free_iosurfaces_[2]->id()); |
| 2174 EXPECT_EQ(3u, renderer_->free_iosurfaces_[3]->id()); |
| 2175 } |
| 2176 |
| 2177 TEST_F(GLRendererRenderPassDrawQuadCopierTest, MaxCacheSize) { |
| 2178 for (int i = 0; i < 6; ++i) { |
| 2179 std::unique_ptr<ScopedResource> resource = |
| 2180 ScopedResource::Create(resource_provider_.get()); |
| 2181 resource->Allocate(gfx::Size(1, 1), ResourceProvider::TEXTURE_HINT_DEFAULT, |
| 2182 RGBA_8888); |
| 2183 renderer_->in_use_iosurfaces_.emplace_back(std::move(resource)); |
| 2184 } |
| 2185 for (int i = 0; i < 5; ++i) { |
| 2186 std::unique_ptr<ScopedResource> resource = |
| 2187 ScopedResource::Create(resource_provider_.get()); |
| 2188 resource->Allocate(gfx::Size(1, 1), ResourceProvider::TEXTURE_HINT_DEFAULT, |
| 2189 RGBA_8888); |
| 2190 renderer_->free_iosurfaces_.emplace_back(std::move(resource)); |
| 2191 } |
| 2192 |
| 2193 // Set cache size to 4. |
| 2194 renderer_->UpdateCopyCountForFrame(2); |
| 2195 EXPECT_EQ(4u, renderer_->iosurface_limit_); |
| 2196 EXPECT_EQ(6u, renderer_->in_use_iosurfaces_.size()); |
| 2197 EXPECT_EQ(4u, renderer_->free_iosurfaces_.size()); |
| 2198 |
| 2199 // Set cache size to 2. |
| 2200 renderer_->UpdateCopyCountForFrame(1); |
| 2201 EXPECT_EQ(2u, renderer_->iosurface_limit_); |
| 2202 EXPECT_EQ(6u, renderer_->in_use_iosurfaces_.size()); |
| 2203 EXPECT_EQ(2u, renderer_->free_iosurfaces_.size()); |
| 2204 |
| 2205 // Set cache size to 8. |
| 2206 renderer_->UpdateCopyCountForFrame(1); |
| 2207 EXPECT_EQ(2u, renderer_->iosurface_limit_); |
| 2208 EXPECT_EQ(6u, renderer_->in_use_iosurfaces_.size()); |
| 2209 EXPECT_EQ(2u, renderer_->free_iosurfaces_.size()); |
| 2210 } |
| 2211 |
| 2072 } // namespace cc | 2212 } // namespace cc |
| OLD | NEW |