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 <set> | 7 #include <set> |
8 | 8 |
9 #include "base/location.h" | 9 #include "base/location.h" |
10 #include "base/single_thread_task_runner.h" | 10 #include "base/single_thread_task_runner.h" |
(...skipping 2092 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2103 public: | 2103 public: |
2104 class Strategy : public OverlayProcessor::Strategy { | 2104 class Strategy : public OverlayProcessor::Strategy { |
2105 public: | 2105 public: |
2106 Strategy() {} | 2106 Strategy() {} |
2107 ~Strategy() override {} | 2107 ~Strategy() override {} |
2108 MOCK_METHOD2(Attempt, | 2108 MOCK_METHOD2(Attempt, |
2109 bool(RenderPassList* render_passes_in_draw_order, | 2109 bool(RenderPassList* render_passes_in_draw_order, |
2110 OverlayCandidateList* candidates)); | 2110 OverlayCandidateList* candidates)); |
2111 }; | 2111 }; |
2112 | 2112 |
2113 TestOverlayProcessor(OutputSurface* surface, | 2113 TestOverlayProcessor(OutputSurface* surface) : OverlayProcessor(surface) {} |
2114 ResourceProvider* resource_provider) | |
2115 : OverlayProcessor(surface, resource_provider) {} | |
2116 ~TestOverlayProcessor() override {} | 2114 ~TestOverlayProcessor() override {} |
2117 void Initialize() override { | 2115 void Initialize() override { |
2118 strategy_ = new Strategy(); | 2116 strategy_ = new Strategy(); |
2119 strategies_.push_back(scoped_ptr<OverlayProcessor::Strategy>(strategy_)); | 2117 strategies_.push_back(scoped_ptr<OverlayProcessor::Strategy>(strategy_)); |
2120 } | 2118 } |
2121 | 2119 |
2122 Strategy* strategy_; | 2120 Strategy* strategy_; |
2123 }; | 2121 }; |
2124 | 2122 |
2125 void MailboxReleased(unsigned sync_point, | 2123 void MailboxReleased(unsigned sync_point, |
(...skipping 18 matching lines...) Expand all Loading... |
2144 1)); | 2142 1)); |
2145 scoped_ptr<TextureMailboxDeleter> mailbox_deleter( | 2143 scoped_ptr<TextureMailboxDeleter> mailbox_deleter( |
2146 new TextureMailboxDeleter(base::ThreadTaskRunnerHandle::Get())); | 2144 new TextureMailboxDeleter(base::ThreadTaskRunnerHandle::Get())); |
2147 | 2145 |
2148 RendererSettings settings; | 2146 RendererSettings settings; |
2149 FakeRendererClient renderer_client; | 2147 FakeRendererClient renderer_client; |
2150 FakeRendererGL renderer(&renderer_client, &settings, output_surface.get(), | 2148 FakeRendererGL renderer(&renderer_client, &settings, output_surface.get(), |
2151 resource_provider.get(), mailbox_deleter.get()); | 2149 resource_provider.get(), mailbox_deleter.get()); |
2152 | 2150 |
2153 TestOverlayProcessor* processor = | 2151 TestOverlayProcessor* processor = |
2154 new TestOverlayProcessor(output_surface.get(), resource_provider.get()); | 2152 new TestOverlayProcessor(output_surface.get()); |
2155 processor->Initialize(); | 2153 processor->Initialize(); |
2156 renderer.SetOverlayProcessor(processor); | 2154 renderer.SetOverlayProcessor(processor); |
2157 | 2155 |
2158 gfx::Rect viewport_rect(1, 1); | 2156 gfx::Rect viewport_rect(1, 1); |
2159 TestRenderPass* root_pass = | 2157 TestRenderPass* root_pass = |
2160 AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 0), | 2158 AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 0), |
2161 viewport_rect, gfx::Transform()); | 2159 viewport_rect, gfx::Transform()); |
2162 root_pass->has_transparent_background = false; | 2160 root_pass->has_transparent_background = false; |
2163 root_pass->copy_requests.push_back( | 2161 root_pass->copy_requests.push_back( |
2164 CopyOutputRequest::CreateRequest(base::Bind(&IgnoreCopyResult))); | 2162 CopyOutputRequest::CreateRequest(base::Bind(&IgnoreCopyResult))); |
2165 | 2163 |
2166 unsigned sync_point = 0; | 2164 unsigned sync_point = 0; |
2167 TextureMailbox mailbox = | 2165 TextureMailbox mailbox = |
2168 TextureMailbox(gpu::Mailbox::Generate(), GL_TEXTURE_2D, sync_point); | 2166 TextureMailbox(gpu::Mailbox::Generate(), GL_TEXTURE_2D, sync_point); |
2169 mailbox.set_allow_overlay(true); | |
2170 scoped_ptr<SingleReleaseCallbackImpl> release_callback = | 2167 scoped_ptr<SingleReleaseCallbackImpl> release_callback = |
2171 SingleReleaseCallbackImpl::Create(base::Bind(&MailboxReleased)); | 2168 SingleReleaseCallbackImpl::Create(base::Bind(&MailboxReleased)); |
2172 ResourceId resource_id = resource_provider->CreateResourceFromTextureMailbox( | 2169 ResourceId resource_id = resource_provider->CreateResourceFromTextureMailbox( |
2173 mailbox, release_callback.Pass()); | 2170 mailbox, release_callback.Pass()); |
2174 bool premultiplied_alpha = false; | 2171 bool premultiplied_alpha = false; |
2175 bool flipped = false; | 2172 bool flipped = false; |
2176 bool nearest_neighbor = false; | 2173 bool nearest_neighbor = false; |
2177 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; | 2174 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; |
2178 | 2175 |
2179 TextureDrawQuad* overlay_quad = | 2176 TextureDrawQuad* overlay_quad = |
2180 root_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); | 2177 root_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); |
2181 overlay_quad->SetNew(root_pass->CreateAndAppendSharedQuadState(), | 2178 overlay_quad->SetNew(root_pass->CreateAndAppendSharedQuadState(), |
2182 viewport_rect, viewport_rect, viewport_rect, resource_id, | 2179 viewport_rect, viewport_rect, viewport_rect, resource_id, |
2183 premultiplied_alpha, gfx::PointF(0, 0), | 2180 premultiplied_alpha, gfx::PointF(0, 0), |
2184 gfx::PointF(1, 1), SK_ColorTRANSPARENT, vertex_opacity, | 2181 gfx::PointF(1, 1), SK_ColorTRANSPARENT, vertex_opacity, |
2185 flipped, nearest_neighbor); | 2182 flipped, nearest_neighbor); |
| 2183 overlay_quad->allow_overlay = true; |
2186 | 2184 |
2187 // DirectRenderer::DrawFrame calls into OverlayProcessor::ProcessForOverlays. | 2185 // DirectRenderer::DrawFrame calls into OverlayProcessor::ProcessForOverlays. |
2188 // Attempt will be called for each strategy in OverlayProcessor. We have | 2186 // Attempt will be called for each strategy in OverlayProcessor. We have |
2189 // added a fake strategy, so checking for Attempt calls checks if there was | 2187 // added a fake strategy, so checking for Attempt calls checks if there was |
2190 // any attempt to overlay, which there shouldn't be. We can't use the quad | 2188 // any attempt to overlay, which there shouldn't be. We can't use the quad |
2191 // list because the render pass is cleaned up by DrawFrame. | 2189 // list because the render pass is cleaned up by DrawFrame. |
2192 EXPECT_CALL(*processor->strategy_, Attempt(_, _)).Times(0); | 2190 EXPECT_CALL(*processor->strategy_, Attempt(_, _)).Times(0); |
2193 renderer.DrawFrame(&render_passes_in_draw_order_, 1.f, viewport_rect, | 2191 renderer.DrawFrame(&render_passes_in_draw_order_, 1.f, viewport_rect, |
2194 viewport_rect, false); | 2192 viewport_rect, false); |
2195 Mock::VerifyAndClearExpectations(processor->strategy_); | 2193 Mock::VerifyAndClearExpectations(processor->strategy_); |
(...skipping 19 matching lines...) Expand all Loading... |
2215 public: | 2213 public: |
2216 class SingleOverlayValidator : public OverlayCandidateValidator { | 2214 class SingleOverlayValidator : public OverlayCandidateValidator { |
2217 public: | 2215 public: |
2218 void CheckOverlaySupport(OverlayCandidateList* surfaces) override { | 2216 void CheckOverlaySupport(OverlayCandidateList* surfaces) override { |
2219 ASSERT_EQ(2U, surfaces->size()); | 2217 ASSERT_EQ(2U, surfaces->size()); |
2220 OverlayCandidate& candidate = surfaces->back(); | 2218 OverlayCandidate& candidate = surfaces->back(); |
2221 candidate.overlay_handled = true; | 2219 candidate.overlay_handled = true; |
2222 } | 2220 } |
2223 }; | 2221 }; |
2224 | 2222 |
2225 SingleOverlayOnTopProcessor(OutputSurface* surface, | 2223 SingleOverlayOnTopProcessor(OutputSurface* surface) |
2226 ResourceProvider* resource_provider) | 2224 : OverlayProcessor(surface) {} |
2227 : OverlayProcessor(surface, resource_provider) {} | |
2228 | 2225 |
2229 void Initialize() override { | 2226 void Initialize() override { |
2230 strategies_.push_back(scoped_ptr<Strategy>( | 2227 strategies_.push_back( |
2231 new OverlayStrategySingleOnTop(&validator_, resource_provider_))); | 2228 scoped_ptr<Strategy>(new OverlayStrategySingleOnTop(&validator_))); |
2232 } | 2229 } |
2233 | 2230 |
2234 SingleOverlayValidator validator_; | 2231 SingleOverlayValidator validator_; |
2235 }; | 2232 }; |
2236 | 2233 |
2237 class WaitSyncPointCountingContext : public TestWebGraphicsContext3D { | 2234 class WaitSyncPointCountingContext : public TestWebGraphicsContext3D { |
2238 public: | 2235 public: |
2239 MOCK_METHOD1(waitSyncPoint, void(unsigned sync_point)); | 2236 MOCK_METHOD1(waitSyncPoint, void(unsigned sync_point)); |
2240 }; | 2237 }; |
2241 | 2238 |
(...skipping 29 matching lines...) Expand all Loading... |
2271 output_surface.get(), shared_bitmap_manager.get(), NULL, NULL, 0, false, | 2268 output_surface.get(), shared_bitmap_manager.get(), NULL, NULL, 0, false, |
2272 1)); | 2269 1)); |
2273 scoped_ptr<TextureMailboxDeleter> mailbox_deleter( | 2270 scoped_ptr<TextureMailboxDeleter> mailbox_deleter( |
2274 new TextureMailboxDeleter(base::ThreadTaskRunnerHandle::Get())); | 2271 new TextureMailboxDeleter(base::ThreadTaskRunnerHandle::Get())); |
2275 | 2272 |
2276 RendererSettings settings; | 2273 RendererSettings settings; |
2277 FakeRendererClient renderer_client; | 2274 FakeRendererClient renderer_client; |
2278 FakeRendererGL renderer(&renderer_client, &settings, output_surface.get(), | 2275 FakeRendererGL renderer(&renderer_client, &settings, output_surface.get(), |
2279 resource_provider.get(), mailbox_deleter.get()); | 2276 resource_provider.get(), mailbox_deleter.get()); |
2280 | 2277 |
2281 SingleOverlayOnTopProcessor* processor = new SingleOverlayOnTopProcessor( | 2278 SingleOverlayOnTopProcessor* processor = |
2282 output_surface.get(), resource_provider.get()); | 2279 new SingleOverlayOnTopProcessor(output_surface.get()); |
2283 processor->Initialize(); | 2280 processor->Initialize(); |
2284 renderer.SetOverlayProcessor(processor); | 2281 renderer.SetOverlayProcessor(processor); |
2285 | 2282 |
2286 gfx::Rect viewport_rect(1, 1); | 2283 gfx::Rect viewport_rect(1, 1); |
2287 TestRenderPass* root_pass = | 2284 TestRenderPass* root_pass = |
2288 AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 0), | 2285 AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 0), |
2289 viewport_rect, gfx::Transform()); | 2286 viewport_rect, gfx::Transform()); |
2290 root_pass->has_transparent_background = false; | 2287 root_pass->has_transparent_background = false; |
2291 | 2288 |
2292 unsigned sync_point = TestRenderPass::kSyncPointForMailboxTextureQuad; | 2289 unsigned sync_point = TestRenderPass::kSyncPointForMailboxTextureQuad; |
2293 TextureMailbox mailbox = | 2290 TextureMailbox mailbox = |
2294 TextureMailbox(gpu::Mailbox::Generate(), GL_TEXTURE_2D, sync_point); | 2291 TextureMailbox(gpu::Mailbox::Generate(), GL_TEXTURE_2D, sync_point); |
2295 mailbox.set_allow_overlay(true); | |
2296 scoped_ptr<SingleReleaseCallbackImpl> release_callback = | 2292 scoped_ptr<SingleReleaseCallbackImpl> release_callback = |
2297 SingleReleaseCallbackImpl::Create(base::Bind(&MailboxReleased)); | 2293 SingleReleaseCallbackImpl::Create(base::Bind(&MailboxReleased)); |
2298 ResourceId resource_id = resource_provider->CreateResourceFromTextureMailbox( | 2294 ResourceId resource_id = resource_provider->CreateResourceFromTextureMailbox( |
2299 mailbox, release_callback.Pass()); | 2295 mailbox, release_callback.Pass()); |
2300 bool premultiplied_alpha = false; | 2296 bool premultiplied_alpha = false; |
2301 bool flipped = false; | 2297 bool flipped = false; |
2302 bool nearest_neighbor = false; | 2298 bool nearest_neighbor = false; |
2303 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; | 2299 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; |
2304 gfx::PointF uv_top_left(0, 0); | 2300 gfx::PointF uv_top_left(0, 0); |
2305 gfx::PointF uv_bottom_right(1, 1); | 2301 gfx::PointF uv_bottom_right(1, 1); |
2306 | 2302 |
2307 TextureDrawQuad* overlay_quad = | 2303 TextureDrawQuad* overlay_quad = |
2308 root_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); | 2304 root_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); |
2309 SharedQuadState* shared_state = root_pass->CreateAndAppendSharedQuadState(); | 2305 SharedQuadState* shared_state = root_pass->CreateAndAppendSharedQuadState(); |
2310 shared_state->SetAll(gfx::Transform(), viewport_rect.size(), viewport_rect, | 2306 shared_state->SetAll(gfx::Transform(), viewport_rect.size(), viewport_rect, |
2311 viewport_rect, false, 1, SkXfermode::kSrcOver_Mode, 0); | 2307 viewport_rect, false, 1, SkXfermode::kSrcOver_Mode, 0); |
2312 overlay_quad->SetNew(shared_state, viewport_rect, viewport_rect, | 2308 overlay_quad->SetNew(shared_state, viewport_rect, viewport_rect, |
2313 viewport_rect, resource_id, premultiplied_alpha, | 2309 viewport_rect, resource_id, premultiplied_alpha, |
2314 uv_top_left, uv_bottom_right, SK_ColorTRANSPARENT, | 2310 uv_top_left, uv_bottom_right, SK_ColorTRANSPARENT, |
2315 vertex_opacity, flipped, nearest_neighbor); | 2311 vertex_opacity, flipped, nearest_neighbor); |
| 2312 overlay_quad->allow_overlay = true; |
2316 | 2313 |
2317 // Verify that overlay_quad actually gets turned into an overlay, and even | 2314 // Verify that overlay_quad actually gets turned into an overlay, and even |
2318 // though it's not drawn, that its sync point is waited on. | 2315 // though it's not drawn, that its sync point is waited on. |
2319 EXPECT_CALL(*context, | 2316 EXPECT_CALL(*context, |
2320 waitSyncPoint(TestRenderPass::kSyncPointForMailboxTextureQuad)) | 2317 waitSyncPoint(TestRenderPass::kSyncPointForMailboxTextureQuad)) |
2321 .Times(1); | 2318 .Times(1); |
2322 EXPECT_CALL(overlay_scheduler, | 2319 EXPECT_CALL(overlay_scheduler, |
2323 Schedule(1, gfx::OVERLAY_TRANSFORM_NONE, _, viewport_rect, | 2320 Schedule(1, gfx::OVERLAY_TRANSFORM_NONE, _, viewport_rect, |
2324 BoundingRect(uv_top_left, uv_bottom_right))).Times(1); | 2321 BoundingRect(uv_top_left, uv_bottom_right))).Times(1); |
2325 | 2322 |
2326 renderer.DrawFrame(&render_passes_in_draw_order_, 1.f, viewport_rect, | 2323 renderer.DrawFrame(&render_passes_in_draw_order_, 1.f, viewport_rect, |
2327 viewport_rect, false); | 2324 viewport_rect, false); |
2328 } | 2325 } |
2329 | 2326 |
2330 } // namespace | 2327 } // namespace |
2331 } // namespace cc | 2328 } // namespace cc |
OLD | NEW |