OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 | 4 |
5 #include "gpu/command_buffer/tests/gl_manager.h" | 5 #include "gpu/command_buffer/tests/gl_manager.h" |
6 | 6 |
| 7 #include <GLES2/gl2.h> |
| 8 #include <GLES2/gl2ext.h> |
| 9 |
7 #include <vector> | 10 #include <vector> |
8 | 11 |
9 #include "base/at_exit.h" | 12 #include "base/at_exit.h" |
10 #include "base/bind.h" | 13 #include "base/bind.h" |
| 14 #include "base/memory/ref_counted_memory.h" |
11 #include "gpu/command_buffer/client/gles2_implementation.h" | 15 #include "gpu/command_buffer/client/gles2_implementation.h" |
12 #include "gpu/command_buffer/client/gles2_lib.h" | 16 #include "gpu/command_buffer/client/gles2_lib.h" |
13 #include "gpu/command_buffer/client/gpu_memory_buffer_factory.h" | |
14 #include "gpu/command_buffer/client/transfer_buffer.h" | 17 #include "gpu/command_buffer/client/transfer_buffer.h" |
15 #include "gpu/command_buffer/common/constants.h" | 18 #include "gpu/command_buffer/common/constants.h" |
16 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 19 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
17 #include "gpu/command_buffer/service/command_buffer_service.h" | 20 #include "gpu/command_buffer/service/command_buffer_service.h" |
18 #include "gpu/command_buffer/service/context_group.h" | 21 #include "gpu/command_buffer/service/context_group.h" |
19 #include "gpu/command_buffer/service/gl_context_virtual.h" | 22 #include "gpu/command_buffer/service/gl_context_virtual.h" |
20 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 23 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
21 #include "gpu/command_buffer/service/gpu_control_service.h" | |
22 #include "gpu/command_buffer/service/gpu_scheduler.h" | 24 #include "gpu/command_buffer/service/gpu_scheduler.h" |
23 #include "gpu/command_buffer/service/image_manager.h" | 25 #include "gpu/command_buffer/service/image_manager.h" |
24 #include "gpu/command_buffer/service/mailbox_manager.h" | 26 #include "gpu/command_buffer/service/mailbox_manager.h" |
25 #include "testing/gtest/include/gtest/gtest.h" | 27 #include "testing/gtest/include/gtest/gtest.h" |
| 28 #include "ui/gfx/gpu_memory_buffer.h" |
26 #include "ui/gl/gl_context.h" | 29 #include "ui/gl/gl_context.h" |
| 30 #include "ui/gl/gl_image_ref_counted_memory.h" |
27 #include "ui/gl/gl_share_group.h" | 31 #include "ui/gl/gl_share_group.h" |
28 #include "ui/gl/gl_surface.h" | 32 #include "ui/gl/gl_surface.h" |
29 | 33 |
30 namespace gpu { | 34 namespace gpu { |
| 35 namespace { |
| 36 |
| 37 int BytesPerPixel(unsigned internalformat) { |
| 38 switch (internalformat) { |
| 39 case GL_RGBA8_OES: |
| 40 return 4; |
| 41 default: |
| 42 NOTREACHED(); |
| 43 return 0; |
| 44 } |
| 45 } |
| 46 |
| 47 class GpuMemoryBufferImpl : public gfx::GpuMemoryBuffer { |
| 48 public: |
| 49 GpuMemoryBufferImpl(base::RefCountedBytes* bytes, |
| 50 const gfx::Size& size, |
| 51 unsigned internalformat) |
| 52 : bytes_(bytes), |
| 53 size_(size), |
| 54 internalformat_(internalformat), |
| 55 mapped_(false) {} |
| 56 |
| 57 // Overridden from gfx::GpuMemoryBuffer: |
| 58 virtual void* Map() OVERRIDE { |
| 59 mapped_ = true; |
| 60 return &bytes_->data().front(); |
| 61 } |
| 62 virtual void Unmap() OVERRIDE { mapped_ = false; } |
| 63 virtual bool IsMapped() const OVERRIDE { return mapped_; } |
| 64 virtual uint32 GetStride() const OVERRIDE { |
| 65 return size_.width() * BytesPerPixel(internalformat_); |
| 66 } |
| 67 virtual gfx::GpuMemoryBufferHandle GetHandle() const OVERRIDE { |
| 68 NOTREACHED(); |
| 69 return gfx::GpuMemoryBufferHandle(); |
| 70 } |
| 71 |
| 72 private: |
| 73 scoped_refptr<base::RefCountedBytes> bytes_; |
| 74 const gfx::Size size_; |
| 75 unsigned internalformat_; |
| 76 bool mapped_; |
| 77 }; |
| 78 |
| 79 } // namespace |
31 | 80 |
32 int GLManager::use_count_; | 81 int GLManager::use_count_; |
33 scoped_refptr<gfx::GLShareGroup>* GLManager::base_share_group_; | 82 scoped_refptr<gfx::GLShareGroup>* GLManager::base_share_group_; |
34 scoped_refptr<gfx::GLSurface>* GLManager::base_surface_; | 83 scoped_refptr<gfx::GLSurface>* GLManager::base_surface_; |
35 scoped_refptr<gfx::GLContext>* GLManager::base_context_; | 84 scoped_refptr<gfx::GLContext>* GLManager::base_context_; |
36 | 85 |
37 GLManager::Options::Options() | 86 GLManager::Options::Options() |
38 : size(4, 4), | 87 : size(4, 4), |
39 share_group_manager(NULL), | 88 share_group_manager(NULL), |
40 share_mailbox_manager(NULL), | 89 share_mailbox_manager(NULL), |
41 virtual_manager(NULL), | 90 virtual_manager(NULL), |
42 bind_generates_resource(false), | 91 bind_generates_resource(false), |
43 lose_context_when_out_of_memory(false), | 92 lose_context_when_out_of_memory(false), |
44 context_lost_allowed(false), | 93 context_lost_allowed(false) { |
45 image_manager(NULL) {} | 94 } |
46 | 95 |
47 GLManager::GLManager() | 96 GLManager::GLManager() : context_lost_allowed_(false) { |
48 : context_lost_allowed_(false), gpu_memory_buffer_factory_(NULL) { | |
49 SetupBaseContext(); | 97 SetupBaseContext(); |
50 } | 98 } |
51 | 99 |
52 GLManager::~GLManager() { | 100 GLManager::~GLManager() { |
53 --use_count_; | 101 --use_count_; |
54 if (!use_count_) { | 102 if (!use_count_) { |
55 if (base_share_group_) { | 103 if (base_share_group_) { |
56 delete base_context_; | 104 delete base_context_; |
57 base_context_ = NULL; | 105 base_context_ = NULL; |
58 } | 106 } |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
113 attrib_helper.red_size_ = 8; | 161 attrib_helper.red_size_ = 8; |
114 attrib_helper.green_size_ = 8; | 162 attrib_helper.green_size_ = 8; |
115 attrib_helper.blue_size_ = 8; | 163 attrib_helper.blue_size_ = 8; |
116 attrib_helper.alpha_size_ = 8; | 164 attrib_helper.alpha_size_ = 8; |
117 attrib_helper.depth_size_ = 16; | 165 attrib_helper.depth_size_ = 16; |
118 attrib_helper.Serialize(&attribs); | 166 attrib_helper.Serialize(&attribs); |
119 | 167 |
120 if (!context_group) { | 168 if (!context_group) { |
121 context_group = | 169 context_group = |
122 new gles2::ContextGroup(mailbox_manager_.get(), | 170 new gles2::ContextGroup(mailbox_manager_.get(), |
123 options.image_manager, | |
124 NULL, | 171 NULL, |
125 new gpu::gles2::ShaderTranslatorCache, | 172 new gpu::gles2::ShaderTranslatorCache, |
126 NULL, | 173 NULL, |
127 options.bind_generates_resource); | 174 options.bind_generates_resource); |
128 } | 175 } |
129 | 176 |
130 decoder_.reset(::gpu::gles2::GLES2Decoder::Create(context_group)); | 177 decoder_.reset(::gpu::gles2::GLES2Decoder::Create(context_group)); |
131 | 178 |
132 command_buffer_.reset(new CommandBufferService( | 179 command_buffer_.reset(new CommandBufferService( |
133 decoder_->GetContextGroup()->transfer_buffer_manager())); | 180 decoder_->GetContextGroup()->transfer_buffer_manager())); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 ASSERT_TRUE(context_->MakeCurrent(surface_.get())); | 212 ASSERT_TRUE(context_->MakeCurrent(surface_.get())); |
166 | 213 |
167 ASSERT_TRUE(decoder_->Initialize( | 214 ASSERT_TRUE(decoder_->Initialize( |
168 surface_.get(), | 215 surface_.get(), |
169 context_.get(), | 216 context_.get(), |
170 true, | 217 true, |
171 options.size, | 218 options.size, |
172 ::gpu::gles2::DisallowedFeatures(), | 219 ::gpu::gles2::DisallowedFeatures(), |
173 attribs)) << "could not initialize decoder"; | 220 attribs)) << "could not initialize decoder"; |
174 | 221 |
175 gpu_control_service_.reset( | |
176 new GpuControlService(decoder_->GetContextGroup()->image_manager(), | |
177 decoder_->GetQueryManager())); | |
178 gpu_memory_buffer_factory_ = options.gpu_memory_buffer_factory; | |
179 | |
180 command_buffer_->SetPutOffsetChangeCallback( | 222 command_buffer_->SetPutOffsetChangeCallback( |
181 base::Bind(&GLManager::PumpCommands, base::Unretained(this))); | 223 base::Bind(&GLManager::PumpCommands, base::Unretained(this))); |
182 command_buffer_->SetGetBufferChangeCallback( | 224 command_buffer_->SetGetBufferChangeCallback( |
183 base::Bind(&GLManager::GetBufferChanged, base::Unretained(this))); | 225 base::Bind(&GLManager::GetBufferChanged, base::Unretained(this))); |
184 | 226 |
185 // Create the GLES2 helper, which writes the command buffer protocol. | 227 // Create the GLES2 helper, which writes the command buffer protocol. |
186 gles2_helper_.reset(new gles2::GLES2CmdHelper(command_buffer_.get())); | 228 gles2_helper_.reset(new gles2::GLES2CmdHelper(command_buffer_.get())); |
187 ASSERT_TRUE(gles2_helper_->Initialize(kCommandBufferSize)); | 229 ASSERT_TRUE(gles2_helper_->Initialize(kCommandBufferSize)); |
188 | 230 |
189 // Create a transfer buffer. | 231 // Create a transfer buffer. |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
271 Capabilities GLManager::GetCapabilities() { | 313 Capabilities GLManager::GetCapabilities() { |
272 return decoder_->GetCapabilities(); | 314 return decoder_->GetCapabilities(); |
273 } | 315 } |
274 | 316 |
275 gfx::GpuMemoryBuffer* GLManager::CreateGpuMemoryBuffer( | 317 gfx::GpuMemoryBuffer* GLManager::CreateGpuMemoryBuffer( |
276 size_t width, | 318 size_t width, |
277 size_t height, | 319 size_t height, |
278 unsigned internalformat, | 320 unsigned internalformat, |
279 unsigned usage, | 321 unsigned usage, |
280 int32* id) { | 322 int32* id) { |
| 323 gfx::Size size(width, height); |
| 324 |
281 *id = -1; | 325 *id = -1; |
| 326 |
| 327 std::vector<unsigned char> data( |
| 328 size.GetArea() * BytesPerPixel(internalformat), 0); |
| 329 scoped_refptr<base::RefCountedBytes> bytes(new base::RefCountedBytes(data)); |
282 scoped_ptr<gfx::GpuMemoryBuffer> buffer( | 330 scoped_ptr<gfx::GpuMemoryBuffer> buffer( |
283 gpu_memory_buffer_factory_->CreateGpuMemoryBuffer( | 331 new GpuMemoryBufferImpl(bytes.get(), size, internalformat)); |
284 width, height, internalformat, usage)); | 332 |
285 if (!buffer.get()) | 333 static int32 next_id = 1; |
| 334 int32 new_id = next_id++; |
| 335 |
| 336 scoped_refptr<gfx::GLImageRefCountedMemory> image( |
| 337 new gfx::GLImageRefCountedMemory(size, internalformat)); |
| 338 if (!image->Initialize(bytes.get())) |
286 return NULL; | 339 return NULL; |
287 | 340 |
288 static int32 next_id = 1; | 341 gpu::gles2::ImageManager* image_manager = decoder_->GetImageManager(); |
289 *id = next_id++; | 342 DCHECK(image_manager); |
290 gpu_control_service_->RegisterGpuMemoryBuffer( | 343 image_manager->AddImage(image.get(), new_id); |
291 *id, buffer->GetHandle(), width, height, internalformat); | 344 |
292 gfx::GpuMemoryBuffer* raw_buffer = buffer.get(); | 345 *id = new_id; |
293 memory_buffers_.add(*id, buffer.Pass()); | 346 DCHECK(gpu_memory_buffers_.find(new_id) == gpu_memory_buffers_.end()); |
294 return raw_buffer; | 347 return gpu_memory_buffers_.add(new_id, buffer.Pass()).first->second; |
295 } | 348 } |
296 | 349 |
297 void GLManager::DestroyGpuMemoryBuffer(int32 id) { | 350 void GLManager::DestroyGpuMemoryBuffer(int32 id) { |
298 memory_buffers_.erase(id); | 351 gpu::gles2::ImageManager* image_manager = decoder_->GetImageManager(); |
299 gpu_control_service_->UnregisterGpuMemoryBuffer(id); | 352 DCHECK(image_manager); |
| 353 image_manager->RemoveImage(id); |
| 354 |
| 355 gpu_memory_buffers_.erase(id); |
300 } | 356 } |
301 | 357 |
302 uint32 GLManager::InsertSyncPoint() { | 358 uint32 GLManager::InsertSyncPoint() { |
303 NOTIMPLEMENTED(); | 359 NOTIMPLEMENTED(); |
304 return 0u; | 360 return 0u; |
305 } | 361 } |
306 | 362 |
307 uint32 GLManager::InsertFutureSyncPoint() { | 363 uint32 GLManager::InsertFutureSyncPoint() { |
308 NOTIMPLEMENTED(); | 364 NOTIMPLEMENTED(); |
309 return 0u; | 365 return 0u; |
(...skipping 19 matching lines...) Expand all Loading... |
329 void GLManager::Echo(const base::Closure& callback) { | 385 void GLManager::Echo(const base::Closure& callback) { |
330 NOTIMPLEMENTED(); | 386 NOTIMPLEMENTED(); |
331 } | 387 } |
332 | 388 |
333 uint32 GLManager::CreateStreamTexture(uint32 texture_id) { | 389 uint32 GLManager::CreateStreamTexture(uint32 texture_id) { |
334 NOTIMPLEMENTED(); | 390 NOTIMPLEMENTED(); |
335 return 0; | 391 return 0; |
336 } | 392 } |
337 | 393 |
338 } // namespace gpu | 394 } // namespace gpu |
OLD | NEW |