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