11e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 21e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 31e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// found in the LICENSE file. 41e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#ifndef CONTENT_COMMON_GPU_CLIENT_GPU_MEMORY_BUFFER_IMPL_H_ 61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define CONTENT_COMMON_GPU_CLIENT_GPU_MEMORY_BUFFER_IMPL_H_ 71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/callback.h" 91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/gfx/gpu_memory_buffer.h" 111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/gfx/size.h" 121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace content { 141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Provides common implementation of a GPU memory buffer. 161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class GpuMemoryBufferImpl : public gfx::GpuMemoryBuffer { 171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public: 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef base::Callback<void(scoped_ptr<GpuMemoryBufferImpl> buffer)> 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreationCallback; 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) typedef base::Callback<void(const gfx::GpuMemoryBufferHandle& handle)> 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AllocationCallback; 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef base::Closure DestructionCallback; 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual ~GpuMemoryBufferImpl(); 25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Creates a GPU memory buffer instance with |size| and |internalformat| for 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // |usage| by the current process and |client_id|. 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static void Create(const gfx::Size& size, 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned internalformat, 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned usage, 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int client_id, 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const CreationCallback& callback); 33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Allocates a GPU memory buffer with |size| and |internalformat| for |usage| 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // by |child_process| and |child_client_id|. The |handle| returned can be 3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // used by the |child_process| to create an instance of this class. 37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static void AllocateForChildProcess(const gfx::Size& size, 38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) unsigned internalformat, 39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) unsigned usage, 40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::ProcessHandle child_process, 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int child_client_id, 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const AllocationCallback& callback); 43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Notify that GPU memory buffer has been deleted by |child_process|. 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) static void DeletedByChildProcess(gfx::GpuMemoryBufferType type, 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const gfx::GpuMemoryBufferId& id, 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::ProcessHandle child_process); 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Creates an instance from the given |handle|. |size| and |internalformat| 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // should match what was used to allocate the |handle|. |callback| is 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // called when instance is deleted, which is not necessarily on the same 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // thread as this function was called on and instance was created on. 53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static scoped_ptr<GpuMemoryBufferImpl> CreateFromHandle( 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const gfx::GpuMemoryBufferHandle& handle, 55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const gfx::Size& size, 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned internalformat, 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const DestructionCallback& callback); 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Returns true if |internalformat| is a format recognized by this base class. 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static bool IsFormatValid(unsigned internalformat); 61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Returns true if |usage| is recognized by this base class. 63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static bool IsUsageValid(unsigned usage); 64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Returns the number of bytes per pixel that must be used by an 66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // implementation when using |internalformat|. 67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static size_t BytesPerPixel(unsigned internalformat); 68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Overridden from gfx::GpuMemoryBuffer: 701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual bool IsMapped() const OVERRIDE; 711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) protected: 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GpuMemoryBufferImpl(const gfx::Size& size, 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned internalformat, 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const DestructionCallback& callback); 761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const gfx::Size size_; 78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const unsigned internalformat_; 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const DestructionCallback callback_; 801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool mapped_; 811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(GpuMemoryBufferImpl); 831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}; 841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} // namespace content 861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif // CONTENT_COMMON_GPU_CLIENT_GPU_MEMORY_BUFFER_IMPL_H_ 88