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 911 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
922 renderer.SetVisible(false); | 922 renderer.SetVisible(false); |
923 EXPECT_TRUE(context->last_call_was_set_visibility()); | 923 EXPECT_TRUE(context->last_call_was_set_visibility()); |
924 } | 924 } |
925 | 925 |
926 class TextureStateTrackingContext : public TestWebGraphicsContext3D { | 926 class TextureStateTrackingContext : public TestWebGraphicsContext3D { |
927 public: | 927 public: |
928 TextureStateTrackingContext() : active_texture_(GL_INVALID_ENUM) { | 928 TextureStateTrackingContext() : active_texture_(GL_INVALID_ENUM) { |
929 test_capabilities_.gpu.egl_image_external = true; | 929 test_capabilities_.gpu.egl_image_external = true; |
930 } | 930 } |
931 | 931 |
932 MOCK_METHOD1(waitSyncPoint, void(unsigned sync_point)); | 932 MOCK_METHOD1(waitSyncToken, void(const GLbyte* sync_token)); |
933 MOCK_METHOD3(texParameteri, void(GLenum target, GLenum pname, GLint param)); | 933 MOCK_METHOD3(texParameteri, void(GLenum target, GLenum pname, GLint param)); |
934 MOCK_METHOD4(drawElements, | 934 MOCK_METHOD4(drawElements, |
935 void(GLenum mode, GLsizei count, GLenum type, GLintptr offset)); | 935 void(GLenum mode, GLsizei count, GLenum type, GLintptr offset)); |
936 | 936 |
937 virtual void activeTexture(GLenum texture) { | 937 virtual void activeTexture(GLenum texture) { |
938 EXPECT_NE(texture, active_texture_); | 938 EXPECT_NE(texture, active_texture_); |
939 active_texture_ = texture; | 939 active_texture_ = texture; |
940 } | 940 } |
941 | 941 |
942 GLenum active_texture() const { return active_texture_; } | 942 GLenum active_texture() const { return active_texture_; } |
(...skipping 23 matching lines...) Expand all Loading... | |
966 &settings, | 966 &settings, |
967 output_surface.get(), | 967 output_surface.get(), |
968 resource_provider.get()); | 968 resource_provider.get()); |
969 | 969 |
970 // During initialization we are allowed to set any texture parameters. | 970 // During initialization we are allowed to set any texture parameters. |
971 EXPECT_CALL(*context, texParameteri(_, _, _)).Times(AnyNumber()); | 971 EXPECT_CALL(*context, texParameteri(_, _, _)).Times(AnyNumber()); |
972 | 972 |
973 RenderPass* root_pass = | 973 RenderPass* root_pass = |
974 AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 1), | 974 AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 1), |
975 gfx::Rect(100, 100), gfx::Transform()); | 975 gfx::Rect(100, 100), gfx::Transform()); |
976 uint32_t mailbox_sync_point; | 976 unsigned mailbox_sync_point; |
977 AddOneOfEveryQuadType(root_pass, resource_provider.get(), RenderPassId(0, 0), | 977 AddOneOfEveryQuadType(root_pass, resource_provider.get(), RenderPassId(0, 0), |
978 &mailbox_sync_point); | 978 &mailbox_sync_point); |
979 | 979 |
980 renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_); | 980 renderer.DecideRenderPassAllocationsForFrame(render_passes_in_draw_order_); |
981 | 981 |
982 // Set up expected texture filter state transitions that match the quads | 982 // Set up expected texture filter state transitions that match the quads |
983 // created in AppendOneOfEveryQuadType(). | 983 // created in AppendOneOfEveryQuadType(). |
984 Mock::VerifyAndClearExpectations(context); | 984 Mock::VerifyAndClearExpectations(context); |
985 { | 985 { |
986 InSequence sequence; | 986 InSequence sequence; |
987 | 987 |
988 // The sync points for all quads are waited on first. This sync point is | 988 // The sync points for all quads are waited on first. This sync point is |
989 // for a texture quad drawn later in the frame. | 989 // for a texture quad drawn later in the frame. |
990 EXPECT_CALL(*context, waitSyncPoint(mailbox_sync_point)).Times(1); | 990 gpu::SyncToken mailbox_sync_token(mailbox_sync_point); |
991 EXPECT_CALL(*context, waitSyncToken(mailbox_sync_token.GetConstData())) | |
992 .Times(1); | |
991 | 993 |
992 // yuv_quad is drawn with the default linear filter. | 994 // yuv_quad is drawn with the default linear filter. |
993 EXPECT_CALL(*context, drawElements(_, _, _, _)); | 995 EXPECT_CALL(*context, drawElements(_, _, _, _)); |
994 | 996 |
995 // tile_quad is drawn with GL_NEAREST because it is not transformed or | 997 // tile_quad is drawn with GL_NEAREST because it is not transformed or |
996 // scaled. | 998 // scaled. |
997 EXPECT_CALL( | 999 EXPECT_CALL( |
998 *context, | 1000 *context, |
999 texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); | 1001 texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); |
1000 EXPECT_CALL( | 1002 EXPECT_CALL( |
(...skipping 1015 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2016 : OverlayProcessor(surface) {} | 2018 : OverlayProcessor(surface) {} |
2017 ~TestOverlayProcessor() override {} | 2019 ~TestOverlayProcessor() override {} |
2018 void Initialize() override { | 2020 void Initialize() override { |
2019 strategy_ = new Strategy(); | 2021 strategy_ = new Strategy(); |
2020 strategies_.push_back(make_scoped_ptr(strategy_)); | 2022 strategies_.push_back(make_scoped_ptr(strategy_)); |
2021 } | 2023 } |
2022 | 2024 |
2023 Strategy* strategy_; | 2025 Strategy* strategy_; |
2024 }; | 2026 }; |
2025 | 2027 |
2026 void MailboxReleased(unsigned sync_point, | 2028 void MailboxReleased(const gpu::SyncToken& sync_token, |
2027 bool lost_resource, | 2029 bool lost_resource, |
2028 BlockingTaskRunner* main_thread_task_runner) { | 2030 BlockingTaskRunner* main_thread_task_runner) {} |
2029 } | |
2030 | 2031 |
2031 void IgnoreCopyResult(scoped_ptr<CopyOutputResult> result) { | 2032 void IgnoreCopyResult(scoped_ptr<CopyOutputResult> result) { |
2032 } | 2033 } |
2033 | 2034 |
2034 TEST_F(GLRendererTest, DontOverlayWithCopyRequests) { | 2035 TEST_F(GLRendererTest, DontOverlayWithCopyRequests) { |
2035 scoped_ptr<DiscardCheckingContext> context_owned(new DiscardCheckingContext); | 2036 scoped_ptr<DiscardCheckingContext> context_owned(new DiscardCheckingContext); |
2036 FakeOutputSurfaceClient output_surface_client; | 2037 FakeOutputSurfaceClient output_surface_client; |
2037 scoped_ptr<OutputSurface> output_surface( | 2038 scoped_ptr<OutputSurface> output_surface( |
2038 FakeOutputSurface::Create3d(context_owned.Pass())); | 2039 FakeOutputSurface::Create3d(context_owned.Pass())); |
2039 CHECK(output_surface->BindToClient(&output_surface_client)); | 2040 CHECK(output_surface->BindToClient(&output_surface_client)); |
(...skipping 16 matching lines...) Expand all Loading... | |
2056 renderer.SetOverlayProcessor(processor); | 2057 renderer.SetOverlayProcessor(processor); |
2057 | 2058 |
2058 gfx::Rect viewport_rect(1, 1); | 2059 gfx::Rect viewport_rect(1, 1); |
2059 RenderPass* root_pass = | 2060 RenderPass* root_pass = |
2060 AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 0), | 2061 AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 0), |
2061 viewport_rect, gfx::Transform()); | 2062 viewport_rect, gfx::Transform()); |
2062 root_pass->has_transparent_background = false; | 2063 root_pass->has_transparent_background = false; |
2063 root_pass->copy_requests.push_back( | 2064 root_pass->copy_requests.push_back( |
2064 CopyOutputRequest::CreateRequest(base::Bind(&IgnoreCopyResult))); | 2065 CopyOutputRequest::CreateRequest(base::Bind(&IgnoreCopyResult))); |
2065 | 2066 |
2066 unsigned sync_point = 0; | |
2067 TextureMailbox mailbox = | 2067 TextureMailbox mailbox = |
2068 TextureMailbox(gpu::Mailbox::Generate(), GL_TEXTURE_2D, sync_point, | 2068 TextureMailbox(gpu::Mailbox::Generate(), gpu::SyncToken(), GL_TEXTURE_2D, |
2069 gfx::Size(256, 256), true); | 2069 gfx::Size(256, 256), true); |
2070 scoped_ptr<SingleReleaseCallbackImpl> release_callback = | 2070 scoped_ptr<SingleReleaseCallbackImpl> release_callback = |
2071 SingleReleaseCallbackImpl::Create(base::Bind(&MailboxReleased)); | 2071 SingleReleaseCallbackImpl::Create(base::Bind(&MailboxReleased)); |
2072 ResourceId resource_id = resource_provider->CreateResourceFromTextureMailbox( | 2072 ResourceId resource_id = resource_provider->CreateResourceFromTextureMailbox( |
2073 mailbox, release_callback.Pass()); | 2073 mailbox, release_callback.Pass()); |
2074 bool premultiplied_alpha = false; | 2074 bool premultiplied_alpha = false; |
2075 bool flipped = false; | 2075 bool flipped = false; |
2076 bool nearest_neighbor = false; | 2076 bool nearest_neighbor = false; |
2077 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; | 2077 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; |
2078 | 2078 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2132 : OverlayProcessor(surface) {} | 2132 : OverlayProcessor(surface) {} |
2133 | 2133 |
2134 void Initialize() override { | 2134 void Initialize() override { |
2135 strategies_.push_back( | 2135 strategies_.push_back( |
2136 make_scoped_ptr(new OverlayStrategySingleOnTop(&validator_))); | 2136 make_scoped_ptr(new OverlayStrategySingleOnTop(&validator_))); |
2137 } | 2137 } |
2138 | 2138 |
2139 SingleOverlayValidator validator_; | 2139 SingleOverlayValidator validator_; |
2140 }; | 2140 }; |
2141 | 2141 |
2142 class WaitSyncPointCountingContext : public TestWebGraphicsContext3D { | 2142 class WaitSyncTokenCountingContext : public TestWebGraphicsContext3D { |
2143 public: | 2143 public: |
2144 MOCK_METHOD1(waitSyncPoint, void(unsigned sync_point)); | 2144 MOCK_METHOD1(waitSyncToken, void(const GLbyte* sync_Token)); |
piman
2015/10/29 00:08:20
nit: sync_token
David Yen
2015/10/29 17:08:08
Done.
| |
2145 }; | 2145 }; |
2146 | 2146 |
2147 class MockOverlayScheduler { | 2147 class MockOverlayScheduler { |
2148 public: | 2148 public: |
2149 MOCK_METHOD5(Schedule, | 2149 MOCK_METHOD5(Schedule, |
2150 void(int plane_z_order, | 2150 void(int plane_z_order, |
2151 gfx::OverlayTransform plane_transform, | 2151 gfx::OverlayTransform plane_transform, |
2152 unsigned overlay_texture_id, | 2152 unsigned overlay_texture_id, |
2153 const gfx::Rect& display_bounds, | 2153 const gfx::Rect& display_bounds, |
2154 const gfx::RectF& uv_rect)); | 2154 const gfx::RectF& uv_rect)); |
2155 }; | 2155 }; |
2156 | 2156 |
2157 TEST_F(GLRendererTest, OverlaySyncPointsAreProcessed) { | 2157 TEST_F(GLRendererTest, OverlaySyncTokensAreProcessed) { |
2158 scoped_ptr<WaitSyncPointCountingContext> context_owned( | 2158 scoped_ptr<WaitSyncTokenCountingContext> context_owned( |
2159 new WaitSyncPointCountingContext); | 2159 new WaitSyncTokenCountingContext); |
2160 WaitSyncPointCountingContext* context = context_owned.get(); | 2160 WaitSyncTokenCountingContext* context = context_owned.get(); |
2161 | 2161 |
2162 MockOverlayScheduler overlay_scheduler; | 2162 MockOverlayScheduler overlay_scheduler; |
2163 scoped_refptr<TestContextProvider> context_provider = | 2163 scoped_refptr<TestContextProvider> context_provider = |
2164 TestContextProvider::Create(context_owned.Pass()); | 2164 TestContextProvider::Create(context_owned.Pass()); |
2165 context_provider->support()->SetScheduleOverlayPlaneCallback(base::Bind( | 2165 context_provider->support()->SetScheduleOverlayPlaneCallback(base::Bind( |
2166 &MockOverlayScheduler::Schedule, base::Unretained(&overlay_scheduler))); | 2166 &MockOverlayScheduler::Schedule, base::Unretained(&overlay_scheduler))); |
2167 | 2167 |
2168 FakeOutputSurfaceClient output_surface_client; | 2168 FakeOutputSurfaceClient output_surface_client; |
2169 scoped_ptr<OutputSurface> output_surface( | 2169 scoped_ptr<OutputSurface> output_surface( |
2170 FakeOutputSurface::Create3d(context_provider)); | 2170 FakeOutputSurface::Create3d(context_provider)); |
(...skipping 15 matching lines...) Expand all Loading... | |
2186 new SingleOverlayOnTopProcessor(output_surface.get()); | 2186 new SingleOverlayOnTopProcessor(output_surface.get()); |
2187 processor->Initialize(); | 2187 processor->Initialize(); |
2188 renderer.SetOverlayProcessor(processor); | 2188 renderer.SetOverlayProcessor(processor); |
2189 | 2189 |
2190 gfx::Rect viewport_rect(1, 1); | 2190 gfx::Rect viewport_rect(1, 1); |
2191 RenderPass* root_pass = | 2191 RenderPass* root_pass = |
2192 AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 0), | 2192 AddRenderPass(&render_passes_in_draw_order_, RenderPassId(1, 0), |
2193 viewport_rect, gfx::Transform()); | 2193 viewport_rect, gfx::Transform()); |
2194 root_pass->has_transparent_background = false; | 2194 root_pass->has_transparent_background = false; |
2195 | 2195 |
2196 unsigned sync_point = 29; | 2196 gpu::SyncToken sync_token(29); |
2197 TextureMailbox mailbox = | 2197 TextureMailbox mailbox = |
2198 TextureMailbox(gpu::Mailbox::Generate(), GL_TEXTURE_2D, sync_point, | 2198 TextureMailbox(gpu::Mailbox::Generate(), sync_token, GL_TEXTURE_2D, |
2199 gfx::Size(256, 256), true); | 2199 gfx::Size(256, 256), true); |
2200 scoped_ptr<SingleReleaseCallbackImpl> release_callback = | 2200 scoped_ptr<SingleReleaseCallbackImpl> release_callback = |
2201 SingleReleaseCallbackImpl::Create(base::Bind(&MailboxReleased)); | 2201 SingleReleaseCallbackImpl::Create(base::Bind(&MailboxReleased)); |
2202 ResourceId resource_id = resource_provider->CreateResourceFromTextureMailbox( | 2202 ResourceId resource_id = resource_provider->CreateResourceFromTextureMailbox( |
2203 mailbox, release_callback.Pass()); | 2203 mailbox, release_callback.Pass()); |
2204 bool premultiplied_alpha = false; | 2204 bool premultiplied_alpha = false; |
2205 bool flipped = false; | 2205 bool flipped = false; |
2206 bool nearest_neighbor = false; | 2206 bool nearest_neighbor = false; |
2207 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; | 2207 float vertex_opacity[4] = {1.0f, 1.0f, 1.0f, 1.0f}; |
2208 gfx::PointF uv_top_left(0, 0); | 2208 gfx::PointF uv_top_left(0, 0); |
2209 gfx::PointF uv_bottom_right(1, 1); | 2209 gfx::PointF uv_bottom_right(1, 1); |
2210 | 2210 |
2211 TextureDrawQuad* overlay_quad = | 2211 TextureDrawQuad* overlay_quad = |
2212 root_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); | 2212 root_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); |
2213 SharedQuadState* shared_state = root_pass->CreateAndAppendSharedQuadState(); | 2213 SharedQuadState* shared_state = root_pass->CreateAndAppendSharedQuadState(); |
2214 shared_state->SetAll(gfx::Transform(), viewport_rect.size(), viewport_rect, | 2214 shared_state->SetAll(gfx::Transform(), viewport_rect.size(), viewport_rect, |
2215 viewport_rect, false, 1, SkXfermode::kSrcOver_Mode, 0); | 2215 viewport_rect, false, 1, SkXfermode::kSrcOver_Mode, 0); |
2216 overlay_quad->SetNew(shared_state, viewport_rect, viewport_rect, | 2216 overlay_quad->SetNew(shared_state, viewport_rect, viewport_rect, |
2217 viewport_rect, resource_id, premultiplied_alpha, | 2217 viewport_rect, resource_id, premultiplied_alpha, |
2218 uv_top_left, uv_bottom_right, SK_ColorTRANSPARENT, | 2218 uv_top_left, uv_bottom_right, SK_ColorTRANSPARENT, |
2219 vertex_opacity, flipped, nearest_neighbor); | 2219 vertex_opacity, flipped, nearest_neighbor); |
2220 | 2220 |
2221 // Verify that overlay_quad actually gets turned into an overlay, and even | 2221 // Verify that overlay_quad actually gets turned into an overlay, and even |
2222 // though it's not drawn, that its sync point is waited on. | 2222 // though it's not drawn, that its sync point is waited on. |
2223 EXPECT_CALL(*context, waitSyncPoint(sync_point)).Times(1); | 2223 EXPECT_CALL(*context, waitSyncToken(sync_token.GetConstData())).Times(1); |
2224 EXPECT_CALL(overlay_scheduler, | 2224 EXPECT_CALL(overlay_scheduler, |
2225 Schedule(1, gfx::OVERLAY_TRANSFORM_NONE, _, viewport_rect, | 2225 Schedule(1, gfx::OVERLAY_TRANSFORM_NONE, _, viewport_rect, |
2226 BoundingRect(uv_top_left, uv_bottom_right))).Times(1); | 2226 BoundingRect(uv_top_left, uv_bottom_right))).Times(1); |
2227 | 2227 |
2228 renderer.DrawFrame(&render_passes_in_draw_order_, 1.f, viewport_rect, | 2228 renderer.DrawFrame(&render_passes_in_draw_order_, 1.f, viewport_rect, |
2229 viewport_rect, false); | 2229 viewport_rect, false); |
2230 } | 2230 } |
2231 | 2231 |
2232 } // namespace | 2232 } // namespace |
2233 } // namespace cc | 2233 } // namespace cc |
OLD | NEW |