diff options
author | aelias@chromium.org <aelias@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-18 03:42:11 +0000 |
---|---|---|
committer | aelias@chromium.org <aelias@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-18 03:42:11 +0000 |
commit | bf189f6d9415107d901c8bc16a30ecacfa7d5f90 (patch) | |
tree | fde26f10dbf02ff53ee12eb7169e68d2c99e9088 /cc | |
parent | 015995065ae92efd0a310c6dba94664ddbbc3252 (diff) | |
download | chromium_src-bf189f6d9415107d901c8bc16a30ecacfa7d5f90.zip chromium_src-bf189f6d9415107d901c8bc16a30ecacfa7d5f90.tar.gz chromium_src-bf189f6d9415107d901c8bc16a30ecacfa7d5f90.tar.bz2 |
Send compositor frame IPC with metadata.
This makes CompositorFrame contain one of two payloads: DelegatedFrameData for ubercomp and GLFrameData for the Aura model. This also adds CompositorFrameMetadata containing information useful for positioning subwindows relative to the webpage scroll position.
The message is sent when a new switch --enable-compositor-frame-message is set. This is enabled by default on Android and also suppresses Android-specific UpdateFrameInfo messages, which will be superceded by CompositorFrameMetadata.
BUG=152337,161945
Review URL: https://chromiumcodereview.appspot.com/11316128
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@173634 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc')
-rw-r--r-- | cc/cc.gyp | 6 | ||||
-rw-r--r-- | cc/compositor_frame.h | 14 | ||||
-rw-r--r-- | cc/compositor_frame_metadata.cc | 18 | ||||
-rw-r--r-- | cc/compositor_frame_metadata.h | 39 | ||||
-rw-r--r-- | cc/delegated_frame_data.cc | 13 | ||||
-rw-r--r-- | cc/delegated_frame_data.h | 28 | ||||
-rw-r--r-- | cc/gl_frame_data.cc | 15 | ||||
-rw-r--r-- | cc/gl_frame_data.h | 27 | ||||
-rw-r--r-- | cc/gl_renderer.cc | 20 | ||||
-rw-r--r-- | cc/gl_renderer.h | 10 | ||||
-rw-r--r-- | cc/gl_renderer_pixeltest.cc | 7 | ||||
-rw-r--r-- | cc/gl_renderer_unittest.cc | 40 | ||||
-rw-r--r-- | cc/layer_tree_host_impl.cc | 23 | ||||
-rw-r--r-- | cc/layer_tree_host_impl.h | 2 | ||||
-rw-r--r-- | cc/layer_tree_host_impl_unittest.cc | 11 | ||||
-rw-r--r-- | cc/layer_tree_settings.cc | 2 | ||||
-rw-r--r-- | cc/layer_tree_settings.h | 1 | ||||
-rw-r--r-- | cc/renderer.h | 2 | ||||
-rw-r--r-- | cc/software_renderer_unittest.cc | 3 | ||||
-rw-r--r-- | cc/switches.cc | 3 | ||||
-rw-r--r-- | cc/switches.h | 1 | ||||
-rw-r--r-- | cc/transferable_resource.cc | 2 | ||||
-rw-r--r-- | cc/transferable_resource.h | 10 |
23 files changed, 249 insertions, 48 deletions
@@ -24,6 +24,8 @@ 'compositor_frame.h', 'compositor_frame_ack.cc', 'compositor_frame_ack.h', + 'compositor_frame_metadata.cc', + 'compositor_frame_metadata.h', 'content_layer.cc', 'content_layer.h', 'content_layer_client.h', @@ -41,6 +43,8 @@ 'debug_rect_history.h', 'delay_based_time_source.cc', 'delay_based_time_source.h', + 'delegated_frame_data.h', + 'delegated_frame_data.cc', 'delegated_renderer_layer.cc', 'delegated_renderer_layer.h', 'delegated_renderer_layer_impl.cc', @@ -60,6 +64,8 @@ 'frame_rate_counter.h', 'geometry_binding.cc', 'geometry_binding.h', + 'gl_frame_data.h', + 'gl_frame_data.cc', 'gl_renderer.cc', 'gl_renderer.h', 'gl_renderer_draw_cache.cc', diff --git a/cc/compositor_frame.h b/cc/compositor_frame.h index b9f09c1..88ebe2f 100644 --- a/cc/compositor_frame.h +++ b/cc/compositor_frame.h @@ -5,11 +5,11 @@ #ifndef CC_COMPOSITOR_FRAME_H_ #define CC_COMPOSITOR_FRAME_H_ +#include "base/memory/scoped_ptr.h" #include "cc/cc_export.h" -#include "cc/render_pass.h" -#include "cc/scoped_ptr_vector.h" -#include "cc/transferable_resource.h" -#include "ui/gfx/size.h" +#include "cc/compositor_frame_metadata.h" +#include "cc/delegated_frame_data.h" +#include "cc/gl_frame_data.h" namespace cc { @@ -18,9 +18,9 @@ class CC_EXPORT CompositorFrame { CompositorFrame(); ~CompositorFrame(); - gfx::Size size; - TransferableResourceList resource_list; - ScopedPtrVector<RenderPass> render_pass_list; + CompositorFrameMetadata metadata; + scoped_ptr<DelegatedFrameData> delegated_frame_data; + scoped_ptr<GLFrameData> gl_frame_data; }; } // namespace cc diff --git a/cc/compositor_frame_metadata.cc b/cc/compositor_frame_metadata.cc new file mode 100644 index 0000000..acc8178 --- /dev/null +++ b/cc/compositor_frame_metadata.cc @@ -0,0 +1,18 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "cc/compositor_frame_metadata.h" + +namespace cc { + +CompositorFrameMetadata::CompositorFrameMetadata() + : page_scale_factor(0), + min_page_scale_factor(0), + max_page_scale_factor(0) { +} + +CompositorFrameMetadata::~CompositorFrameMetadata() { +} + +} // namespace cc diff --git a/cc/compositor_frame_metadata.h b/cc/compositor_frame_metadata.h new file mode 100644 index 0000000..92a48ff --- /dev/null +++ b/cc/compositor_frame_metadata.h @@ -0,0 +1,39 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CC_COMPOSITOR_FRAME_METADATA_H_ +#define CC_COMPOSITOR_FRAME_METADATA_H_ + +#include "cc/cc_export.h" +#include "ui/gfx/size_f.h" +#include "ui/gfx/vector2d_f.h" + +namespace cc { + +class CC_EXPORT CompositorFrameMetadata +{ + public: + CompositorFrameMetadata(); + ~CompositorFrameMetadata(); + + // Scroll offset and scale of the root layer. This can be used for tasks + // like positioning windowed plugins. + gfx::Vector2dF root_scroll_offset; + float page_scale_factor; + + // These limits can be used together with the scroll/scale fields above to + // determine if scrolling/scaling in a particular direction is possible. + gfx::SizeF viewport_size; + gfx::SizeF root_layer_size; + float min_page_scale_factor; + float max_page_scale_factor; + + // Used to position the Android location top bar, whose precise + // position is computed by the renderer compositor. + gfx::Vector2dF location_bar_offset; +}; + +} // namespace cc + +#endif // CC_COMPOSITOR_FRAME_METADATA_H_ diff --git a/cc/delegated_frame_data.cc b/cc/delegated_frame_data.cc new file mode 100644 index 0000000..4c08041 --- /dev/null +++ b/cc/delegated_frame_data.cc @@ -0,0 +1,13 @@ +// Copyright 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "cc/delegated_frame_data.h" + +namespace cc { + +DelegatedFrameData::DelegatedFrameData() {} + +DelegatedFrameData::~DelegatedFrameData() {} + +} // namespace cc diff --git a/cc/delegated_frame_data.h b/cc/delegated_frame_data.h new file mode 100644 index 0000000..91e0193 --- /dev/null +++ b/cc/delegated_frame_data.h @@ -0,0 +1,28 @@ +// Copyright 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CC_DELEGATED_FRAME_DATA_H_ +#define CC_DELEGATED_FRAME_DATA_H_ + +#include "cc/cc_export.h" +#include "cc/render_pass.h" +#include "cc/scoped_ptr_vector.h" +#include "cc/transferable_resource.h" +#include "ui/gfx/size.h" + +namespace cc { + +class CC_EXPORT DelegatedFrameData { + public: + DelegatedFrameData(); + ~DelegatedFrameData(); + + gfx::Size size; + TransferableResourceList resource_list; + ScopedPtrVector<RenderPass> render_pass_list; +}; + +} // namespace cc + +#endif // CC_DELEGATED_FRAME_DATA_H_ diff --git a/cc/gl_frame_data.cc b/cc/gl_frame_data.cc new file mode 100644 index 0000000..9895c79 --- /dev/null +++ b/cc/gl_frame_data.cc @@ -0,0 +1,15 @@ +// Copyright 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "cc/gl_frame_data.h" + +namespace cc { + +GLFrameData::GLFrameData() + : sync_point(0) { +} + +GLFrameData::~GLFrameData() {} + +} // namespace cc diff --git a/cc/gl_frame_data.h b/cc/gl_frame_data.h new file mode 100644 index 0000000..987f5af --- /dev/null +++ b/cc/gl_frame_data.h @@ -0,0 +1,27 @@ +// Copyright 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CC_GL_FRAME_DATA_H_ +#define CC_GL_FRAME_DATA_H_ + +#include <string> + +#include "base/basictypes.h" +#include "cc/cc_export.h" +#include "cc/transferable_resource.h" + +namespace cc { + +class CC_EXPORT GLFrameData { + public: + GLFrameData(); + ~GLFrameData(); + + Mailbox mailbox; + uint32 sync_point; +}; + +} // namespace cc + +#endif // CC_GL_FRAME_DATA_H_ diff --git a/cc/gl_renderer.cc b/cc/gl_renderer.cc index e5178ea..bb4ec4d 100644 --- a/cc/gl_renderer.cc +++ b/cc/gl_renderer.cc @@ -9,8 +9,11 @@ #include "base/string_split.h" #include "base/string_util.h" #include "build/build_config.h" +#include "cc/compositor_frame.h" +#include "cc/compositor_frame_metadata.h" #include "cc/damage_tracker.h" #include "cc/geometry_binding.h" +#include "cc/gl_frame_data.h" #include "cc/layer_quad.h" #include "cc/math_util.h" #include "cc/priority_calculator.h" @@ -58,20 +61,21 @@ bool needsIOSurfaceReadbackWorkaround() } // anonymous namespace -scoped_ptr<GLRenderer> GLRenderer::create(RendererClient* client, ResourceProvider* resourceProvider) +scoped_ptr<GLRenderer> GLRenderer::create(RendererClient* client, OutputSurface* outputSurface, ResourceProvider* resourceProvider) { - scoped_ptr<GLRenderer> renderer(make_scoped_ptr(new GLRenderer(client, resourceProvider))); + scoped_ptr<GLRenderer> renderer(make_scoped_ptr(new GLRenderer(client, outputSurface, resourceProvider))); if (!renderer->initialize()) return scoped_ptr<GLRenderer>(); return renderer.Pass(); } -GLRenderer::GLRenderer(RendererClient* client, ResourceProvider* resourceProvider) +GLRenderer::GLRenderer(RendererClient* client, OutputSurface* outputSurface, ResourceProvider* resourceProvider) : DirectRenderer(client, resourceProvider) , m_offscreenFramebufferId(0) , m_sharedGeometryQuad(gfx::RectF(-0.5f, -0.5f, 1.0f, 1.0f)) - , m_context(resourceProvider->graphicsContext3D()) + , m_outputSurface(outputSurface) + , m_context(outputSurface->Context3D()) , m_isViewportChanged(false) , m_isBackbufferDiscarded(false) , m_discardBackbufferWhenNotVisible(false) @@ -1167,6 +1171,14 @@ void GLRenderer::finishDrawingFrame(DrawingFrame& frame) GLC(m_context, m_context->disable(GL_BLEND)); m_blendShadow = false; + + if (settings().compositorFrameMessage) { + CompositorFrame compositor_frame; + compositor_frame.metadata = m_client->makeCompositorFrameMetadata(); + compositor_frame.gl_frame_data.reset(new GLFrameData()); + // FIXME: Fill in GLFrameData when we implement swapping with it. + m_outputSurface->SendFrameToParentCompositor(compositor_frame); + } } void GLRenderer::finishDrawingQuadList() diff --git a/cc/gl_renderer.h b/cc/gl_renderer.h index 494cef2..1fbe28d 100644 --- a/cc/gl_renderer.h +++ b/cc/gl_renderer.h @@ -11,6 +11,7 @@ #include "cc/direct_renderer.h" #include "cc/gl_renderer_draw_cache.h" #include "cc/io_surface_draw_quad.h" +#include "cc/output_surface.h" #include "cc/render_pass_draw_quad.h" #include "cc/renderer.h" #include "cc/solid_color_draw_quad.h" @@ -20,10 +21,6 @@ #include "third_party/WebKit/Source/Platform/chromium/public/WebGraphicsMemoryAllocation.h" #include "ui/gfx/quad_f.h" -namespace WebKit { -class WebGraphicsContext3D; -} - namespace cc { class ScopedResource; @@ -38,7 +35,7 @@ class CC_EXPORT GLRenderer : public DirectRenderer, public NON_EXPORTED_BASE(WebKit::WebGraphicsContext3D::WebGraphicsMemoryAllocationChangedCallbackCHROMIUM), public NON_EXPORTED_BASE(WebKit::WebGraphicsContext3D::WebGraphicsContextLostCallback) { public: - static scoped_ptr<GLRenderer> create(RendererClient*, ResourceProvider*); + static scoped_ptr<GLRenderer> create(RendererClient*, OutputSurface*, ResourceProvider*); virtual ~GLRenderer(); @@ -64,7 +61,7 @@ public: virtual void sendManagedMemoryStats(size_t bytesVisible, size_t bytesVisibleAndNearby, size_t bytesAllocated) OVERRIDE; protected: - GLRenderer(RendererClient*, ResourceProvider*); + GLRenderer(RendererClient*, OutputSurface*, ResourceProvider*); static void debugGLCall(WebKit::WebGraphicsContext3D*, const char* command, const char* file, int line); @@ -218,6 +215,7 @@ private: scoped_ptr<SolidColorProgram> m_solidColorProgram; + OutputSurface* m_outputSurface; WebKit::WebGraphicsContext3D* m_context; gfx::Rect m_swapBufferRect; diff --git a/cc/gl_renderer_pixeltest.cc b/cc/gl_renderer_pixeltest.cc index d70b06d..b444ee0 100644 --- a/cc/gl_renderer_pixeltest.cc +++ b/cc/gl_renderer_pixeltest.cc @@ -6,6 +6,7 @@ #include "base/file_util.h" #include "base/path_service.h" +#include "cc/compositor_frame_metadata.h" #include "cc/draw_quad.h" #include "cc/prioritized_resource_manager.h" #include "cc/resource_provider.h" @@ -42,6 +43,8 @@ class FakeRendererClient : public RendererClient { const ManagedMemoryPolicy&) OVERRIDE {} virtual bool hasImplThread() const OVERRIDE { return false; } virtual bool shouldClearRootRenderPass() const { return true; } + virtual CompositorFrameMetadata makeCompositorFrameMetadata() const + OVERRIDE { return CompositorFrameMetadata(); } }; class GLRendererPixelTest : public testing::Test { @@ -52,7 +55,9 @@ class GLRendererPixelTest : public testing::Test { gfx::InitializeGLBindings(gfx::kGLImplementationOSMesaGL); output_surface_ = PixelTestOutputSurface::create(); resource_provider_ = ResourceProvider::create(output_surface_.get()); - renderer_ = GLRenderer::create(&fake_client_, resource_provider_.get()); + renderer_ = GLRenderer::create(&fake_client_, + output_surface_.get(), + resource_provider_.get()); } bool PixelsMatchReference(FilePath ref_file, gfx::Rect viewport_rect) { diff --git a/cc/gl_renderer_unittest.cc b/cc/gl_renderer_unittest.cc index 560bd2d..b4741cda 100644 --- a/cc/gl_renderer_unittest.cc +++ b/cc/gl_renderer_unittest.cc @@ -4,6 +4,7 @@ #include "cc/gl_renderer.h" +#include "cc/compositor_frame_metadata.h" #include "cc/draw_quad.h" #include "cc/prioritized_resource_manager.h" #include "cc/resource_provider.h" @@ -85,6 +86,8 @@ public: virtual void enforceManagedMemoryPolicy(const ManagedMemoryPolicy& policy) OVERRIDE { if (m_lastCallWasSetVisibility) *m_lastCallWasSetVisibility = false; } virtual bool hasImplThread() const OVERRIDE { return false; } virtual bool shouldClearRootRenderPass() const OVERRIDE { return true; } + virtual CompositorFrameMetadata makeCompositorFrameMetadata() const + OVERRIDE { return CompositorFrameMetadata(); } // Methods added for test. int setFullRootLayerDamageCount() const { return m_setFullRootLayerDamageCount; } @@ -109,7 +112,7 @@ private: class FakeRendererGL : public GLRenderer { public: - FakeRendererGL(RendererClient* client, ResourceProvider* resourceProvider) : GLRenderer(client, resourceProvider) { } + FakeRendererGL(RendererClient* client, OutputSurface* outputSurface, ResourceProvider* resourceProvider) : GLRenderer(client, outputSurface, resourceProvider) { } // GLRenderer methods. @@ -126,9 +129,9 @@ protected: GLRendererTest() : m_suggestHaveBackbufferYes(1, true) , m_suggestHaveBackbufferNo(1, false) - , m_context(FakeOutputSurface::Create3d(scoped_ptr<WebKit::WebGraphicsContext3D>(new FrameCountingMemoryAllocationSettingContext()))) - , m_resourceProvider(ResourceProvider::create(m_context.get())) - , m_renderer(&m_mockClient, m_resourceProvider.get()) + , m_outputSurface(FakeOutputSurface::Create3d(scoped_ptr<WebKit::WebGraphicsContext3D>(new FrameCountingMemoryAllocationSettingContext()))) + , m_resourceProvider(ResourceProvider::create(m_outputSurface.get())) + , m_renderer(&m_mockClient, m_outputSurface.get(), m_resourceProvider.get()) { } @@ -142,12 +145,12 @@ protected: m_renderer.swapBuffers(); } - FrameCountingMemoryAllocationSettingContext* context() { return static_cast<FrameCountingMemoryAllocationSettingContext*>(m_context->Context3D()); } + FrameCountingMemoryAllocationSettingContext* context() { return static_cast<FrameCountingMemoryAllocationSettingContext*>(m_outputSurface->Context3D()); } WebGraphicsMemoryAllocation m_suggestHaveBackbufferYes; WebGraphicsMemoryAllocation m_suggestHaveBackbufferNo; - scoped_ptr<OutputSurface> m_context; + scoped_ptr<OutputSurface> m_outputSurface; FakeRendererClient m_mockClient; scoped_ptr<ResourceProvider> m_resourceProvider; FakeRendererGL m_renderer; @@ -308,9 +311,9 @@ public: TEST(GLRendererTest2, initializationDoesNotMakeSynchronousCalls) { FakeRendererClient mockClient; - scoped_ptr<OutputSurface> context(FakeOutputSurface::Create3d(scoped_ptr<WebKit::WebGraphicsContext3D>(new ForbidSynchronousCallContext))); - scoped_ptr<ResourceProvider> resourceProvider(ResourceProvider::create(context.get())); - FakeRendererGL renderer(&mockClient, resourceProvider.get()); + scoped_ptr<OutputSurface> outputSurface(FakeOutputSurface::Create3d(scoped_ptr<WebKit::WebGraphicsContext3D>(new ForbidSynchronousCallContext))); + scoped_ptr<ResourceProvider> resourceProvider(ResourceProvider::create(outputSurface.get())); + FakeRendererGL renderer(&mockClient, outputSurface.get(), resourceProvider.get()); EXPECT_TRUE(renderer.initialize()); } @@ -351,9 +354,9 @@ private: TEST(GLRendererTest2, initializationWithQuicklyLostContextDoesNotAssert) { FakeRendererClient mockClient; - scoped_ptr<OutputSurface> context(FakeOutputSurface::Create3d(scoped_ptr<WebKit::WebGraphicsContext3D>(new LoseContextOnFirstGetContext))); - scoped_ptr<ResourceProvider> resourceProvider(ResourceProvider::create(context.get())); - FakeRendererGL renderer(&mockClient, resourceProvider.get()); + scoped_ptr<OutputSurface> outputSurface(FakeOutputSurface::Create3d(scoped_ptr<WebKit::WebGraphicsContext3D>(new LoseContextOnFirstGetContext))); + scoped_ptr<ResourceProvider> resourceProvider(ResourceProvider::create(outputSurface.get())); + FakeRendererGL renderer(&mockClient, outputSurface.get(), resourceProvider.get()); renderer.initialize(); } @@ -375,7 +378,7 @@ TEST(GLRendererTest2, initializationWithoutGpuMemoryManagerExtensionSupportShoul FakeRendererClient mockClient; scoped_ptr<OutputSurface> outputSurface(FakeOutputSurface::Create3d(scoped_ptr<WebKit::WebGraphicsContext3D>(new ContextThatDoesNotSupportMemoryManagmentExtensions))); scoped_ptr<ResourceProvider> resourceProvider(ResourceProvider::create(outputSurface.get())); - FakeRendererGL renderer(&mockClient, resourceProvider.get()); + FakeRendererGL renderer(&mockClient, outputSurface.get(), resourceProvider.get()); renderer.initialize(); @@ -403,7 +406,7 @@ TEST(GLRendererTest2, opaqueBackground) scoped_ptr<OutputSurface> outputSurface(FakeOutputSurface::Create3d(scoped_ptr<WebKit::WebGraphicsContext3D>(new ClearCountingContext))); ClearCountingContext* context = static_cast<ClearCountingContext*>(outputSurface->Context3D()); scoped_ptr<ResourceProvider> resourceProvider(ResourceProvider::create(outputSurface.get())); - FakeRendererGL renderer(&mockClient, resourceProvider.get()); + FakeRendererGL renderer(&mockClient, outputSurface.get(), resourceProvider.get()); mockClient.rootRenderPass()->has_transparent_background = false; @@ -426,7 +429,7 @@ TEST(GLRendererTest2, transparentBackground) scoped_ptr<OutputSurface> outputSurface(FakeOutputSurface::Create3d(scoped_ptr<WebKit::WebGraphicsContext3D>(new ClearCountingContext))); ClearCountingContext* context = static_cast<ClearCountingContext*>(outputSurface->Context3D()); scoped_ptr<ResourceProvider> resourceProvider(ResourceProvider::create(outputSurface.get())); - FakeRendererGL renderer(&mockClient, resourceProvider.get()); + FakeRendererGL renderer(&mockClient, outputSurface.get(), resourceProvider.get()); mockClient.rootRenderPass()->has_transparent_background = true; @@ -477,7 +480,7 @@ TEST(GLRendererTest2, visibilityChangeIsLastCall) scoped_ptr<OutputSurface> outputSurface(FakeOutputSurface::Create3d(scoped_ptr<WebKit::WebGraphicsContext3D>(new VisibilityChangeIsLastCallTrackingContext))); VisibilityChangeIsLastCallTrackingContext* context = static_cast<VisibilityChangeIsLastCallTrackingContext*>(outputSurface->Context3D()); scoped_ptr<ResourceProvider> resourceProvider(ResourceProvider::create(outputSurface.get())); - FakeRendererGL renderer(&mockClient, resourceProvider.get()); + FakeRendererGL renderer(&mockClient, outputSurface.get(), resourceProvider.get()); EXPECT_TRUE(renderer.initialize()); @@ -529,7 +532,7 @@ TEST(GLRendererTest2, activeTextureState) scoped_ptr<OutputSurface> outputSurface(FakeOutputSurface::Create3d(scoped_ptr<WebKit::WebGraphicsContext3D>(new TextureStateTrackingContext))); TextureStateTrackingContext* context = static_cast<TextureStateTrackingContext*>(outputSurface->Context3D()); scoped_ptr<ResourceProvider> resourceProvider(ResourceProvider::create(outputSurface.get())); - FakeRendererGL renderer(&fakeClient, resourceProvider.get()); + FakeRendererGL renderer(&fakeClient, outputSurface.get(), resourceProvider.get()); // During initialization we are allowed to set any texture parameters. EXPECT_CALL(*context, texParameteri(_, _, _)).Times(AnyNumber()); @@ -597,9 +600,8 @@ TEST(GLRendererTest2, shouldClearRootRenderPass) NoClearRootRenderPassFakeClient mockClient; scoped_ptr<OutputSurface> outputSurface(FakeOutputSurface::Create3d(scoped_ptr<WebKit::WebGraphicsContext3D>(new NoClearRootRenderPassMockContext))); NoClearRootRenderPassMockContext* mockContext = static_cast<NoClearRootRenderPassMockContext*>(outputSurface->Context3D()); - scoped_ptr<ResourceProvider> resourceProvider(ResourceProvider::create(outputSurface.get())); - FakeRendererGL renderer(&mockClient, resourceProvider.get()); + FakeRendererGL renderer(&mockClient, outputSurface.get(), resourceProvider.get()); EXPECT_TRUE(renderer.initialize()); gfx::Rect viewportRect(mockClient.deviceViewportSize()); diff --git a/cc/layer_tree_host_impl.cc b/cc/layer_tree_host_impl.cc index e7874b6..740c361 100644 --- a/cc/layer_tree_host_impl.cc +++ b/cc/layer_tree_host_impl.cc @@ -10,6 +10,7 @@ #include "base/debug/trace_event.h" #include "base/json/json_writer.h" #include "cc/append_quads_data.h" +#include "cc/compositor_frame_metadata.h" #include "cc/damage_tracker.h" #include "cc/debug_rect_history.h" #include "cc/delay_based_time_source.h" @@ -881,6 +882,26 @@ void LayerTreeHostImpl::OnCanDrawStateChangedForTree(LayerTreeImpl*) m_client->onCanDrawStateChanged(canDraw()); } +CompositorFrameMetadata LayerTreeHostImpl::makeCompositorFrameMetadata() const +{ + if (!rootScrollLayer()) + return CompositorFrameMetadata(); + + CompositorFrameMetadata metadata; + metadata.root_scroll_offset = rootScrollLayer()->scrollOffset() + rootScrollLayer()->scrollDelta(); + metadata.page_scale_factor = m_pinchZoomViewport.totalPageScaleFactor(); + metadata.viewport_size = m_pinchZoomViewport.bounds().size(); + metadata.root_layer_size = rootScrollLayer()->bounds(); + metadata.min_page_scale_factor = m_pinchZoomViewport.minPageScaleFactor(); + metadata.max_page_scale_factor = m_pinchZoomViewport.maxPageScaleFactor(); + if (!m_settings.pageScalePinchZoomEnabled) { + metadata.root_scroll_offset.Scale(1 / m_pinchZoomViewport.pageScaleFactor()); + metadata.root_layer_size.Scale(1 / m_pinchZoomViewport.pageScaleFactor()); + } + + return metadata; +} + void LayerTreeHostImpl::drawLayers(FrameData& frame) { TRACE_EVENT0("cc", "LayerTreeHostImpl::drawLayers"); @@ -1064,7 +1085,7 @@ bool LayerTreeHostImpl::initializeRenderer(scoped_ptr<OutputSurface> outputSurfa if (outputSurface->Capabilities().has_parent_compositor) m_renderer = DelegatingRenderer::Create(this, resourceProvider.get()); else if (outputSurface->Context3D()) - m_renderer = GLRenderer::create(this, resourceProvider.get()); + m_renderer = GLRenderer::create(this, outputSurface.get(), resourceProvider.get()); else if (outputSurface->SoftwareDevice()) m_renderer = SoftwareRenderer::create(this, resourceProvider.get(), outputSurface->SoftwareDevice()); if (!m_renderer) diff --git a/cc/layer_tree_host_impl.h b/cc/layer_tree_host_impl.h index 79c26c02..5337f19 100644 --- a/cc/layer_tree_host_impl.h +++ b/cc/layer_tree_host_impl.h @@ -22,6 +22,7 @@ namespace cc { class CompletionEvent; +class CompositorFrameMetadata; class DebugRectHistory; class FrameRateCounter; class LayerImpl; @@ -171,6 +172,7 @@ public: virtual void enforceManagedMemoryPolicy(const ManagedMemoryPolicy& policy) OVERRIDE; virtual bool hasImplThread() const OVERRIDE; virtual bool shouldClearRootRenderPass() const OVERRIDE; + virtual CompositorFrameMetadata makeCompositorFrameMetadata() const OVERRIDE; // TileManagerClient implementation. virtual void ScheduleManageTiles() OVERRIDE; diff --git a/cc/layer_tree_host_impl_unittest.cc b/cc/layer_tree_host_impl_unittest.cc index d439760..3a60455 100644 --- a/cc/layer_tree_host_impl_unittest.cc +++ b/cc/layer_tree_host_impl_unittest.cc @@ -9,6 +9,7 @@ #include "base/bind.h" #include "base/command_line.h" #include "base/hash_tables.h" +#include "cc/compositor_frame_metadata.h" #include "cc/delegated_renderer_layer_impl.h" #include "cc/gl_renderer.h" #include "cc/heads_up_display_layer_impl.h" @@ -4100,9 +4101,9 @@ struct RenderPassRemovalTestData : public LayerTreeHostImpl::FrameData { class TestRenderer : public GLRenderer, public RendererClient { public: - static scoped_ptr<TestRenderer> create(ResourceProvider* resourceProvider, Proxy* proxy) + static scoped_ptr<TestRenderer> create(ResourceProvider* resourceProvider, OutputSurface* outputSurface, Proxy* proxy) { - scoped_ptr<TestRenderer> renderer(new TestRenderer(resourceProvider, proxy)); + scoped_ptr<TestRenderer> renderer(new TestRenderer(resourceProvider, outputSurface, proxy)); if (!renderer->initialize()) return scoped_ptr<TestRenderer>(); @@ -4124,9 +4125,11 @@ public: virtual void enforceManagedMemoryPolicy(const ManagedMemoryPolicy& policy) OVERRIDE { } virtual bool hasImplThread() const OVERRIDE { return false; } virtual bool shouldClearRootRenderPass() const OVERRIDE { return true; } + virtual CompositorFrameMetadata makeCompositorFrameMetadata() const + OVERRIDE { return CompositorFrameMetadata(); } protected: - TestRenderer(ResourceProvider* resourceProvider, Proxy* proxy) : GLRenderer(this, resourceProvider) { } + TestRenderer(ResourceProvider* resourceProvider, OutputSurface* outputSurface, Proxy* proxy) : GLRenderer(this, outputSurface, resourceProvider) { } private: LayerTreeSettings m_settings; @@ -4417,7 +4420,7 @@ TEST_P(LayerTreeHostImplTest, testRemoveRenderPasses) ASSERT_TRUE(outputSurface->Context3D()); scoped_ptr<ResourceProvider> resourceProvider(ResourceProvider::create(outputSurface.get())); - scoped_ptr<TestRenderer> renderer(TestRenderer::create(resourceProvider.get(), &m_proxy)); + scoped_ptr<TestRenderer> renderer(TestRenderer::create(resourceProvider.get(), outputSurface.get(), &m_proxy)); int testCaseIndex = 0; while (removeRenderPassesCases[testCaseIndex].name) { diff --git a/cc/layer_tree_settings.cc b/cc/layer_tree_settings.cc index 4ef2b7b..4221167 100644 --- a/cc/layer_tree_settings.cc +++ b/cc/layer_tree_settings.cc @@ -15,6 +15,7 @@ namespace cc { LayerTreeSettings::LayerTreeSettings() : acceleratePainting(false) + , compositorFrameMessage(false) , implSidePainting(false) , renderVSyncEnabled(true) , perTilePaintingEnabled(false) @@ -33,6 +34,7 @@ LayerTreeSettings::LayerTreeSettings() , minimumOcclusionTrackingSize(gfx::Size(160, 160)) { // TODO(danakj): Move this to chromium when we don't go through the WebKit API anymore. + compositorFrameMessage = CommandLine::ForCurrentProcess()->HasSwitch(cc::switches::kEnableCompositorFrameMessage); implSidePainting = CommandLine::ForCurrentProcess()->HasSwitch(cc::switches::kEnableImplSidePainting); partialSwapEnabled = CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnablePartialSwap); backgroundColorInsteadOfCheckerboard = CommandLine::ForCurrentProcess()->HasSwitch(switches::kBackgroundColorInsteadOfCheckerboard); diff --git a/cc/layer_tree_settings.h b/cc/layer_tree_settings.h index e5ca724..847795f 100644 --- a/cc/layer_tree_settings.h +++ b/cc/layer_tree_settings.h @@ -18,6 +18,7 @@ class CC_EXPORT LayerTreeSettings { ~LayerTreeSettings(); bool acceleratePainting; + bool compositorFrameMessage; bool implSidePainting; bool renderVSyncEnabled; bool perTilePaintingEnabled; diff --git a/cc/renderer.h b/cc/renderer.h index 2adf7c0..36d6791e 100644 --- a/cc/renderer.h +++ b/cc/renderer.h @@ -14,6 +14,7 @@ namespace cc { class CompositorFrameAck; +class CompositorFrameMetadata; class ScopedResource; class CC_EXPORT RendererClient { @@ -27,6 +28,7 @@ public: virtual void enforceManagedMemoryPolicy(const ManagedMemoryPolicy& policy) = 0; virtual bool hasImplThread() const = 0; virtual bool shouldClearRootRenderPass() const = 0; + virtual CompositorFrameMetadata makeCompositorFrameMetadata() const = 0; protected: virtual ~RendererClient() { } }; diff --git a/cc/software_renderer_unittest.cc b/cc/software_renderer_unittest.cc index f7dc195..21e5d6f 100644 --- a/cc/software_renderer_unittest.cc +++ b/cc/software_renderer_unittest.cc @@ -4,6 +4,7 @@ #include "cc/software_renderer.h" +#include "cc/compositor_frame_metadata.h" #include "cc/quad_sink.h" #include "cc/render_pass.h" #include "cc/render_pass_draw_quad.h" @@ -53,6 +54,8 @@ public: virtual void enforceManagedMemoryPolicy(const ManagedMemoryPolicy& policy) OVERRIDE { }; virtual bool hasImplThread() const OVERRIDE { return false; } virtual bool shouldClearRootRenderPass() const OVERRIDE { return m_shouldClearRootRenderPass; } + virtual CompositorFrameMetadata makeCompositorFrameMetadata() const + OVERRIDE { return CompositorFrameMetadata(); } protected: scoped_ptr<FakeOutputSurface> m_outputSurface; diff --git a/cc/switches.cc b/cc/switches.cc index ee119bc..2cbb459 100644 --- a/cc/switches.cc +++ b/cc/switches.cc @@ -14,6 +14,9 @@ const char kBackgroundColorInsteadOfCheckerboard[] = const char kDisableThreadedAnimation[] = "disable-threaded-animation"; +// Send a message for every frame from the impl thread to the parent compositor. +const char kEnableCompositorFrameMessage[] = "enable-compositor-frame-message"; + // Paint content on the compositor thread instead of the main thread. const char kEnableImplSidePainting[] = "enable-impl-side-painting"; diff --git a/cc/switches.h b/cc/switches.h index 164b2de..e3797bb 100644 --- a/cc/switches.h +++ b/cc/switches.h @@ -17,6 +17,7 @@ namespace switches { CC_EXPORT extern const char kBackgroundColorInsteadOfCheckerboard[]; CC_EXPORT extern const char kDisableThreadedAnimation[]; +CC_EXPORT extern const char kEnableCompositorFrameMessage[]; CC_EXPORT extern const char kEnableImplSidePainting[]; CC_EXPORT extern const char kEnablePartialSwap[]; CC_EXPORT extern const char kEnablePerTilePainting[]; diff --git a/cc/transferable_resource.cc b/cc/transferable_resource.cc index 39eba20..9d5eeb4 100644 --- a/cc/transferable_resource.cc +++ b/cc/transferable_resource.cc @@ -19,7 +19,7 @@ bool Mailbox::isZero() const { return true; } -void Mailbox::setName(const GLbyte* n) { +void Mailbox::setName(const int8* n) { DCHECK(isZero() || !memcmp(name, n, sizeof(name))); memcpy(name, n, sizeof(name)); } diff --git a/cc/transferable_resource.h b/cc/transferable_resource.h index f4e434f..1ab5611 100644 --- a/cc/transferable_resource.h +++ b/cc/transferable_resource.h @@ -7,17 +7,17 @@ #include <vector> +#include "base/basictypes.h" #include "cc/cc_export.h" #include "ui/gfx/size.h" -#include "third_party/khronos/GLES2/gl2.h" namespace cc { struct CC_EXPORT Mailbox { Mailbox(); bool isZero() const; - void setName(const GLbyte* name); - GLbyte name[64]; + void setName(const int8* name); + int8 name[64]; }; struct CC_EXPORT TransferableResource { @@ -25,8 +25,8 @@ struct CC_EXPORT TransferableResource { ~TransferableResource(); unsigned id; - GLenum format; - GLenum filter; + uint32 format; + uint32 filter; gfx::Size size; Mailbox mailbox; }; |