| 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> | 7 #include <GLES2/gl2.h> |
| 8 #include <GLES2/gl2ext.h> | 8 #include <GLES2/gl2ext.h> |
| 9 #include <GLES2/gl2extchromium.h> |
| 9 | 10 |
| 10 #include <vector> | 11 #include <vector> |
| 11 | 12 |
| 12 #include "base/at_exit.h" | 13 #include "base/at_exit.h" |
| 13 #include "base/bind.h" | 14 #include "base/bind.h" |
| 14 #include "base/memory/ref_counted_memory.h" | 15 #include "base/memory/ref_counted_memory.h" |
| 15 #include "gpu/command_buffer/client/gles2_implementation.h" | 16 #include "gpu/command_buffer/client/gles2_implementation.h" |
| 16 #include "gpu/command_buffer/client/gles2_lib.h" | 17 #include "gpu/command_buffer/client/gles2_lib.h" |
| 17 #include "gpu/command_buffer/client/transfer_buffer.h" | 18 #include "gpu/command_buffer/client/transfer_buffer.h" |
| 18 #include "gpu/command_buffer/common/constants.h" | 19 #include "gpu/command_buffer/common/constants.h" |
| 19 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 20 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
| 20 #include "gpu/command_buffer/service/command_buffer_service.h" | 21 #include "gpu/command_buffer/service/command_buffer_service.h" |
| 21 #include "gpu/command_buffer/service/context_group.h" | 22 #include "gpu/command_buffer/service/context_group.h" |
| 22 #include "gpu/command_buffer/service/gl_context_virtual.h" | 23 #include "gpu/command_buffer/service/gl_context_virtual.h" |
| 23 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 24 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
| 24 #include "gpu/command_buffer/service/gpu_scheduler.h" | 25 #include "gpu/command_buffer/service/gpu_scheduler.h" |
| 25 #include "gpu/command_buffer/service/image_manager.h" | 26 #include "gpu/command_buffer/service/image_manager.h" |
| 26 #include "gpu/command_buffer/service/mailbox_manager.h" | 27 #include "gpu/command_buffer/service/mailbox_manager.h" |
| 27 #include "gpu/command_buffer/service/memory_tracking.h" | 28 #include "gpu/command_buffer/service/memory_tracking.h" |
| 28 #include "testing/gtest/include/gtest/gtest.h" | 29 #include "testing/gtest/include/gtest/gtest.h" |
| 29 #include "ui/gfx/gpu_memory_buffer.h" | 30 #include "ui/gfx/gpu_memory_buffer.h" |
| 30 #include "ui/gl/gl_context.h" | 31 #include "ui/gl/gl_context.h" |
| 31 #include "ui/gl/gl_image_ref_counted_memory.h" | 32 #include "ui/gl/gl_image_ref_counted_memory.h" |
| 32 #include "ui/gl/gl_share_group.h" | 33 #include "ui/gl/gl_share_group.h" |
| 33 #include "ui/gl/gl_surface.h" | 34 #include "ui/gl/gl_surface.h" |
| 34 | 35 |
| 35 namespace gpu { | 36 namespace gpu { |
| 36 namespace { | 37 namespace { |
| 37 | 38 |
| 38 int BytesPerPixel(unsigned internalformat) { | 39 size_t BytesPerPixel(gfx::GpuMemoryBuffer::Format format) { |
| 39 switch (internalformat) { | 40 switch (format) { |
| 40 case GL_RGBA8_OES: | 41 case gfx::GpuMemoryBuffer::RGBA_8888: |
| 42 case gfx::GpuMemoryBuffer::BGRA_8888: |
| 41 return 4; | 43 return 4; |
| 42 default: | 44 case gfx::GpuMemoryBuffer::RGBX_8888: |
| 43 NOTREACHED(); | 45 NOTREACHED(); |
| 44 return 0; | 46 return 0; |
| 45 } | 47 } |
| 48 |
| 49 NOTREACHED(); |
| 50 return 0; |
| 46 } | 51 } |
| 47 | 52 |
| 48 class GpuMemoryBufferImpl : public gfx::GpuMemoryBuffer { | 53 class GpuMemoryBufferImpl : public gfx::GpuMemoryBuffer { |
| 49 public: | 54 public: |
| 50 GpuMemoryBufferImpl(base::RefCountedBytes* bytes, | 55 GpuMemoryBufferImpl(base::RefCountedBytes* bytes, |
| 51 const gfx::Size& size, | 56 const gfx::Size& size, |
| 52 unsigned internalformat) | 57 gfx::GpuMemoryBuffer::Format format) |
| 53 : bytes_(bytes), | 58 : bytes_(bytes), size_(size), format_(format), mapped_(false) {} |
| 54 size_(size), | 59 |
| 55 internalformat_(internalformat), | 60 static GpuMemoryBufferImpl* FromClientBuffer(ClientBuffer buffer) { |
| 56 mapped_(false) {} | 61 return reinterpret_cast<GpuMemoryBufferImpl*>(buffer); |
| 62 } |
| 57 | 63 |
| 58 // Overridden from gfx::GpuMemoryBuffer: | 64 // Overridden from gfx::GpuMemoryBuffer: |
| 59 virtual void* Map() override { | 65 virtual void* Map() override { |
| 60 mapped_ = true; | 66 mapped_ = true; |
| 61 return &bytes_->data().front(); | 67 return &bytes_->data().front(); |
| 62 } | 68 } |
| 63 virtual void Unmap() override { mapped_ = false; } | 69 virtual void Unmap() override { mapped_ = false; } |
| 64 virtual bool IsMapped() const override { return mapped_; } | 70 virtual bool IsMapped() const override { return mapped_; } |
| 71 virtual Format GetFormat() const override { return format_; } |
| 65 virtual uint32 GetStride() const override { | 72 virtual uint32 GetStride() const override { |
| 66 return size_.width() * BytesPerPixel(internalformat_); | 73 return size_.width() * BytesPerPixel(format_); |
| 67 } | 74 } |
| 68 virtual gfx::GpuMemoryBufferHandle GetHandle() const override { | 75 virtual gfx::GpuMemoryBufferHandle GetHandle() const override { |
| 69 NOTREACHED(); | 76 NOTREACHED(); |
| 70 return gfx::GpuMemoryBufferHandle(); | 77 return gfx::GpuMemoryBufferHandle(); |
| 71 } | 78 } |
| 79 virtual ClientBuffer AsClientBuffer() override { |
| 80 return reinterpret_cast<ClientBuffer>(this); |
| 81 } |
| 82 |
| 83 base::RefCountedBytes* bytes() { return bytes_.get(); } |
| 72 | 84 |
| 73 private: | 85 private: |
| 74 scoped_refptr<base::RefCountedBytes> bytes_; | 86 scoped_refptr<base::RefCountedBytes> bytes_; |
| 75 const gfx::Size size_; | 87 const gfx::Size size_; |
| 76 unsigned internalformat_; | 88 gfx::GpuMemoryBuffer::Format format_; |
| 77 bool mapped_; | 89 bool mapped_; |
| 78 }; | 90 }; |
| 79 | 91 |
| 80 } // namespace | 92 } // namespace |
| 81 | 93 |
| 82 int GLManager::use_count_; | 94 int GLManager::use_count_; |
| 83 scoped_refptr<gfx::GLShareGroup>* GLManager::base_share_group_; | 95 scoped_refptr<gfx::GLShareGroup>* GLManager::base_share_group_; |
| 84 scoped_refptr<gfx::GLSurface>* GLManager::base_surface_; | 96 scoped_refptr<gfx::GLSurface>* GLManager::base_surface_; |
| 85 scoped_refptr<gfx::GLContext>* GLManager::base_context_; | 97 scoped_refptr<gfx::GLContext>* GLManager::base_context_; |
| 86 | 98 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 109 delete base_surface_; | 121 delete base_surface_; |
| 110 base_surface_ = NULL; | 122 base_surface_ = NULL; |
| 111 } | 123 } |
| 112 if (base_context_) { | 124 if (base_context_) { |
| 113 delete base_context_; | 125 delete base_context_; |
| 114 base_context_ = NULL; | 126 base_context_ = NULL; |
| 115 } | 127 } |
| 116 } | 128 } |
| 117 } | 129 } |
| 118 | 130 |
| 131 // static |
| 132 scoped_ptr<gfx::GpuMemoryBuffer> GLManager::CreateGpuMemoryBuffer( |
| 133 const gfx::Size& size, |
| 134 gfx::GpuMemoryBuffer::Format format) { |
| 135 std::vector<unsigned char> data(size.GetArea() * BytesPerPixel(format), 0); |
| 136 scoped_refptr<base::RefCountedBytes> bytes(new base::RefCountedBytes(data)); |
| 137 return make_scoped_ptr<gfx::GpuMemoryBuffer>( |
| 138 new GpuMemoryBufferImpl(bytes.get(), size, format)); |
| 139 } |
| 140 |
| 119 void GLManager::Initialize(const GLManager::Options& options) { | 141 void GLManager::Initialize(const GLManager::Options& options) { |
| 120 const int32 kCommandBufferSize = 1024 * 1024; | 142 const int32 kCommandBufferSize = 1024 * 1024; |
| 121 const size_t kStartTransferBufferSize = 4 * 1024 * 1024; | 143 const size_t kStartTransferBufferSize = 4 * 1024 * 1024; |
| 122 const size_t kMinTransferBufferSize = 1 * 256 * 1024; | 144 const size_t kMinTransferBufferSize = 1 * 256 * 1024; |
| 123 const size_t kMaxTransferBufferSize = 16 * 1024 * 1024; | 145 const size_t kMaxTransferBufferSize = 16 * 1024 * 1024; |
| 124 | 146 |
| 125 context_lost_allowed_ = options.context_lost_allowed; | 147 context_lost_allowed_ = options.context_lost_allowed; |
| 126 | 148 |
| 127 gles2::MailboxManager* mailbox_manager = NULL; | 149 gles2::MailboxManager* mailbox_manager = NULL; |
| 128 if (options.share_mailbox_manager) { | 150 if (options.share_mailbox_manager) { |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 308 } | 330 } |
| 309 | 331 |
| 310 bool GLManager::GetBufferChanged(int32 transfer_buffer_id) { | 332 bool GLManager::GetBufferChanged(int32 transfer_buffer_id) { |
| 311 return gpu_scheduler_->SetGetBuffer(transfer_buffer_id); | 333 return gpu_scheduler_->SetGetBuffer(transfer_buffer_id); |
| 312 } | 334 } |
| 313 | 335 |
| 314 Capabilities GLManager::GetCapabilities() { | 336 Capabilities GLManager::GetCapabilities() { |
| 315 return decoder_->GetCapabilities(); | 337 return decoder_->GetCapabilities(); |
| 316 } | 338 } |
| 317 | 339 |
| 318 gfx::GpuMemoryBuffer* GLManager::CreateGpuMemoryBuffer( | 340 int32 GLManager::CreateImage(ClientBuffer buffer, |
| 319 size_t width, | 341 size_t width, |
| 320 size_t height, | 342 size_t height, |
| 321 unsigned internalformat, | 343 unsigned internalformat) { |
| 322 unsigned usage, | 344 GpuMemoryBufferImpl* gpu_memory_buffer = |
| 323 int32* id) { | 345 GpuMemoryBufferImpl::FromClientBuffer(buffer); |
| 324 gfx::Size size(width, height); | |
| 325 | 346 |
| 326 *id = -1; | 347 scoped_refptr<gfx::GLImageRefCountedMemory> image( |
| 327 | 348 new gfx::GLImageRefCountedMemory(gfx::Size(width, height), |
| 328 std::vector<unsigned char> data( | 349 internalformat)); |
| 329 size.GetArea() * BytesPerPixel(internalformat), 0); | 350 if (!image->Initialize(gpu_memory_buffer->bytes(), |
| 330 scoped_refptr<base::RefCountedBytes> bytes(new base::RefCountedBytes(data)); | 351 gpu_memory_buffer->GetFormat())) { |
| 331 scoped_ptr<gfx::GpuMemoryBuffer> buffer( | 352 return -1; |
| 332 new GpuMemoryBufferImpl(bytes.get(), size, internalformat)); | 353 } |
| 333 | 354 |
| 334 static int32 next_id = 1; | 355 static int32 next_id = 1; |
| 335 int32 new_id = next_id++; | 356 int32 new_id = next_id++; |
| 336 | 357 |
| 337 scoped_refptr<gfx::GLImageRefCountedMemory> image( | |
| 338 new gfx::GLImageRefCountedMemory(size, internalformat)); | |
| 339 if (!image->Initialize(bytes.get())) | |
| 340 return NULL; | |
| 341 | |
| 342 gpu::gles2::ImageManager* image_manager = decoder_->GetImageManager(); | 358 gpu::gles2::ImageManager* image_manager = decoder_->GetImageManager(); |
| 343 DCHECK(image_manager); | 359 DCHECK(image_manager); |
| 344 image_manager->AddImage(image.get(), new_id); | 360 image_manager->AddImage(image.get(), new_id); |
| 345 | 361 return new_id; |
| 346 *id = new_id; | |
| 347 DCHECK(gpu_memory_buffers_.find(new_id) == gpu_memory_buffers_.end()); | |
| 348 return gpu_memory_buffers_.add(new_id, buffer.Pass()).first->second; | |
| 349 } | 362 } |
| 350 | 363 |
| 351 void GLManager::DestroyGpuMemoryBuffer(int32 id) { | 364 int32 GLManager::CreateGpuMemoryBufferImage(size_t width, |
| 365 size_t height, |
| 366 unsigned internalformat, |
| 367 unsigned usage) { |
| 368 DCHECK_EQ(usage, static_cast<unsigned>(GL_MAP_CHROMIUM)); |
| 369 scoped_ptr<gfx::GpuMemoryBuffer> buffer = GLManager::CreateGpuMemoryBuffer( |
| 370 gfx::Size(width, height), gfx::GpuMemoryBuffer::RGBA_8888); |
| 371 return CreateImage(buffer->AsClientBuffer(), width, height, internalformat); |
| 372 } |
| 373 |
| 374 void GLManager::DestroyImage(int32 id) { |
| 352 gpu::gles2::ImageManager* image_manager = decoder_->GetImageManager(); | 375 gpu::gles2::ImageManager* image_manager = decoder_->GetImageManager(); |
| 353 DCHECK(image_manager); | 376 DCHECK(image_manager); |
| 354 image_manager->RemoveImage(id); | 377 image_manager->RemoveImage(id); |
| 355 | |
| 356 gpu_memory_buffers_.erase(id); | |
| 357 } | 378 } |
| 358 | 379 |
| 359 uint32 GLManager::InsertSyncPoint() { | 380 uint32 GLManager::InsertSyncPoint() { |
| 360 NOTIMPLEMENTED(); | 381 NOTIMPLEMENTED(); |
| 361 return 0u; | 382 return 0u; |
| 362 } | 383 } |
| 363 | 384 |
| 364 uint32 GLManager::InsertFutureSyncPoint() { | 385 uint32 GLManager::InsertFutureSyncPoint() { |
| 365 NOTIMPLEMENTED(); | 386 NOTIMPLEMENTED(); |
| 366 return 0u; | 387 return 0u; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 382 void GLManager::SetSurfaceVisible(bool visible) { | 403 void GLManager::SetSurfaceVisible(bool visible) { |
| 383 NOTIMPLEMENTED(); | 404 NOTIMPLEMENTED(); |
| 384 } | 405 } |
| 385 | 406 |
| 386 uint32 GLManager::CreateStreamTexture(uint32 texture_id) { | 407 uint32 GLManager::CreateStreamTexture(uint32 texture_id) { |
| 387 NOTIMPLEMENTED(); | 408 NOTIMPLEMENTED(); |
| 388 return 0; | 409 return 0; |
| 389 } | 410 } |
| 390 | 411 |
| 391 } // namespace gpu | 412 } // namespace gpu |
| OLD | NEW |