| Index: gpu/ipc/service/direct_composition_surface_win_unittest.cc
|
| diff --git a/gpu/ipc/service/direct_composition_surface_win_unittest.cc b/gpu/ipc/service/direct_composition_surface_win_unittest.cc
|
| index 19a1d2c52bcc3044e4f9446fe009104dbc9ba77b..862e1525bd58bc046dc165220d5ff1e9b75e7ead 100644
|
| --- a/gpu/ipc/service/direct_composition_surface_win_unittest.cc
|
| +++ b/gpu/ipc/service/direct_composition_surface_win_unittest.cc
|
| @@ -42,6 +42,21 @@ void RunPendingTasks(scoped_refptr<base::TaskRunner> task_runner) {
|
| done.Wait();
|
| }
|
|
|
| +void DestroySurface(scoped_refptr<DirectCompositionSurfaceWin> surface) {
|
| + scoped_refptr<base::TaskRunner> task_runner =
|
| + surface->GetWindowTaskRunnerForTesting();
|
| + DCHECK(surface->HasOneRef());
|
| +
|
| + surface = nullptr;
|
| +
|
| + // Ensure that the ChildWindowWin posts the task to delete the thread to the
|
| + // main loop before doing RunUntilIdle. Otherwise the child threads could
|
| + // outlive the main thread.
|
| + RunPendingTasks(task_runner);
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| +}
|
| +
|
| TEST(DirectCompositionSurfaceTest, TestMakeCurrent) {
|
| if (!gl::QueryDirectCompositionDevice(
|
| gl::QueryD3D11DeviceObjectFromANGLE())) {
|
| @@ -52,35 +67,37 @@ TEST(DirectCompositionSurfaceTest, TestMakeCurrent) {
|
|
|
| TestImageTransportSurfaceDelegate delegate;
|
|
|
| - scoped_refptr<DirectCompositionSurfaceWin> surface(
|
| + scoped_refptr<DirectCompositionSurfaceWin> surface1(
|
| new DirectCompositionSurfaceWin(delegate.AsWeakPtr(),
|
| ui::GetHiddenWindow()));
|
| - EXPECT_TRUE(surface->Initialize());
|
| + EXPECT_TRUE(surface1->Initialize());
|
| + surface1->SetEnableDCLayers(true);
|
|
|
| - scoped_refptr<gl::GLContext> context =
|
| - gl::init::CreateGLContext(nullptr, surface.get(), gl::GLContextAttribs());
|
| - EXPECT_TRUE(surface->Resize(gfx::Size(100, 100), 1.0, true));
|
| + scoped_refptr<gl::GLContext> context1 = gl::init::CreateGLContext(
|
| + nullptr, surface1.get(), gl::GLContextAttribs());
|
| + EXPECT_TRUE(surface1->Resize(gfx::Size(100, 100), 1.0, true));
|
|
|
| // First SetDrawRectangle must be full size of surface.
|
| - EXPECT_FALSE(surface->SetDrawRectangle(gfx::Rect(0, 0, 50, 50)));
|
| - EXPECT_TRUE(surface->SetDrawRectangle(gfx::Rect(0, 0, 100, 100)));
|
| + EXPECT_FALSE(surface1->SetDrawRectangle(gfx::Rect(0, 0, 50, 50)));
|
| + EXPECT_TRUE(surface1->SetDrawRectangle(gfx::Rect(0, 0, 100, 100)));
|
|
|
| // SetDrawRectangle can't be called again until swap.
|
| - EXPECT_FALSE(surface->SetDrawRectangle(gfx::Rect(0, 0, 100, 100)));
|
| + EXPECT_FALSE(surface1->SetDrawRectangle(gfx::Rect(0, 0, 100, 100)));
|
|
|
| - EXPECT_TRUE(context->MakeCurrent(surface.get()));
|
| - EXPECT_EQ(gfx::SwapResult::SWAP_ACK, surface->SwapBuffers());
|
| + EXPECT_TRUE(context1->MakeCurrent(surface1.get()));
|
| + EXPECT_EQ(gfx::SwapResult::SWAP_ACK, surface1->SwapBuffers());
|
|
|
| - EXPECT_TRUE(context->IsCurrent(surface.get()));
|
| + EXPECT_TRUE(context1->IsCurrent(surface1.get()));
|
|
|
| // SetDrawRectangle must be contained within surface.
|
| - EXPECT_FALSE(surface->SetDrawRectangle(gfx::Rect(0, 0, 101, 101)));
|
| - EXPECT_TRUE(surface->SetDrawRectangle(gfx::Rect(0, 0, 100, 100)));
|
| - EXPECT_TRUE(context->IsCurrent(surface.get()));
|
| + EXPECT_FALSE(surface1->SetDrawRectangle(gfx::Rect(0, 0, 101, 101)));
|
| + EXPECT_TRUE(surface1->SetDrawRectangle(gfx::Rect(0, 0, 100, 100)));
|
| + EXPECT_TRUE(context1->IsCurrent(surface1.get()));
|
|
|
| - EXPECT_TRUE(surface->Resize(gfx::Size(50, 50), 1.0, true));
|
| - EXPECT_TRUE(surface->SetDrawRectangle(gfx::Rect(0, 0, 50, 50)));
|
| - EXPECT_TRUE(context->IsCurrent(surface.get()));
|
| + EXPECT_TRUE(surface1->Resize(gfx::Size(50, 50), 1.0, true));
|
| + EXPECT_TRUE(context1->IsCurrent(surface1.get()));
|
| + EXPECT_TRUE(surface1->SetDrawRectangle(gfx::Rect(0, 0, 50, 50)));
|
| + EXPECT_TRUE(context1->IsCurrent(surface1.get()));
|
|
|
| scoped_refptr<DirectCompositionSurfaceWin> surface2(
|
| new DirectCompositionSurfaceWin(delegate.AsWeakPtr(),
|
| @@ -89,6 +106,7 @@ TEST(DirectCompositionSurfaceTest, TestMakeCurrent) {
|
|
|
| scoped_refptr<gl::GLContext> context2 = gl::init::CreateGLContext(
|
| nullptr, surface2.get(), gl::GLContextAttribs());
|
| + surface2->SetEnableDCLayers(true);
|
| EXPECT_TRUE(context2->MakeCurrent(surface2.get()));
|
| EXPECT_TRUE(surface2->Resize(gfx::Size(100, 100), 1.0, true));
|
| // The previous IDCompositionSurface should be suspended when another
|
| @@ -98,25 +116,70 @@ TEST(DirectCompositionSurfaceTest, TestMakeCurrent) {
|
|
|
| // It should be possible to switch back to the previous surface and
|
| // unsuspend it.
|
| + EXPECT_TRUE(context1->MakeCurrent(surface1.get()));
|
| + context2 = nullptr;
|
| + context1 = nullptr;
|
| +
|
| + DestroySurface(std::move(surface1));
|
| + DestroySurface(std::move(surface2));
|
| +}
|
| +
|
| +// Tests that switching using EnableDCLayers works.
|
| +TEST(DirectCompositionSurfaceTest, DXGIDCLayerSwitch) {
|
| + if (!gl::QueryDirectCompositionDevice(
|
| + gl::QueryD3D11DeviceObjectFromANGLE())) {
|
| + LOG(WARNING)
|
| + << "GL implementation not using DirectComposition, skipping test.";
|
| + return;
|
| + }
|
| +
|
| + TestImageTransportSurfaceDelegate delegate;
|
| +
|
| + scoped_refptr<DirectCompositionSurfaceWin> surface(
|
| + new DirectCompositionSurfaceWin(delegate.AsWeakPtr(),
|
| + ui::GetHiddenWindow()));
|
| + EXPECT_TRUE(surface->Initialize());
|
| +
|
| + scoped_refptr<gl::GLContext> context =
|
| + gl::init::CreateGLContext(nullptr, surface.get(), gl::GLContextAttribs());
|
| + EXPECT_TRUE(surface->Resize(gfx::Size(100, 100), 1.0, true));
|
| + EXPECT_FALSE(surface->swap_chain());
|
| +
|
| + // First SetDrawRectangle must be full size of surface for DXGI
|
| + // swapchain.
|
| + EXPECT_FALSE(surface->SetDrawRectangle(gfx::Rect(0, 0, 50, 50)));
|
| + EXPECT_TRUE(surface->SetDrawRectangle(gfx::Rect(0, 0, 100, 100)));
|
| + EXPECT_TRUE(surface->swap_chain());
|
| +
|
| + // SetDrawRectangle can't be called again until swap.
|
| + EXPECT_FALSE(surface->SetDrawRectangle(gfx::Rect(0, 0, 100, 100)));
|
| +
|
| EXPECT_TRUE(context->MakeCurrent(surface.get()));
|
| - scoped_refptr<base::TaskRunner> task_runner1 =
|
| - surface->GetWindowTaskRunnerForTesting();
|
| - scoped_refptr<base::TaskRunner> task_runner2 =
|
| - surface2->GetWindowTaskRunnerForTesting();
|
| + EXPECT_EQ(gfx::SwapResult::SWAP_ACK, surface->SwapBuffers());
|
|
|
| - context2 = nullptr;
|
| - surface2 = nullptr;
|
| - context = nullptr;
|
| - surface = nullptr;
|
| + EXPECT_TRUE(context->IsCurrent(surface.get()));
|
|
|
| - // Ensure that the ChildWindowWin posts the task to delete the thread to the
|
| - // main loop before doing RunUntilIdle. Otherwise the child threads could
|
| - // outlive the main thread.
|
| - RunPendingTasks(task_runner1);
|
| - RunPendingTasks(task_runner2);
|
| + surface->SetEnableDCLayers(true);
|
|
|
| - base::RunLoop().RunUntilIdle();
|
| -}
|
| + // Surface switched to use IDCompositionSurface, so must draw to
|
| + // entire surface.
|
| + EXPECT_FALSE(surface->SetDrawRectangle(gfx::Rect(0, 0, 50, 50)));
|
| + EXPECT_TRUE(surface->SetDrawRectangle(gfx::Rect(0, 0, 100, 100)));
|
| + EXPECT_TRUE(context->IsCurrent(surface.get()));
|
| + EXPECT_FALSE(surface->swap_chain());
|
| +
|
| + surface->SetEnableDCLayers(false);
|
|
|
| + EXPECT_EQ(gfx::SwapResult::SWAP_ACK, surface->SwapBuffers());
|
| +
|
| + // Surface switched to use IDXGISwapChain, so must draw to entire
|
| + // surface.
|
| + EXPECT_FALSE(surface->SetDrawRectangle(gfx::Rect(0, 0, 50, 50)));
|
| + EXPECT_TRUE(surface->SetDrawRectangle(gfx::Rect(0, 0, 100, 100)));
|
| + EXPECT_TRUE(surface->swap_chain());
|
| +
|
| + context = nullptr;
|
| + DestroySurface(std::move(surface));
|
| +}
|
| } // namespace
|
| } // namespace gpu
|
|
|