| 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 |