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/client/gpu_memory_buffer_impl_ozone_native_buffer.h" 6 7 #include "base/atomic_sequence_num.h" 8 #include "base/bind.h" 9 #include "content/common/gpu/client/gpu_memory_buffer_factory_host.h" 10 #include "ui/gl/gl_bindings.h" 11 12 namespace content { 13 namespace { 14 15 base::StaticAtomicSequenceNumber g_next_buffer_id; 16 17 void Noop() { 18 } 19 20 void GpuMemoryBufferCreated( 21 const gfx::Size& size, 22 unsigned internalformat, 23 const GpuMemoryBufferImpl::CreationCallback& callback, 24 const gfx::GpuMemoryBufferHandle& handle) { 25 DCHECK_EQ(gfx::OZONE_NATIVE_BUFFER, handle.type); 26 27 callback.Run(GpuMemoryBufferImplOzoneNativeBuffer::CreateFromHandle( 28 handle, size, internalformat, base::Bind(&Noop))); 29 } 30 31 void GpuMemoryBufferCreatedForChildProcess( 32 const GpuMemoryBufferImpl::AllocationCallback& callback, 33 const gfx::GpuMemoryBufferHandle& handle) { 34 DCHECK_EQ(gfx::OZONE_NATIVE_BUFFER, handle.type); 35 36 callback.Run(handle); 37 } 38 39 } // namespace 40 41 GpuMemoryBufferImplOzoneNativeBuffer::GpuMemoryBufferImplOzoneNativeBuffer( 42 const gfx::Size& size, 43 unsigned internalformat, 44 const DestructionCallback& callback, 45 const gfx::GpuMemoryBufferId& id) 46 : GpuMemoryBufferImpl(size, internalformat, callback), id_(id) { 47 } 48 49 GpuMemoryBufferImplOzoneNativeBuffer::~GpuMemoryBufferImplOzoneNativeBuffer() { 50 } 51 52 // static 53 void GpuMemoryBufferImplOzoneNativeBuffer::Create( 54 const gfx::Size& size, 55 unsigned internalformat, 56 unsigned usage, 57 int client_id, 58 const CreationCallback& callback) { 59 gfx::GpuMemoryBufferHandle handle; 60 handle.global_id.primary_id = g_next_buffer_id.GetNext(); 61 handle.global_id.secondary_id = client_id; 62 handle.type = gfx::OZONE_NATIVE_BUFFER; 63 GpuMemoryBufferFactoryHost::GetInstance()->CreateGpuMemoryBuffer( 64 handle, 65 size, 66 internalformat, 67 usage, 68 base::Bind(&GpuMemoryBufferCreated, size, internalformat, callback)); 69 } 70 71 // static 72 void GpuMemoryBufferImplOzoneNativeBuffer::AllocateForChildProcess( 73 const gfx::Size& size, 74 unsigned internalformat, 75 unsigned usage, 76 int child_client_id, 77 const AllocationCallback& callback) { 78 gfx::GpuMemoryBufferHandle handle; 79 handle.global_id.primary_id = g_next_buffer_id.GetNext(); 80 handle.global_id.secondary_id = child_client_id; 81 handle.type = gfx::OZONE_NATIVE_BUFFER; 82 GpuMemoryBufferFactoryHost::GetInstance()->CreateGpuMemoryBuffer( 83 handle, 84 size, 85 internalformat, 86 usage, 87 base::Bind(&GpuMemoryBufferCreatedForChildProcess, callback)); 88 } 89 90 // static 91 scoped_ptr<GpuMemoryBufferImpl> 92 GpuMemoryBufferImplOzoneNativeBuffer::CreateFromHandle( 93 const gfx::GpuMemoryBufferHandle& handle, 94 const gfx::Size& size, 95 unsigned internalformat, 96 const DestructionCallback& callback) { 97 DCHECK(IsFormatSupported(internalformat)); 98 99 return make_scoped_ptr<GpuMemoryBufferImpl>( 100 new GpuMemoryBufferImplOzoneNativeBuffer( 101 size, internalformat, callback, handle.global_id)); 102 } 103 104 // static 105 bool GpuMemoryBufferImplOzoneNativeBuffer::IsFormatSupported( 106 unsigned internalformat) { 107 switch (internalformat) { 108 case GL_RGBA8_OES: 109 case GL_RGB8_OES: 110 return true; 111 default: 112 return false; 113 } 114 } 115 116 // static 117 bool GpuMemoryBufferImplOzoneNativeBuffer::IsUsageSupported(unsigned usage) { 118 switch (usage) { 119 case GL_IMAGE_SCANOUT_CHROMIUM: 120 return true; 121 default: 122 return false; 123 } 124 } 125 126 // static 127 bool GpuMemoryBufferImplOzoneNativeBuffer::IsConfigurationSupported( 128 unsigned internalformat, 129 unsigned usage) { 130 return IsFormatSupported(internalformat) && IsUsageSupported(usage); 131 } 132 133 void* GpuMemoryBufferImplOzoneNativeBuffer::Map() { 134 NOTREACHED(); 135 return NULL; 136 } 137 138 void GpuMemoryBufferImplOzoneNativeBuffer::Unmap() { 139 NOTREACHED(); 140 } 141 142 uint32 GpuMemoryBufferImplOzoneNativeBuffer::GetStride() const { 143 NOTREACHED(); 144 return 0; 145 } 146 147 gfx::GpuMemoryBufferHandle GpuMemoryBufferImplOzoneNativeBuffer::GetHandle() 148 const { 149 gfx::GpuMemoryBufferHandle handle; 150 handle.type = gfx::OZONE_NATIVE_BUFFER; 151 handle.global_id = id_; 152 return handle; 153 } 154 155 } // namespace content 156