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"
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "cc/resources/release_callback_impl.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"
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "cc/resources/single_release_callback_impl.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 {
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass BlockingTaskRunner;
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class IdAllocator;
521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class SharedBitmap;
531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class SharedBitmapManager;
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TextureUploader;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class is not thread-safe and can only be called from the thread it was
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// created on (in practice, the impl thread).
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CC_EXPORT ResourceProvider {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef unsigned ResourceId;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::vector<ResourceId> ResourceIdArray;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::set<ResourceId> ResourceIdSet;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::hash_map<ResourceId, ResourceId> ResourceIdMap;
6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  enum TextureHint {
6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    TextureHintDefault = 0x0,
6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    TextureHintImmutable = 0x1,
6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    TextureHintFramebuffer = 0x2,
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    TextureHintImmutableFramebuffer =
6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        TextureHintImmutable | TextureHintFramebuffer
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum ResourceType {
727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    InvalidType = 0,
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLTexture = 1,
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Bitmap,
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  static scoped_ptr<ResourceProvider> Create(
781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      OutputSurface* output_surface,
791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      SharedBitmapManager* shared_bitmap_manager,
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      BlockingTaskRunner* blocking_main_thread_task_runner,
811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      int highp_threshold_min,
820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      bool use_rgba_4444_texture_format,
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      size_t id_allocation_chunk_size,
84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      bool use_distance_field_text);
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~ResourceProvider();
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void InitializeSoftware();
880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void InitializeGL();
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void DidLoseOutputSurface() { lost_output_surface_ = true; }
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int max_texture_size() const { return max_texture_size_; }
93d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ResourceFormat memory_efficient_texture_format() const {
94d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return use_rgba_4444_texture_format_ ? RGBA_4444 : best_texture_format_;
95d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
96d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ResourceFormat best_texture_format() const { return best_texture_format_; }
975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  bool use_sync_query() const { return use_sync_query_; }
98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  size_t num_resources() const { return resources_.size(); }
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Checks whether a resource is in use by a consumer.
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool InUseByConsumer(ResourceId id);
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool IsLost(ResourceId id);
10423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bool AllowOverlay(ResourceId id);
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Producer interface.
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceType default_resource_type() const { return default_resource_type_; }
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceType GetResourceType(ResourceId id);
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates a resource of the default resource type.
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ResourceId CreateResource(const gfx::Size& size,
11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                            GLint wrap_mode,
11403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                            TextureHint hint,
115d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                            ResourceFormat format);
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates a resource which is tagged as being managed for GPU memory
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // accounting purposes.
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ResourceId CreateManagedResource(const gfx::Size& size,
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                   GLenum target,
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                   GLint wrap_mode,
12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                   TextureHint hint,
123d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                   ResourceFormat format);
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // You can also explicitly create a specific resource type.
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ResourceId CreateGLTexture(const gfx::Size& size,
127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                             GLenum target,
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             GLenum texture_pool,
12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                             GLint wrap_mode,
13003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                             TextureHint hint,
131d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                             ResourceFormat format);
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ResourceId CreateBitmap(const gfx::Size& size, GLint wrap_mode);
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Wraps an IOSurface into a GL resource.
135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ResourceId CreateResourceFromIOSurface(const gfx::Size& size,
136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                         unsigned io_surface_id);
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Wraps an external texture mailbox into a GL resource.
139d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ResourceId CreateResourceFromTextureMailbox(
140d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      const TextureMailbox& mailbox,
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      scoped_ptr<SingleReleaseCallbackImpl> release_callback_impl);
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DeleteResource(ResourceId id);
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Update pixels from image, copying source_rect (in image) to dest_offset (in
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the resource).
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetPixels(ResourceId id,
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 const uint8_t* image,
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 const gfx::Rect& image_rect,
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 const gfx::Rect& source_rect,
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 const gfx::Vector2d& dest_offset);
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check upload status.
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t NumBlockingUploads();
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void MarkPendingUploadsAsNonBlocking();
156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  size_t EstimatedUploadsPerTick();
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FlushUploads();
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ReleaseCachedData();
159a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::TimeTicks EstimatedUploadCompletionTime(size_t uploads_per_tick);
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Only flush the command buffer if supported.
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if the shallow flush occurred, false otherwise.
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool ShallowFlushIfSupported();
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates accounting for a child. Returns a child ID.
16668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  int CreateChild(const ReturnCallback& return_callback);
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Destroys accounting for the child, deleting all accounted resources.
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DestroyChild(int child);
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Gets the child->parent resource ID map.
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ResourceIdMap& GetChildToParentMap(int child) const;
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Prepares resources to be transfered to the parent, moving them to
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // mailboxes and serializing meta-data into TransferableResources.
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Resources are not removed from the ResourceProvider, but are marked as
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // "in use".
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void PrepareSendToParent(const ResourceIdArray& resources,
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           TransferableResourceArray* transferable_resources);
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Receives resources from a child, moving them from mailboxes. Resource IDs
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // passed are in the child namespace, and will be translated to the parent
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // namespace, added to the child->parent map.
18468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // This adds the resources to the working set in the ResourceProvider without
18568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // declaring which resources are in use. Use DeclareUsedResourcesFromChild
18668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // after calling this method to do that. All calls to ReceiveFromChild should
18768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // be followed by a DeclareUsedResourcesFromChild.
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // NOTE: if the sync_point is set on any TransferableResource, this will
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // wait on it.
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ReceiveFromChild(
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int child, const TransferableResourceArray& transferable_resources);
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Once a set of resources have been received, they may or may not be used.
19468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // This declares what set of resources are currently in use from the child,
19568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // releasing any other resources back to the child.
19668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void DeclareUsedResourcesFromChild(
19768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      int child,
19868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      const ResourceIdArray& resources_from_child);
19968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Receives resources from the parent, moving them from mailboxes. Resource
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // IDs passed are in the child namespace.
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // NOTE: if the sync_point is set on any TransferableResource, this will
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // wait on it.
2043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void ReceiveReturnsFromParent(
2053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      const ReturnedResourceArray& transferable_resources);
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The following lock classes are part of the ResourceProvider API and are
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // needed to read and write the resource contents. The user must ensure
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // that they only use GL locks on GL resources, etc, and this is enforced
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // by assertions.
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class CC_EXPORT ScopedReadLockGL {
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   public:
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedReadLockGL(ResourceProvider* resource_provider,
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     ResourceProvider::ResourceId resource_id);
215a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    virtual ~ScopedReadLockGL();
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned texture_id() const { return texture_id_; }
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
219a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)   protected:
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ResourceProvider* resource_provider_;
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ResourceProvider::ResourceId resource_id_;
222a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
223a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)   private:
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned texture_id_;
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(ScopedReadLockGL);
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class CC_EXPORT ScopedSamplerGL : public ScopedReadLockGL {
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   public:
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedSamplerGL(ResourceProvider* resource_provider,
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    ResourceProvider::ResourceId resource_id,
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    GLenum filter);
234a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ScopedSamplerGL(ResourceProvider* resource_provider,
235a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                    ResourceProvider::ResourceId resource_id,
236a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                    GLenum unit,
237a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                    GLenum filter);
238a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    virtual ~ScopedSamplerGL();
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    GLenum target() const { return target_; }
241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   private:
243a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    GLenum unit_;
244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    GLenum target_;
245a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(ScopedSamplerGL);
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class CC_EXPORT ScopedWriteLockGL {
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   public:
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedWriteLockGL(ResourceProvider* resource_provider,
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      ResourceProvider::ResourceId resource_id);
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~ScopedWriteLockGL();
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned texture_id() const { return texture_id_; }
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   private:
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ResourceProvider* resource_provider_;
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ResourceProvider::ResourceId resource_id_;
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned texture_id_;
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(ScopedWriteLockGL);
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class CC_EXPORT ScopedReadLockSoftware {
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   public:
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedReadLockSoftware(ResourceProvider* resource_provider,
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           ResourceProvider::ResourceId resource_id);
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~ScopedReadLockSoftware();
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const SkBitmap* sk_bitmap() const {
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DCHECK(valid());
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return &sk_bitmap_;
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    GLint wrap_mode() const { return wrap_mode_; }
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool valid() const { return !!sk_bitmap_.getPixels(); }
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   private:
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ResourceProvider* resource_provider_;
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ResourceProvider::ResourceId resource_id_;
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SkBitmap sk_bitmap_;
283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    GLint wrap_mode_;
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(ScopedReadLockSoftware);
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class CC_EXPORT ScopedWriteLockSoftware {
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   public:
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ScopedWriteLockSoftware(ResourceProvider* resource_provider,
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            ResourceProvider::ResourceId resource_id);
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~ScopedWriteLockSoftware();
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SkCanvas* sk_canvas() { return sk_canvas_.get(); }
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool valid() const { return !!sk_bitmap_.getPixels(); }
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   private:
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ResourceProvider* resource_provider_;
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ResourceProvider::ResourceId resource_id_;
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SkBitmap sk_bitmap_;
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<SkCanvas> sk_canvas_;
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(ScopedWriteLockSoftware);
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class Fence : public base::RefCounted<Fence> {
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   public:
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Fence() {}
3095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    virtual void Set() = 0;
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual bool HasPassed() = 0;
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   protected:
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    friend class base::RefCounted<Fence>;
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual ~Fence() {}
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   private:
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(Fence);
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Acquire pixel buffer for resource. The pixel buffer can be used to
3221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // set resource pixels without performing unnecessary copying.
3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void AcquirePixelBuffer(ResourceId resource);
3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void ReleasePixelBuffer(ResourceId resource);
3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Map/unmap the acquired pixel buffer.
3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  uint8_t* MapPixelBuffer(ResourceId id, int* stride);
3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void UnmapPixelBuffer(ResourceId id);
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Asynchronously update pixels from acquired pixel buffer.
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void BeginSetPixels(ResourceId id);
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ForceSetPixelsToComplete(ResourceId id);
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool DidSetPixelsComplete(ResourceId id);
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Acquire and release an image. The image allows direct
3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // manipulation of texture memory.
3351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void AcquireImage(ResourceId id);
3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void ReleaseImage(ResourceId id);
3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Maps the acquired image so that its pixels could be modified.
3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Unmap is called when all pixels are set.
3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  uint8_t* MapImage(ResourceId id, int* stride);
3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void UnmapImage(ResourceId id);
3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Acquire and release a SkSurface.
3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void AcquireSkSurface(ResourceId id);
3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void ReleaseSkSurface(ResourceId id);
3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Lock/unlock resource for writing to SkSurface.
3461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SkSurface* LockForWriteToSkSurface(ResourceId id);
3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void UnlockForWriteToSkSurface(ResourceId id);
3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
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.
3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void EnableReadLockFences(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:
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct Resource {
3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    enum Origin { Internal, External, Delegated };
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Resource();
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~Resource();
382868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    Resource(unsigned texture_id,
3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             const gfx::Size& size,
3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             Origin origin,
38568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)             GLenum target,
386868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)             GLenum filter,
387868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)             GLenum texture_pool,
38858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)             GLint wrap_mode,
38903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)             TextureHint hint,
390d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)             ResourceFormat format);
39158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    Resource(uint8_t* pixels,
3921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)             SharedBitmap* bitmap,
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             const gfx::Size& size,
3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             Origin origin,
3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             GLenum filter,
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             GLint wrap_mode);
3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Resource(const SharedBitmapId& bitmap_id,
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             const gfx::Size& size,
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             Origin origin,
40058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)             GLenum filter,
40158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)             GLint wrap_mode);
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
40368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    int child_id;
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned gl_id;
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Pixel buffer used for set pixels without unnecessary copying.
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned gl_pixel_buffer_id;
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Query used to determine when asynchronous set pixels complete.
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned gl_upload_query_id;
409a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // Query used to determine when read lock fence has passed.
410a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    unsigned gl_read_lock_query_id;
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TextureMailbox mailbox;
4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ReleaseCallbackImpl release_callback_impl;
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    uint8_t* pixels;
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int lock_for_read_count;
4153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    int imported_count;
4163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    int exported_count;
417effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    bool dirty_image : 1;
418effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    bool locked_for_write : 1;
419effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    bool lost : 1;
420effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    bool marked_for_deletion : 1;
421effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    bool pending_set_pixels : 1;
422effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    bool set_pixels_completion_forced : 1;
423effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    bool allocated : 1;
4245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    bool read_lock_fences_enabled : 1;
425effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    bool has_shared_bitmap_id : 1;
426effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    bool allow_overlay : 1;
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<Fence> read_lock_fence;
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Size size;
429effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    Origin origin;
43068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    GLenum target;
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // TODO(skyostil): Use a separate sampler object for filter state.
432d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    GLenum original_filter;
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLenum filter;
43490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    unsigned image_id;
4358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    unsigned bound_image_id;
436868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    GLenum texture_pool;
43758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    GLint wrap_mode;
43803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    TextureHint hint;
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ResourceType type;
440d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    ResourceFormat format;
4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SharedBitmapId shared_bitmap_id;
4421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    SharedBitmap* shared_bitmap;
4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    skia::RefPtr<SkSurface> sk_surface;
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::hash_map<ResourceId, Resource> ResourceMap;
44668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
44768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  static bool CompareResourceMapIteratorsByChildId(
44868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      const std::pair<ReturnedResource, ResourceMap::iterator>& a,
44968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      const std::pair<ReturnedResource, ResourceMap::iterator>& b);
45068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct Child {
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Child();
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ~Child();
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ResourceIdMap child_to_parent_map;
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ResourceIdMap parent_to_child_map;
45768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ReturnCallback return_callback;
45868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ResourceIdSet in_use_resources;
459f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    bool marked_for_deletion;
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::hash_map<int, Child> ChildMap;
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool ReadLockFenceHasPassed(const Resource* resource) {
464868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return !resource->read_lock_fence.get() ||
465868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)           resource->read_lock_fence->HasPassed();
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
468d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ResourceProvider(OutputSurface* output_surface,
4691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                   SharedBitmapManager* shared_bitmap_manager,
4701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   BlockingTaskRunner* blocking_main_thread_task_runner,
471d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                   int highp_threshold_min,
4720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                   bool use_rgba_4444_texture_format,
473010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   size_t id_allocation_chunk_size,
474010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   bool use_distance_field_text);
4757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
4767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void CleanUpGLIfNeeded();
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  Resource* GetResource(ResourceId id);
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const Resource* LockForRead(ResourceId id);
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UnlockForRead(ResourceId id);
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const Resource* LockForWrite(ResourceId id);
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UnlockForWrite(ResourceId id);
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void PopulateSkBitmapWithResource(SkBitmap* sk_bitmap,
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           const Resource* resource);
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
486a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void TransferResource(gpu::gles2::GLES2Interface* gl,
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        ResourceId id,
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        TransferableResource* resource);
489c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  enum DeleteStyle {
490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Normal,
491c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ForShutdown,
492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void DeleteResourceInternal(ResourceMap::iterator it, DeleteStyle style);
494f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void DeleteAndReturnUnusedResourcesToChild(ChildMap::iterator child_it,
49568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                             DeleteStyle style,
49668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                             const ResourceIdArray& unused);
497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void DestroyChildInternal(ChildMap::iterator it, DeleteStyle style);
498868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void LazyCreate(Resource* resource);
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void LazyAllocate(Resource* resource);
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void BindImageForSampling(Resource* resource);
502a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Binds the given GL resource to a texture target for sampling using the
503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // specified filter for both minification and magnification. Returns the
504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // texture target used. The resource must be locked for reading.
5051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  GLenum BindForSampling(ResourceId resource_id, GLenum unit, GLenum filter);
506a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Returns NULL if the output_surface_ does not have a ContextProvider.
508a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gpu::gles2::GLES2Interface* ContextGL() const;
5095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  class GrContext* GrContext() const;
5100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OutputSurface* output_surface_;
5121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  SharedBitmapManager* shared_bitmap_manager_;
5131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BlockingTaskRunner* blocking_main_thread_task_runner_;
514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool lost_output_surface_;
5157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  int highp_threshold_min_;
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceId next_id_;
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceMap resources_;
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int next_child_;
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ChildMap children_;
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResourceType default_resource_type_;
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool use_texture_storage_ext_;
5231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool use_texture_format_bgra_;
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool use_texture_usage_hint_;
5251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool use_compressed_texture_etc1_;
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<TextureUploader> texture_uploader_;
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int max_texture_size_;
528d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ResourceFormat best_texture_format_;
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ThreadChecker thread_checker_;
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<Fence> current_read_lock_fence_;
533d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool use_rgba_4444_texture_format_;
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
535f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const size_t id_allocation_chunk_size_;
536f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<IdAllocator> texture_id_allocator_;
537f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<IdAllocator> buffer_id_allocator_;
5380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
5390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  bool use_sync_query_;
5400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
541010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool use_distance_field_text_;
542010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ResourceProvider);
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// TODO(epenner): Move these format conversions to resource_format.h
5484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// once that builds on mac (npapi.h currently #includes OpenGL.h).
5491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)inline unsigned BitsPerPixel(ResourceFormat format) {
5504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK_LE(format, RESOURCE_FORMAT_MAX);
5511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  static const unsigned format_bits_per_pixel[RESOURCE_FORMAT_MAX + 1] = {
5521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    32,  // RGBA_8888
5531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    16,  // RGBA_4444
5541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    32,  // BGRA_8888
5556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    8,   // ALPHA_8
5561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    8,   // LUMINANCE_8
5571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    16,  // RGB_565,
5581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    4    // ETC1
5594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  };
5601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return format_bits_per_pixel[format];
5614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
5624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)inline GLenum GLDataType(ResourceFormat format) {
5644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK_LE(format, RESOURCE_FORMAT_MAX);
5654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  static const unsigned format_gl_data_type[RESOURCE_FORMAT_MAX + 1] = {
5664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    GL_UNSIGNED_BYTE,           // RGBA_8888
5674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    GL_UNSIGNED_SHORT_4_4_4_4,  // RGBA_4444
5684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    GL_UNSIGNED_BYTE,           // BGRA_8888
5696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    GL_UNSIGNED_BYTE,           // ALPHA_8
5704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    GL_UNSIGNED_BYTE,           // LUMINANCE_8
5711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    GL_UNSIGNED_SHORT_5_6_5,    // RGB_565,
5721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    GL_UNSIGNED_BYTE            // ETC1
5734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  };
5744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return format_gl_data_type[format];
5754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
5764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)inline GLenum GLDataFormat(ResourceFormat format) {
5784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK_LE(format, RESOURCE_FORMAT_MAX);
5794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  static const unsigned format_gl_data_format[RESOURCE_FORMAT_MAX + 1] = {
5801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    GL_RGBA,           // RGBA_8888
5811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    GL_RGBA,           // RGBA_4444
5821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    GL_BGRA_EXT,       // BGRA_8888
5836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    GL_ALPHA,          // ALPHA_8
5841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    GL_LUMINANCE,      // LUMINANCE_8
5851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    GL_RGB,            // RGB_565
5861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    GL_ETC1_RGB8_OES   // ETC1
5874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  };
5884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return format_gl_data_format[format];
5894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
5904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)inline GLenum GLInternalFormat(ResourceFormat format) {
5924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return GLDataFormat(format);
5934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
5944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace cc
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CC_RESOURCES_RESOURCE_PROVIDER_H_
598