blob: 4e5df19bee100921b27d9ba2d36b3e2eba4cd714 [file] [log] [blame]
Avi Drissman05dfbc822022-09-13 21:25:341// Copyright 2012 The Chromium Authors
apatrick@google.com1bee3982009-12-17 23:15:282// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
apatrick@google.com96449d2c2009-11-25 00:01:324
Arthur Sonzogni720f1c952024-07-25 16:17:515#ifdef UNSAFE_BUFFERS_BUILD
6// TODO(crbug.com/40285824): Remove this and convert code to safer constructs.
7#pragma allow_unsafe_buffers
8#endif
9
apatrick@google.com96449d2c2009-11-25 00:01:3210// This file contains definitions for mock objects, used for testing.
11
gman@chromium.orgf57bb282010-11-12 00:51:3412// TODO(apatrick): This file "manually" defines some mock objects. Using gMock
13// would be definitely preferable, unfortunately it doesn't work on Windows yet.
apatrick@google.com96449d2c2009-11-25 00:01:3214
apatrick@google.coma7a27ace2009-12-12 00:11:2515#ifndef GPU_COMMAND_BUFFER_SERVICE_MOCKS_H_
16#define GPU_COMMAND_BUFFER_SERVICE_MOCKS_H_
apatrick@google.com96449d2c2009-11-25 00:01:3217
avif15d60a2015-12-21 17:06:3318#include <stddef.h>
19#include <stdint.h>
20
dsinclair@chromium.orge3932abb2013-03-13 00:01:3721#include <string>
Helmut Januschkab81e97dc2024-04-17 14:57:0522#include <string_view>
apatrick@google.com96449d2c2009-11-25 00:01:3223#include <vector>
apatrick@chromium.org20407e92010-09-08 18:31:0824
Keishi Hattori0e45c022021-11-27 09:25:5225#include "base/memory/raw_ptr.h"
Jonathan Backereaf6bd62019-01-10 22:09:1926#include "gpu/command_buffer/common/cmd_buffer_common.h"
Antoine Laboure0990c1c2017-05-17 21:05:5627#include "gpu/command_buffer/service/async_api_interface.h"
Loko Kung6fb05ef2022-08-20 00:33:5028#include "gpu/command_buffer/service/decoder_client.h"
Loko Kung76d0dab2022-10-08 01:58:5029#include "gpu/command_buffer/service/isolation_key_provider.h"
gman@chromium.org739a06e2013-01-15 23:25:1130#include "gpu/command_buffer/service/memory_tracking.h"
dmurph@chromium.org65dfc602012-07-23 20:39:3931#include "gpu/command_buffer/service/program_cache.h"
gman@chromium.orgf57bb282010-11-12 00:51:3432#include "gpu/command_buffer/service/shader_translator.h"
apatrick@chromium.org20407e92010-09-08 18:31:0833#include "testing/gmock/include/gmock/gmock.h"
apatrick@google.com96449d2c2009-11-25 00:01:3234
apatrick@google.coma7a27ace2009-12-12 00:11:2535namespace gpu {
apatrick@google.com96449d2c2009-11-25 00:01:3236
Tom Sepez8bc9aae2023-04-21 22:51:3737class CommandBufferDirect;
Antoine Labour33555ec2017-05-23 18:16:3938class CommandBufferServiceBase;
39
apatrick@google.com96449d2c2009-11-25 00:01:3240// Mocks an AsyncAPIInterface, using GMock.
41class AsyncAPIMock : public AsyncAPIInterface {
42 public:
Antoine Labour1bec1072017-06-06 19:37:0343 explicit AsyncAPIMock(bool default_do_commands,
Tom Sepez8bc9aae2023-04-21 22:51:3744 CommandBufferDirect* command_buffer,
Antoine Labour1bec1072017-06-06 19:37:0345 CommandBufferServiceBase* command_buffer_service);
Daniel Chengc50b3f02018-04-27 03:01:5546 ~AsyncAPIMock() override;
apatrick@google.com96449d2c2009-11-25 00:01:3247
vmiura8266ca72014-09-09 21:37:0048 error::Error FakeDoCommands(unsigned int num_commands,
pimana728ad12016-09-06 16:48:0849 const volatile void* buffer,
vmiura8266ca72014-09-09 21:37:0050 int num_entries,
51 int* entries_processed);
52
apatrick@google.com96449d2c2009-11-25 00:01:3253 // Predicate that matches args passed to DoCommand, by looking at the values.
54 class IsArgs {
55 public:
pimana728ad12016-09-06 16:48:0856 IsArgs(unsigned int arg_count, const volatile void* args)
apatrick@google.com96449d2c2009-11-25 00:01:3257 : arg_count_(arg_count),
pimana728ad12016-09-06 16:48:0858 args_(static_cast<volatile CommandBufferEntry*>(
59 const_cast<volatile void*>(args))) {}
apatrick@google.com96449d2c2009-11-25 00:01:3260
pimana728ad12016-09-06 16:48:0861 bool operator()(const volatile void* _args) const {
62 const volatile CommandBufferEntry* args =
63 static_cast<const volatile CommandBufferEntry*>(_args) + 1;
apatrick@google.com96449d2c2009-11-25 00:01:3264 for (unsigned int i = 0; i < arg_count_; ++i) {
65 if (args[i].value_uint32 != args_[i].value_uint32) return false;
66 }
67 return true;
68 }
69
70 private:
71 unsigned int arg_count_;
Tom Sepezd83ed1b2023-09-19 00:10:0072 raw_ptr<volatile CommandBufferEntry, DanglingUntriaged | AllowPtrArithmetic>
73 args_;
apatrick@google.com96449d2c2009-11-25 00:01:3274 };
75
Antoine Labour3aaa590f2017-05-24 00:34:3476 void BeginDecoding() override {}
77 void EndDecoding() override {}
78
pimana728ad12016-09-06 16:48:0879 MOCK_METHOD3(DoCommand,
80 error::Error(unsigned int command,
81 unsigned int arg_count,
82 const volatile void* cmd_data));
apatrick@google.com96449d2c2009-11-25 00:01:3283
vmiura8266ca72014-09-09 21:37:0084 MOCK_METHOD4(DoCommands,
85 error::Error(unsigned int num_commands,
pimana728ad12016-09-06 16:48:0886 const volatile void* buffer,
vmiura8266ca72014-09-09 21:37:0087 int num_entries,
88 int* entries_processed));
89
Helmut Januschkab81e97dc2024-04-17 14:57:0590 std::string_view GetLogPrefix() override { return "None"; }
Antoine Labour3aaa590f2017-05-24 00:34:3491
apatrick@google.com96449d2c2009-11-25 00:01:3292 // Forwards the SetToken commands to the engine.
93 void SetToken(unsigned int command,
94 unsigned int arg_count,
pimana728ad12016-09-06 16:48:0895 const volatile void* _args);
erg@google.com33392292011-01-05 17:56:3996
apatrick@google.com96449d2c2009-11-25 00:01:3297 private:
Tom Sepez8bc9aae2023-04-21 22:51:3798 raw_ptr<CommandBufferDirect> command_buffer_;
Arthur Sonzognie98d2142023-06-01 15:02:2599 raw_ptr<CommandBufferServiceBase, DanglingUntriaged> command_buffer_service_;
apatrick@google.com96449d2c2009-11-25 00:01:32100};
101
Loko Kung6fb05ef2022-08-20 00:33:50102class MockDecoderClient : public DecoderClient {
103 public:
104 MockDecoderClient();
105 ~MockDecoderClient() override;
106
107 MOCK_METHOD(void, OnConsoleMessage, (int32_t id, const std::string& message));
Vasiliy Telezhnikovd503cba2025-09-03 15:26:48108 MOCK_METHOD(void, OnGpuSwitched, ());
Loko Kung6fb05ef2022-08-20 00:33:50109 MOCK_METHOD(void,
110 CacheBlob,
111 (gpu::GpuDiskCacheType type,
112 const std::string& key,
113 const std::string& shader));
114 MOCK_METHOD(void, OnFenceSyncRelease, (uint64_t release));
115 MOCK_METHOD(void, OnDescheduleUntilFinished, ());
116 MOCK_METHOD(void, OnRescheduleAfterFinished, ());
Loko Kung6fb05ef2022-08-20 00:33:50117 MOCK_METHOD(void, ScheduleGrContextCleanup, ());
118 MOCK_METHOD(void, SetActiveURL, (GURL url));
119 MOCK_METHOD(void, HandleReturnData, (base::span<const uint8_t> data));
Scott Violet39a6a822024-08-09 23:44:00120 MOCK_METHOD(bool, ShouldYield, ());
Loko Kung6fb05ef2022-08-20 00:33:50121};
122
Loko Kung76d0dab2022-10-08 01:58:50123class MockIsolationKeyProvider : public IsolationKeyProvider {
124 public:
125 MockIsolationKeyProvider();
126 ~MockIsolationKeyProvider() override;
127
128 MOCK_METHOD(void,
129 GetIsolationKey,
130 (const blink::WebGPUExecutionContextToken& token,
131 GetIsolationKeyCallback cb),
132 (override));
133};
134
gman@chromium.orgf57bb282010-11-12 00:51:34135namespace gles2 {
136
137class MockShaderTranslator : public ShaderTranslatorInterface {
138 public:
erg@google.com33392292011-01-05 17:56:39139 MockShaderTranslator();
gman@chromium.orgf57bb282010-11-12 00:51:34140
penghuang7404df9882016-02-29 23:07:29141 MOCK_METHOD6(Init,
kkinnunen48854202015-08-13 09:41:35142 bool(sh::GLenum shader_type,
143 ShShaderSpec shader_spec,
144 const ShBuiltInResources* resources,
145 ShShaderOutput shader_output_language,
Shahbaz Youssefib2c865572022-08-08 02:33:27146 const ShCompileOptions& driver_bug_workarounds,
penghuang7404df9882016-02-29 23:07:29147 bool gl_shader_interm_output));
kainino78c79d22017-05-04 18:45:30148 MOCK_CONST_METHOD9(Translate,
149 bool(const std::string& shader_source,
150 std::string* info_log,
151 std::string* translated_source,
152 int* shader_version,
153 AttributeMap* attrib_map,
154 UniformMap* uniform_map,
155 VaryingMap* varying_map,
156 InterfaceBlockMap* interface_block_map,
157 OutputVariableList* output_variable_list));
Geoff Lang30efb7b2017-08-09 14:59:23158 MOCK_CONST_METHOD0(GetStringForOptionsThatWouldAffectCompilation,
159 OptionsAffectingCompilationString*());
160
dyen0ff9e4402015-02-12 22:27:43161 private:
162 ~MockShaderTranslator() override;
gman@chromium.orgf57bb282010-11-12 00:51:34163};
164
dmurph@chromium.org65dfc602012-07-23 20:39:39165class MockProgramCache : public ProgramCache {
166 public:
167 MockProgramCache();
Daniel Chengc50b3f02018-04-27 03:01:55168 ~MockProgramCache() override;
dmurph@chromium.org65dfc602012-07-23 20:39:39169
Antoine Labourf679fa42017-06-07 00:32:43170 MOCK_METHOD7(LoadLinkedProgram,
171 ProgramLoadResult(
172 GLuint program,
173 Shader* shader_a,
174 Shader* shader_b,
175 const LocationMap* bind_attrib_location_map,
176 const std::vector<std::string>& transform_feedback_varyings,
177 GLenum transform_feedback_buffer_mode,
Jonathan Backer1d807a42018-01-08 20:45:54178 DecoderClient* client));
dmurph@chromium.org65dfc602012-07-23 20:39:39179
Antoine Labourf679fa42017-06-07 00:32:43180 MOCK_METHOD7(SaveLinkedProgram,
181 void(GLuint program,
182 const Shader* shader_a,
183 const Shader* shader_b,
184 const LocationMap* bind_attrib_location_map,
185 const std::vector<std::string>& transform_feedback_varyings,
186 GLenum transform_feedback_buffer_mode,
Jonathan Backer1d807a42018-01-08 20:45:54187 DecoderClient* client));
Jamie Madill4b5b28f2017-07-12 18:19:04188 MOCK_METHOD2(LoadProgram, void(const std::string&, const std::string&));
Jamie Madill1dbe2a12017-07-05 17:49:36189 MOCK_METHOD1(Trim, size_t(size_t));
dsinclair@chromium.orge3932abb2013-03-13 00:01:37190
dmurph@chromium.org65dfc602012-07-23 20:39:39191 private:
192 MOCK_METHOD0(ClearBackend, void());
193};
194
gman@chromium.org739a06e2013-01-15 23:25:11195class MockMemoryTracker : public MemoryTracker {
196 public:
197 MockMemoryTracker();
gman@chromium.org739a06e2013-01-15 23:25:11198
Kramer Ge4cb61ef2019-12-06 17:41:29199 MOCK_METHOD1(TrackMemoryAllocatedChange, void(int64_t delta));
Antoine Labour3b79a442018-07-06 20:19:34200 uint64_t GetSize() const override { return 0; }
ericrkf08855b42015-08-06 00:20:22201 MOCK_CONST_METHOD0(ClientTracingId, uint64_t());
202 MOCK_CONST_METHOD0(ClientId, int());
kylechard167a8662018-09-14 20:16:29203 MOCK_CONST_METHOD0(ContextGroupTracingId, uint64_t());
Maggie Chen40af1efa2025-06-04 18:19:57204
205 protected:
206 ~MockMemoryTracker() override;
gman@chromium.org739a06e2013-01-15 23:25:11207};
208
gman@chromium.orgf57bb282010-11-12 00:51:34209} // namespace gles2
apatrick@google.coma7a27ace2009-12-12 00:11:25210} // namespace gpu
apatrick@google.com96449d2c2009-11-25 00:01:32211
apatrick@google.coma7a27ace2009-12-12 00:11:25212#endif // GPU_COMMAND_BUFFER_SERVICE_MOCKS_H_