OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 #include <stddef.h> | 4 #include <stddef.h> |
5 #include <stdint.h> | 5 #include <stdint.h> |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/at_exit.h" | 10 #include "base/at_exit.h" |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 "GL_OES_texture_float_linear " | 82 "GL_OES_texture_float_linear " |
83 "GL_OES_texture_half_float " | 83 "GL_OES_texture_half_float " |
84 "GL_OES_texture_half_float_linear"; | 84 "GL_OES_texture_half_float_linear"; |
85 #endif | 85 #endif |
86 | 86 |
87 class CommandBufferSetup { | 87 class CommandBufferSetup { |
88 public: | 88 public: |
89 CommandBufferSetup() | 89 CommandBufferSetup() |
90 : atexit_manager_(), | 90 : atexit_manager_(), |
91 sync_point_manager_(new SyncPointManager()), | 91 sync_point_manager_(new SyncPointManager()), |
92 sync_point_order_data_(SyncPointOrderData::Create()), | 92 sync_point_order_data_(sync_point_manager_->CreateSyncPointOrderData()), |
93 mailbox_manager_(new gles2::MailboxManagerImpl), | 93 mailbox_manager_(new gles2::MailboxManagerImpl), |
94 share_group_(new gl::GLShareGroup), | 94 share_group_(new gl::GLShareGroup), |
95 command_buffer_id_(CommandBufferId::FromUnsafeValue(1)) { | 95 command_buffer_id_(CommandBufferId::FromUnsafeValue(1)) { |
96 logging::SetMinLogLevel(logging::LOG_FATAL); | 96 logging::SetMinLogLevel(logging::LOG_FATAL); |
97 base::CommandLine::Init(0, NULL); | 97 base::CommandLine::Init(0, NULL); |
98 | 98 |
99 #if defined(GPU_FUZZER_USE_ANGLE) | 99 #if defined(GPU_FUZZER_USE_ANGLE) |
100 auto* command_line = base::CommandLine::ForCurrentProcess(); | 100 auto* command_line = base::CommandLine::ForCurrentProcess(); |
101 command_line->AppendSwitchASCII(switches::kUseGL, | 101 command_line->AppendSwitchASCII(switches::kUseGL, |
102 gl::kGLImplementationANGLEName); | 102 gl::kGLImplementationANGLEName); |
(...skipping 10 matching lines...) Expand all Loading... |
113 surface_ = new gl::GLSurfaceStub; | 113 surface_ = new gl::GLSurfaceStub; |
114 scoped_refptr<gl::GLContextStub> context_stub = | 114 scoped_refptr<gl::GLContextStub> context_stub = |
115 new gl::GLContextStub(share_group_.get()); | 115 new gl::GLContextStub(share_group_.get()); |
116 context_stub->SetGLVersionString("OpenGL ES 3.1"); | 116 context_stub->SetGLVersionString("OpenGL ES 3.1"); |
117 context_stub->SetExtensionsString(kExtensions); | 117 context_stub->SetExtensionsString(kExtensions); |
118 context_stub->SetUseStubApi(true); | 118 context_stub->SetUseStubApi(true); |
119 context_ = context_stub; | 119 context_ = context_stub; |
120 gl::GLSurfaceTestSupport::InitializeOneOffWithMockBindings(); | 120 gl::GLSurfaceTestSupport::InitializeOneOffWithMockBindings(); |
121 #endif | 121 #endif |
122 | 122 |
123 sync_point_client_ = base::MakeUnique<SyncPointClient>( | 123 sync_point_client_state_ = sync_point_manager_->CreateSyncPointClientState( |
124 sync_point_manager_.get(), sync_point_order_data_, | 124 CommandBufferNamespace::IN_PROCESS, command_buffer_id_, |
125 CommandBufferNamespace::IN_PROCESS, command_buffer_id_); | 125 sync_point_order_data_->sequence_id()); |
126 | 126 |
127 translator_cache_ = new gles2::ShaderTranslatorCache(gpu_preferences_); | 127 translator_cache_ = new gles2::ShaderTranslatorCache(gpu_preferences_); |
128 completeness_cache_ = new gles2::FramebufferCompletenessCache; | 128 completeness_cache_ = new gles2::FramebufferCompletenessCache; |
129 } | 129 } |
130 | 130 |
131 void InitDecoder() { | 131 void InitDecoder() { |
132 context_->MakeCurrent(surface_.get()); | 132 context_->MakeCurrent(surface_.get()); |
133 scoped_refptr<gles2::FeatureInfo> feature_info = | 133 scoped_refptr<gles2::FeatureInfo> feature_info = |
134 new gles2::FeatureInfo(); | 134 new gles2::FeatureInfo(); |
135 scoped_refptr<gles2::ContextGroup> context_group = new gles2::ContextGroup( | 135 scoped_refptr<gles2::ContextGroup> context_group = new gles2::ContextGroup( |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
180 } | 180 } |
181 } | 181 } |
182 | 182 |
183 void ResetDecoder() { | 183 void ResetDecoder() { |
184 decoder_->Destroy(true); | 184 decoder_->Destroy(true); |
185 decoder_.reset(); | 185 decoder_.reset(); |
186 command_buffer_.reset(); | 186 command_buffer_.reset(); |
187 } | 187 } |
188 | 188 |
189 ~CommandBufferSetup() { | 189 ~CommandBufferSetup() { |
190 sync_point_client_ = nullptr; | |
191 if (sync_point_order_data_) { | 190 if (sync_point_order_data_) { |
192 sync_point_order_data_->Destroy(); | 191 sync_point_order_data_->Destroy(); |
193 sync_point_order_data_ = nullptr; | 192 sync_point_order_data_ = nullptr; |
194 } | 193 } |
| 194 if (sync_point_client_state_) { |
| 195 sync_point_client_state_->Destroy(); |
| 196 sync_point_client_state_ = nullptr; |
| 197 } |
195 } | 198 } |
196 | 199 |
197 void RunCommandBuffer(const uint8_t* data, size_t size) { | 200 void RunCommandBuffer(const uint8_t* data, size_t size) { |
198 // The commands are flushed at a uint32_t granularity. If the data is not | 201 // The commands are flushed at a uint32_t granularity. If the data is not |
199 // a full command, we zero-pad it. | 202 // a full command, we zero-pad it. |
200 size_t padded_size = (size + 3) & ~3; | 203 size_t padded_size = (size + 3) & ~3; |
201 // crbug.com/638836 The -max_len argument is sometimes not respected, so the | 204 // crbug.com/638836 The -max_len argument is sometimes not respected, so the |
202 // fuzzer may give us too much data. Bail ASAP in that case. | 205 // fuzzer may give us too much data. Bail ASAP in that case. |
203 if (padded_size > kCommandBufferSize) | 206 if (padded_size > kCommandBufferSize) |
204 return; | 207 return; |
(...skipping 11 matching lines...) Expand all Loading... |
216 } | 219 } |
217 | 220 |
218 private: | 221 private: |
219 void PumpCommands() { | 222 void PumpCommands() { |
220 if (!decoder_->MakeCurrent()) { | 223 if (!decoder_->MakeCurrent()) { |
221 command_buffer_->SetContextLostReason(decoder_->GetContextLostReason()); | 224 command_buffer_->SetContextLostReason(decoder_->GetContextLostReason()); |
222 command_buffer_->SetParseError(::gpu::error::kLostContext); | 225 command_buffer_->SetParseError(::gpu::error::kLostContext); |
223 return; | 226 return; |
224 } | 227 } |
225 | 228 |
226 uint32_t order_num = sync_point_order_data_->GenerateUnprocessedOrderNumber( | 229 uint32_t order_num = |
227 sync_point_manager_.get()); | 230 sync_point_order_data_->GenerateUnprocessedOrderNumber(); |
228 sync_point_order_data_->BeginProcessingOrderNumber(order_num); | 231 sync_point_order_data_->BeginProcessingOrderNumber(order_num); |
229 | 232 |
230 executor_->PutChanged(); | 233 executor_->PutChanged(); |
231 | 234 |
232 sync_point_order_data_->FinishProcessingOrderNumber(order_num); | 235 sync_point_order_data_->FinishProcessingOrderNumber(order_num); |
233 } | 236 } |
234 | 237 |
235 bool GetBufferChanged(int32_t transfer_buffer_id) { | 238 bool GetBufferChanged(int32_t transfer_buffer_id) { |
236 return executor_->SetGetBuffer(transfer_buffer_id); | 239 return executor_->SetGetBuffer(transfer_buffer_id); |
237 } | 240 } |
238 | 241 |
239 void OnFenceSyncRelease(uint64_t release) { | 242 void OnFenceSyncRelease(uint64_t release) { |
240 CHECK(sync_point_client_); | 243 CHECK(sync_point_client_state_); |
241 sync_point_client_->ReleaseFenceSync(release); | 244 sync_point_client_state_->ReleaseFenceSync(release); |
242 } | 245 } |
243 | 246 |
244 bool OnWaitSyncToken(const SyncToken& sync_token) { | 247 bool OnWaitSyncToken(const SyncToken& sync_token) { |
245 CHECK(sync_point_manager_); | 248 CHECK(sync_point_manager_); |
246 if (sync_point_manager_->IsSyncTokenReleased(sync_token)) | 249 if (sync_point_manager_->IsSyncTokenReleased(sync_token)) |
247 return false; | 250 return false; |
248 executor_->SetScheduled(false); | 251 executor_->SetScheduled(false); |
249 return true; | 252 return true; |
250 } | 253 } |
251 | 254 |
(...skipping 16 matching lines...) Expand all Loading... |
268 CreateTransferBuffer(kTransferBufferSize, 4); | 271 CreateTransferBuffer(kTransferBufferSize, 4); |
269 CreateTransferBuffer(kTinyTransferBufferSize, 5); | 272 CreateTransferBuffer(kTinyTransferBufferSize, 5); |
270 } | 273 } |
271 | 274 |
272 base::AtExitManager atexit_manager_; | 275 base::AtExitManager atexit_manager_; |
273 | 276 |
274 GpuPreferences gpu_preferences_; | 277 GpuPreferences gpu_preferences_; |
275 | 278 |
276 std::unique_ptr<SyncPointManager> sync_point_manager_; | 279 std::unique_ptr<SyncPointManager> sync_point_manager_; |
277 scoped_refptr<SyncPointOrderData> sync_point_order_data_; | 280 scoped_refptr<SyncPointOrderData> sync_point_order_data_; |
278 std::unique_ptr<SyncPointClient> sync_point_client_; | 281 scoped_refptr<SyncPointClientState> sync_point_client_state_; |
279 scoped_refptr<gles2::MailboxManager> mailbox_manager_; | 282 scoped_refptr<gles2::MailboxManager> mailbox_manager_; |
280 scoped_refptr<gl::GLShareGroup> share_group_; | 283 scoped_refptr<gl::GLShareGroup> share_group_; |
281 const gpu::CommandBufferId command_buffer_id_; | 284 const gpu::CommandBufferId command_buffer_id_; |
282 | 285 |
283 scoped_refptr<gl::GLSurface> surface_; | 286 scoped_refptr<gl::GLSurface> surface_; |
284 scoped_refptr<gl::GLContext> context_; | 287 scoped_refptr<gl::GLContext> context_; |
285 | 288 |
286 scoped_refptr<gles2::ShaderTranslatorCache> translator_cache_; | 289 scoped_refptr<gles2::ShaderTranslatorCache> translator_cache_; |
287 scoped_refptr<gles2::FramebufferCompletenessCache> completeness_cache_; | 290 scoped_refptr<gles2::FramebufferCompletenessCache> completeness_cache_; |
288 | 291 |
(...skipping 16 matching lines...) Expand all Loading... |
305 // registered, causing crashes. | 308 // registered, causing crashes. |
306 CommandBufferSetup* g_setup = new CommandBufferSetup(); | 309 CommandBufferSetup* g_setup = new CommandBufferSetup(); |
307 | 310 |
308 } // anonymous namespace | 311 } // anonymous namespace |
309 } // namespace gpu | 312 } // namespace gpu |
310 | 313 |
311 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { | 314 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { |
312 gpu::g_setup->RunCommandBuffer(data, size); | 315 gpu::g_setup->RunCommandBuffer(data, size); |
313 return 0; | 316 return 0; |
314 } | 317 } |
OLD | NEW |