| OLD | NEW |
| (Empty) |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef CC_RESOURCES_RESOURCE_PROVIDER_H_ | |
| 6 #define CC_RESOURCES_RESOURCE_PROVIDER_H_ | |
| 7 | |
| 8 #include <deque> | |
| 9 #include <set> | |
| 10 #include <string> | |
| 11 #include <utility> | |
| 12 #include <vector> | |
| 13 | |
| 14 #include "base/basictypes.h" | |
| 15 #include "base/callback.h" | |
| 16 #include "base/containers/hash_tables.h" | |
| 17 #include "base/memory/linked_ptr.h" | |
| 18 #include "base/memory/scoped_ptr.h" | |
| 19 #include "base/threading/thread_checker.h" | |
| 20 #include "cc/output/context_provider.h" | |
| 21 #include "cc/output/output_surface.h" | |
| 22 #include "cc/resources/release_callback_impl.h" | |
| 23 #include "cc/resources/resource_format.h" | |
| 24 #include "cc/resources/return_callback.h" | |
| 25 #include "cc/resources/shared_bitmap.h" | |
| 26 #include "cc/resources/single_release_callback_impl.h" | |
| 27 #include "cc/resources/texture_mailbox.h" | |
| 28 #include "cc/resources/transferable_resource.h" | |
| 29 #include "third_party/khronos/GLES2/gl2.h" | |
| 30 #include "third_party/khronos/GLES2/gl2ext.h" | |
| 31 #include "third_party/skia/include/core/SkBitmap.h" | |
| 32 #include "third_party/skia/include/core/SkCanvas.h" | |
| 33 #include "ui/gfx/geometry/size.h" | |
| 34 | |
| 35 class GrContext; | |
| 36 | |
| 37 namespace gpu { | |
| 38 class GpuMemoryBufferManager; | |
| 39 namespace gles { | |
| 40 class GLES2Interface; | |
| 41 } | |
| 42 } | |
| 43 | |
| 44 namespace gfx { | |
| 45 class GpuMemoryBuffer; | |
| 46 class Rect; | |
| 47 class Vector2d; | |
| 48 } | |
| 49 | |
| 50 namespace cc { | |
| 51 class BlockingTaskRunner; | |
| 52 class IdAllocator; | |
| 53 class SharedBitmap; | |
| 54 class SharedBitmapManager; | |
| 55 class TextureUploader; | |
| 56 | |
| 57 // This class is not thread-safe and can only be called from the thread it was | |
| 58 // created on (in practice, the impl thread). | |
| 59 class ResourceProvider { | |
| 60 private: | |
| 61 struct Resource; | |
| 62 | |
| 63 public: | |
| 64 typedef unsigned ResourceId; | |
| 65 typedef std::vector<ResourceId> ResourceIdArray; | |
| 66 typedef std::set<ResourceId> ResourceIdSet; | |
| 67 typedef base::hash_map<ResourceId, ResourceId> ResourceIdMap; | |
| 68 enum TextureHint { | |
| 69 TEXTURE_HINT_DEFAULT = 0x0, | |
| 70 TEXTURE_HINT_IMMUTABLE = 0x1, | |
| 71 TEXTURE_HINT_FRAMEBUFFER = 0x2, | |
| 72 TEXTURE_HINT_IMMUTABLE_FRAMEBUFFER = | |
| 73 TEXTURE_HINT_IMMUTABLE | TEXTURE_HINT_FRAMEBUFFER | |
| 74 }; | |
| 75 enum ResourceType { | |
| 76 RESOURCE_TYPE_INVALID = 0, | |
| 77 RESOURCE_TYPE_GL_TEXTURE = 1, | |
| 78 RESOURCE_TYPE_BITMAP, | |
| 79 }; | |
| 80 | |
| 81 static scoped_ptr<ResourceProvider> Create( | |
| 82 OutputSurface* output_surface, | |
| 83 SharedBitmapManager* shared_bitmap_manager, | |
| 84 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, | |
| 85 BlockingTaskRunner* blocking_main_thread_task_runner, | |
| 86 int highp_threshold_min, | |
| 87 bool use_rgba_4444_texture_format, | |
| 88 size_t id_allocation_chunk_size); | |
| 89 virtual ~ResourceProvider(); | |
| 90 | |
| 91 void InitializeSoftware(); | |
| 92 void InitializeGL(); | |
| 93 | |
| 94 void DidLoseOutputSurface() { lost_output_surface_ = true; } | |
| 95 | |
| 96 int max_texture_size() const { return max_texture_size_; } | |
| 97 ResourceFormat memory_efficient_texture_format() const { | |
| 98 return use_rgba_4444_texture_format_ ? RGBA_4444 : best_texture_format_; | |
| 99 } | |
| 100 ResourceFormat best_texture_format() const { return best_texture_format_; } | |
| 101 ResourceFormat yuv_resource_format() const { return yuv_resource_format_; } | |
| 102 bool use_sync_query() const { return use_sync_query_; } | |
| 103 size_t num_resources() const { return resources_.size(); } | |
| 104 | |
| 105 // Checks whether a resource is in use by a consumer. | |
| 106 bool InUseByConsumer(ResourceId id); | |
| 107 | |
| 108 bool IsLost(ResourceId id); | |
| 109 bool AllowOverlay(ResourceId id); | |
| 110 | |
| 111 // Producer interface. | |
| 112 | |
| 113 ResourceType default_resource_type() const { return default_resource_type_; } | |
| 114 ResourceType GetResourceType(ResourceId id); | |
| 115 | |
| 116 // Creates a resource of the default resource type. | |
| 117 ResourceId CreateResource(const gfx::Size& size, | |
| 118 GLint wrap_mode, | |
| 119 TextureHint hint, | |
| 120 ResourceFormat format); | |
| 121 | |
| 122 // Creates a resource which is tagged as being managed for GPU memory | |
| 123 // accounting purposes. | |
| 124 ResourceId CreateManagedResource(const gfx::Size& size, | |
| 125 GLenum target, | |
| 126 GLint wrap_mode, | |
| 127 TextureHint hint, | |
| 128 ResourceFormat format); | |
| 129 | |
| 130 // You can also explicitly create a specific resource type. | |
| 131 ResourceId CreateGLTexture(const gfx::Size& size, | |
| 132 GLenum target, | |
| 133 GLenum texture_pool, | |
| 134 GLint wrap_mode, | |
| 135 TextureHint hint, | |
| 136 ResourceFormat format); | |
| 137 | |
| 138 ResourceId CreateBitmap(const gfx::Size& size, GLint wrap_mode); | |
| 139 // Wraps an IOSurface into a GL resource. | |
| 140 ResourceId CreateResourceFromIOSurface(const gfx::Size& size, | |
| 141 unsigned io_surface_id); | |
| 142 | |
| 143 // Wraps an external texture mailbox into a GL resource. | |
| 144 ResourceId CreateResourceFromTextureMailbox( | |
| 145 const TextureMailbox& mailbox, | |
| 146 scoped_ptr<SingleReleaseCallbackImpl> release_callback_impl); | |
| 147 | |
| 148 void DeleteResource(ResourceId id); | |
| 149 | |
| 150 // Update pixels from image, copying source_rect (in image) to dest_offset (in | |
| 151 // the resource). | |
| 152 // NOTE: DEPRECATED. Use CopyToResource() instead. | |
| 153 void SetPixels(ResourceId id, | |
| 154 const uint8_t* image, | |
| 155 const gfx::Rect& image_rect, | |
| 156 const gfx::Rect& source_rect, | |
| 157 const gfx::Vector2d& dest_offset); | |
| 158 void CopyToResource(ResourceId id, | |
| 159 const uint8_t* image, | |
| 160 const gfx::Size& image_size); | |
| 161 | |
| 162 // Check upload status. | |
| 163 size_t NumBlockingUploads(); | |
| 164 void MarkPendingUploadsAsNonBlocking(); | |
| 165 size_t EstimatedUploadsPerTick(); | |
| 166 void FlushUploads(); | |
| 167 void ReleaseCachedData(); | |
| 168 base::TimeTicks EstimatedUploadCompletionTime(size_t uploads_per_tick); | |
| 169 | |
| 170 // Only flush the command buffer if supported. | |
| 171 // Returns true if the shallow flush occurred, false otherwise. | |
| 172 bool ShallowFlushIfSupported(); | |
| 173 | |
| 174 // Creates accounting for a child. Returns a child ID. | |
| 175 int CreateChild(const ReturnCallback& return_callback); | |
| 176 | |
| 177 // Destroys accounting for the child, deleting all accounted resources. | |
| 178 void DestroyChild(int child); | |
| 179 | |
| 180 // Gets the child->parent resource ID map. | |
| 181 const ResourceIdMap& GetChildToParentMap(int child) const; | |
| 182 | |
| 183 // Prepares resources to be transfered to the parent, moving them to | |
| 184 // mailboxes and serializing meta-data into TransferableResources. | |
| 185 // Resources are not removed from the ResourceProvider, but are marked as | |
| 186 // "in use". | |
| 187 void PrepareSendToParent(const ResourceIdArray& resources, | |
| 188 TransferableResourceArray* transferable_resources); | |
| 189 | |
| 190 // Receives resources from a child, moving them from mailboxes. Resource IDs | |
| 191 // passed are in the child namespace, and will be translated to the parent | |
| 192 // namespace, added to the child->parent map. | |
| 193 // This adds the resources to the working set in the ResourceProvider without | |
| 194 // declaring which resources are in use. Use DeclareUsedResourcesFromChild | |
| 195 // after calling this method to do that. All calls to ReceiveFromChild should | |
| 196 // be followed by a DeclareUsedResourcesFromChild. | |
| 197 // NOTE: if the sync_point is set on any TransferableResource, this will | |
| 198 // wait on it. | |
| 199 void ReceiveFromChild( | |
| 200 int child, const TransferableResourceArray& transferable_resources); | |
| 201 | |
| 202 // Once a set of resources have been received, they may or may not be used. | |
| 203 // This declares what set of resources are currently in use from the child, | |
| 204 // releasing any other resources back to the child. | |
| 205 void DeclareUsedResourcesFromChild( | |
| 206 int child, | |
| 207 const ResourceIdArray& resources_from_child); | |
| 208 | |
| 209 // Receives resources from the parent, moving them from mailboxes. Resource | |
| 210 // IDs passed are in the child namespace. | |
| 211 // NOTE: if the sync_point is set on any TransferableResource, this will | |
| 212 // wait on it. | |
| 213 void ReceiveReturnsFromParent( | |
| 214 const ReturnedResourceArray& transferable_resources); | |
| 215 | |
| 216 // The following lock classes are part of the ResourceProvider API and are | |
| 217 // needed to read and write the resource contents. The user must ensure | |
| 218 // that they only use GL locks on GL resources, etc, and this is enforced | |
| 219 // by assertions. | |
| 220 class ScopedReadLockGL { | |
| 221 public: | |
| 222 ScopedReadLockGL(ResourceProvider* resource_provider, | |
| 223 ResourceProvider::ResourceId resource_id); | |
| 224 virtual ~ScopedReadLockGL(); | |
| 225 | |
| 226 unsigned texture_id() const { return texture_id_; } | |
| 227 | |
| 228 protected: | |
| 229 ResourceProvider* resource_provider_; | |
| 230 ResourceProvider::ResourceId resource_id_; | |
| 231 | |
| 232 private: | |
| 233 unsigned texture_id_; | |
| 234 | |
| 235 DISALLOW_COPY_AND_ASSIGN(ScopedReadLockGL); | |
| 236 }; | |
| 237 | |
| 238 class ScopedSamplerGL : public ScopedReadLockGL { | |
| 239 public: | |
| 240 ScopedSamplerGL(ResourceProvider* resource_provider, | |
| 241 ResourceProvider::ResourceId resource_id, | |
| 242 GLenum filter); | |
| 243 ScopedSamplerGL(ResourceProvider* resource_provider, | |
| 244 ResourceProvider::ResourceId resource_id, | |
| 245 GLenum unit, | |
| 246 GLenum filter); | |
| 247 ~ScopedSamplerGL() override; | |
| 248 | |
| 249 GLenum target() const { return target_; } | |
| 250 | |
| 251 private: | |
| 252 GLenum unit_; | |
| 253 GLenum target_; | |
| 254 | |
| 255 DISALLOW_COPY_AND_ASSIGN(ScopedSamplerGL); | |
| 256 }; | |
| 257 | |
| 258 class ScopedWriteLockGL { | |
| 259 public: | |
| 260 ScopedWriteLockGL(ResourceProvider* resource_provider, | |
| 261 ResourceProvider::ResourceId resource_id); | |
| 262 ~ScopedWriteLockGL(); | |
| 263 | |
| 264 unsigned texture_id() const { return texture_id_; } | |
| 265 | |
| 266 private: | |
| 267 ResourceProvider* resource_provider_; | |
| 268 ResourceProvider::Resource* resource_; | |
| 269 unsigned texture_id_; | |
| 270 | |
| 271 DISALLOW_COPY_AND_ASSIGN(ScopedWriteLockGL); | |
| 272 }; | |
| 273 | |
| 274 class ScopedReadLockSoftware { | |
| 275 public: | |
| 276 ScopedReadLockSoftware(ResourceProvider* resource_provider, | |
| 277 ResourceProvider::ResourceId resource_id); | |
| 278 ~ScopedReadLockSoftware(); | |
| 279 | |
| 280 const SkBitmap* sk_bitmap() const { | |
| 281 DCHECK(valid()); | |
| 282 return &sk_bitmap_; | |
| 283 } | |
| 284 GLint wrap_mode() const { return wrap_mode_; } | |
| 285 | |
| 286 bool valid() const { return !!sk_bitmap_.getPixels(); } | |
| 287 | |
| 288 private: | |
| 289 ResourceProvider* resource_provider_; | |
| 290 ResourceProvider::ResourceId resource_id_; | |
| 291 SkBitmap sk_bitmap_; | |
| 292 GLint wrap_mode_; | |
| 293 | |
| 294 DISALLOW_COPY_AND_ASSIGN(ScopedReadLockSoftware); | |
| 295 }; | |
| 296 | |
| 297 class ScopedWriteLockSoftware { | |
| 298 public: | |
| 299 ScopedWriteLockSoftware(ResourceProvider* resource_provider, | |
| 300 ResourceProvider::ResourceId resource_id); | |
| 301 ~ScopedWriteLockSoftware(); | |
| 302 | |
| 303 SkBitmap& sk_bitmap() { return sk_bitmap_; } | |
| 304 bool valid() const { return !!sk_bitmap_.getPixels(); } | |
| 305 | |
| 306 private: | |
| 307 ResourceProvider* resource_provider_; | |
| 308 ResourceProvider::Resource* resource_; | |
| 309 SkBitmap sk_bitmap_; | |
| 310 base::ThreadChecker thread_checker_; | |
| 311 | |
| 312 DISALLOW_COPY_AND_ASSIGN(ScopedWriteLockSoftware); | |
| 313 }; | |
| 314 | |
| 315 class ScopedWriteLockGpuMemoryBuffer { | |
| 316 public: | |
| 317 ScopedWriteLockGpuMemoryBuffer(ResourceProvider* resource_provider, | |
| 318 ResourceProvider::ResourceId resource_id); | |
| 319 ~ScopedWriteLockGpuMemoryBuffer(); | |
| 320 | |
| 321 gfx::GpuMemoryBuffer* GetGpuMemoryBuffer(); | |
| 322 | |
| 323 private: | |
| 324 ResourceProvider* resource_provider_; | |
| 325 ResourceProvider::Resource* resource_; | |
| 326 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager_; | |
| 327 gfx::GpuMemoryBuffer* gpu_memory_buffer_; | |
| 328 gfx::Size size_; | |
| 329 ResourceFormat format_; | |
| 330 base::ThreadChecker thread_checker_; | |
| 331 | |
| 332 DISALLOW_COPY_AND_ASSIGN(ScopedWriteLockGpuMemoryBuffer); | |
| 333 }; | |
| 334 | |
| 335 class ScopedWriteLockGr { | |
| 336 public: | |
| 337 ScopedWriteLockGr(ResourceProvider* resource_provider, | |
| 338 ResourceProvider::ResourceId resource_id); | |
| 339 ~ScopedWriteLockGr(); | |
| 340 | |
| 341 void InitSkSurface(bool use_worker_context, | |
| 342 bool use_distance_field_text, | |
| 343 bool can_use_lcd_text, | |
| 344 int msaa_sample_count); | |
| 345 void ReleaseSkSurface(); | |
| 346 | |
| 347 SkSurface* sk_surface() { return sk_surface_.get(); } | |
| 348 ResourceProvider::Resource* resource() { return resource_; } | |
| 349 | |
| 350 private: | |
| 351 ResourceProvider* resource_provider_; | |
| 352 ResourceProvider::Resource* resource_; | |
| 353 base::ThreadChecker thread_checker_; | |
| 354 skia::RefPtr<SkSurface> sk_surface_; | |
| 355 | |
| 356 DISALLOW_COPY_AND_ASSIGN(ScopedWriteLockGr); | |
| 357 }; | |
| 358 | |
| 359 class Fence : public base::RefCounted<Fence> { | |
| 360 public: | |
| 361 Fence() {} | |
| 362 | |
| 363 virtual void Set() = 0; | |
| 364 virtual bool HasPassed() = 0; | |
| 365 virtual void Wait() = 0; | |
| 366 | |
| 367 protected: | |
| 368 friend class base::RefCounted<Fence>; | |
| 369 virtual ~Fence() {} | |
| 370 | |
| 371 private: | |
| 372 DISALLOW_COPY_AND_ASSIGN(Fence); | |
| 373 }; | |
| 374 | |
| 375 class SynchronousFence : public ResourceProvider::Fence { | |
| 376 public: | |
| 377 explicit SynchronousFence(gpu::gles2::GLES2Interface* gl); | |
| 378 | |
| 379 // Overridden from Fence: | |
| 380 void Set() override; | |
| 381 bool HasPassed() override; | |
| 382 void Wait() override; | |
| 383 | |
| 384 // Returns true if fence has been set but not yet synchornized. | |
| 385 bool has_synchronized() const { return has_synchronized_; } | |
| 386 | |
| 387 private: | |
| 388 ~SynchronousFence() override; | |
| 389 | |
| 390 void Synchronize(); | |
| 391 | |
| 392 gpu::gles2::GLES2Interface* gl_; | |
| 393 bool has_synchronized_; | |
| 394 | |
| 395 DISALLOW_COPY_AND_ASSIGN(SynchronousFence); | |
| 396 }; | |
| 397 | |
| 398 // Acquire pixel buffer for resource. The pixel buffer can be used to | |
| 399 // set resource pixels without performing unnecessary copying. | |
| 400 void AcquirePixelBuffer(ResourceId resource); | |
| 401 void ReleasePixelBuffer(ResourceId resource); | |
| 402 // Map/unmap the acquired pixel buffer. | |
| 403 uint8_t* MapPixelBuffer(ResourceId id, int* stride); | |
| 404 void UnmapPixelBuffer(ResourceId id); | |
| 405 // Asynchronously update pixels from acquired pixel buffer. | |
| 406 void BeginSetPixels(ResourceId id); | |
| 407 void ForceSetPixelsToComplete(ResourceId id); | |
| 408 bool DidSetPixelsComplete(ResourceId id); | |
| 409 | |
| 410 // For tests only! This prevents detecting uninitialized reads. | |
| 411 // Use SetPixels or LockForWrite to allocate implicitly. | |
| 412 void AllocateForTesting(ResourceId id); | |
| 413 | |
| 414 // For tests only! | |
| 415 void CreateForTesting(ResourceId id); | |
| 416 | |
| 417 GLenum TargetForTesting(ResourceId id); | |
| 418 | |
| 419 // Sets the current read fence. If a resource is locked for read | |
| 420 // and has read fences enabled, the resource will not allow writes | |
| 421 // until this fence has passed. | |
| 422 void SetReadLockFence(Fence* fence) { current_read_lock_fence_ = fence; } | |
| 423 | |
| 424 // Indicates if we can currently lock this resource for write. | |
| 425 bool CanLockForWrite(ResourceId id); | |
| 426 | |
| 427 // Copy pixels from source to destination. | |
| 428 void CopyResource(ResourceId source_id, ResourceId dest_id); | |
| 429 | |
| 430 void WaitSyncPointIfNeeded(ResourceId id); | |
| 431 | |
| 432 void WaitReadLockIfNeeded(ResourceId id); | |
| 433 | |
| 434 static GLint GetActiveTextureUnit(gpu::gles2::GLES2Interface* gl); | |
| 435 | |
| 436 OutputSurface* output_surface() { return output_surface_; } | |
| 437 | |
| 438 private: | |
| 439 struct Resource { | |
| 440 enum Origin { INTERNAL, EXTERNAL, DELEGATED }; | |
| 441 | |
| 442 Resource(); | |
| 443 ~Resource(); | |
| 444 Resource(unsigned texture_id, | |
| 445 const gfx::Size& size, | |
| 446 Origin origin, | |
| 447 GLenum target, | |
| 448 GLenum filter, | |
| 449 GLenum texture_pool, | |
| 450 GLint wrap_mode, | |
| 451 TextureHint hint, | |
| 452 ResourceFormat format); | |
| 453 Resource(uint8_t* pixels, | |
| 454 SharedBitmap* bitmap, | |
| 455 const gfx::Size& size, | |
| 456 Origin origin, | |
| 457 GLenum filter, | |
| 458 GLint wrap_mode); | |
| 459 Resource(const SharedBitmapId& bitmap_id, | |
| 460 const gfx::Size& size, | |
| 461 Origin origin, | |
| 462 GLenum filter, | |
| 463 GLint wrap_mode); | |
| 464 | |
| 465 int child_id; | |
| 466 unsigned gl_id; | |
| 467 // Pixel buffer used for set pixels without unnecessary copying. | |
| 468 unsigned gl_pixel_buffer_id; | |
| 469 // Query used to determine when asynchronous set pixels complete. | |
| 470 unsigned gl_upload_query_id; | |
| 471 // Query used to determine when read lock fence has passed. | |
| 472 unsigned gl_read_lock_query_id; | |
| 473 TextureMailbox mailbox; | |
| 474 ReleaseCallbackImpl release_callback_impl; | |
| 475 uint8_t* pixels; | |
| 476 int lock_for_read_count; | |
| 477 int imported_count; | |
| 478 int exported_count; | |
| 479 bool dirty_image : 1; | |
| 480 bool locked_for_write : 1; | |
| 481 bool lost : 1; | |
| 482 bool marked_for_deletion : 1; | |
| 483 bool pending_set_pixels : 1; | |
| 484 bool set_pixels_completion_forced : 1; | |
| 485 bool allocated : 1; | |
| 486 bool read_lock_fences_enabled : 1; | |
| 487 bool has_shared_bitmap_id : 1; | |
| 488 bool allow_overlay : 1; | |
| 489 scoped_refptr<Fence> read_lock_fence; | |
| 490 gfx::Size size; | |
| 491 Origin origin; | |
| 492 GLenum target; | |
| 493 // TODO(skyostil): Use a separate sampler object for filter state. | |
| 494 GLenum original_filter; | |
| 495 GLenum filter; | |
| 496 unsigned image_id; | |
| 497 unsigned bound_image_id; | |
| 498 GLenum texture_pool; | |
| 499 GLint wrap_mode; | |
| 500 TextureHint hint; | |
| 501 ResourceType type; | |
| 502 ResourceFormat format; | |
| 503 SharedBitmapId shared_bitmap_id; | |
| 504 SharedBitmap* shared_bitmap; | |
| 505 gfx::GpuMemoryBuffer* gpu_memory_buffer; | |
| 506 }; | |
| 507 typedef base::hash_map<ResourceId, Resource> ResourceMap; | |
| 508 | |
| 509 static bool CompareResourceMapIteratorsByChildId( | |
| 510 const std::pair<ReturnedResource, ResourceMap::iterator>& a, | |
| 511 const std::pair<ReturnedResource, ResourceMap::iterator>& b); | |
| 512 | |
| 513 struct Child { | |
| 514 Child(); | |
| 515 ~Child(); | |
| 516 | |
| 517 ResourceIdMap child_to_parent_map; | |
| 518 ResourceIdMap parent_to_child_map; | |
| 519 ReturnCallback return_callback; | |
| 520 ResourceIdSet in_use_resources; | |
| 521 bool marked_for_deletion; | |
| 522 }; | |
| 523 typedef base::hash_map<int, Child> ChildMap; | |
| 524 | |
| 525 bool ReadLockFenceHasPassed(const Resource* resource) { | |
| 526 return !resource->read_lock_fence.get() || | |
| 527 resource->read_lock_fence->HasPassed(); | |
| 528 } | |
| 529 | |
| 530 ResourceProvider(OutputSurface* output_surface, | |
| 531 SharedBitmapManager* shared_bitmap_manager, | |
| 532 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, | |
| 533 BlockingTaskRunner* blocking_main_thread_task_runner, | |
| 534 int highp_threshold_min, | |
| 535 bool use_rgba_4444_texture_format, | |
| 536 size_t id_allocation_chunk_size); | |
| 537 | |
| 538 void CleanUpGLIfNeeded(); | |
| 539 | |
| 540 Resource* GetResource(ResourceId id); | |
| 541 const Resource* LockForRead(ResourceId id); | |
| 542 void UnlockForRead(ResourceId id); | |
| 543 Resource* LockForWrite(ResourceId id); | |
| 544 void UnlockForWrite(Resource* resource); | |
| 545 | |
| 546 static void PopulateSkBitmapWithResource(SkBitmap* sk_bitmap, | |
| 547 const Resource* resource); | |
| 548 | |
| 549 void TransferResource(gpu::gles2::GLES2Interface* gl, | |
| 550 ResourceId id, | |
| 551 TransferableResource* resource); | |
| 552 enum DeleteStyle { | |
| 553 NORMAL, | |
| 554 FOR_SHUTDOWN, | |
| 555 }; | |
| 556 void DeleteResourceInternal(ResourceMap::iterator it, DeleteStyle style); | |
| 557 void DeleteAndReturnUnusedResourcesToChild(ChildMap::iterator child_it, | |
| 558 DeleteStyle style, | |
| 559 const ResourceIdArray& unused); | |
| 560 void DestroyChildInternal(ChildMap::iterator it, DeleteStyle style); | |
| 561 void LazyCreate(Resource* resource); | |
| 562 void LazyAllocate(Resource* resource); | |
| 563 | |
| 564 void BindImageForSampling(Resource* resource); | |
| 565 // Binds the given GL resource to a texture target for sampling using the | |
| 566 // specified filter for both minification and magnification. Returns the | |
| 567 // texture target used. The resource must be locked for reading. | |
| 568 GLenum BindForSampling(ResourceId resource_id, GLenum unit, GLenum filter); | |
| 569 | |
| 570 // Returns NULL if the output_surface_ does not have a ContextProvider. | |
| 571 gpu::gles2::GLES2Interface* ContextGL() const; | |
| 572 class GrContext* GrContext(bool worker_context) const; | |
| 573 | |
| 574 OutputSurface* output_surface_; | |
| 575 SharedBitmapManager* shared_bitmap_manager_; | |
| 576 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager_; | |
| 577 BlockingTaskRunner* blocking_main_thread_task_runner_; | |
| 578 bool lost_output_surface_; | |
| 579 int highp_threshold_min_; | |
| 580 ResourceId next_id_; | |
| 581 ResourceMap resources_; | |
| 582 int next_child_; | |
| 583 ChildMap children_; | |
| 584 | |
| 585 ResourceType default_resource_type_; | |
| 586 bool use_texture_storage_ext_; | |
| 587 bool use_texture_format_bgra_; | |
| 588 bool use_texture_usage_hint_; | |
| 589 bool use_compressed_texture_etc1_; | |
| 590 ResourceFormat yuv_resource_format_; | |
| 591 scoped_ptr<TextureUploader> texture_uploader_; | |
| 592 int max_texture_size_; | |
| 593 ResourceFormat best_texture_format_; | |
| 594 | |
| 595 base::ThreadChecker thread_checker_; | |
| 596 | |
| 597 scoped_refptr<Fence> current_read_lock_fence_; | |
| 598 bool use_rgba_4444_texture_format_; | |
| 599 | |
| 600 const size_t id_allocation_chunk_size_; | |
| 601 scoped_ptr<IdAllocator> texture_id_allocator_; | |
| 602 scoped_ptr<IdAllocator> buffer_id_allocator_; | |
| 603 | |
| 604 bool use_sync_query_; | |
| 605 // Fence used for CopyResource if CHROMIUM_sync_query is not supported. | |
| 606 scoped_refptr<SynchronousFence> synchronous_fence_; | |
| 607 | |
| 608 DISALLOW_COPY_AND_ASSIGN(ResourceProvider); | |
| 609 }; | |
| 610 | |
| 611 // TODO(epenner): Move these format conversions to resource_format.h | |
| 612 // once that builds on mac (npapi.h currently #includes OpenGL.h). | |
| 613 inline unsigned BitsPerPixel(ResourceFormat format) { | |
| 614 switch (format) { | |
| 615 case BGRA_8888: | |
| 616 case RGBA_8888: | |
| 617 return 32; | |
| 618 case RGBA_4444: | |
| 619 case RGB_565: | |
| 620 return 16; | |
| 621 case ALPHA_8: | |
| 622 case LUMINANCE_8: | |
| 623 case RED_8: | |
| 624 return 8; | |
| 625 case ETC1: | |
| 626 return 4; | |
| 627 } | |
| 628 NOTREACHED(); | |
| 629 return 0; | |
| 630 } | |
| 631 | |
| 632 inline GLenum GLDataType(ResourceFormat format) { | |
| 633 DCHECK_LE(format, RESOURCE_FORMAT_MAX); | |
| 634 static const unsigned format_gl_data_type[RESOURCE_FORMAT_MAX + 1] = { | |
| 635 GL_UNSIGNED_BYTE, // RGBA_8888 | |
| 636 GL_UNSIGNED_SHORT_4_4_4_4, // RGBA_4444 | |
| 637 GL_UNSIGNED_BYTE, // BGRA_8888 | |
| 638 GL_UNSIGNED_BYTE, // ALPHA_8 | |
| 639 GL_UNSIGNED_BYTE, // LUMINANCE_8 | |
| 640 GL_UNSIGNED_SHORT_5_6_5, // RGB_565, | |
| 641 GL_UNSIGNED_BYTE, // ETC1 | |
| 642 GL_UNSIGNED_BYTE // RED_8 | |
| 643 }; | |
| 644 return format_gl_data_type[format]; | |
| 645 } | |
| 646 | |
| 647 inline GLenum GLDataFormat(ResourceFormat format) { | |
| 648 DCHECK_LE(format, RESOURCE_FORMAT_MAX); | |
| 649 static const unsigned format_gl_data_format[RESOURCE_FORMAT_MAX + 1] = { | |
| 650 GL_RGBA, // RGBA_8888 | |
| 651 GL_RGBA, // RGBA_4444 | |
| 652 GL_BGRA_EXT, // BGRA_8888 | |
| 653 GL_ALPHA, // ALPHA_8 | |
| 654 GL_LUMINANCE, // LUMINANCE_8 | |
| 655 GL_RGB, // RGB_565 | |
| 656 GL_ETC1_RGB8_OES, // ETC1 | |
| 657 GL_RED_EXT // RED_8 | |
| 658 }; | |
| 659 return format_gl_data_format[format]; | |
| 660 } | |
| 661 | |
| 662 inline GLenum GLInternalFormat(ResourceFormat format) { | |
| 663 return GLDataFormat(format); | |
| 664 } | |
| 665 | |
| 666 } // namespace cc | |
| 667 | |
| 668 #endif // CC_RESOURCES_RESOURCE_PROVIDER_H_ | |
| OLD | NEW |