Chromium Code Reviews| 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" |
| 11 #include "base/bind.h" | 11 #include "base/bind.h" |
| 12 #include "base/command_line.h" | 12 #include "base/command_line.h" |
| 13 #include "base/logging.h" | 13 #include "base/logging.h" |
| 14 #include "base/memory/ptr_util.h" | 14 #include "base/memory/ptr_util.h" |
| 15 #include "base/memory/ref_counted.h" | 15 #include "base/memory/ref_counted.h" |
| 16 #include "build/build_config.h" | 16 #include "build/build_config.h" |
| 17 #include "gpu/command_buffer/common/constants.h" | 17 #include "gpu/command_buffer/common/constants.h" |
| 18 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 18 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
| 19 #include "gpu/command_buffer/common/sync_token.h" | 19 #include "gpu/command_buffer/common/sync_token.h" |
| 20 #include "gpu/command_buffer/service/buffer_manager.h" | 20 #include "gpu/command_buffer/service/buffer_manager.h" |
| 21 #include "gpu/command_buffer/service/command_buffer_service.h" | 21 #include "gpu/command_buffer/service/command_buffer_service.h" |
| 22 #include "gpu/command_buffer/service/command_executor.h" | 22 #include "gpu/command_buffer/service/command_executor.h" |
| 23 #include "gpu/command_buffer/service/context_group.h" | 23 #include "gpu/command_buffer/service/context_group.h" |
| 24 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 24 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
| 25 #include "gpu/command_buffer/service/gpu_switches.h" | |
| 25 #include "gpu/command_buffer/service/logger.h" | 26 #include "gpu/command_buffer/service/logger.h" |
| 26 #include "gpu/command_buffer/service/mailbox_manager_impl.h" | 27 #include "gpu/command_buffer/service/mailbox_manager_impl.h" |
| 27 #include "gpu/command_buffer/service/sync_point_manager.h" | 28 #include "gpu/command_buffer/service/sync_point_manager.h" |
| 28 #include "gpu/command_buffer/service/transfer_buffer_manager.h" | 29 #include "gpu/command_buffer/service/transfer_buffer_manager.h" |
| 29 #include "ui/gfx/geometry/size.h" | 30 #include "ui/gfx/geometry/size.h" |
| 30 #include "ui/gl/gl_context.h" | 31 #include "ui/gl/gl_context.h" |
| 31 #include "ui/gl/gl_context_egl.h" | 32 #include "ui/gl/gl_context_egl.h" |
| 32 #include "ui/gl/gl_context_stub.h" | 33 #include "ui/gl/gl_context_stub.h" |
| 33 #include "ui/gl/gl_image_ref_counted_memory.h" | 34 #include "ui/gl/gl_image_ref_counted_memory.h" |
| 34 #include "ui/gl/gl_share_group.h" | 35 #include "ui/gl/gl_share_group.h" |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 89 CommandBufferSetup() | 90 CommandBufferSetup() |
| 90 : atexit_manager_(), | 91 : atexit_manager_(), |
| 91 sync_point_manager_(new SyncPointManager(false)), | 92 sync_point_manager_(new SyncPointManager(false)), |
| 92 sync_point_order_data_(SyncPointOrderData::Create()), | 93 sync_point_order_data_(SyncPointOrderData::Create()), |
| 93 mailbox_manager_(new gles2::MailboxManagerImpl), | 94 mailbox_manager_(new gles2::MailboxManagerImpl), |
| 94 share_group_(new gl::GLShareGroup), | 95 share_group_(new gl::GLShareGroup), |
| 95 command_buffer_id_(CommandBufferId::FromUnsafeValue(1)) { | 96 command_buffer_id_(CommandBufferId::FromUnsafeValue(1)) { |
| 96 logging::SetMinLogLevel(logging::LOG_FATAL); | 97 logging::SetMinLogLevel(logging::LOG_FATAL); |
| 97 base::CommandLine::Init(0, NULL); | 98 base::CommandLine::Init(0, NULL); |
| 98 | 99 |
| 100 auto* command_line = base::CommandLine::ForCurrentProcess(); | |
| 101 (void)command_line; | |
|
piman
2017/03/09 18:15:13
nit: ALLOW_UNUSED_LOCAL
Geoff Lang
2017/03/09 19:29:10
Done.
| |
| 102 | |
| 103 #if defined(GPU_FUZZER_USE_PASSTHROUGH_CMD_DECODER) | |
| 104 command_line->AppendSwitch(switches::kUsePassthroughCmdDecoder); | |
| 105 gpu_preferences_.use_passthrough_cmd_decoder = true; | |
| 106 #endif | |
| 107 | |
| 99 #if defined(GPU_FUZZER_USE_ANGLE) | 108 #if defined(GPU_FUZZER_USE_ANGLE) |
| 100 auto* command_line = base::CommandLine::ForCurrentProcess(); | |
| 101 command_line->AppendSwitchASCII(switches::kUseGL, | 109 command_line->AppendSwitchASCII(switches::kUseGL, |
| 102 gl::kGLImplementationANGLEName); | 110 gl::kGLImplementationANGLEName); |
| 103 command_line->AppendSwitchASCII(switches::kUseANGLE, | 111 command_line->AppendSwitchASCII(switches::kUseANGLE, |
| 104 gl::kANGLEImplementationNullName); | 112 gl::kANGLEImplementationNullName); |
| 105 gl::init::InitializeGLOneOffImplementation(gl::kGLImplementationEGLGLES2, | 113 gl::init::InitializeGLOneOffImplementation(gl::kGLImplementationEGLGLES2, |
| 106 false, false, false); | 114 false, false, false); |
| 115 #else | |
| 116 gl::GLSurfaceTestSupport::InitializeOneOffWithMockBindings(); | |
| 117 #endif | |
| 118 | |
| 119 sync_point_client_ = sync_point_manager_->CreateSyncPointClient( | |
| 120 sync_point_order_data_, CommandBufferNamespace::IN_PROCESS, | |
| 121 command_buffer_id_); | |
| 122 | |
| 123 translator_cache_ = new gles2::ShaderTranslatorCache(gpu_preferences_); | |
| 124 completeness_cache_ = new gles2::FramebufferCompletenessCache; | |
| 125 | |
| 126 InitDecoder(); | |
| 127 } | |
| 128 | |
| 129 void InitDecoder() { | |
| 130 if (decoder_initialized_) { | |
| 131 return; | |
| 132 } | |
| 133 | |
| 134 #if defined(GPU_FUZZER_USE_ANGLE) | |
| 107 surface_ = new gl::PbufferGLSurfaceEGL(gfx::Size()); | 135 surface_ = new gl::PbufferGLSurfaceEGL(gfx::Size()); |
| 108 surface_->Initialize(); | 136 surface_->Initialize(); |
| 109 | 137 |
| 110 context_ = new gl::GLContextEGL(share_group_.get()); | 138 context_ = new gl::GLContextEGL(share_group_.get()); |
| 111 context_->Initialize(surface_.get(), gl::GLContextAttribs()); | 139 context_->Initialize(surface_.get(), gl::GLContextAttribs()); |
|
piman
2017/03/09 18:15:13
Did you intend to recreate the context on every te
Geoff Lang
2017/03/09 19:29:10
Yea, it didn't seem to have too much of an effect
| |
| 112 #else | 140 #else |
| 113 surface_ = new gl::GLSurfaceStub; | 141 surface_ = new gl::GLSurfaceStub; |
| 114 scoped_refptr<gl::GLContextStub> context_stub = | 142 scoped_refptr<gl::GLContextStub> context_stub = |
| 115 new gl::GLContextStub(share_group_.get()); | 143 new gl::GLContextStub(share_group_.get()); |
| 116 context_stub->SetGLVersionString("OpenGL ES 3.1"); | 144 context_stub->SetGLVersionString("OpenGL ES 3.1"); |
| 117 context_stub->SetExtensionsString(kExtensions); | 145 context_stub->SetExtensionsString(kExtensions); |
| 118 context_stub->SetUseStubApi(true); | 146 context_stub->SetUseStubApi(true); |
| 119 context_ = context_stub; | 147 context_ = context_stub; |
| 120 gl::GLSurfaceTestSupport::InitializeOneOffWithMockBindings(); | |
| 121 #endif | 148 #endif |
| 122 | 149 |
| 123 sync_point_client_ = sync_point_manager_->CreateSyncPointClient( | |
| 124 sync_point_order_data_, CommandBufferNamespace::IN_PROCESS, | |
| 125 command_buffer_id_); | |
| 126 | |
| 127 translator_cache_ = new gles2::ShaderTranslatorCache(gpu_preferences_); | |
| 128 completeness_cache_ = new gles2::FramebufferCompletenessCache; | |
| 129 } | |
| 130 | |
| 131 void InitDecoder() { | |
| 132 context_->MakeCurrent(surface_.get()); | 150 context_->MakeCurrent(surface_.get()); |
| 133 scoped_refptr<gles2::FeatureInfo> feature_info = | 151 scoped_refptr<gles2::FeatureInfo> feature_info = |
| 134 new gles2::FeatureInfo(); | 152 new gles2::FeatureInfo(); |
| 135 scoped_refptr<gles2::ContextGroup> context_group = new gles2::ContextGroup( | 153 scoped_refptr<gles2::ContextGroup> context_group = new gles2::ContextGroup( |
| 136 gpu_preferences_, mailbox_manager_.get(), nullptr, translator_cache_, | 154 gpu_preferences_, mailbox_manager_.get(), nullptr, translator_cache_, |
| 137 completeness_cache_, feature_info, true /* bind_generates_resource */, | 155 completeness_cache_, feature_info, true /* bind_generates_resource */, |
| 138 nullptr /* image_factory */, nullptr /* progress_reporter */); | 156 nullptr /* image_factory */, nullptr /* progress_reporter */); |
| 139 command_buffer_.reset( | 157 command_buffer_.reset( |
| 140 new CommandBufferService(context_group->transfer_buffer_manager())); | 158 new CommandBufferService(context_group->transfer_buffer_manager())); |
| 141 command_buffer_->SetPutOffsetChangeCallback( | 159 command_buffer_->SetPutOffsetChangeCallback( |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 170 CHECK(result); | 188 CHECK(result); |
| 171 decoder_->set_max_bucket_size(8 << 20); | 189 decoder_->set_max_bucket_size(8 << 20); |
| 172 context_group->buffer_manager()->set_max_buffer_size(8 << 20); | 190 context_group->buffer_manager()->set_max_buffer_size(8 << 20); |
| 173 if (!vertex_translator_) { | 191 if (!vertex_translator_) { |
| 174 // Keep a reference to the translators, which keeps them in the cache even | 192 // Keep a reference to the translators, which keeps them in the cache even |
| 175 // after the decoder is reset. They are expensive to initialize, but they | 193 // after the decoder is reset. They are expensive to initialize, but they |
| 176 // don't keep state. | 194 // don't keep state. |
| 177 vertex_translator_ = decoder_->GetTranslator(GL_VERTEX_SHADER); | 195 vertex_translator_ = decoder_->GetTranslator(GL_VERTEX_SHADER); |
| 178 fragment_translator_ = decoder_->GetTranslator(GL_FRAGMENT_SHADER); | 196 fragment_translator_ = decoder_->GetTranslator(GL_FRAGMENT_SHADER); |
| 179 } | 197 } |
| 198 | |
| 199 decoder_initialized_ = true; | |
|
piman
2017/03/09 18:15:13
Why the need for this? Before this change, we init
Geoff Lang
2017/03/09 19:29:10
I added this due to the comment referenced below.
piman
2017/03/09 22:12:35
Right, the important part is that the ANGLE DLL is
Geoff Lang
2017/03/09 22:22:13
Sounds good, I'll update that when I get back to M
Geoff Lang
2017/03/16 17:22:08
Done, I also updated it to only re-create the cont
| |
| 180 } | 200 } |
| 181 | 201 |
| 182 void ResetDecoder() { | 202 void ResetDecoder() { |
| 203 if (!decoder_initialized_) { | |
| 204 return; | |
| 205 } | |
| 206 | |
| 183 decoder_->Destroy(true); | 207 decoder_->Destroy(true); |
| 184 decoder_.reset(); | 208 decoder_.reset(); |
| 185 command_buffer_.reset(); | 209 command_buffer_.reset(); |
| 210 surface_ = nullptr; | |
| 211 context_->ReleaseCurrent(nullptr); | |
| 212 context_ = nullptr; | |
| 213 | |
| 214 decoder_initialized_ = false; | |
| 186 } | 215 } |
| 187 | 216 |
| 188 ~CommandBufferSetup() { | 217 ~CommandBufferSetup() { |
| 218 ResetDecoder(); | |
| 189 sync_point_client_ = nullptr; | 219 sync_point_client_ = nullptr; |
| 190 if (sync_point_order_data_) { | 220 if (sync_point_order_data_) { |
| 191 sync_point_order_data_->Destroy(); | 221 sync_point_order_data_->Destroy(); |
| 192 sync_point_order_data_ = nullptr; | 222 sync_point_order_data_ = nullptr; |
| 193 } | 223 } |
| 194 } | 224 } |
| 195 | 225 |
| 196 void RunCommandBuffer(const uint8_t* data, size_t size) { | 226 void RunCommandBuffer(const uint8_t* data, size_t size) { |
| 197 // The commands are flushed at a uint32_t granularity. If the data is not | 227 // The commands are flushed at a uint32_t granularity. If the data is not |
| 198 // a full command, we zero-pad it. | 228 // a full command, we zero-pad it. |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 281 | 311 |
| 282 GpuPreferences gpu_preferences_; | 312 GpuPreferences gpu_preferences_; |
| 283 | 313 |
| 284 std::unique_ptr<SyncPointManager> sync_point_manager_; | 314 std::unique_ptr<SyncPointManager> sync_point_manager_; |
| 285 scoped_refptr<SyncPointOrderData> sync_point_order_data_; | 315 scoped_refptr<SyncPointOrderData> sync_point_order_data_; |
| 286 std::unique_ptr<SyncPointClient> sync_point_client_; | 316 std::unique_ptr<SyncPointClient> sync_point_client_; |
| 287 scoped_refptr<gles2::MailboxManager> mailbox_manager_; | 317 scoped_refptr<gles2::MailboxManager> mailbox_manager_; |
| 288 scoped_refptr<gl::GLShareGroup> share_group_; | 318 scoped_refptr<gl::GLShareGroup> share_group_; |
| 289 const gpu::CommandBufferId command_buffer_id_; | 319 const gpu::CommandBufferId command_buffer_id_; |
| 290 | 320 |
| 321 bool decoder_initialized_ = false; | |
| 322 | |
| 291 scoped_refptr<gl::GLSurface> surface_; | 323 scoped_refptr<gl::GLSurface> surface_; |
| 292 scoped_refptr<gl::GLContext> context_; | 324 scoped_refptr<gl::GLContext> context_; |
| 293 | 325 |
| 294 scoped_refptr<gles2::ShaderTranslatorCache> translator_cache_; | 326 scoped_refptr<gles2::ShaderTranslatorCache> translator_cache_; |
| 295 scoped_refptr<gles2::FramebufferCompletenessCache> completeness_cache_; | 327 scoped_refptr<gles2::FramebufferCompletenessCache> completeness_cache_; |
| 296 | 328 |
| 297 std::unique_ptr<CommandBufferService> command_buffer_; | 329 std::unique_ptr<CommandBufferService> command_buffer_; |
| 298 | 330 |
| 299 std::unique_ptr<gles2::GLES2Decoder> decoder_; | 331 std::unique_ptr<gles2::GLES2Decoder> decoder_; |
| 300 std::unique_ptr<CommandExecutor> executor_; | 332 std::unique_ptr<CommandExecutor> executor_; |
| 301 | 333 |
| 302 scoped_refptr<gles2::ShaderTranslatorInterface> vertex_translator_; | 334 scoped_refptr<gles2::ShaderTranslatorInterface> vertex_translator_; |
| 303 scoped_refptr<gles2::ShaderTranslatorInterface> fragment_translator_; | 335 scoped_refptr<gles2::ShaderTranslatorInterface> fragment_translator_; |
| 304 | 336 |
| 305 scoped_refptr<Buffer> buffer_; | 337 scoped_refptr<Buffer> buffer_; |
| 306 int32_t buffer_id_ = 0; | 338 int32_t buffer_id_ = 0; |
| 307 }; | 339 }; |
| 308 | 340 |
| 309 // Intentionally leaked because asan tries to exit cleanly after a crash, but | 341 // Intentionally leaked because asan tries to exit cleanly after a crash, but |
| 310 // the decoder is usually in a bad state at that point. | 342 // the decoder is usually in a bad state at that point. |
| 311 // We need to load ANGLE libraries before the fuzzer infrastructure starts, | 343 // We need to load ANGLE libraries before the fuzzer infrastructure starts, |
| 312 // because it gets confused about new coverage counters being dynamically | 344 // because it gets confused about new coverage counters being dynamically |
| 313 // registered, causing crashes. | 345 // registered, causing crashes. |
| 314 CommandBufferSetup* g_setup = new CommandBufferSetup(); | 346 CommandBufferSetup* g_setup = new CommandBufferSetup(); |
|
Geoff Lang
2017/03/09 19:29:10
ref
| |
| 315 | 347 |
| 316 } // anonymous namespace | 348 } // anonymous namespace |
| 317 } // namespace gpu | 349 } // namespace gpu |
| 318 | 350 |
| 319 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { | 351 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { |
| 320 gpu::g_setup->RunCommandBuffer(data, size); | 352 gpu::g_setup->RunCommandBuffer(data, size); |
| 321 return 0; | 353 return 0; |
| 322 } | 354 } |
| OLD | NEW |