Index: cc/layer_tree_host_impl_unittest.cc |
diff --git a/cc/layer_tree_host_impl_unittest.cc b/cc/layer_tree_host_impl_unittest.cc |
index af6082d5d674291520c12615206b4276dd5107f5..fea6e22776f155044c7a1099349a5e0e1a583c61 100644 |
--- a/cc/layer_tree_host_impl_unittest.cc |
+++ b/cc/layer_tree_host_impl_unittest.cc |
@@ -27,6 +27,8 @@ |
#include "cc/test/animation_test_common.h" |
#include "cc/test/fake_output_surface.h" |
#include "cc/test/fake_proxy.h" |
+#include "cc/test/fake_video_frame.h" |
+#include "cc/test/fake_video_frame_provider.h" |
#include "cc/test/fake_web_graphics_context_3d.h" |
#include "cc/test/fake_web_scrollbar_theme_geometry.h" |
#include "cc/test/geometry_test_utils.h" |
@@ -38,15 +40,11 @@ |
#include "cc/tiled_layer_impl.h" |
#include "cc/video_layer_impl.h" |
#include "media/base/media.h" |
-#include "media/base/video_frame.h" |
#include "testing/gmock/include/gmock/gmock.h" |
#include "testing/gtest/include/gtest/gtest.h" |
-#include "third_party/WebKit/Source/Platform/chromium/public/WebVideoFrame.h" |
-#include "third_party/WebKit/Source/Platform/chromium/public/WebVideoFrameProvider.h" |
#include "ui/gfx/size_conversions.h" |
#include "ui/gfx/vector2d_conversions.h" |
-using media::VideoFrame; |
using ::testing::Mock; |
using ::testing::Return; |
using ::testing::AnyNumber; |
@@ -2225,8 +2223,7 @@ public: |
.WillOnce(Return()) |
.RetiresOnSaturation(); |
- // 1 is hardcoded return value of fake createProgram() |
- EXPECT_CALL(*m_context, useProgram(1)) |
+ EXPECT_CALL(*m_context, useProgram(_)) |
.WillOnce(Return()) |
.RetiresOnSaturation(); |
@@ -2454,509 +2451,6 @@ TEST_P(LayerTreeHostImplTest, contributingLayerEmptyScissorNoPartialSwap) |
} |
} |
-// Make sure that output surface lost notifications are propagated through the tree. |
-class OutputSurfaceLostNotificationCheckLayer : public LayerImpl { |
-public: |
- static scoped_ptr<LayerImpl> create(LayerTreeImpl* treeImpl, int id) { return scoped_ptr<LayerImpl>(new OutputSurfaceLostNotificationCheckLayer(treeImpl, id)); } |
- |
- virtual void didLoseOutputSurface() OVERRIDE |
- { |
- m_didLoseOutputSurfaceCalled = true; |
- } |
- |
- bool didLoseOutputSurfaceCalled() const { return m_didLoseOutputSurfaceCalled; } |
- |
-private: |
- OutputSurfaceLostNotificationCheckLayer(LayerTreeImpl* treeImpl, int id) |
- : LayerImpl(treeImpl, id) |
- , m_didLoseOutputSurfaceCalled(false) |
- { |
- } |
- |
- bool m_didLoseOutputSurfaceCalled; |
-}; |
- |
-TEST_P(LayerTreeHostImplTest, outputSurfaceLostAndRestoredNotificationSentToAllLayers) |
-{ |
- m_hostImpl->setRootLayer(OutputSurfaceLostNotificationCheckLayer::create(m_hostImpl->activeTree(), 1)); |
- OutputSurfaceLostNotificationCheckLayer* root = static_cast<OutputSurfaceLostNotificationCheckLayer*>(m_hostImpl->rootLayer()); |
- |
- root->addChild(OutputSurfaceLostNotificationCheckLayer::create(m_hostImpl->activeTree(), 2)); |
- OutputSurfaceLostNotificationCheckLayer* layer1 = static_cast<OutputSurfaceLostNotificationCheckLayer*>(root->children()[0]); |
- |
- layer1->addChild(OutputSurfaceLostNotificationCheckLayer::create(m_hostImpl->activeTree(), 3)); |
- OutputSurfaceLostNotificationCheckLayer* layer2 = static_cast<OutputSurfaceLostNotificationCheckLayer*>(layer1->children()[0]); |
- |
- EXPECT_FALSE(root->didLoseOutputSurfaceCalled()); |
- EXPECT_FALSE(layer1->didLoseOutputSurfaceCalled()); |
- EXPECT_FALSE(layer2->didLoseOutputSurfaceCalled()); |
- |
- m_hostImpl->initializeRenderer(createOutputSurface()); |
- |
- EXPECT_TRUE(root->didLoseOutputSurfaceCalled()); |
- EXPECT_TRUE(layer1->didLoseOutputSurfaceCalled()); |
- EXPECT_TRUE(layer2->didLoseOutputSurfaceCalled()); |
-} |
- |
-TEST_P(LayerTreeHostImplTest, finishAllRenderingAfterContextLost) |
-{ |
- LayerTreeSettings settings; |
- m_hostImpl = LayerTreeHostImpl::create(settings, this, &m_proxy); |
- |
- // The context initialization will fail, but we should still be able to call finishAllRendering() without any ill effects. |
- m_hostImpl->initializeRenderer(FakeOutputSurface::Create3d(scoped_ptr<WebKit::WebGraphicsContext3D>(new FakeWebGraphicsContext3DMakeCurrentFails)).PassAs<OutputSurface>()); |
- m_hostImpl->finishAllRendering(); |
-} |
- |
-class FakeWebGraphicsContext3DMakeCurrentFailsEventually : public FakeWebGraphicsContext3D { |
-public: |
- explicit FakeWebGraphicsContext3DMakeCurrentFailsEventually(unsigned succeedCount) : m_succeedCount(succeedCount) { } |
- virtual bool makeContextCurrent() { |
- if (!m_succeedCount) |
- return false; |
- --m_succeedCount; |
- return true; |
- } |
- |
-private: |
- unsigned m_succeedCount; |
-}; |
- |
-TEST_P(LayerTreeHostImplTest, context3DLostDuringInitialize) |
-{ |
- LayerTreeSettings settings; |
- m_hostImpl = LayerTreeHostImpl::create(settings, this, &m_proxy); |
- |
- // Initialize into a known successful state. |
- EXPECT_TRUE(m_hostImpl->initializeRenderer(createOutputSurface())); |
- EXPECT_TRUE(m_hostImpl->outputSurface()); |
- EXPECT_TRUE(m_hostImpl->renderer()); |
- EXPECT_TRUE(m_hostImpl->resourceProvider()); |
- |
- // We will make the context get lost after a numer of makeContextCurrent |
- // calls. The exact number of calls to make it succeed is dependent on the |
- // implementation and doesn't really matter (i.e. can be changed to make the |
- // tests pass after some refactoring). |
- const unsigned kMakeCurrentSuccessesNeededForSuccessfulInitialization = 3; |
- |
- for (unsigned i = 0; i < kMakeCurrentSuccessesNeededForSuccessfulInitialization; ++i) { |
- // The context will get lost during initialization, we shouldn't crash. We |
- // should also be in a consistent state. |
- EXPECT_FALSE(m_hostImpl->initializeRenderer(FakeOutputSurface::Create3d(scoped_ptr<WebKit::WebGraphicsContext3D>(new FakeWebGraphicsContext3DMakeCurrentFailsEventually(i))).PassAs<OutputSurface>())); |
- EXPECT_EQ(0, m_hostImpl->outputSurface()); |
- EXPECT_EQ(0, m_hostImpl->renderer()); |
- EXPECT_EQ(0, m_hostImpl->resourceProvider()); |
- EXPECT_TRUE(m_hostImpl->initializeRenderer(createOutputSurface())); |
- } |
- |
- EXPECT_TRUE(m_hostImpl->initializeRenderer(FakeOutputSurface::Create3d(scoped_ptr<WebKit::WebGraphicsContext3D>(new FakeWebGraphicsContext3DMakeCurrentFailsEventually(kMakeCurrentSuccessesNeededForSuccessfulInitialization))).PassAs<OutputSurface>())); |
- EXPECT_TRUE(m_hostImpl->outputSurface()); |
- EXPECT_TRUE(m_hostImpl->renderer()); |
- EXPECT_TRUE(m_hostImpl->resourceProvider()); |
-} |
- |
-// Fake WebKit::WebGraphicsContext3D that will cause a failure if trying to use a |
-// resource that wasn't created by it (resources created by |
-// FakeWebGraphicsContext3D have an id of 1). |
-class StrictWebGraphicsContext3D : public FakeWebGraphicsContext3D { |
-public: |
- StrictWebGraphicsContext3D() |
- : FakeWebGraphicsContext3D() |
- { |
- next_texture_id_ = 8; // Start allocating texture ids larger than any other resource IDs so we can tell if someone's mixing up their resource types. |
- } |
- |
- virtual WebKit::WebGLId createBuffer() { return 2; } |
- virtual WebKit::WebGLId createFramebuffer() { return 3; } |
- virtual WebKit::WebGLId createProgram() { return 4; } |
- virtual WebKit::WebGLId createRenderbuffer() { return 5; } |
- virtual WebKit::WebGLId createShader(WebKit::WGC3Denum) { return 6; } |
- |
- static const WebKit::WebGLId kExternalTextureId = 7; |
- |
- virtual void deleteBuffer(WebKit::WebGLId id) |
- { |
- if (id != 2) |
- ADD_FAILURE() << "Trying to delete buffer id " << id; |
- } |
- |
- virtual void deleteFramebuffer(WebKit::WebGLId id) |
- { |
- if (id != 3) |
- ADD_FAILURE() << "Trying to delete framebuffer id " << id; |
- } |
- |
- virtual void deleteProgram(WebKit::WebGLId id) |
- { |
- if (id != 4) |
- ADD_FAILURE() << "Trying to delete program id " << id; |
- } |
- |
- virtual void deleteRenderbuffer(WebKit::WebGLId id) |
- { |
- if (id != 5) |
- ADD_FAILURE() << "Trying to delete renderbuffer id " << id; |
- } |
- |
- virtual void deleteShader(WebKit::WebGLId id) |
- { |
- if (id != 6) |
- ADD_FAILURE() << "Trying to delete shader id " << id; |
- } |
- |
- virtual WebKit::WebGLId createTexture() |
- { |
- unsigned textureId = FakeWebGraphicsContext3D::createTexture(); |
- m_allocatedTextureIds.insert(textureId); |
- return textureId; |
- } |
- virtual void deleteTexture(WebKit::WebGLId id) |
- { |
- if (id == kExternalTextureId) |
- ADD_FAILURE() << "Trying to delete external texture"; |
- if (!ContainsKey(m_allocatedTextureIds, id)) |
- ADD_FAILURE() << "Trying to delete texture id " << id; |
- m_allocatedTextureIds.erase(id); |
- } |
- |
- virtual void bindBuffer(WebKit::WGC3Denum, WebKit::WebGLId id) |
- { |
- if (id != 2 && id) |
- ADD_FAILURE() << "Trying to bind buffer id " << id; |
- } |
- |
- virtual void bindFramebuffer(WebKit::WGC3Denum, WebKit::WebGLId id) |
- { |
- if (id != 3 && id) |
- ADD_FAILURE() << "Trying to bind framebuffer id " << id; |
- } |
- |
- virtual void useProgram(WebKit::WebGLId id) |
- { |
- if (id != 4) |
- ADD_FAILURE() << "Trying to use program id " << id; |
- } |
- |
- virtual void bindRenderbuffer(WebKit::WGC3Denum, WebKit::WebGLId id) |
- { |
- if (id != 5 && id) |
- ADD_FAILURE() << "Trying to bind renderbuffer id " << id; |
- } |
- |
- virtual void attachShader(WebKit::WebGLId program, WebKit::WebGLId shader) |
- { |
- if ((program != 4) || (shader != 6)) |
- ADD_FAILURE() << "Trying to attach shader id " << shader << " to program id " << program; |
- } |
- |
- virtual void bindTexture(WebKit::WGC3Denum, WebKit::WebGLId id) |
- { |
- if (id && id != kExternalTextureId && !ContainsKey(m_allocatedTextureIds, id)) |
- ADD_FAILURE() << "Trying to bind texture id " << id; |
- } |
- |
-private: |
- base::hash_set<unsigned> m_allocatedTextureIds; |
-}; |
- |
-// Fake WebKit::WebVideoFrame wrapper of media::VideoFrame. |
-class FakeVideoFrame: public WebKit::WebVideoFrame { |
-public: |
- explicit FakeVideoFrame(const scoped_refptr<VideoFrame>& frame) : m_frame(frame) { } |
- virtual ~FakeVideoFrame() { } |
- |
- virtual Format format() const { NOTREACHED(); return FormatInvalid; } |
- virtual unsigned width() const { NOTREACHED(); return 0; } |
- virtual unsigned height() const { NOTREACHED(); return 0; } |
- virtual unsigned planes() const { NOTREACHED(); return 0; } |
- virtual int stride(unsigned plane) const { NOTREACHED(); return 0; } |
- virtual const void* data(unsigned plane) const { NOTREACHED(); return NULL; } |
- virtual unsigned textureId() const { NOTREACHED(); return 0; } |
- virtual unsigned textureTarget() const { NOTREACHED(); return 0; } |
- virtual WebKit::WebRect visibleRect() const { NOTREACHED(); return WebKit::WebRect(0, 0, 0, 0); } |
- virtual WebKit::WebSize textureSize() const { NOTREACHED(); return WebKit::WebSize(4, 4); } |
- |
- static VideoFrame* toVideoFrame(WebKit::WebVideoFrame* web_video_frame) { |
- FakeVideoFrame* wrapped_frame = |
- static_cast<FakeVideoFrame*>(web_video_frame); |
- if (wrapped_frame) |
- return wrapped_frame->m_frame.get(); |
- return NULL; |
- } |
- |
-private: |
- scoped_refptr<VideoFrame> m_frame; |
-}; |
- |
-// Fake video frame provider that always provides the same FakeVideoFrame. |
-class FakeVideoFrameProvider: public WebKit::WebVideoFrameProvider { |
-public: |
- FakeVideoFrameProvider() : m_frame(0), m_client(0) { } |
- virtual ~FakeVideoFrameProvider() |
- { |
- if (m_client) |
- m_client->stopUsingProvider(); |
- } |
- |
- virtual void setVideoFrameProviderClient(Client* client) { m_client = client; } |
- virtual WebKit::WebVideoFrame* getCurrentFrame() { return m_frame; } |
- virtual void putCurrentFrame(WebKit::WebVideoFrame*) { } |
- |
- void setFrame(WebKit::WebVideoFrame* frame) { m_frame = frame; } |
- |
-private: |
- WebKit::WebVideoFrame* m_frame; |
- Client* m_client; |
-}; |
- |
-class StrictWebGraphicsContext3DWithIOSurface : public StrictWebGraphicsContext3D { |
-public: |
- virtual WebKit::WebString getString(WebKit::WGC3Denum name) OVERRIDE |
- { |
- if (name == GL_EXTENSIONS) |
- return WebKit::WebString("GL_CHROMIUM_iosurface GL_ARB_texture_rectangle"); |
- |
- return WebKit::WebString(); |
- } |
-}; |
- |
-class FakeWebGraphicsContext3DWithIOSurface : public FakeWebGraphicsContext3D { |
-public: |
- virtual WebKit::WebString getString(WebKit::WGC3Denum name) OVERRIDE |
- { |
- if (name == GL_EXTENSIONS) |
- return WebKit::WebString("GL_CHROMIUM_iosurface GL_ARB_texture_rectangle"); |
- |
- return WebKit::WebString(); |
- } |
-}; |
- |
-class FakeWebScrollbarThemeGeometryNonEmpty : public FakeWebScrollbarThemeGeometry { |
- virtual WebKit::WebRect trackRect(WebKit::WebScrollbar*) OVERRIDE { return WebKit::WebRect(0, 0, 10, 10); } |
- virtual WebKit::WebRect thumbRect(WebKit::WebScrollbar*) OVERRIDE { return WebKit::WebRect(0, 5, 5, 2); } |
- virtual void splitTrack(WebKit::WebScrollbar*, const WebKit::WebRect& track, WebKit::WebRect& startTrack, WebKit::WebRect& thumb, WebKit::WebRect& endTrack) OVERRIDE |
- { |
- thumb = WebKit::WebRect(0, 5, 5, 2); |
- startTrack = WebKit::WebRect(0, 5, 0, 5); |
- endTrack = WebKit::WebRect(0, 0, 0, 5); |
- } |
-}; |
- |
-class FakeScrollbarLayerImpl : public ScrollbarLayerImpl { |
-public: |
- static scoped_ptr<FakeScrollbarLayerImpl> create(LayerTreeImpl* treeImpl, int id) |
- { |
- return make_scoped_ptr(new FakeScrollbarLayerImpl(treeImpl, id)); |
- } |
- |
- void createResources(ResourceProvider* provider) |
- { |
- DCHECK(provider); |
- gfx::Size size(10, 10); |
- GLenum format = GL_RGBA; |
- ResourceProvider::TextureUsageHint hint = ResourceProvider::TextureUsageAny; |
- setScrollbarGeometry(ScrollbarGeometryFixedThumb::create(FakeWebScrollbarThemeGeometryNonEmpty::create())); |
- |
- setBackTrackResourceId(provider->createResource(size, format, hint)); |
- setForeTrackResourceId(provider->createResource(size, format, hint)); |
- setThumbResourceId(provider->createResource(size, format, hint)); |
- } |
- |
-protected: |
- FakeScrollbarLayerImpl(LayerTreeImpl* treeImpl, int id) |
- : ScrollbarLayerImpl(treeImpl, id) |
- { |
- } |
-}; |
- |
-static inline scoped_ptr<RenderPass> createRenderPassWithResource(ResourceProvider* provider) |
-{ |
- ResourceProvider::ResourceId resourceId = provider->createResource(gfx::Size(1, 1), GL_RGBA, ResourceProvider::TextureUsageAny); |
- |
- scoped_ptr<TestRenderPass> pass = TestRenderPass::Create(); |
- pass->SetNew(RenderPass::Id(1, 1), gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1), gfx::Transform()); |
- scoped_ptr<SharedQuadState> sharedState = SharedQuadState::Create(); |
- sharedState->SetAll(gfx::Transform(), gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1), false, 1); |
- const float vertex_opacity[] = {1.0f, 1.0f, 1.0f, 1.0f}; |
- scoped_ptr<TextureDrawQuad> quad = TextureDrawQuad::Create(); |
- quad->SetNew(sharedState.get(), gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1), resourceId, false, gfx::RectF(0, 0, 1, 1), vertex_opacity, false); |
- |
- pass->AppendSharedQuadState(sharedState.Pass()); |
- pass->AppendQuad(quad.PassAs<DrawQuad>()); |
- |
- return pass.PassAs<RenderPass>(); |
-} |
- |
-TEST_P(LayerTreeHostImplTest, dontUseOldResourcesAfterLostOutputSurface) |
-{ |
- int layerId = 1; |
- |
- scoped_ptr<LayerImpl> rootLayer(LayerImpl::create(m_hostImpl->activeTree(), layerId++)); |
- rootLayer->setBounds(gfx::Size(10, 10)); |
- rootLayer->setAnchorPoint(gfx::PointF(0, 0)); |
- |
- scoped_ptr<TiledLayerImpl> tileLayer = TiledLayerImpl::create(m_hostImpl->activeTree(), layerId++); |
- tileLayer->setBounds(gfx::Size(10, 10)); |
- tileLayer->setAnchorPoint(gfx::PointF(0, 0)); |
- tileLayer->setContentBounds(gfx::Size(10, 10)); |
- tileLayer->setDrawsContent(true); |
- tileLayer->setSkipsDraw(false); |
- scoped_ptr<LayerTilingData> tilingData(LayerTilingData::create(gfx::Size(10, 10), LayerTilingData::NoBorderTexels)); |
- tilingData->setBounds(gfx::Size(10, 10)); |
- tileLayer->setTilingData(*tilingData); |
- tileLayer->pushTileProperties(0, 0, 1, gfx::Rect(0, 0, 10, 10), false); |
- rootLayer->addChild(tileLayer.PassAs<LayerImpl>()); |
- |
- scoped_ptr<TextureLayerImpl> textureLayer = TextureLayerImpl::create(m_hostImpl->activeTree(), layerId++); |
- textureLayer->setBounds(gfx::Size(10, 10)); |
- textureLayer->setAnchorPoint(gfx::PointF(0, 0)); |
- textureLayer->setContentBounds(gfx::Size(10, 10)); |
- textureLayer->setDrawsContent(true); |
- textureLayer->setTextureId(StrictWebGraphicsContext3D::kExternalTextureId); |
- rootLayer->addChild(textureLayer.PassAs<LayerImpl>()); |
- |
- scoped_ptr<TiledLayerImpl> maskLayer = TiledLayerImpl::create(m_hostImpl->activeTree(), layerId++); |
- maskLayer->setBounds(gfx::Size(10, 10)); |
- maskLayer->setAnchorPoint(gfx::PointF(0, 0)); |
- maskLayer->setContentBounds(gfx::Size(10, 10)); |
- maskLayer->setDrawsContent(true); |
- maskLayer->setSkipsDraw(false); |
- maskLayer->setTilingData(*tilingData); |
- maskLayer->pushTileProperties(0, 0, 1, gfx::Rect(0, 0, 10, 10), false); |
- |
- scoped_ptr<TextureLayerImpl> textureLayerWithMask = TextureLayerImpl::create(m_hostImpl->activeTree(), layerId++); |
- textureLayerWithMask->setBounds(gfx::Size(10, 10)); |
- textureLayerWithMask->setAnchorPoint(gfx::PointF(0, 0)); |
- textureLayerWithMask->setContentBounds(gfx::Size(10, 10)); |
- textureLayerWithMask->setDrawsContent(true); |
- textureLayerWithMask->setTextureId(StrictWebGraphicsContext3D::kExternalTextureId); |
- textureLayerWithMask->setMaskLayer(maskLayer.PassAs<LayerImpl>()); |
- rootLayer->addChild(textureLayerWithMask.PassAs<LayerImpl>()); |
- |
- FakeVideoFrame videoFrame(VideoFrame::CreateColorFrame(gfx::Size(4, 4), |
- 0x80, 0x80, 0x80, |
- base::TimeDelta())); |
- VideoLayerImpl::FrameUnwrapper unwrapper = |
- base::Bind(FakeVideoFrame::toVideoFrame); |
- FakeVideoFrameProvider provider; |
- provider.setFrame(&videoFrame); |
- scoped_ptr<VideoLayerImpl> videoLayer = VideoLayerImpl::create(m_hostImpl->activeTree(), layerId++, &provider, unwrapper); |
- videoLayer->setBounds(gfx::Size(10, 10)); |
- videoLayer->setAnchorPoint(gfx::PointF(0, 0)); |
- videoLayer->setContentBounds(gfx::Size(10, 10)); |
- videoLayer->setDrawsContent(true); |
- rootLayer->addChild(videoLayer.PassAs<LayerImpl>()); |
- |
- FakeVideoFrameProvider providerScaled; |
- scoped_ptr<VideoLayerImpl> videoLayerScaled = VideoLayerImpl::create(m_hostImpl->activeTree(), layerId++, &providerScaled, unwrapper); |
- videoLayerScaled->setBounds(gfx::Size(10, 10)); |
- videoLayerScaled->setAnchorPoint(gfx::PointF(0, 0)); |
- videoLayerScaled->setContentBounds(gfx::Size(10, 10)); |
- videoLayerScaled->setDrawsContent(true); |
- rootLayer->addChild(videoLayerScaled.PassAs<LayerImpl>()); |
- |
- FakeVideoFrameProvider hwProvider; |
- scoped_ptr<VideoLayerImpl> hwVideoLayer = VideoLayerImpl::create(m_hostImpl->activeTree(), layerId++, &hwProvider, unwrapper); |
- hwVideoLayer->setBounds(gfx::Size(10, 10)); |
- hwVideoLayer->setAnchorPoint(gfx::PointF(0, 0)); |
- hwVideoLayer->setContentBounds(gfx::Size(10, 10)); |
- hwVideoLayer->setDrawsContent(true); |
- rootLayer->addChild(hwVideoLayer.PassAs<LayerImpl>()); |
- |
- scoped_ptr<IOSurfaceLayerImpl> ioSurfaceLayer = IOSurfaceLayerImpl::create(m_hostImpl->activeTree(), layerId++); |
- ioSurfaceLayer->setBounds(gfx::Size(10, 10)); |
- ioSurfaceLayer->setAnchorPoint(gfx::PointF(0, 0)); |
- ioSurfaceLayer->setContentBounds(gfx::Size(10, 10)); |
- ioSurfaceLayer->setDrawsContent(true); |
- ioSurfaceLayer->setIOSurfaceProperties(1, gfx::Size(10, 10)); |
- rootLayer->addChild(ioSurfaceLayer.PassAs<LayerImpl>()); |
- |
- scoped_ptr<HeadsUpDisplayLayerImpl> hudLayer = HeadsUpDisplayLayerImpl::create(m_hostImpl->activeTree(), layerId++); |
- hudLayer->setBounds(gfx::Size(10, 10)); |
- hudLayer->setAnchorPoint(gfx::PointF(0, 0)); |
- hudLayer->setContentBounds(gfx::Size(10, 10)); |
- hudLayer->setDrawsContent(true); |
- rootLayer->addChild(hudLayer.PassAs<LayerImpl>()); |
- |
- scoped_ptr<FakeScrollbarLayerImpl> scrollbarLayer(FakeScrollbarLayerImpl::create(m_hostImpl->activeTree(), layerId++)); |
- scrollbarLayer->setBounds(gfx::Size(10, 10)); |
- scrollbarLayer->setContentBounds(gfx::Size(10, 10)); |
- scrollbarLayer->setDrawsContent(true); |
- scrollbarLayer->createResources(m_hostImpl->resourceProvider()); |
- rootLayer->addChild(scrollbarLayer.PassAs<LayerImpl>()); |
- |
- scoped_ptr<DelegatedRendererLayerImpl> delegatedRendererLayer(DelegatedRendererLayerImpl::create(m_hostImpl->activeTree(), layerId++)); |
- delegatedRendererLayer->setBounds(gfx::Size(10, 10)); |
- delegatedRendererLayer->setContentBounds(gfx::Size(10, 10)); |
- delegatedRendererLayer->setDrawsContent(true); |
- ScopedPtrVector<RenderPass> passList; |
- passList.append(createRenderPassWithResource(m_hostImpl->resourceProvider())); |
- delegatedRendererLayer->setRenderPasses(passList); |
- EXPECT_TRUE(passList.isEmpty()); |
- rootLayer->addChild(delegatedRendererLayer.PassAs<LayerImpl>()); |
- |
- // Use a context that supports IOSurfaces |
- m_hostImpl->initializeRenderer(FakeOutputSurface::Create3d(scoped_ptr<WebKit::WebGraphicsContext3D>(new FakeWebGraphicsContext3DWithIOSurface)).PassAs<OutputSurface>()); |
- |
- FakeVideoFrame hwVideoFrame( |
- VideoFrame::WrapNativeTexture( |
- m_hostImpl->resourceProvider()->graphicsContext3D()->createTexture(), |
- GL_TEXTURE_2D, |
- gfx::Size(4, 4), gfx::Rect(0, 0, 4, 4), gfx::Size(4, 4), base::TimeDelta(), |
- VideoFrame::ReadPixelsCB(), base::Closure())); |
- hwProvider.setFrame(&hwVideoFrame); |
- |
- FakeVideoFrame videoFrameScaled( |
- VideoFrame::WrapNativeTexture( |
- m_hostImpl->resourceProvider()->graphicsContext3D()->createTexture(), |
- GL_TEXTURE_2D, |
- gfx::Size(4, 4), gfx::Rect(0, 0, 3, 2), gfx::Size(4, 4), base::TimeDelta(), |
- VideoFrame::ReadPixelsCB(), base::Closure())); |
- providerScaled.setFrame(&videoFrameScaled); |
- |
- m_hostImpl->setRootLayer(rootLayer.Pass()); |
- |
- LayerTreeHostImpl::FrameData frame; |
- EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); |
- m_hostImpl->drawLayers(frame); |
- m_hostImpl->didDrawAllLayers(frame); |
- m_hostImpl->swapBuffers(); |
- |
- unsigned numResources = m_hostImpl->resourceProvider()->numResources(); |
- |
- // Lose the WebKit::WebGraphicsContext3D, replacing it with a StrictWebGraphicsContext3DWithIOSurface, |
- // that will warn if any resource from the previous context gets used. |
- m_hostImpl->initializeRenderer(FakeOutputSurface::Create3d(scoped_ptr<WebKit::WebGraphicsContext3D>(new StrictWebGraphicsContext3DWithIOSurface)).PassAs<OutputSurface>()); |
- |
- // Create dummy resources so that looking up an old resource will get an |
- // invalid texture id mapping. |
- for (unsigned i = 0; i < numResources; ++i) |
- m_hostImpl->resourceProvider()->createResourceFromExternalTexture(StrictWebGraphicsContext3D::kExternalTextureId); |
- |
- // The WebKit::WebVideoFrameProvider is expected to recreate its textures after a |
- // lost output surface (or not serve a frame). |
- hwProvider.setFrame(0); |
- providerScaled.setFrame(0); |
- |
- EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); |
- m_hostImpl->drawLayers(frame); |
- m_hostImpl->didDrawAllLayers(frame); |
- m_hostImpl->swapBuffers(); |
- |
- FakeVideoFrame hwVideoFrame2( |
- VideoFrame::WrapNativeTexture( |
- m_hostImpl->resourceProvider()->graphicsContext3D()->createTexture(), |
- GL_TEXTURE_2D, |
- gfx::Size(4, 4), gfx::Rect(0, 0, 4, 4), gfx::Size(4, 4), base::TimeDelta(), |
- VideoFrame::ReadPixelsCB(), base::Closure())); |
- hwProvider.setFrame(&hwVideoFrame2); |
- |
- EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); |
- m_hostImpl->drawLayers(frame); |
- m_hostImpl->didDrawAllLayers(frame); |
- m_hostImpl->swapBuffers(); |
-} |
- |
// Fake WebKit::WebGraphicsContext3D that tracks the number of textures in use. |
class TrackingWebGraphicsContext3D : public FakeWebGraphicsContext3D { |
public: |
@@ -2998,35 +2492,39 @@ private: |
unsigned m_numTextures; |
}; |
+static unsigned createResourceId(ResourceProvider* resourceProvider) |
+{ |
+ return resourceProvider->createResource( |
+ gfx::Size(20, 12), |
+ resourceProvider->bestTextureFormat(), |
+ ResourceProvider::TextureUsageAny); |
+} |
+ |
+static unsigned createTextureId(ResourceProvider* resourceProvider) |
+{ |
+ return ResourceProvider::ScopedReadLockGL( |
+ resourceProvider, createResourceId(resourceProvider)).textureId(); |
+} |
+ |
TEST_P(LayerTreeHostImplTest, layersFreeTextures) |
{ |
+ scoped_ptr<FakeWebGraphicsContext3D> context = |
+ FakeWebGraphicsContext3D::Create(); |
+ FakeWebGraphicsContext3D* context3d = context.get(); |
+ scoped_ptr<OutputSurface> outputSurface = FakeOutputSurface::Create3d( |
+ context.PassAs<WebKit::WebGraphicsContext3D>()).PassAs<OutputSurface>(); |
+ m_hostImpl->initializeRenderer(outputSurface.Pass()); |
+ |
scoped_ptr<LayerImpl> rootLayer(LayerImpl::create(m_hostImpl->activeTree(), 1)); |
rootLayer->setBounds(gfx::Size(10, 10)); |
rootLayer->setAnchorPoint(gfx::PointF(0, 0)); |
- scoped_ptr<TiledLayerImpl> tileLayer = TiledLayerImpl::create(m_hostImpl->activeTree(), 2); |
- tileLayer->setBounds(gfx::Size(10, 10)); |
- tileLayer->setAnchorPoint(gfx::PointF(0, 0)); |
- tileLayer->setContentBounds(gfx::Size(10, 10)); |
- tileLayer->setDrawsContent(true); |
- tileLayer->setSkipsDraw(false); |
- scoped_ptr<LayerTilingData> tilingData(LayerTilingData::create(gfx::Size(10, 10), LayerTilingData::NoBorderTexels)); |
- tilingData->setBounds(gfx::Size(10, 10)); |
- tileLayer->setTilingData(*tilingData); |
- tileLayer->pushTileProperties(0, 0, 1, gfx::Rect(0, 0, 10, 10), false); |
- rootLayer->addChild(tileLayer.PassAs<LayerImpl>()); |
- |
- scoped_ptr<TextureLayerImpl> textureLayer = TextureLayerImpl::create(m_hostImpl->activeTree(), 3); |
- textureLayer->setBounds(gfx::Size(10, 10)); |
- textureLayer->setAnchorPoint(gfx::PointF(0, 0)); |
- textureLayer->setContentBounds(gfx::Size(10, 10)); |
- textureLayer->setDrawsContent(true); |
- textureLayer->setTextureId(1); |
- rootLayer->addChild(textureLayer.PassAs<LayerImpl>()); |
- |
+ FakeVideoFrame softwareFrame(media::VideoFrame::CreateColorFrame( |
+ gfx::Size(4, 4), 0x80, 0x80, 0x80, base::TimeDelta())); |
VideoLayerImpl::FrameUnwrapper unwrapper = |
- base::Bind(FakeVideoFrame::toVideoFrame); |
+ base::Bind(FakeVideoFrame::ToVideoFrame); |
FakeVideoFrameProvider provider; |
+ provider.set_frame(&softwareFrame); |
scoped_ptr<VideoLayerImpl> videoLayer = VideoLayerImpl::create(m_hostImpl->activeTree(), 4, &provider, unwrapper); |
videoLayer->setBounds(gfx::Size(10, 10)); |
videoLayer->setAnchorPoint(gfx::PointF(0, 0)); |
@@ -3042,25 +2540,22 @@ TEST_P(LayerTreeHostImplTest, layersFreeTextures) |
ioSurfaceLayer->setIOSurfaceProperties(1, gfx::Size(10, 10)); |
rootLayer->addChild(ioSurfaceLayer.PassAs<LayerImpl>()); |
- // Lose the WebGraphicsContext3D, replacing it with a TrackingWebGraphicsContext3D (which the LayerTreeHostImpl takes ownership of). |
- scoped_ptr<OutputSurface> outputSurface(FakeOutputSurface::Create3d(scoped_ptr<WebKit::WebGraphicsContext3D>(new TrackingWebGraphicsContext3D))); |
- TrackingWebGraphicsContext3D* trackingWebGraphicsContext3D = static_cast<TrackingWebGraphicsContext3D*>(outputSurface->Context3D()); |
- m_hostImpl->initializeRenderer(outputSurface.Pass()); |
- |
m_hostImpl->setRootLayer(rootLayer.Pass()); |
+ EXPECT_EQ(0u, context3d->NumTextures()); |
+ |
LayerTreeHostImpl::FrameData frame; |
EXPECT_TRUE(m_hostImpl->prepareToDraw(frame)); |
m_hostImpl->drawLayers(frame); |
m_hostImpl->didDrawAllLayers(frame); |
m_hostImpl->swapBuffers(); |
- EXPECT_GT(trackingWebGraphicsContext3D->numTextures(), 0u); |
+ EXPECT_GT(context3d->NumTextures(), 0u); |
// Kill the layer tree. |
m_hostImpl->setRootLayer(LayerImpl::create(m_hostImpl->activeTree(), 100)); |
// There should be no textures left in use after. |
- EXPECT_EQ(0u, trackingWebGraphicsContext3D->numTextures()); |
+ EXPECT_EQ(0u, context3d->NumTextures()); |
} |
class MockDrawQuadsToFillScreenContext : public FakeWebGraphicsContext3D { |