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