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 | |
no sievers
2014/07/11 18:33:29
I've been wanting to use InProcessCommandBuffer fo
reveman
2014/07/11 21:08:06
Acknowledged.
| |
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 decoder()->GetImageManager()->AddImage(image.get(), new_id); |
289 *id = next_id++; | 342 |
290 gpu_control_service_->RegisterGpuMemoryBuffer( | 343 *id = new_id; |
291 *id, buffer->GetHandle(), width, height, internalformat); | 344 gpu_memory_buffers_.add(new_id, buffer.Pass()); |
292 gfx::GpuMemoryBuffer* raw_buffer = buffer.get(); | 345 return gpu_memory_buffers_.get(new_id); |
reveman
2014/07/11 21:08:06
Changed this to be consistent with CommandBufferPr
| |
293 memory_buffers_.add(*id, buffer.Pass()); | |
294 return raw_buffer; | |
295 } | 346 } |
296 | 347 |
297 void GLManager::DestroyGpuMemoryBuffer(int32 id) { | 348 void GLManager::DestroyGpuMemoryBuffer(int32 id) { |
298 memory_buffers_.erase(id); | 349 decoder()->GetImageManager()->RemoveImage(id); |
299 gpu_control_service_->UnregisterGpuMemoryBuffer(id); | 350 gpu_memory_buffers_.erase(id); |
300 } | 351 } |
301 | 352 |
302 uint32 GLManager::InsertSyncPoint() { | 353 uint32 GLManager::InsertSyncPoint() { |
303 NOTIMPLEMENTED(); | 354 NOTIMPLEMENTED(); |
304 return 0u; | 355 return 0u; |
305 } | 356 } |
306 | 357 |
307 uint32 GLManager::InsertFutureSyncPoint() { | 358 uint32 GLManager::InsertFutureSyncPoint() { |
308 NOTIMPLEMENTED(); | 359 NOTIMPLEMENTED(); |
309 return 0u; | 360 return 0u; |
(...skipping 19 matching lines...) Expand all Loading... | |
329 void GLManager::Echo(const base::Closure& callback) { | 380 void GLManager::Echo(const base::Closure& callback) { |
330 NOTIMPLEMENTED(); | 381 NOTIMPLEMENTED(); |
331 } | 382 } |
332 | 383 |
333 uint32 GLManager::CreateStreamTexture(uint32 texture_id) { | 384 uint32 GLManager::CreateStreamTexture(uint32 texture_id) { |
334 NOTIMPLEMENTED(); | 385 NOTIMPLEMENTED(); |
335 return 0; | 386 return 0; |
336 } | 387 } |
337 | 388 |
338 } // namespace gpu | 389 } // namespace gpu |
OLD | NEW |