1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "components/viz/service/display/texture_deleter.h"
6 
7 #include "base/single_thread_task_runner.h"
8 #include "base/threading/thread_task_runner_handle.h"
9 #include "components/viz/common/resources/single_release_callback.h"
10 #include "components/viz/test/test_context_provider.h"
11 #include "gpu/command_buffer/client/shared_image_interface.h"
12 #include "gpu/command_buffer/common/shared_image_usage.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14 #include "ui/gfx/color_space.h"
15 
16 namespace viz {
17 namespace {
18 
TEST(TextureDeleterTest,Destroy)19 TEST(TextureDeleterTest, Destroy) {
20   auto deleter =
21       std::make_unique<TextureDeleter>(base::ThreadTaskRunnerHandle::Get());
22 
23   scoped_refptr<TestContextProvider> context_provider =
24       TestContextProvider::Create();
25   context_provider->BindToCurrentThread();
26 
27   auto* sii = context_provider->SharedImageInterface();
28 
29   gpu::Mailbox mailbox = sii->CreateSharedImage(
30       ResourceFormat::RGBA_8888, gfx::Size(1, 1), gfx::ColorSpace(),
31       kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType,
32       gpu::SHARED_IMAGE_USAGE_GLES2, gpu::kNullSurfaceHandle);
33 
34   EXPECT_TRUE(context_provider->HasOneRef());
35   EXPECT_EQ(1u, sii->shared_image_count());
36 
37   std::unique_ptr<SingleReleaseCallback> cb =
38       deleter->GetReleaseCallback(context_provider, mailbox);
39   EXPECT_FALSE(context_provider->HasOneRef());
40   EXPECT_EQ(1u, sii->shared_image_count());
41 
42   // When the deleter is destroyed, it immediately drops its ref on the
43   // ContextProvider, and deletes the shared image.
44   deleter = nullptr;
45   EXPECT_TRUE(context_provider->HasOneRef());
46   EXPECT_EQ(0u, sii->shared_image_count());
47 
48   // Run the scoped release callback before destroying it, but it won't do
49   // anything.
50   cb->Run(gpu::SyncToken(), false);
51 }
52 
TEST(TextureDeleterTest,NullTaskRunner)53 TEST(TextureDeleterTest, NullTaskRunner) {
54   auto deleter = std::make_unique<TextureDeleter>(nullptr);
55 
56   scoped_refptr<TestContextProvider> context_provider =
57       TestContextProvider::Create();
58   context_provider->BindToCurrentThread();
59 
60   auto* sii = context_provider->SharedImageInterface();
61 
62   gpu::Mailbox mailbox = sii->CreateSharedImage(
63       ResourceFormat::RGBA_8888, gfx::Size(1, 1), gfx::ColorSpace(),
64       kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType,
65       gpu::SHARED_IMAGE_USAGE_GLES2, gpu::kNullSurfaceHandle);
66 
67   EXPECT_TRUE(context_provider->HasOneRef());
68   EXPECT_EQ(1u, sii->shared_image_count());
69 
70   std::unique_ptr<SingleReleaseCallback> cb =
71       deleter->GetReleaseCallback(context_provider, mailbox);
72   EXPECT_FALSE(context_provider->HasOneRef());
73   EXPECT_EQ(1u, sii->shared_image_count());
74 
75   cb->Run(gpu::SyncToken(), false);
76 
77   // With no task runner the callback will immediately drops its ref on the
78   // ContextProvider and delete the shared image.
79   EXPECT_TRUE(context_provider->HasOneRef());
80   EXPECT_EQ(0u, sii->shared_image_count());
81 }
82 
83 }  // namespace
84 }  // namespace viz
85