Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1021)

Side by Side Diff: cc/output/gl_renderer_unittest.cc

Issue 2162193002: Add logic to GLRenderer to support RenderPassDrawQuad copying. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Clean up. Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698