1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
gpu / command_buffer / client / test_shared_image_interface.h [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef GPU_COMMAND_BUFFER_CLIENT_TEST_SHARED_IMAGE_INTERFACE_H_
#define GPU_COMMAND_BUFFER_CLIENT_TEST_SHARED_IMAGE_INTERFACE_H_
#include <memory>
#include "base/containers/flat_set.h"
#include "base/synchronization/lock.h"
#include "build/build_config.h"
#include "gpu/command_buffer/client/shared_image_interface.h"
#include "gpu/command_buffer/client/test_gpu_memory_buffer_manager.h"
#include "gpu/command_buffer/common/shared_image_capabilities.h"
#include "gpu/command_buffer/common/shared_image_usage.h"
#include "gpu/ipc/client/shared_image_interface_proxy.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace gpu {
class TestBufferCollection;
class TestSharedImageInterface : public SharedImageInterface {
public:
TestSharedImageInterface();
scoped_refptr<ClientSharedImage> CreateSharedImage(
const SharedImageInfo& si_info,
SurfaceHandle surface_handle,
std::optional<SharedImagePoolId> pool_id = std::nullopt) override;
scoped_refptr<ClientSharedImage> CreateSharedImage(
const SharedImageInfo& si_info,
base::span<const uint8_t> pixel_data) override;
scoped_refptr<ClientSharedImage> CreateSharedImage(
const SharedImageInfo& si_info,
SurfaceHandle surface_handle,
gfx::BufferUsage buffer_usage,
std::optional<SharedImagePoolId> pool_id = std::nullopt) override;
MOCK_METHOD4(DoCreateSharedImage,
void(const gfx::Size& size,
const viz::SharedImageFormat& format,
gpu::SurfaceHandle surface_handle,
gfx::BufferUsage buffer_usage));
MOCK_METHOD0(DoFlush, void());
scoped_refptr<ClientSharedImage> CreateSharedImage(
const SharedImageInfo& si_info,
SurfaceHandle surface_handle,
gfx::BufferUsage buffer_usage,
gfx::GpuMemoryBufferHandle buffer_handle) override;
scoped_refptr<ClientSharedImage> CreateSharedImage(
const SharedImageInfo& si_info,
gfx::GpuMemoryBufferHandle buffer_handle) override;
SharedImageInterface::SharedImageMapping CreateSharedImage(
const SharedImageInfo& si_info) override;
scoped_refptr<ClientSharedImage> CreateSharedImageForSoftwareCompositor(
const SharedImageInfo& si_info) override;
void UpdateSharedImage(const SyncToken& sync_token,
const Mailbox& mailbox) override;
void UpdateSharedImage(const SyncToken& sync_token,
std::unique_ptr<gfx::GpuFence> acquire_fence,
const Mailbox& mailbox) override;
scoped_refptr<ClientSharedImage> ImportSharedImage(
const ExportedSharedImage& exported_shared_image) override;
void DestroySharedImage(const SyncToken& sync_token,
const Mailbox& mailbox) override;
void DestroySharedImage(
const SyncToken& sync_token,
scoped_refptr<ClientSharedImage> client_shared_image) override;
SwapChainSharedImages CreateSwapChain(viz::SharedImageFormat format,
const gfx::Size& size,
const gfx::ColorSpace& color_space,
GrSurfaceOrigin surface_origin,
SkAlphaType alpha_type,
SharedImageUsageSet usage) override;
void PresentSwapChain(const SyncToken& sync_token,
const Mailbox& mailbox) override;
#if BUILDFLAG(IS_FUCHSIA)
void RegisterSysmemBufferCollection(zx::eventpair service_handle,
zx::channel sysmem_token,
const viz::SharedImageFormat& format,
gfx::BufferUsage usage,
bool register_with_image_pipe) override;
#endif // BUILDFLAG(IS_FUCHSIA)
SyncToken GenVerifiedSyncToken() override;
SyncToken GenUnverifiedSyncToken() override;
void VerifySyncToken(SyncToken& sync_token) override;
void WaitSyncToken(const SyncToken& sync_token) override;
void Flush() override;
scoped_refptr<gfx::NativePixmap> GetNativePixmap(
const Mailbox& mailbox) override;
size_t shared_image_count() const { return shared_images_.size(); }
const gfx::Size& MostRecentSize() const { return most_recent_size_; }
const SyncToken& MostRecentGeneratedToken() const {
return most_recent_generated_token_;
}
const SyncToken& MostRecentDestroyToken() const {
return most_recent_destroy_token_;
}
bool CheckSharedImageExists(const Mailbox& mailbox) const;
const SharedImageCapabilities& GetCapabilities() override;
void SetCapabilities(const SharedImageCapabilities& caps);
void SetFailSharedImageCreationWithBufferUsage(bool value) {
fail_shared_image_creation_with_buffer_usage_ = value;
}
void UseTestGMBInSharedImageCreationWithBufferUsage() {
// Create |test_gmb_manager_| only if it doesn't already exist.
if (!test_gmb_manager_) {
test_gmb_manager_ = std::make_unique<TestGpuMemoryBufferManager>();
}
}
void emulate_client_provided_native_buffer() {
emulate_client_provided_native_buffer_ = true;
}
#if BUILDFLAG(IS_MAC)
void set_texture_target_for_io_surfaces(uint32_t target) {
shared_image_capabilities_.texture_target_for_io_surfaces = target;
}
#endif
protected:
~TestSharedImageInterface() override;
private:
void InitializeSharedImageCapabilities();
mutable base::Lock lock_;
uint64_t release_id_ = 0;
gfx::Size most_recent_size_;
SyncToken most_recent_generated_token_;
SyncToken most_recent_destroy_token_;
base::flat_set<Mailbox> shared_images_;
bool emulate_client_provided_native_buffer_ = false;
#if BUILDFLAG(IS_FUCHSIA)
base::flat_map<zx_koid_t, std::unique_ptr<TestBufferCollection>>
sysmem_buffer_collections_;
#endif
SharedImageCapabilities shared_image_capabilities_;
bool fail_shared_image_creation_with_buffer_usage_ = false;
// If non-null, this will be used to back mappable SharedImages with test
// GpuMemoryBuffers.
std::unique_ptr<TestGpuMemoryBufferManager> test_gmb_manager_;
};
} // namespace gpu
#endif // GPU_COMMAND_BUFFER_CLIENT_TEST_SHARED_IMAGE_INTERFACE_H_