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