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