Chromium Code Reviews| Index: gpu/command_buffer/tests/gl_manager.cc |
| diff --git a/gpu/command_buffer/tests/gl_manager.cc b/gpu/command_buffer/tests/gl_manager.cc |
| index 6e4cc59527b671688804a4eacaf6f76c6e2528dd..95778c9cb47fde802cd155e5cffd2260d664cda7 100644 |
| --- a/gpu/command_buffer/tests/gl_manager.cc |
| +++ b/gpu/command_buffer/tests/gl_manager.cc |
| @@ -15,6 +15,7 @@ |
| #include "base/at_exit.h" |
| #include "base/bind.h" |
| #include "base/memory/ref_counted_memory.h" |
| +#include "build/build_config.h" |
| #include "gpu/command_buffer/client/gles2_cmd_helper.h" |
| #include "gpu/command_buffer/client/gles2_implementation.h" |
| #include "gpu/command_buffer/client/gles2_lib.h" |
| @@ -42,6 +43,11 @@ |
| #include "ui/gl/gl_share_group.h" |
| #include "ui/gl/gl_surface.h" |
| +#if defined(OS_MACOSX) |
| +#include "ui/gfx/mac/io_surface.h" |
| +#include "ui/gl/gl_image_io_surface.h" |
| +#endif |
| + |
| namespace gpu { |
| namespace { |
| @@ -101,6 +107,65 @@ class GpuMemoryBufferImpl : public gfx::GpuMemoryBuffer { |
| gfx::BufferFormat format_; |
| }; |
| +#if defined(OS_MACOSX) |
| +class IOSurfaceGpuMemoryBuffer : public gfx::GpuMemoryBuffer { |
|
Ken Russell (switch to Gerrit)
2016/03/16 01:21:49
Is this new code path tested?
erikchen
2016/03/16 01:27:25
I'm not sure what you mean? If you're referring to
Ken Russell (switch to Gerrit)
2016/03/16 01:30:54
Sorry for the stupid question, but I didn't realiz
|
| + public: |
| + IOSurfaceGpuMemoryBuffer(const gfx::Size& size, gfx::BufferFormat format) |
| + : mapped_(false), size_(size), format_(format) { |
| + iosurface_ = gfx::CreateIOSurface(size, gfx::BufferFormat::BGRA_8888); |
| + } |
| + |
| + ~IOSurfaceGpuMemoryBuffer() override { |
| + CFRelease(iosurface_); |
| + } |
| + |
| + static IOSurfaceGpuMemoryBuffer* FromClientBuffer(ClientBuffer buffer) { |
| + return reinterpret_cast<IOSurfaceGpuMemoryBuffer*>(buffer); |
| + } |
| + |
| + // Overridden from gfx::GpuMemoryBuffer: |
| + bool Map() override { |
| + DCHECK(!mapped_); |
| + mapped_ = true; |
| + return true; |
| + } |
| + void* memory(size_t plane) override { |
| + DCHECK(mapped_); |
| + DCHECK_LT(plane, gfx::NumberOfPlanesForBufferFormat(format_)); |
| + return IOSurfaceGetBaseAddressOfPlane(iosurface_, plane); |
| + } |
| + void Unmap() override { |
| + DCHECK(mapped_); |
| + mapped_ = false; |
| + } |
| + gfx::Size GetSize() const override { return size_; } |
| + gfx::BufferFormat GetFormat() const override { return format_; } |
| + int stride(size_t plane) const override { |
| + DCHECK_LT(plane, gfx::NumberOfPlanesForBufferFormat(format_)); |
| + return IOSurfaceGetWidthOfPlane(iosurface_, plane); |
| + } |
| + gfx::GpuMemoryBufferId GetId() const override { |
| + NOTREACHED(); |
| + return gfx::GpuMemoryBufferId(0); |
| + } |
| + gfx::GpuMemoryBufferHandle GetHandle() const override { |
| + NOTREACHED(); |
| + return gfx::GpuMemoryBufferHandle(); |
| + } |
| + ClientBuffer AsClientBuffer() override { |
| + return reinterpret_cast<ClientBuffer>(this); |
| + } |
| + |
| + IOSurfaceRef iosurface() { return iosurface_; } |
| + |
| + private: |
| + bool mapped_; |
| + IOSurfaceRef iosurface_; |
| + const gfx::Size size_; |
| + gfx::BufferFormat format_; |
| +}; |
| +#endif // defined(OS_MACOSX) |
| + |
| } // namespace |
| int GLManager::use_count_; |
| @@ -149,10 +214,15 @@ GLManager::~GLManager() { |
| } |
| } |
| -// static |
| scoped_ptr<gfx::GpuMemoryBuffer> GLManager::CreateGpuMemoryBuffer( |
| const gfx::Size& size, |
| gfx::BufferFormat format) { |
| +#if defined(OS_MACOSX) |
| + if (use_iosurface_memory_buffers_) { |
| + return make_scoped_ptr<gfx::GpuMemoryBuffer>( |
| + new IOSurfaceGpuMemoryBuffer(size, format)); |
| + } |
| +#endif // defined(OS_MACOSX) |
| std::vector<uint8_t> data(gfx::BufferSizeForBufferFormat(size, format), 0); |
| scoped_refptr<base::RefCountedBytes> bytes(new base::RefCountedBytes(data)); |
| return make_scoped_ptr<gfx::GpuMemoryBuffer>( |
| @@ -449,23 +519,41 @@ int32_t GLManager::CreateImage(ClientBuffer buffer, |
| size_t width, |
| size_t height, |
| unsigned internalformat) { |
| - GpuMemoryBufferImpl* gpu_memory_buffer = |
| - GpuMemoryBufferImpl::FromClientBuffer(buffer); |
| - |
| - scoped_refptr<gl::GLImageRefCountedMemory> image( |
| - new gl::GLImageRefCountedMemory(gfx::Size(width, height), |
| - internalformat)); |
| - if (!image->Initialize(gpu_memory_buffer->bytes(), |
| - gpu_memory_buffer->GetFormat())) { |
| - return -1; |
| + gfx::Size size(width, height); |
| + scoped_refptr<gl::GLImage> gl_image; |
| + |
| +#if defined(OS_MACOSX) |
| + if (use_iosurface_memory_buffers_) { |
| + IOSurfaceGpuMemoryBuffer* gpu_memory_buffer = |
| + IOSurfaceGpuMemoryBuffer::FromClientBuffer(buffer); |
| + scoped_refptr<gl::GLImageIOSurface> image( |
| + new gl::GLImageIOSurface(size, internalformat)); |
| + if (!image->Initialize(gpu_memory_buffer->iosurface(), |
| + gfx::GenericSharedMemoryId(1), |
| + gfx::BufferFormat::BGRA_8888)) { |
| + return -1; |
| + } |
| + gl_image = image; |
| + } |
| +#endif // defined(OS_MACOSX) |
| + if (!gl_image) { |
| + GpuMemoryBufferImpl* gpu_memory_buffer = |
| + GpuMemoryBufferImpl::FromClientBuffer(buffer); |
| + |
| + scoped_refptr<gl::GLImageRefCountedMemory> image( |
| + new gl::GLImageRefCountedMemory(size, internalformat)); |
| + if (!image->Initialize(gpu_memory_buffer->bytes(), |
| + gpu_memory_buffer->GetFormat())) { |
| + return -1; |
| + } |
| + gl_image = image; |
| } |
| static int32_t next_id = 1; |
| int32_t new_id = next_id++; |
| - |
| gpu::gles2::ImageManager* image_manager = decoder_->GetImageManager(); |
| DCHECK(image_manager); |
| - image_manager->AddImage(image.get(), new_id); |
| + image_manager->AddImage(gl_image.get(), new_id); |
| return new_id; |
| } |
| @@ -474,7 +562,7 @@ int32_t GLManager::CreateGpuMemoryBufferImage(size_t width, |
| unsigned internalformat, |
| unsigned usage) { |
| DCHECK_EQ(usage, static_cast<unsigned>(GL_READ_WRITE_CHROMIUM)); |
| - scoped_ptr<gfx::GpuMemoryBuffer> buffer = GLManager::CreateGpuMemoryBuffer( |
| + scoped_ptr<gfx::GpuMemoryBuffer> buffer = CreateGpuMemoryBuffer( |
| gfx::Size(width, height), gfx::BufferFormat::RGBA_8888); |
| return CreateImage(buffer->AsClientBuffer(), width, height, internalformat); |
| } |