| 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 2011 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2022 public: | 2022 public: |
| 2023 class Strategy : public OverlayProcessor::Strategy { | 2023 class Strategy : public OverlayProcessor::Strategy { |
| 2024 public: | 2024 public: |
| 2025 Strategy() {} | 2025 Strategy() {} |
| 2026 ~Strategy() override {} | 2026 ~Strategy() override {} |
| 2027 MOCK_METHOD2(Attempt, | 2027 MOCK_METHOD2(Attempt, |
| 2028 bool(RenderPassList* render_passes_in_draw_order, | 2028 bool(RenderPassList* render_passes_in_draw_order, |
| 2029 OverlayCandidateList* candidates)); | 2029 OverlayCandidateList* candidates)); |
| 2030 }; | 2030 }; |
| 2031 | 2031 |
| 2032 TestOverlayProcessor(OutputSurface* surface, | 2032 explicit TestOverlayProcessor(OutputSurface* surface) |
| 2033 ResourceProvider* resource_provider) | 2033 : OverlayProcessor(surface) {} |
| 2034 : OverlayProcessor(surface, resource_provider) {} | |
| 2035 ~TestOverlayProcessor() override {} | 2034 ~TestOverlayProcessor() override {} |
| 2036 void Initialize() override { | 2035 void Initialize() override { |
| 2037 strategy_ = new Strategy(); | 2036 strategy_ = new Strategy(); |
| 2038 strategies_.push_back(scoped_ptr<OverlayProcessor::Strategy>(strategy_)); | 2037 strategies_.push_back(scoped_ptr<OverlayProcessor::Strategy>(strategy_)); |
| 2039 } | 2038 } |
| 2040 | 2039 |
| 2041 Strategy* strategy_; | 2040 Strategy* strategy_; |
| 2042 }; | 2041 }; |
| 2043 | 2042 |
| 2044 void MailboxReleased(unsigned sync_point, | 2043 void MailboxReleased(unsigned sync_point, |
| (...skipping 17 matching lines...) Expand all Loading... |
| 2062 output_surface.get(), shared_bitmap_manager.get()); | 2061 output_surface.get(), shared_bitmap_manager.get()); |
| 2063 scoped_ptr<TextureMailboxDeleter> mailbox_deleter( | 2062 scoped_ptr<TextureMailboxDeleter> mailbox_deleter( |
| 2064 new TextureMailboxDeleter(base::ThreadTaskRunnerHandle::Get())); | 2063 new TextureMailboxDeleter(base::ThreadTaskRunnerHandle::Get())); |
| 2065 | 2064 |
| 2066 RendererSettings settings; | 2065 RendererSettings settings; |
| 2067 FakeRendererClient renderer_client; | 2066 FakeRendererClient renderer_client; |
| 2068 FakeRendererGL renderer(&renderer_client, &settings, output_surface.get(), | 2067 FakeRendererGL renderer(&renderer_client, &settings, output_surface.get(), |
| 2069 resource_provider.get(), mailbox_deleter.get()); | 2068 resource_provider.get(), mailbox_deleter.get()); |
| 2070 | 2069 |
| 2071 TestOverlayProcessor* processor = | 2070 TestOverlayProcessor* processor = |
| 2072 new TestOverlayProcessor(output_surface.get(), resource_provider.get()); | 2071 new TestOverlayProcessor(output_surface.get()); |
| 2073 processor->Initialize(); | 2072 processor->Initialize(); |
| 2074 renderer.SetOverlayProcessor(processor); | 2073 renderer.SetOverlayProcessor(processor); |
| 2075 | 2074 |
| 2076 gfx::Rect viewport_rect(1, 1); | 2075 gfx::Rect viewport_rect(1, 1); |
| 2077 TestRenderPass* root_pass = | 2076 TestRenderPass* root_pass = |
| 2078 AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 0), | 2077 AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 0), |
| 2079 viewport_rect, gfx::Transform()); | 2078 viewport_rect, gfx::Transform()); |
| 2080 root_pass->has_transparent_background = false; | 2079 root_pass->has_transparent_background = false; |
| 2081 root_pass->copy_requests.push_back( | 2080 root_pass->copy_requests.push_back( |
| 2082 CopyOutputRequest::CreateRequest(base::Bind(&IgnoreCopyResult))); | 2081 CopyOutputRequest::CreateRequest(base::Bind(&IgnoreCopyResult))); |
| 2083 | 2082 |
| 2084 unsigned sync_point = 0; | 2083 unsigned sync_point = 0; |
| 2085 TextureMailbox mailbox = | 2084 TextureMailbox mailbox = |
| 2086 TextureMailbox(gpu::Mailbox::Generate(), GL_TEXTURE_2D, sync_point); | 2085 TextureMailbox(gpu::Mailbox::Generate(), GL_TEXTURE_2D, sync_point); |
| 2087 mailbox.set_allow_overlay(true); | |
| 2088 scoped_ptr<SingleReleaseCallbackImpl> release_callback = | 2086 scoped_ptr<SingleReleaseCallbackImpl> release_callback = |
| 2089 SingleReleaseCallbackImpl::Create(base::Bind(&MailboxReleased)); | 2087 SingleReleaseCallbackImpl::Create(base::Bind(&MailboxReleased)); |
| 2090 ResourceId resource_id = resource_provider->CreateResourceFromTextureMailbox( | 2088 ResourceId resource_id = resource_provider->CreateResourceFromTextureMailbox( |
| 2091 mailbox, release_callback.Pass()); | 2089 mailbox, release_callback.Pass()); |
| 2092 bool premultiplied_alpha = false; | 2090 bool premultiplied_alpha = false; |
| 2093 bool flipped = false; | 2091 bool flipped = false; |
| 2094 bool nearest_neighbor = false; | 2092 bool nearest_neighbor = false; |
| 2095 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; | 2093 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; |
| 2096 | 2094 |
| 2097 TextureDrawQuad* overlay_quad = | 2095 TextureDrawQuad* overlay_quad = |
| 2098 root_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); | 2096 root_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); |
| 2099 overlay_quad->SetNew(root_pass->CreateAndAppendSharedQuadState(), | 2097 overlay_quad->SetNew(root_pass->CreateAndAppendSharedQuadState(), |
| 2100 viewport_rect, viewport_rect, viewport_rect, resource_id, | 2098 viewport_rect, viewport_rect, viewport_rect, resource_id, |
| 2101 premultiplied_alpha, gfx::PointF(0, 0), | 2099 premultiplied_alpha, gfx::PointF(0, 0), |
| 2102 gfx::PointF(1, 1), SK_ColorTRANSPARENT, vertex_opacity, | 2100 gfx::PointF(1, 1), SK_ColorTRANSPARENT, vertex_opacity, |
| 2103 flipped, nearest_neighbor); | 2101 flipped, nearest_neighbor); |
| 2102 overlay_quad->allow_overlay = true; |
| 2104 | 2103 |
| 2105 // DirectRenderer::DrawFrame calls into OverlayProcessor::ProcessForOverlays. | 2104 // DirectRenderer::DrawFrame calls into OverlayProcessor::ProcessForOverlays. |
| 2106 // Attempt will be called for each strategy in OverlayProcessor. We have | 2105 // Attempt will be called for each strategy in OverlayProcessor. We have |
| 2107 // added a fake strategy, so checking for Attempt calls checks if there was | 2106 // added a fake strategy, so checking for Attempt calls checks if there was |
| 2108 // any attempt to overlay, which there shouldn't be. We can't use the quad | 2107 // any attempt to overlay, which there shouldn't be. We can't use the quad |
| 2109 // list because the render pass is cleaned up by DrawFrame. | 2108 // list because the render pass is cleaned up by DrawFrame. |
| 2110 EXPECT_CALL(*processor->strategy_, Attempt(_, _)).Times(0); | 2109 EXPECT_CALL(*processor->strategy_, Attempt(_, _)).Times(0); |
| 2111 renderer.DrawFrame(&render_passes_in_draw_order_, 1.f, viewport_rect, | 2110 renderer.DrawFrame(&render_passes_in_draw_order_, 1.f, viewport_rect, |
| 2112 viewport_rect, false); | 2111 viewport_rect, false); |
| 2113 Mock::VerifyAndClearExpectations(processor->strategy_); | 2112 Mock::VerifyAndClearExpectations(processor->strategy_); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 2133 public: | 2132 public: |
| 2134 class SingleOverlayValidator : public OverlayCandidateValidator { | 2133 class SingleOverlayValidator : public OverlayCandidateValidator { |
| 2135 public: | 2134 public: |
| 2136 void CheckOverlaySupport(OverlayCandidateList* surfaces) override { | 2135 void CheckOverlaySupport(OverlayCandidateList* surfaces) override { |
| 2137 ASSERT_EQ(2U, surfaces->size()); | 2136 ASSERT_EQ(2U, surfaces->size()); |
| 2138 OverlayCandidate& candidate = surfaces->back(); | 2137 OverlayCandidate& candidate = surfaces->back(); |
| 2139 candidate.overlay_handled = true; | 2138 candidate.overlay_handled = true; |
| 2140 } | 2139 } |
| 2141 }; | 2140 }; |
| 2142 | 2141 |
| 2143 SingleOverlayOnTopProcessor(OutputSurface* surface, | 2142 explicit SingleOverlayOnTopProcessor(OutputSurface* surface) |
| 2144 ResourceProvider* resource_provider) | 2143 : OverlayProcessor(surface) {} |
| 2145 : OverlayProcessor(surface, resource_provider) {} | |
| 2146 | 2144 |
| 2147 void Initialize() override { | 2145 void Initialize() override { |
| 2148 strategies_.push_back(scoped_ptr<Strategy>( | 2146 strategies_.push_back( |
| 2149 new OverlayStrategySingleOnTop(&validator_, resource_provider_))); | 2147 scoped_ptr<Strategy>(new OverlayStrategySingleOnTop(&validator_))); |
| 2150 } | 2148 } |
| 2151 | 2149 |
| 2152 SingleOverlayValidator validator_; | 2150 SingleOverlayValidator validator_; |
| 2153 }; | 2151 }; |
| 2154 | 2152 |
| 2155 class WaitSyncPointCountingContext : public TestWebGraphicsContext3D { | 2153 class WaitSyncPointCountingContext : public TestWebGraphicsContext3D { |
| 2156 public: | 2154 public: |
| 2157 MOCK_METHOD1(waitSyncPoint, void(unsigned sync_point)); | 2155 MOCK_METHOD1(waitSyncPoint, void(unsigned sync_point)); |
| 2158 }; | 2156 }; |
| 2159 | 2157 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 2188 scoped_ptr<ResourceProvider> resource_provider = FakeResourceProvider::Create( | 2186 scoped_ptr<ResourceProvider> resource_provider = FakeResourceProvider::Create( |
| 2189 output_surface.get(), shared_bitmap_manager.get()); | 2187 output_surface.get(), shared_bitmap_manager.get()); |
| 2190 scoped_ptr<TextureMailboxDeleter> mailbox_deleter( | 2188 scoped_ptr<TextureMailboxDeleter> mailbox_deleter( |
| 2191 new TextureMailboxDeleter(base::ThreadTaskRunnerHandle::Get())); | 2189 new TextureMailboxDeleter(base::ThreadTaskRunnerHandle::Get())); |
| 2192 | 2190 |
| 2193 RendererSettings settings; | 2191 RendererSettings settings; |
| 2194 FakeRendererClient renderer_client; | 2192 FakeRendererClient renderer_client; |
| 2195 FakeRendererGL renderer(&renderer_client, &settings, output_surface.get(), | 2193 FakeRendererGL renderer(&renderer_client, &settings, output_surface.get(), |
| 2196 resource_provider.get(), mailbox_deleter.get()); | 2194 resource_provider.get(), mailbox_deleter.get()); |
| 2197 | 2195 |
| 2198 SingleOverlayOnTopProcessor* processor = new SingleOverlayOnTopProcessor( | 2196 SingleOverlayOnTopProcessor* processor = |
| 2199 output_surface.get(), resource_provider.get()); | 2197 new SingleOverlayOnTopProcessor(output_surface.get()); |
| 2200 processor->Initialize(); | 2198 processor->Initialize(); |
| 2201 renderer.SetOverlayProcessor(processor); | 2199 renderer.SetOverlayProcessor(processor); |
| 2202 | 2200 |
| 2203 gfx::Rect viewport_rect(1, 1); | 2201 gfx::Rect viewport_rect(1, 1); |
| 2204 TestRenderPass* root_pass = | 2202 TestRenderPass* root_pass = |
| 2205 AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 0), | 2203 AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 0), |
| 2206 viewport_rect, gfx::Transform()); | 2204 viewport_rect, gfx::Transform()); |
| 2207 root_pass->has_transparent_background = false; | 2205 root_pass->has_transparent_background = false; |
| 2208 | 2206 |
| 2209 unsigned sync_point = TestRenderPass::kSyncPointForMailboxTextureQuad; | 2207 unsigned sync_point = TestRenderPass::kSyncPointForMailboxTextureQuad; |
| 2210 TextureMailbox mailbox = | 2208 TextureMailbox mailbox = |
| 2211 TextureMailbox(gpu::Mailbox::Generate(), GL_TEXTURE_2D, sync_point); | 2209 TextureMailbox(gpu::Mailbox::Generate(), GL_TEXTURE_2D, sync_point); |
| 2212 mailbox.set_allow_overlay(true); | |
| 2213 scoped_ptr<SingleReleaseCallbackImpl> release_callback = | 2210 scoped_ptr<SingleReleaseCallbackImpl> release_callback = |
| 2214 SingleReleaseCallbackImpl::Create(base::Bind(&MailboxReleased)); | 2211 SingleReleaseCallbackImpl::Create(base::Bind(&MailboxReleased)); |
| 2215 ResourceId resource_id = resource_provider->CreateResourceFromTextureMailbox( | 2212 ResourceId resource_id = resource_provider->CreateResourceFromTextureMailbox( |
| 2216 mailbox, release_callback.Pass()); | 2213 mailbox, release_callback.Pass()); |
| 2217 bool premultiplied_alpha = false; | 2214 bool premultiplied_alpha = false; |
| 2218 bool flipped = false; | 2215 bool flipped = false; |
| 2219 bool nearest_neighbor = false; | 2216 bool nearest_neighbor = false; |
| 2220 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; | 2217 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; |
| 2221 gfx::PointF uv_top_left(0, 0); | 2218 gfx::PointF uv_top_left(0, 0); |
| 2222 gfx::PointF uv_bottom_right(1, 1); | 2219 gfx::PointF uv_bottom_right(1, 1); |
| 2223 | 2220 |
| 2224 TextureDrawQuad* overlay_quad = | 2221 TextureDrawQuad* overlay_quad = |
| 2225 root_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); | 2222 root_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); |
| 2226 SharedQuadState* shared_state = root_pass->CreateAndAppendSharedQuadState(); | 2223 SharedQuadState* shared_state = root_pass->CreateAndAppendSharedQuadState(); |
| 2227 shared_state->SetAll(gfx::Transform(), viewport_rect.size(), viewport_rect, | 2224 shared_state->SetAll(gfx::Transform(), viewport_rect.size(), viewport_rect, |
| 2228 viewport_rect, false, 1, SkXfermode::kSrcOver_Mode, 0); | 2225 viewport_rect, false, 1, SkXfermode::kSrcOver_Mode, 0); |
| 2229 overlay_quad->SetNew(shared_state, viewport_rect, viewport_rect, | 2226 overlay_quad->SetNew(shared_state, viewport_rect, viewport_rect, |
| 2230 viewport_rect, resource_id, premultiplied_alpha, | 2227 viewport_rect, resource_id, premultiplied_alpha, |
| 2231 uv_top_left, uv_bottom_right, SK_ColorTRANSPARENT, | 2228 uv_top_left, uv_bottom_right, SK_ColorTRANSPARENT, |
| 2232 vertex_opacity, flipped, nearest_neighbor); | 2229 vertex_opacity, flipped, nearest_neighbor); |
| 2230 overlay_quad->allow_overlay = true; |
| 2233 | 2231 |
| 2234 // Verify that overlay_quad actually gets turned into an overlay, and even | 2232 // Verify that overlay_quad actually gets turned into an overlay, and even |
| 2235 // though it's not drawn, that its sync point is waited on. | 2233 // though it's not drawn, that its sync point is waited on. |
| 2236 EXPECT_CALL(*context, | 2234 EXPECT_CALL(*context, |
| 2237 waitSyncPoint(TestRenderPass::kSyncPointForMailboxTextureQuad)) | 2235 waitSyncPoint(TestRenderPass::kSyncPointForMailboxTextureQuad)) |
| 2238 .Times(1); | 2236 .Times(1); |
| 2239 EXPECT_CALL(overlay_scheduler, | 2237 EXPECT_CALL(overlay_scheduler, |
| 2240 Schedule(1, gfx::OVERLAY_TRANSFORM_NONE, _, viewport_rect, | 2238 Schedule(1, gfx::OVERLAY_TRANSFORM_NONE, _, viewport_rect, |
| 2241 BoundingRect(uv_top_left, uv_bottom_right))).Times(1); | 2239 BoundingRect(uv_top_left, uv_bottom_right))).Times(1); |
| 2242 | 2240 |
| 2243 renderer.DrawFrame(&render_passes_in_draw_order_, 1.f, viewport_rect, | 2241 renderer.DrawFrame(&render_passes_in_draw_order_, 1.f, viewport_rect, |
| 2244 viewport_rect, false); | 2242 viewport_rect, false); |
| 2245 } | 2243 } |
| 2246 | 2244 |
| 2247 } // namespace | 2245 } // namespace |
| 2248 } // namespace cc | 2246 } // namespace cc |
| OLD | NEW |