diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer_software_rendering_test.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer_software_rendering_test.cc | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer_software_rendering_test.cc b/chromium/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer_software_rendering_test.cc new file mode 100644 index 00000000000..c8e07ba0c7a --- /dev/null +++ b/chromium/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer_software_rendering_test.cc @@ -0,0 +1,117 @@ +// Copyright 2016 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 "third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.h" + +#include "cc/resources/shared_bitmap_id_registrar.h" +#include "components/viz/common/resources/single_release_callback.h" +#include "components/viz/common/resources/transferable_resource.h" +#include "gpu/command_buffer/client/gles2_interface_stub.h" +#include "gpu/config/gpu_feature_info.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/renderer/platform/graphics/gpu/drawing_buffer_test_helpers.h" + +// These unit tests are separate from DrawingBufferTests.cpp because they are +// built as a part of webkit_unittests instead blink_platform_unittests. This is +// because the software rendering mode has a dependency on the blink::Platform +// interface for buffer allocations. + +namespace blink { +namespace { + +class TestSharedBitmapIdRegistar : public cc::SharedBitmapIdRegistrar { + virtual cc::SharedBitmapIdRegistration RegisterSharedBitmapId( + const viz::SharedBitmapId& id, + scoped_refptr<cc::CrossThreadSharedBitmap> bitmap) { + return {}; + } +}; + +class DrawingBufferSoftwareCompositingTest : public testing::Test { + protected: + void SetUp() override { + IntSize initial_size(kInitialWidth, kInitialHeight); + auto gl = std::make_unique<GLES2InterfaceForTests>(); + auto provider = + std::make_unique<WebGraphicsContext3DProviderForTests>(std::move(gl)); + GLES2InterfaceForTests* gl_ = + static_cast<GLES2InterfaceForTests*>(provider->ContextGL()); + bool gpu_compositing = false; + drawing_buffer_ = DrawingBufferForTests::Create( + std::move(provider), gpu_compositing, gl_, initial_size, + DrawingBuffer::kPreserve, kDisableMultisampling); + CHECK(drawing_buffer_); + } + + scoped_refptr<DrawingBufferForTests> drawing_buffer_; + TestSharedBitmapIdRegistar test_shared_bitmap_id_registrar_; +}; + +TEST_F(DrawingBufferSoftwareCompositingTest, BitmapRecycling) { + viz::TransferableResource resource; + std::unique_ptr<viz::SingleReleaseCallback> release_callback1; + std::unique_ptr<viz::SingleReleaseCallback> release_callback2; + std::unique_ptr<viz::SingleReleaseCallback> release_callback3; + IntSize initial_size(kInitialWidth, kInitialHeight); + IntSize alternate_size(kInitialWidth, kAlternateHeight); + + drawing_buffer_->Resize(initial_size); + drawing_buffer_->MarkContentsChanged(); + drawing_buffer_->PrepareTransferableResource( + &test_shared_bitmap_id_registrar_, &resource, + &release_callback1); // create a bitmap. + EXPECT_EQ(0, drawing_buffer_->RecycledBitmapCount()); + release_callback1->Run( + gpu::SyncToken(), + false /* lostResource */); // release bitmap to the recycling queue + EXPECT_EQ(1, drawing_buffer_->RecycledBitmapCount()); + drawing_buffer_->MarkContentsChanged(); + drawing_buffer_->PrepareTransferableResource( + &test_shared_bitmap_id_registrar_, &resource, + &release_callback2); // recycle a bitmap. + EXPECT_EQ(0, drawing_buffer_->RecycledBitmapCount()); + release_callback2->Run( + gpu::SyncToken(), + false /* lostResource */); // release bitmap to the recycling queue + EXPECT_EQ(1, drawing_buffer_->RecycledBitmapCount()); + drawing_buffer_->Resize(alternate_size); + drawing_buffer_->MarkContentsChanged(); + // Regression test for crbug.com/647896 - Next line must not crash + drawing_buffer_->PrepareTransferableResource( + &test_shared_bitmap_id_registrar_, &resource, + &release_callback3); // cause recycling queue to be purged due to resize + EXPECT_EQ(0, drawing_buffer_->RecycledBitmapCount()); + release_callback3->Run(gpu::SyncToken(), false /* lostResource */); + EXPECT_EQ(1, drawing_buffer_->RecycledBitmapCount()); + + drawing_buffer_->BeginDestruction(); +} + +TEST_F(DrawingBufferSoftwareCompositingTest, FramebufferBinding) { + GLES2InterfaceForTests* gl_ = drawing_buffer_->ContextGLForTests(); + viz::TransferableResource resource; + std::unique_ptr<viz::SingleReleaseCallback> release_callback; + IntSize initial_size(kInitialWidth, kInitialHeight); + GLint drawBinding = 0, readBinding = 0; + + GLuint draw_framebuffer_binding = 0xbeef3; + GLuint read_framebuffer_binding = 0xbeef4; + gl_->BindFramebuffer(GL_DRAW_FRAMEBUFFER, draw_framebuffer_binding); + gl_->BindFramebuffer(GL_READ_FRAMEBUFFER, read_framebuffer_binding); + gl_->SaveState(); + drawing_buffer_->Resize(initial_size); + drawing_buffer_->MarkContentsChanged(); + drawing_buffer_->PrepareTransferableResource( + &test_shared_bitmap_id_registrar_, &resource, &release_callback); + gl_->GetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &drawBinding); + gl_->GetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &readBinding); + EXPECT_EQ(static_cast<GLint>(draw_framebuffer_binding), drawBinding); + EXPECT_EQ(static_cast<GLint>(read_framebuffer_binding), readBinding); + release_callback->Run(gpu::SyncToken(), false /* lostResource */); + + drawing_buffer_->BeginDestruction(); +} + +} // unnamed namespace +} // blink |