resource_provider.h revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CC_RESOURCES_RESOURCE_PROVIDER_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CC_RESOURCES_RESOURCE_PROVIDER_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <deque> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <set> 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include <utility> 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector> 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/callback.h" 167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h" 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/linked_ptr.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/threading/thread_checker.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/cc_export.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/context_provider.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/output_surface.h" 23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "cc/resources/release_callback.h" 24d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "cc/resources/resource_format.h" 2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "cc/resources/return_callback.h" 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "cc/resources/shared_bitmap.h" 27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "cc/resources/single_release_callback.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/texture_mailbox.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/transferable_resource.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2.h" 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2ext.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkCanvas.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size.h" 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class GrContext; 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace gpu { 39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace gles { 40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class GLES2Interface; 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace gfx { 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Rect; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Vector2d; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class IdAllocator; 511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class SharedBitmap; 521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class SharedBitmapManager; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TextureUploader; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class is not thread-safe and can only be called from the thread it was 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// created on (in practice, the impl thread). 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CC_EXPORT ResourceProvider { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef unsigned ResourceId; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::vector<ResourceId> ResourceIdArray; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::set<ResourceId> ResourceIdSet; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::hash_map<ResourceId, ResourceId> ResourceIdMap; 6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) enum TextureHint { 6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) TextureHintDefault = 0x0, 6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) TextureHintImmutable = 0x1, 6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) TextureHintFramebuffer = 0x2, 6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) TextureHintImmutableFramebuffer = 6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) TextureHintImmutable | TextureHintFramebuffer 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum ResourceType { 717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch InvalidType = 0, 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLTexture = 1, 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Bitmap, 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) static scoped_ptr<ResourceProvider> Create( 771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) OutputSurface* output_surface, 781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) SharedBitmapManager* shared_bitmap_manager, 791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) int highp_threshold_min, 800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) bool use_rgba_4444_texture_format, 81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) size_t id_allocation_chunk_size, 82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool use_distance_field_text); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ResourceProvider(); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void InitializeSoftware(); 860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void InitializeGL(); 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void DidLoseOutputSurface() { lost_output_surface_ = true; } 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int max_texture_size() const { return max_texture_size_; } 91d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ResourceFormat memory_efficient_texture_format() const { 92d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return use_rgba_4444_texture_format_ ? RGBA_4444 : best_texture_format_; 93d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 94d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ResourceFormat best_texture_format() const { return best_texture_format_; } 955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool use_sync_query() const { return use_sync_query_; } 96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) size_t num_resources() const { return resources_.size(); } 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Checks whether a resource is in use by a consumer. 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool InUseByConsumer(ResourceId id); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool IsLost(ResourceId id); 10223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) bool AllowOverlay(ResourceId id); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Producer interface. 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceType default_resource_type() const { return default_resource_type_; } 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceType GetResourceType(ResourceId id); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Creates a resource of the default resource type. 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResourceId CreateResource(const gfx::Size& size, 11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GLint wrap_mode, 11203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) TextureHint hint, 113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ResourceFormat format); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Creates a resource which is tagged as being managed for GPU memory 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // accounting purposes. 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResourceId CreateManagedResource(const gfx::Size& size, 118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GLenum target, 11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GLint wrap_mode, 12003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) TextureHint hint, 121d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ResourceFormat format); 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // You can also explicitly create a specific resource type. 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResourceId CreateGLTexture(const gfx::Size& size, 125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GLenum target, 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum texture_pool, 12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GLint wrap_mode, 12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) TextureHint hint, 129d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ResourceFormat format); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResourceId CreateBitmap(const gfx::Size& size, GLint wrap_mode); 132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Wraps an IOSurface into a GL resource. 133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ResourceId CreateResourceFromIOSurface(const gfx::Size& size, 134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) unsigned io_surface_id); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Wraps an external texture mailbox into a GL resource. 137d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ResourceId CreateResourceFromTextureMailbox( 138d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const TextureMailbox& mailbox, 139d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<SingleReleaseCallback> release_callback); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DeleteResource(ResourceId id); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Update pixels from image, copying source_rect (in image) to dest_offset (in 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the resource). 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetPixels(ResourceId id, 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const uint8_t* image, 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& image_rect, 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Rect& source_rect, 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Vector2d& dest_offset); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check upload status. 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t NumBlockingUploads(); 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void MarkPendingUploadsAsNonBlocking(); 154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) size_t EstimatedUploadsPerTick(); 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void FlushUploads(); 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ReleaseCachedData(); 157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::TimeTicks EstimatedUploadCompletionTime(size_t uploads_per_tick); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Only flush the command buffer if supported. 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns true if the shallow flush occurred, false otherwise. 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool ShallowFlushIfSupported(); 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Creates accounting for a child. Returns a child ID. 16468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int CreateChild(const ReturnCallback& return_callback); 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Destroys accounting for the child, deleting all accounted resources. 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void DestroyChild(int child); 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Gets the child->parent resource ID map. 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceIdMap& GetChildToParentMap(int child) const; 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Prepares resources to be transfered to the parent, moving them to 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // mailboxes and serializing meta-data into TransferableResources. 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Resources are not removed from the ResourceProvider, but are marked as 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // "in use". 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void PrepareSendToParent(const ResourceIdArray& resources, 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TransferableResourceArray* transferable_resources); 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Receives resources from a child, moving them from mailboxes. Resource IDs 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // passed are in the child namespace, and will be translated to the parent 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // namespace, added to the child->parent map. 18268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // This adds the resources to the working set in the ResourceProvider without 18368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // declaring which resources are in use. Use DeclareUsedResourcesFromChild 18468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // after calling this method to do that. All calls to ReceiveFromChild should 18568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // be followed by a DeclareUsedResourcesFromChild. 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // NOTE: if the sync_point is set on any TransferableResource, this will 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // wait on it. 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ReceiveFromChild( 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int child, const TransferableResourceArray& transferable_resources); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Once a set of resources have been received, they may or may not be used. 19268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // This declares what set of resources are currently in use from the child, 19368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // releasing any other resources back to the child. 19468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void DeclareUsedResourcesFromChild( 19568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int child, 19668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const ResourceIdArray& resources_from_child); 19768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Receives resources from the parent, moving them from mailboxes. Resource 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // IDs passed are in the child namespace. 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // NOTE: if the sync_point is set on any TransferableResource, this will 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // wait on it. 2023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void ReceiveReturnsFromParent( 2033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const ReturnedResourceArray& transferable_resources); 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The following lock classes are part of the ResourceProvider API and are 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // needed to read and write the resource contents. The user must ensure 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // that they only use GL locks on GL resources, etc, and this is enforced 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // by assertions. 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class CC_EXPORT ScopedReadLockGL { 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedReadLockGL(ResourceProvider* resource_provider, 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider::ResourceId resource_id); 213a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual ~ScopedReadLockGL(); 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned texture_id() const { return texture_id_; } 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 217a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) protected: 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider* resource_provider_; 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider::ResourceId resource_id_; 220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private: 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned texture_id_; 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedReadLockGL); 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class CC_EXPORT ScopedSamplerGL : public ScopedReadLockGL { 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedSamplerGL(ResourceProvider* resource_provider, 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider::ResourceId resource_id, 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum filter); 232a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ScopedSamplerGL(ResourceProvider* resource_provider, 233a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ResourceProvider::ResourceId resource_id, 234a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GLenum unit, 235a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GLenum filter); 236a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual ~ScopedSamplerGL(); 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GLenum target() const { return target_; } 239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 241a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GLenum unit_; 242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GLenum target_; 243a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedSamplerGL); 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class CC_EXPORT ScopedWriteLockGL { 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedWriteLockGL(ResourceProvider* resource_provider, 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider::ResourceId resource_id); 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~ScopedWriteLockGL(); 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned texture_id() const { return texture_id_; } 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider* resource_provider_; 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider::ResourceId resource_id_; 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned texture_id_; 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedWriteLockGL); 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class CC_EXPORT ScopedReadLockSoftware { 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedReadLockSoftware(ResourceProvider* resource_provider, 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider::ResourceId resource_id); 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~ScopedReadLockSoftware(); 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const SkBitmap* sk_bitmap() const { 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(valid()); 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return &sk_bitmap_; 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GLint wrap_mode() const { return wrap_mode_; } 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool valid() const { return !!sk_bitmap_.getPixels(); } 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider* resource_provider_; 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider::ResourceId resource_id_; 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkBitmap sk_bitmap_; 281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GLint wrap_mode_; 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedReadLockSoftware); 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class CC_EXPORT ScopedWriteLockSoftware { 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedWriteLockSoftware(ResourceProvider* resource_provider, 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider::ResourceId resource_id); 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~ScopedWriteLockSoftware(); 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkCanvas* sk_canvas() { return sk_canvas_.get(); } 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool valid() const { return !!sk_bitmap_.getPixels(); } 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider* resource_provider_; 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceProvider::ResourceId resource_id_; 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkBitmap sk_bitmap_; 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<SkCanvas> sk_canvas_; 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedWriteLockSoftware); 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class Fence : public base::RefCounted<Fence> { 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Fence() {} 3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void Set() = 0; 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool HasPassed() = 0; 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class base::RefCounted<Fence>; 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~Fence() {} 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 315eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Fence); 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Returns a canvas for gpu rasterization. 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Call Unmap before the resource can be read or used for compositing. 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // It is used for direct gpu rasterization. 322116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SkCanvas* MapGpuRasterBuffer(ResourceId id); 323116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void UnmapGpuRasterBuffer(ResourceId id); 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 325a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Returns a canvas backed by an image buffer. UnmapImageRasterBuffer 326a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // returns true if canvas was written to while mapped. 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Rasterizing to the canvas writes the content into the image buffer, 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // which is internally bound to the underlying resource when read. 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Call Unmap before the resource can be read or used for compositing. 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // It is used by ImageRasterWorkerPool. 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SkCanvas* MapImageRasterBuffer(ResourceId id); 332a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool UnmapImageRasterBuffer(ResourceId id); 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 334a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns a canvas backed by pixel buffer. UnmapPixelRasterBuffer 335a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // returns true if canvas was written to while mapped. 3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The pixel buffer needs to be uploaded to the underlying resource 3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // using BeginSetPixels before the resouce can be used for compositing. 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // It is used by PixelRasterWorkerPool. 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void AcquirePixelRasterBuffer(ResourceId id); 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void ReleasePixelRasterBuffer(ResourceId id); 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SkCanvas* MapPixelRasterBuffer(ResourceId id); 342a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool UnmapPixelRasterBuffer(ResourceId id); 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Asynchronously update pixels from acquired pixel buffer. 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void BeginSetPixels(ResourceId id); 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void ForceSetPixelsToComplete(ResourceId id); 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool DidSetPixelsComplete(ResourceId id); 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For tests only! This prevents detecting uninitialized reads. 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Use SetPixels or LockForWrite to allocate implicitly. 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AllocateForTesting(ResourceId id); 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 353868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // For tests only! 354868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void CreateForTesting(ResourceId id); 355868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GLenum TargetForTesting(ResourceId id); 35758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sets the current read fence. If a resource is locked for read 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and has read fences enabled, the resource will not allow writes 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // until this fence has passed. 3610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch void SetReadLockFence(Fence* fence) { current_read_lock_fence_ = fence; } 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Enable read lock fences for a specific resource. 3645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void EnableReadLockFences(ResourceProvider::ResourceId id); 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Indicates if we can currently lock this resource for write. 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool CanLockForWrite(ResourceId id); 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 369a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Copy pixels from source to destination. 370a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void CopyResource(ResourceId source_id, ResourceId dest_id); 371a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 37203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void WaitSyncPointIfNeeded(ResourceId id); 37303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static GLint GetActiveTextureUnit(gpu::gles2::GLES2Interface* gl); 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 377116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch class GpuRasterBuffer; 3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) class ImageRasterBuffer; 3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) class PixelRasterBuffer; 3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct Resource { 3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) enum Origin { Internal, External, Delegated }; 3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Resource(); 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~Resource(); 386868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Resource(unsigned texture_id, 3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size& size, 3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Origin origin, 38968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GLenum target, 390868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GLenum filter, 391868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GLenum texture_pool, 39258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GLint wrap_mode, 39303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) TextureHint hint, 394d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ResourceFormat format); 39558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Resource(uint8_t* pixels, 3961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) SharedBitmap* bitmap, 3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size& size, 3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Origin origin, 3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLenum filter, 4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GLint wrap_mode); 4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Resource(const SharedBitmapId& bitmap_id, 4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::Size& size, 4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Origin origin, 40458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GLenum filter, 40558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GLint wrap_mode); 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 40768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int child_id; 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned gl_id; 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Pixel buffer used for set pixels without unnecessary copying. 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned gl_pixel_buffer_id; 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Query used to determine when asynchronous set pixels complete. 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned gl_upload_query_id; 413a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Query used to determine when read lock fence has passed. 414a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch unsigned gl_read_lock_query_id; 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TextureMailbox mailbox; 416d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ReleaseCallback release_callback; 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8_t* pixels; 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int lock_for_read_count; 4193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int imported_count; 4203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int exported_count; 421effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool dirty_image : 1; 422effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool locked_for_write : 1; 423effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool lost : 1; 424effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool marked_for_deletion : 1; 425effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool pending_set_pixels : 1; 426effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool set_pixels_completion_forced : 1; 427effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool allocated : 1; 4285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool read_lock_fences_enabled : 1; 429effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool has_shared_bitmap_id : 1; 430effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool allow_overlay : 1; 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Fence> read_lock_fence; 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size size; 433effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Origin origin; 43468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GLenum target; 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(skyostil): Use a separate sampler object for filter state. 436d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) GLenum original_filter; 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GLenum filter; 43890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) unsigned image_id; 4398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) unsigned bound_image_id; 440868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GLenum texture_pool; 44158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GLint wrap_mode; 44203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) TextureHint hint; 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceType type; 444d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ResourceFormat format; 4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SharedBitmapId shared_bitmap_id; 4461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) SharedBitmap* shared_bitmap; 447116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch linked_ptr<GpuRasterBuffer> gpu_raster_buffer; 4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) linked_ptr<ImageRasterBuffer> image_raster_buffer; 4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) linked_ptr<PixelRasterBuffer> pixel_raster_buffer; 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::hash_map<ResourceId, Resource> ResourceMap; 45268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) class RasterBuffer { 4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~RasterBuffer(); 4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SkCanvas* LockForWrite(); 458a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns true if canvas was written to while locked. 459a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool UnlockForWrite(); 4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected: 4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RasterBuffer(const Resource* resource, ResourceProvider* resource_provider); 4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const Resource* resource() const { return resource_; } 4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResourceProvider* resource_provider() const { return resource_provider_; } 4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual SkCanvas* DoLockForWrite() = 0; 467a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool DoUnlockForWrite() = 0; 4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const Resource* resource_; 4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResourceProvider* resource_provider_; 4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SkCanvas* locked_canvas_; 4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int canvas_save_count_; 4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 476116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch class GpuRasterBuffer : public RasterBuffer { 4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 478116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GpuRasterBuffer(const Resource* resource, 479116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ResourceProvider* resource_provider, 480116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool use_distance_field_text); 481116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual ~GpuRasterBuffer(); 4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected: 4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual SkCanvas* DoLockForWrite() OVERRIDE; 485a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool DoUnlockForWrite() OVERRIDE; 4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) skia::RefPtr<SkSurface> CreateSurface(); 4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) skia::RefPtr<SkSurface> surface_; 490a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) uint32_t surface_generation_id_; 491010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const bool use_distance_field_text_; 492a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 493116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DISALLOW_COPY_AND_ASSIGN(GpuRasterBuffer); 4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) class BitmapRasterBuffer : public RasterBuffer { 4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~BitmapRasterBuffer(); 4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected: 5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BitmapRasterBuffer(const Resource* resource, 5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResourceProvider* resource_provider); 5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual SkCanvas* DoLockForWrite() OVERRIDE; 505a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual bool DoUnlockForWrite() OVERRIDE; 5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual uint8_t* MapBuffer(int* stride) = 0; 5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void UnmapBuffer() = 0; 5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint8_t* mapped_buffer_; 5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SkBitmap raster_bitmap_; 513a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) uint32_t raster_bitmap_generation_id_; 5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) skia::RefPtr<SkCanvas> raster_canvas_; 5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) class ImageRasterBuffer : public BitmapRasterBuffer { 5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ImageRasterBuffer(const Resource* resource, 5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResourceProvider* resource_provider); 5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~ImageRasterBuffer(); 5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected: 5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual uint8_t* MapBuffer(int* stride) OVERRIDE; 5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void UnmapBuffer() OVERRIDE; 5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ImageRasterBuffer); 5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) class PixelRasterBuffer : public BitmapRasterBuffer { 5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 5335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PixelRasterBuffer(const Resource* resource, 5345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResourceProvider* resource_provider); 5355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~PixelRasterBuffer(); 5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected: 5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual uint8_t* MapBuffer(int* stride) OVERRIDE; 5395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void UnmapBuffer() OVERRIDE; 5405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 5425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PixelRasterBuffer); 5435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 54568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) static bool CompareResourceMapIteratorsByChildId( 54668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const std::pair<ReturnedResource, ResourceMap::iterator>& a, 54768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const std::pair<ReturnedResource, ResourceMap::iterator>& b); 54868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct Child { 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Child(); 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~Child(); 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceIdMap child_to_parent_map; 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceIdMap parent_to_child_map; 55568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ReturnCallback return_callback; 55668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ResourceIdSet in_use_resources; 557f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool marked_for_deletion; 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::hash_map<int, Child> ChildMap; 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool ReadLockFenceHasPassed(const Resource* resource) { 562868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return !resource->read_lock_fence.get() || 563868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) resource->read_lock_fence->HasPassed(); 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 566d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ResourceProvider(OutputSurface* output_surface, 5671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) SharedBitmapManager* shared_bitmap_manager, 568d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int highp_threshold_min, 5690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) bool use_rgba_4444_texture_format, 570010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) size_t id_allocation_chunk_size, 571010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool use_distance_field_text); 5727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void CleanUpGLIfNeeded(); 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Resource* GetResource(ResourceId id); 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Resource* LockForRead(ResourceId id); 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UnlockForRead(ResourceId id); 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Resource* LockForWrite(ResourceId id); 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UnlockForWrite(ResourceId id); 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static void PopulateSkBitmapWithResource(SkBitmap* sk_bitmap, 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Resource* resource); 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 583a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void TransferResource(gpu::gles2::GLES2Interface* gl, 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceId id, 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TransferableResource* resource); 586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enum DeleteStyle { 587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Normal, 588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ForShutdown, 589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void DeleteResourceInternal(ResourceMap::iterator it, DeleteStyle style); 591f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void DeleteAndReturnUnusedResourcesToChild(ChildMap::iterator child_it, 59268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DeleteStyle style, 59368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const ResourceIdArray& unused); 594f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void DestroyChildInternal(ChildMap::iterator it, DeleteStyle style); 595868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void LazyCreate(Resource* resource); 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void LazyAllocate(Resource* resource); 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(alokp): Move the implementation to PixelRasterBuffer. 5995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Acquire pixel buffer for resource. The pixel buffer can be used to 6005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // set resource pixels without performing unnecessary copying. 6015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void AcquirePixelBuffer(Resource* resource); 6025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void ReleasePixelBuffer(Resource* resource); 6035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Map/unmap the acquired pixel buffer. 6045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint8_t* MapPixelBuffer(const Resource* resource, int* stride); 6055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void UnmapPixelBuffer(const Resource* resource); 6065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(alokp): Move the implementation to ImageRasterBuffer. 6085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Acquire and release an image. The image allows direct 6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // manipulation of texture memory. 6105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void AcquireImage(Resource* resource); 6115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void ReleaseImage(Resource* resource); 6125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Maps the acquired image so that its pixels could be modified. 6135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Unmap is called when all pixels are set. 6145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint8_t* MapImage(const Resource* resource, int* stride); 6155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void UnmapImage(const Resource* resource); 6165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 6175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void BindImageForSampling(Resource* resource); 618a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Binds the given GL resource to a texture target for sampling using the 619f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // specified filter for both minification and magnification. Returns the 620f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // texture target used. The resource must be locked for reading. 621f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GLenum BindForSampling(ResourceProvider::ResourceId resource_id, 622f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GLenum unit, 623f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GLenum filter); 624a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 6253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Returns NULL if the output_surface_ does not have a ContextProvider. 626a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gpu::gles2::GLES2Interface* ContextGL() const; 6275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) class GrContext* GrContext() const; 6280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OutputSurface* output_surface_; 6301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) SharedBitmapManager* shared_bitmap_manager_; 631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool lost_output_surface_; 6327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int highp_threshold_min_; 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceId next_id_; 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceMap resources_; 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int next_child_; 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChildMap children_; 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceType default_resource_type_; 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool use_texture_storage_ext_; 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool use_texture_usage_hint_; 6411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool use_compressed_texture_etc1_; 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TextureUploader> texture_uploader_; 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int max_texture_size_; 644d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ResourceFormat best_texture_format_; 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ThreadChecker thread_checker_; 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Fence> current_read_lock_fence_; 649d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool use_rgba_4444_texture_format_; 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 651f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const size_t id_allocation_chunk_size_; 652f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<IdAllocator> texture_id_allocator_; 653f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<IdAllocator> buffer_id_allocator_; 6540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 6550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool use_sync_query_; 6560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 657010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) bool use_distance_field_text_; 658010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ResourceProvider); 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// TODO(epenner): Move these format conversions to resource_format.h 6644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// once that builds on mac (npapi.h currently #includes OpenGL.h). 6651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)inline unsigned BitsPerPixel(ResourceFormat format) { 6664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK_LE(format, RESOURCE_FORMAT_MAX); 6671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) static const unsigned format_bits_per_pixel[RESOURCE_FORMAT_MAX + 1] = { 6681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 32, // RGBA_8888 6691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 16, // RGBA_4444 6701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 32, // BGRA_8888 6716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 8, // ALPHA_8 6721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 8, // LUMINANCE_8 6731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 16, // RGB_565, 6741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 4 // ETC1 6754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) }; 6761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return format_bits_per_pixel[format]; 6774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 6784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)inline GLenum GLDataType(ResourceFormat format) { 6804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK_LE(format, RESOURCE_FORMAT_MAX); 6814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) static const unsigned format_gl_data_type[RESOURCE_FORMAT_MAX + 1] = { 6824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GL_UNSIGNED_BYTE, // RGBA_8888 6834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GL_UNSIGNED_SHORT_4_4_4_4, // RGBA_4444 6844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GL_UNSIGNED_BYTE, // BGRA_8888 6856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) GL_UNSIGNED_BYTE, // ALPHA_8 6864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GL_UNSIGNED_BYTE, // LUMINANCE_8 6871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) GL_UNSIGNED_SHORT_5_6_5, // RGB_565, 6881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) GL_UNSIGNED_BYTE // ETC1 6894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) }; 6904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return format_gl_data_type[format]; 6914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 6924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)inline GLenum GLDataFormat(ResourceFormat format) { 6944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK_LE(format, RESOURCE_FORMAT_MAX); 6954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) static const unsigned format_gl_data_format[RESOURCE_FORMAT_MAX + 1] = { 6961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) GL_RGBA, // RGBA_8888 6971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) GL_RGBA, // RGBA_4444 6981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) GL_BGRA_EXT, // BGRA_8888 6996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) GL_ALPHA, // ALPHA_8 7001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) GL_LUMINANCE, // LUMINANCE_8 7011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) GL_RGB, // RGB_565 7021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) GL_ETC1_RGB8_OES // ETC1 7034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) }; 7044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return format_gl_data_format[format]; 7054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 7064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)inline GLenum GLInternalFormat(ResourceFormat format) { 7084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return GLDataFormat(format); 7094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 7104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace cc 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CC_RESOURCES_RESOURCE_PROVIDER_H_ 714