103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// found in the LICENSE file. 403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/common/gpu/client/gpu_memory_buffer_impl_ozone_native_buffer.h" 603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/atomic_sequence_num.h" 803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/bind.h" 903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/common/gpu/client/gpu_memory_buffer_factory_host.h" 1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "ui/gl/gl_bindings.h" 1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace content { 1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace { 1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)base::StaticAtomicSequenceNumber g_next_buffer_id; 1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid Noop() { 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid GpuMemoryBufferCreated( 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const gfx::Size& size, 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned internalformat, 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GpuMemoryBufferImpl::CreationCallback& callback, 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const gfx::GpuMemoryBufferHandle& handle) { 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_EQ(gfx::OZONE_NATIVE_BUFFER, handle.type); 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci callback.Run(GpuMemoryBufferImplOzoneNativeBuffer::CreateFromHandle( 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handle, size, internalformat, base::Bind(&Noop))); 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid GpuMemoryBufferCreatedForChildProcess( 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GpuMemoryBufferImpl::AllocationCallback& callback, 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const gfx::GpuMemoryBufferHandle& handle) { 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_EQ(gfx::OZONE_NATIVE_BUFFER, handle.type); 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci callback.Run(handle); 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} // namespace 4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)GpuMemoryBufferImplOzoneNativeBuffer::GpuMemoryBufferImplOzoneNativeBuffer( 4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const gfx::Size& size, 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned internalformat, 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const DestructionCallback& callback, 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const gfx::GpuMemoryBufferId& id) 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : GpuMemoryBufferImpl(size, internalformat, callback), id_(id) { 4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)GpuMemoryBufferImplOzoneNativeBuffer::~GpuMemoryBufferImplOzoneNativeBuffer() { 5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// static 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid GpuMemoryBufferImplOzoneNativeBuffer::Create( 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const gfx::Size& size, 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned internalformat, 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned usage, 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int client_id, 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const CreationCallback& callback) { 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::GpuMemoryBufferHandle handle; 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handle.global_id.primary_id = g_next_buffer_id.GetNext(); 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handle.global_id.secondary_id = client_id; 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handle.type = gfx::OZONE_NATIVE_BUFFER; 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GpuMemoryBufferFactoryHost::GetInstance()->CreateGpuMemoryBuffer( 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handle, 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size, 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci internalformat, 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci usage, 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&GpuMemoryBufferCreated, size, internalformat, callback)); 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid GpuMemoryBufferImplOzoneNativeBuffer::AllocateForChildProcess( 7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const gfx::Size& size, 7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) unsigned internalformat, 7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) unsigned usage, 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int child_client_id, 7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const AllocationCallback& callback) { 7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) gfx::GpuMemoryBufferHandle handle; 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handle.global_id.primary_id = g_next_buffer_id.GetNext(); 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handle.global_id.secondary_id = child_client_id; 8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) handle.type = gfx::OZONE_NATIVE_BUFFER; 8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) GpuMemoryBufferFactoryHost::GetInstance()->CreateGpuMemoryBuffer( 8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) handle, 8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) size, 8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) internalformat, 8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) usage, 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&GpuMemoryBufferCreatedForChildProcess, callback)); 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_ptr<GpuMemoryBufferImpl> 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciGpuMemoryBufferImplOzoneNativeBuffer::CreateFromHandle( 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const gfx::GpuMemoryBufferHandle& handle, 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const gfx::Size& size, 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned internalformat, 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const DestructionCallback& callback) { 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(IsFormatSupported(internalformat)); 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return make_scoped_ptr<GpuMemoryBufferImpl>( 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new GpuMemoryBufferImplOzoneNativeBuffer( 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size, internalformat, callback, handle.global_id)); 10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 10403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// static 10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool GpuMemoryBufferImplOzoneNativeBuffer::IsFormatSupported( 10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) unsigned internalformat) { 10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) switch (internalformat) { 10803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) case GL_RGBA8_OES: 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case GL_RGB8_OES: 11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return true; 11103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) default: 11203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return false; 11303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 11403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 11603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// static 11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool GpuMemoryBufferImplOzoneNativeBuffer::IsUsageSupported(unsigned usage) { 11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) switch (usage) { 11903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) case GL_IMAGE_SCANOUT_CHROMIUM: 12003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return true; 12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) default: 12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return false; 12303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 12403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 12503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 12603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// static 12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool GpuMemoryBufferImplOzoneNativeBuffer::IsConfigurationSupported( 12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) unsigned internalformat, 12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) unsigned usage) { 13003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return IsFormatSupported(internalformat) && IsUsageSupported(usage); 13103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 13203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 13303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void* GpuMemoryBufferImplOzoneNativeBuffer::Map() { 13403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) NOTREACHED(); 13503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return NULL; 13603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 13703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 13803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void GpuMemoryBufferImplOzoneNativeBuffer::Unmap() { 13903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) NOTREACHED(); 14003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 14103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 14203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)uint32 GpuMemoryBufferImplOzoneNativeBuffer::GetStride() const { 14303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) NOTREACHED(); 14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return 0; 14503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 14603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 14703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)gfx::GpuMemoryBufferHandle GpuMemoryBufferImplOzoneNativeBuffer::GetHandle() 14803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const { 14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) gfx::GpuMemoryBufferHandle handle; 15003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) handle.type = gfx::OZONE_NATIVE_BUFFER; 15103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) handle.global_id = id_; 15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return handle; 15303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 15403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 15503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} // namespace content 156