1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "content/common/gpu/gpu_memory_buffer_factory.h" 6 7#include "base/logging.h" 8#include "content/common/gpu/gpu_memory_buffer_factory_x11_pixmap.h" 9#include "ui/gl/gl_image.h" 10#include "ui/gl/gl_image_shared_memory.h" 11 12namespace content { 13namespace { 14 15class GpuMemoryBufferFactoryImpl : public GpuMemoryBufferFactory { 16 public: 17 // Overridden from GpuMemoryBufferFactory: 18 virtual gfx::GpuMemoryBufferHandle CreateGpuMemoryBuffer( 19 const gfx::GpuMemoryBufferHandle& handle, 20 const gfx::Size& size, 21 unsigned internalformat, 22 unsigned usage) OVERRIDE { 23 switch (handle.type) { 24 case gfx::X11_PIXMAP_BUFFER: 25 x11_pixmap_factory_.CreateGpuMemoryBuffer(handle.global_id, 26 handle.pixmap); 27 return handle; 28 default: 29 NOTREACHED(); 30 return gfx::GpuMemoryBufferHandle(); 31 } 32 } 33 virtual void DestroyGpuMemoryBuffer( 34 const gfx::GpuMemoryBufferHandle& handle) OVERRIDE { 35 switch (handle.type) { 36 case gfx::X11_PIXMAP_BUFFER: 37 x11_pixmap_factory_.DestroyGpuMemoryBuffer(handle.global_id); 38 break; 39 default: 40 NOTREACHED(); 41 break; 42 } 43 } 44 virtual scoped_refptr<gfx::GLImage> CreateImageForGpuMemoryBuffer( 45 const gfx::GpuMemoryBufferHandle& handle, 46 const gfx::Size& size, 47 unsigned internalformat, 48 int client_id) OVERRIDE { 49 switch (handle.type) { 50 case gfx::SHARED_MEMORY_BUFFER: { 51 scoped_refptr<gfx::GLImageSharedMemory> image( 52 new gfx::GLImageSharedMemory(size, internalformat)); 53 if (!image->Initialize(handle)) 54 return NULL; 55 56 return image; 57 } 58 case gfx::X11_PIXMAP_BUFFER: 59 // Verify that client is the owner of the buffer we're about to use. 60 if (handle.global_id.secondary_id != client_id) 61 return scoped_refptr<gfx::GLImage>(); 62 63 return x11_pixmap_factory_.CreateImageForGpuMemoryBuffer( 64 handle.global_id, size, internalformat); 65 default: 66 NOTREACHED(); 67 return scoped_refptr<gfx::GLImage>(); 68 } 69 } 70 71 private: 72 GpuMemoryBufferFactoryX11Pixmap x11_pixmap_factory_; 73}; 74 75} // namespace 76 77// static 78scoped_ptr<GpuMemoryBufferFactory> GpuMemoryBufferFactory::Create() { 79 return make_scoped_ptr<GpuMemoryBufferFactory>( 80 new GpuMemoryBufferFactoryImpl); 81} 82 83} // namespace content 84