15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// found in the LICENSE file.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "cc/resources/resource_provider.h"
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <algorithm>
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <limits>
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/containers/hash_tables.h"
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/debug/trace_event.h"
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/stl_util.h"
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/strings/string_split.h"
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/strings/string_util.h"
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "cc/base/util.h"
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "cc/output/gl_renderer.h"  // For the GLC() macro.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "cc/resources/platform_color.h"
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "cc/resources/returned_resource.h"
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "cc/resources/shared_bitmap_manager.h"
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "cc/resources/texture_uploader.h"
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "cc/resources/transferable_resource.h"
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h"
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "gpu/command_buffer/client/gles2_interface.h"
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2.h"
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2ext.h"
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "third_party/skia/include/core/SkSurface.h"
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "third_party/skia/include/gpu/GrContext.h"
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "ui/gfx/frame_time.h"
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "ui/gfx/rect.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "ui/gfx/vector2d.h"
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using gpu::gles2::GLES2Interface;
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)namespace cc {
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)class IdAllocator {
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) public:
3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)  virtual ~IdAllocator() {}
3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)  virtual GLuint NextId() = 0;
4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) protected:
4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)  IdAllocator(GLES2Interface* gl, size_t id_allocation_chunk_size)
4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)      : gl_(gl),
4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        id_allocation_chunk_size_(id_allocation_chunk_size),
46e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)        ids_(new GLuint[id_allocation_chunk_size]),
47e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)        next_id_index_(id_allocation_chunk_size) {
48e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    DCHECK(id_allocation_chunk_size_);
4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)  }
5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
5153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)  GLES2Interface* gl_;
525267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)  const size_t id_allocation_chunk_size_;
5353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)  scoped_ptr<GLuint[]> ids_;
5453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)  size_t next_id_index_;
5553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)};
5653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
5753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)namespace {
5853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
5953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)// Measured in seconds.
6053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)const double kSoftwareUploadTickRate = 0.000250;
6153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)const double kTextureUploadTickRate = 0.004;
6253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
6353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)GLenum TextureToStorageFormat(ResourceFormat format) {
6453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)  GLenum storage_format = GL_RGBA8_OES;
6553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)  switch (format) {
6653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    case RGBA_8888:
6753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)      break;
6853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    case BGRA_8888:
6953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)      storage_format = GL_BGRA8_EXT;
7053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)      break;
7153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    case RGBA_4444:
72591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    case ALPHA_8:
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LUMINANCE_8:
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case RGB_565:
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case ETC1:
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      NOTREACHED();
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      break;
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return storage_format;
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool IsFormatSupportedForStorage(ResourceFormat format, bool use_bgra) {
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  switch (format) {
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case RGBA_8888:
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return true;
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case BGRA_8888:
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return use_bgra;
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case RGBA_4444:
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case ALPHA_8:
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LUMINANCE_8:
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case RGB_565:
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case ETC1:
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return false;
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return false;
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)GrPixelConfig ToGrPixelConfig(ResourceFormat format) {
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  switch (format) {
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case RGBA_8888:
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return kRGBA_8888_GrPixelConfig;
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case BGRA_8888:
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return kBGRA_8888_GrPixelConfig;
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case RGBA_4444:
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return kRGBA_4444_GrPixelConfig;
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      break;
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(false) << "Unsupported resource format.";
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return kSkia8888_GrPixelConfig;
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ScopedSetActiveTexture {
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) public:
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ScopedSetActiveTexture(GLES2Interface* gl, GLenum unit)
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      : gl_(gl), unit_(unit) {
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK_EQ(GL_TEXTURE0, ResourceProvider::GetActiveTextureUnit(gl_));
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (unit_ != GL_TEXTURE0)
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      GLC(gl_, gl_->ActiveTexture(unit_));
122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  }
123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  ~ScopedSetActiveTexture() {
12553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    // Active unit being GL_TEXTURE0 is effectively the ground state.
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (unit_ != GL_TEXTURE0)
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      GLC(gl_, gl_->ActiveTexture(GL_TEXTURE0));
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) private:
131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  GLES2Interface* gl_;
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  GLenum unit_;
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class TextureIdAllocator : public IdAllocator {
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) public:
137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  TextureIdAllocator(GLES2Interface* gl,
138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                     size_t texture_id_allocation_chunk_size)
139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)      : IdAllocator(gl, texture_id_allocation_chunk_size) {}
140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  virtual ~TextureIdAllocator() {
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    gl_->DeleteTextures(id_allocation_chunk_size_ - next_id_index_,
142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                        ids_.get() + next_id_index_);
143926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  }
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Overridden from IdAllocator:
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  virtual GLuint NextId() OVERRIDE {
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (next_id_index_ == id_allocation_chunk_size_) {
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      gl_->GenTextures(id_allocation_chunk_size_, ids_.get());
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      next_id_index_ = 0;
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return ids_[next_id_index_++];
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) private:
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TextureIdAllocator);
157926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)};
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class BufferIdAllocator : public IdAllocator {
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) public:
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  BufferIdAllocator(GLES2Interface* gl, size_t buffer_id_allocation_chunk_size)
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      : IdAllocator(gl, buffer_id_allocation_chunk_size) {}
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  virtual ~BufferIdAllocator() {
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    gl_->DeleteBuffers(id_allocation_chunk_size_ - next_id_index_,
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       ids_.get() + next_id_index_);
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Overridden from IdAllocator:
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  virtual GLuint NextId() OVERRIDE {
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (next_id_index_ == id_allocation_chunk_size_) {
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      gl_->GenBuffers(id_allocation_chunk_size_, ids_.get());
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      next_id_index_ = 0;
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return ids_[next_id_index_++];
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) private:
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BufferIdAllocator);
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Generic fence implementation for query objects. Fence has passed when query
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// result is available.
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class QueryFence : public ResourceProvider::Fence {
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) public:
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  QueryFence(gpu::gles2::GLES2Interface* gl, unsigned query_id)
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      : gl_(gl), query_id_(query_id) {}
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Overridden from ResourceProvider::Fence:
19081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)  virtual void Set() OVERRIDE {}
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  virtual bool HasPassed() OVERRIDE {
19281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    unsigned available = 1;
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    gl_->GetQueryObjectuivEXT(
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        query_id_, GL_QUERY_RESULT_AVAILABLE_EXT, &available);
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return !!available;
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) private:
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  virtual ~QueryFence() {}
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  gpu::gles2::GLES2Interface* gl_;
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  unsigned query_id_;
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QueryFence);
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
207e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}  // namespace
208e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
209e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben MurdochResourceProvider::Resource::Resource()
210e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    : child_id(0),
211e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch      gl_id(0),
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      gl_pixel_buffer_id(0),
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      gl_upload_query_id(0),
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      gl_read_lock_query_id(0),
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      pixels(NULL),
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      lock_for_read_count(0),
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      imported_count(0),
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      exported_count(0),
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      dirty_image(false),
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      locked_for_write(false),
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      lost(false),
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      marked_for_deletion(false),
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      pending_set_pixels(false),
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      set_pixels_completion_forced(false),
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      allocated(false),
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      read_lock_fences_enabled(false),
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      has_shared_bitmap_id(false),
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      allow_overlay(false),
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      read_lock_fence(NULL),
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      size(),
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      origin(Internal),
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      target(0),
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      original_filter(0),
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      filter(0),
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      image_id(0),
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      bound_image_id(0),
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      texture_pool(0),
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      wrap_mode(0),
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      hint(TextureHintImmutable),
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      type(InvalidType),
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      format(RGBA_8888),
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      shared_bitmap(NULL) {
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ResourceProvider::Resource::~Resource() {}
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ResourceProvider::Resource::Resource(GLuint texture_id,
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                     const gfx::Size& size,
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                     Origin origin,
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                     GLenum target,
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                     GLenum filter,
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                     GLenum texture_pool,
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                     GLint wrap_mode,
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                     TextureHint hint,
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                     ResourceFormat format)
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : child_id(0),
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      gl_id(texture_id),
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      gl_pixel_buffer_id(0),
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      gl_upload_query_id(0),
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      gl_read_lock_query_id(0),
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      pixels(NULL),
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      lock_for_read_count(0),
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      imported_count(0),
264926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)      exported_count(0),
265926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)      dirty_image(false),
266926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)      locked_for_write(false),
267926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)      lost(false),
268926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)      marked_for_deletion(false),
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      pending_set_pixels(false),
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      set_pixels_completion_forced(false),
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      allocated(false),
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      read_lock_fences_enabled(false),
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      has_shared_bitmap_id(false),
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      allow_overlay(false),
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      read_lock_fence(NULL),
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      size(size),
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      origin(origin),
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      target(target),
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      original_filter(filter),
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      filter(filter),
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      image_id(0),
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      bound_image_id(0),
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      texture_pool(texture_pool),
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      wrap_mode(wrap_mode),
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      hint(hint),
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      type(GLTexture),
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      format(format),
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      shared_bitmap(NULL) {
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(wrap_mode == GL_CLAMP_TO_EDGE || wrap_mode == GL_REPEAT);
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK_EQ(origin == Internal, !!texture_pool);
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ResourceProvider::Resource::Resource(uint8_t* pixels,
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                     SharedBitmap* bitmap,
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                     const gfx::Size& size,
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                     Origin origin,
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                     GLenum filter,
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                     GLint wrap_mode)
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : child_id(0),
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      gl_id(0),
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      gl_pixel_buffer_id(0),
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      gl_upload_query_id(0),
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      gl_read_lock_query_id(0),
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      pixels(pixels),
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      lock_for_read_count(0),
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      imported_count(0),
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      exported_count(0),
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      dirty_image(false),
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      locked_for_write(false),
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      lost(false),
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      marked_for_deletion(false),
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      pending_set_pixels(false),
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      set_pixels_completion_forced(false),
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      allocated(false),
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      read_lock_fences_enabled(false),
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      has_shared_bitmap_id(!!bitmap),
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      allow_overlay(false),
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      read_lock_fence(NULL),
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      size(size),
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      origin(origin),
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      target(0),
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      original_filter(filter),
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      filter(filter),
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      image_id(0),
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      bound_image_id(0),
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      texture_pool(0),
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      wrap_mode(wrap_mode),
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      hint(TextureHintImmutable),
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      type(Bitmap),
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      format(RGBA_8888),
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      shared_bitmap(bitmap) {
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(wrap_mode == GL_CLAMP_TO_EDGE || wrap_mode == GL_REPEAT);
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(origin == Delegated || pixels);
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (bitmap)
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    shared_bitmap_id = bitmap->id();
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ResourceProvider::Resource::Resource(const SharedBitmapId& bitmap_id,
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                     const gfx::Size& size,
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                     Origin origin,
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                     GLenum filter,
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                     GLint wrap_mode)
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : child_id(0),
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      gl_id(0),
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      gl_pixel_buffer_id(0),
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      gl_upload_query_id(0),
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      gl_read_lock_query_id(0),
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      pixels(NULL),
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      lock_for_read_count(0),
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      imported_count(0),
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      exported_count(0),
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      dirty_image(false),
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      locked_for_write(false),
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      lost(false),
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      marked_for_deletion(false),
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      pending_set_pixels(false),
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      set_pixels_completion_forced(false),
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      allocated(false),
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      read_lock_fences_enabled(false),
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      has_shared_bitmap_id(true),
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      allow_overlay(false),
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      read_lock_fence(NULL),
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      size(size),
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      origin(origin),
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      target(0),
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      original_filter(filter),
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      filter(filter),
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      image_id(0),
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      bound_image_id(0),
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      texture_pool(0),
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      wrap_mode(wrap_mode),
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      hint(TextureHintImmutable),
373591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch      type(Bitmap),
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      format(RGBA_8888),
375591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch      shared_bitmap_id(bitmap_id),
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      shared_bitmap(NULL) {
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(wrap_mode == GL_CLAMP_TO_EDGE || wrap_mode == GL_REPEAT);
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ResourceProvider::Child::Child() : marked_for_deletion(false) {}
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ResourceProvider::Child::~Child() {}
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)scoped_ptr<ResourceProvider> ResourceProvider::Create(
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    OutputSurface* output_surface,
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SharedBitmapManager* shared_bitmap_manager,
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    BlockingTaskRunner* blocking_main_thread_task_runner,
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int highp_threshold_min,
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool use_rgba_4444_texture_format,
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t id_allocation_chunk_size,
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool use_distance_field_text) {
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  scoped_ptr<ResourceProvider> resource_provider(
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      new ResourceProvider(output_surface,
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                           shared_bitmap_manager,
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                           blocking_main_thread_task_runner,
396926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                           highp_threshold_min,
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                           use_rgba_4444_texture_format,
398926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                           id_allocation_chunk_size,
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                           use_distance_field_text));
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
401926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  if (resource_provider->ContextGL())
402926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    resource_provider->InitializeGL();
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  else
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resource_provider->InitializeSoftware();
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK_NE(InvalidType, resource_provider->default_resource_type());
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return resource_provider.Pass();
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
410926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)ResourceProvider::~ResourceProvider() {
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  while (!children_.empty())
412926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DestroyChildInternal(children_.begin(), ForShutdown);
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  while (!resources_.empty())
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DeleteResourceInternal(resources_.begin(), ForShutdown);
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  CleanUpGLIfNeeded();
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ResourceProvider::InUseByConsumer(ResourceId id) {
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Resource* resource = GetResource(id);
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return resource->lock_for_read_count > 0 || resource->exported_count > 0 ||
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         resource->lost;
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ResourceProvider::IsLost(ResourceId id) {
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Resource* resource = GetResource(id);
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return resource->lost;
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ResourceProvider::AllowOverlay(ResourceId id) {
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Resource* resource = GetResource(id);
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return resource->allow_overlay;
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ResourceProvider::ResourceId ResourceProvider::CreateResource(
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const gfx::Size& size,
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLint wrap_mode,
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TextureHint hint,
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceFormat format) {
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(!size.IsEmpty());
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  switch (default_resource_type_) {
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case GLTexture:
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return CreateGLTexture(size,
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                             GL_TEXTURE_2D,
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                             GL_TEXTURE_POOL_UNMANAGED_CHROMIUM,
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                             wrap_mode,
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                             hint,
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                             format);
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Bitmap:
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      DCHECK_EQ(RGBA_8888, format);
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return CreateBitmap(size, wrap_mode);
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case InvalidType:
453926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)      break;
454926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  }
455926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
456926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  LOG(FATAL) << "Invalid default resource type.";
457926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  return 0;
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ResourceProvider::ResourceId ResourceProvider::CreateManagedResource(
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const gfx::Size& size,
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLenum target,
463926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    GLint wrap_mode,
464926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    TextureHint hint,
465926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ResourceFormat format) {
466926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  DCHECK(!size.IsEmpty());
467926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  switch (default_resource_type_) {
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case GLTexture:
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return CreateGLTexture(size,
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                             target,
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                             GL_TEXTURE_POOL_MANAGED_CHROMIUM,
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                             wrap_mode,
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                             hint,
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                             format);
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Bitmap:
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      DCHECK_EQ(RGBA_8888, format);
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return CreateBitmap(size, wrap_mode);
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case InvalidType:
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      break;
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  LOG(FATAL) << "Invalid default resource type.";
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return 0;
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ResourceProvider::ResourceId ResourceProvider::CreateGLTexture(
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const gfx::Size& size,
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLenum target,
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLenum texture_pool,
490926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    GLint wrap_mode,
491926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    TextureHint hint,
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceFormat format) {
493926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  DCHECK_LE(size.width(), max_texture_size_);
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK_LE(size.height(), max_texture_size_);
495926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ResourceId id = next_id_++;
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Resource resource(0,
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    size,
500591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                    Resource::Internal,
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    target,
502591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                    GL_LINEAR,
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    texture_pool,
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    wrap_mode,
505926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    hint,
506926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    format);
507926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  resource.allocated = false;
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  resources_[id] = resource;
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return id;
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ResourceProvider::ResourceId ResourceProvider::CreateBitmap(
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const gfx::Size& size, GLint wrap_mode) {
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  scoped_ptr<SharedBitmap> bitmap;
5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (shared_bitmap_manager_)
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bitmap = shared_bitmap_manager_->AllocateSharedBitmap(size);
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
520926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  uint8_t* pixels;
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (bitmap) {
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    pixels = bitmap->pixels();
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  } else {
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t bytes = SharedBitmap::CheckedSizeInBytes(size);
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    pixels = new uint8_t[bytes];
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(pixels);
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ResourceId id = next_id_++;
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Resource resource(
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      pixels, bitmap.release(), size, Resource::Internal, GL_LINEAR, wrap_mode);
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  resource.allocated = true;
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  resources_[id] = resource;
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return id;
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ResourceProvider::ResourceId ResourceProvider::CreateResourceFromIOSurface(
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const gfx::Size& size,
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned io_surface_id) {
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ResourceId id = next_id_++;
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Resource resource(0,
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    gfx::Size(),
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    Resource::Internal,
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    GL_TEXTURE_RECTANGLE_ARB,
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    GL_LINEAR,
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    GL_TEXTURE_POOL_UNMANAGED_CHROMIUM,
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    GL_CLAMP_TO_EDGE,
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    TextureHintImmutable,
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    RGBA_8888);
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  LazyCreate(&resource);
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  GLES2Interface* gl = ContextGL();
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(gl);
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  gl->BindTexture(GL_TEXTURE_RECTANGLE_ARB, resource.gl_id);
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  gl->TexImageIOSurface2DCHROMIUM(
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      GL_TEXTURE_RECTANGLE_ARB, size.width(), size.height(), io_surface_id, 0);
55893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  resource.allocated = true;
55993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  resources_[id] = resource;
56093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  return id;
561e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
56293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
56393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)ResourceProvider::ResourceId ResourceProvider::CreateResourceFromTextureMailbox(
56493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    const TextureMailbox& mailbox,
56593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    scoped_ptr<SingleReleaseCallbackImpl> release_callback_impl) {
56693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
56793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  // Just store the information. Mailbox will be consumed in LockForRead().
56893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  ResourceId id = next_id_++;
56993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  DCHECK(mailbox.IsValid());
570e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch  Resource& resource = resources_[id];
57193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  if (mailbox.IsTexture()) {
57293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    resource = Resource(0,
57393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)                        gfx::Size(),
57493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)                        Resource::External,
57593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)                        mailbox.target(),
57693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)                        GL_LINEAR,
57793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)                        0,
57893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)                        GL_CLAMP_TO_EDGE,
579e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                        TextureHintImmutable,
58093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)                        RGBA_8888);
58193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  } else {
58293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    DCHECK(mailbox.IsSharedMemory());
58393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    base::SharedMemory* shared_memory = mailbox.shared_memory();
58493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    DCHECK(shared_memory->memory());
58593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    uint8_t* pixels = reinterpret_cast<uint8_t*>(shared_memory->memory());
58693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    DCHECK(pixels);
58793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    scoped_ptr<SharedBitmap> shared_bitmap;
588e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (shared_bitmap_manager_) {
58993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)      shared_bitmap =
59093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)          shared_bitmap_manager_->GetBitmapForSharedMemory(shared_memory);
59193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
59293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    resource = Resource(pixels,
59393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)                        shared_bitmap.release(),
59493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)                        mailbox.shared_memory_size(),
59593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)                        Resource::External,
59693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)                        GL_LINEAR,
597e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                        GL_CLAMP_TO_EDGE);
59893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  }
59993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  resource.allocated = true;
60093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  resource.mailbox = mailbox;
60193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  resource.release_callback_impl =
60293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)      base::Bind(&SingleReleaseCallbackImpl::Run,
60393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)                 base::Owned(release_callback_impl.release()));
60493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  resource.allow_overlay = mailbox.allow_overlay();
60593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  return id;
606e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}
60793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
60893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)void ResourceProvider::DeleteResource(ResourceId id) {
60993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
61093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  ResourceMap::iterator it = resources_.find(id);
61193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  CHECK(it != resources_.end());
61293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  Resource* resource = &it->second;
61393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  DCHECK(!resource->marked_for_deletion);
61493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  DCHECK_EQ(resource->imported_count, 0);
615e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch  DCHECK(resource->pending_set_pixels || !resource->locked_for_write);
61693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
61793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  if (resource->exported_count > 0 || resource->lock_for_read_count > 0) {
61893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    resource->marked_for_deletion = true;
61993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    return;
62093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  } else {
62193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    DeleteResourceInternal(it, Normal);
62293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  }
62393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
624e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
62593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)void ResourceProvider::DeleteResourceInternal(ResourceMap::iterator it,
62693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)                                              DeleteStyle style) {
62793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  TRACE_EVENT0("cc", "ResourceProvider::DeleteResourceInternal");
62893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  Resource* resource = &it->second;
62993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  bool lost_resource = resource->lost;
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(resource->exported_count == 0 || style != Normal);
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (style == ForShutdown && resource->exported_count > 0)
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    lost_resource = true;
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (resource->image_id) {
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK(resource->origin == Resource::Internal);
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLES2Interface* gl = ContextGL();
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK(gl);
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLC(gl, gl->DestroyImageCHROMIUM(resource->image_id));
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (resource->gl_upload_query_id) {
642926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DCHECK(resource->origin == Resource::Internal);
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLES2Interface* gl = ContextGL();
644926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DCHECK(gl);
645926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    GLC(gl, gl->DeleteQueriesEXT(1, &resource->gl_upload_query_id));
646926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  }
647926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  if (resource->gl_read_lock_query_id) {
648926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DCHECK(resource->origin == Resource::Internal);
649926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    GLES2Interface* gl = ContextGL();
650926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DCHECK(gl);
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLC(gl, gl->DeleteQueriesEXT(1, &resource->gl_read_lock_query_id));
652926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  }
653926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  if (resource->gl_pixel_buffer_id) {
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK(resource->origin == Resource::Internal);
655926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    GLES2Interface* gl = ContextGL();
656926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DCHECK(gl);
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLC(gl, gl->DeleteBuffers(1, &resource->gl_pixel_buffer_id));
658926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  }
659926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  if (resource->origin == Resource::External) {
660926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DCHECK(resource->mailbox.IsValid());
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLuint sync_point = resource->mailbox.sync_point();
662926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (resource->type == GLTexture) {
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      DCHECK(resource->mailbox.IsTexture());
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      lost_resource |= lost_output_surface_;
665926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)      GLES2Interface* gl = ContextGL();
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      DCHECK(gl);
667926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)      if (resource->gl_id) {
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        GLC(gl, gl->DeleteTextures(1, &resource->gl_id));
669926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        resource->gl_id = 0;
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!lost_resource)
671926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)          sync_point = gl->InsertSyncPointCHROMIUM();
672926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)      }
67353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    } else {
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      DCHECK(resource->mailbox.IsSharedMemory());
67553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)      base::SharedMemory* shared_memory = resource->mailbox.shared_memory();
676926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)      if (resource->pixels && shared_memory) {
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DCHECK(shared_memory->memory() == resource->pixels);
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        resource->pixels = NULL;
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        delete resource->shared_bitmap;
6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        resource->shared_bitmap = NULL;
681926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)      }
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
683926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    resource->release_callback_impl.Run(
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        sync_point, lost_resource, blocking_main_thread_task_runner_);
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (resource->gl_id) {
6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLES2Interface* gl = ContextGL();
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK(gl);
6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLC(gl, gl->DeleteTextures(1, &resource->gl_id));
6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resource->gl_id = 0;
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
692926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  if (resource->shared_bitmap) {
693926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DCHECK(resource->origin != Resource::External);
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK_EQ(Bitmap, resource->type);
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    delete resource->shared_bitmap;
6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resource->pixels = NULL;
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (resource->pixels) {
699926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DCHECK(resource->origin == Resource::Internal);
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    delete[] resource->pixels;
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
702926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  resources_.erase(it);
703926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
704926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ResourceProvider::ResourceType ResourceProvider::GetResourceType(
706926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ResourceId id) {
707926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  return GetResource(id)->type;
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
710926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void ResourceProvider::SetPixels(ResourceId id,
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                 const uint8_t* image,
712926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                                 const gfx::Rect& image_rect,
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                 const gfx::Rect& source_rect,
714926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                                 const gfx::Vector2d& dest_offset) {
7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Resource* resource = GetResource(id);
716926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  DCHECK(!resource->locked_for_write);
7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(!resource->lock_for_read_count);
718926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  DCHECK(resource->origin == Resource::Internal);
719926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  DCHECK_EQ(resource->exported_count, 0);
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(ReadLockFenceHasPassed(resource));
721926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  LazyAllocate(resource);
7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (resource->type == GLTexture) {
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK(resource->gl_id);
72593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    DCHECK(!resource->pending_set_pixels);
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK_EQ(resource->target, static_cast<GLenum>(GL_TEXTURE_2D));
72753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    GLES2Interface* gl = ContextGL();
728926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DCHECK(gl);
729926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DCHECK(texture_uploader_.get());
73053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    gl->BindTexture(GL_TEXTURE_2D, resource->gl_id);
731926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    texture_uploader_->Upload(image,
732926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                              image_rect,
733926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                              source_rect,
73453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                              dest_offset,
735926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                              resource->format,
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                              resource->size);
7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  } else {
73853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    DCHECK_EQ(Bitmap, resource->type);
739926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DCHECK(resource->allocated);
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK_EQ(RGBA_8888, resource->format);
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK(source_rect.x() >= image_rect.x());
742926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    DCHECK(source_rect.y() >= image_rect.y());
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK(source_rect.right() <= image_rect.right());
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK(source_rect.bottom() <= image_rect.bottom());
74553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    SkImageInfo source_info =
746926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        SkImageInfo::MakeN32Premul(source_rect.width(), source_rect.height());
7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t image_row_bytes = image_rect.width() * 4;
74853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    gfx::Vector2d source_offset = source_rect.origin() - image_rect.origin();
749926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    image += source_offset.y() * image_row_bytes + source_offset.x() * 4;
750926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
75153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    ScopedWriteLockSoftware lock(this, id);
752926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    SkCanvas* dest = lock.sk_canvas();
753926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    dest->writePixels(
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        source_info, image, image_row_bytes, dest_offset.x(), dest_offset.y());
755926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  }
756926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
75893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)size_t ResourceProvider::NumBlockingUploads() {
759926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  if (!texture_uploader_)
7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return texture_uploader_->NumBlockingUploads();
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
76453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ResourceProvider::MarkPendingUploadsAsNonBlocking() {
7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (!texture_uploader_)
767926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return;
768591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
769521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)  texture_uploader_->MarkPendingUploadsAsNonBlocking();
770521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)}
771521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
772521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)size_t ResourceProvider::EstimatedUploadsPerTick() {
773591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch  if (!texture_uploader_)
774591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    return 1u;
775591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
776521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)  double textures_per_second = texture_uploader_->EstimatedTexturesPerSecond();
7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  size_t textures_per_tick = floor(
77853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)      kTextureUploadTickRate * textures_per_second);
779926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  return textures_per_tick ? textures_per_tick : 1u;
780926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
781926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
782926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void ResourceProvider::FlushUploads() {
783926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  if (!texture_uploader_)
78453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return;
785926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  texture_uploader_->Flush();
787926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
788926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ResourceProvider::ReleaseCachedData() {
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (!texture_uploader_)
7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return;
7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  texture_uploader_->ReleaseCachedQueries();
7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)base::TimeTicks ResourceProvider::EstimatedUploadCompletionTime(
7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t uploads_per_tick) {
7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (lost_output_surface_)
7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return base::TimeTicks();
8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Software resource uploads happen on impl thread, so don't bother batching
8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // them up and trying to wait for them to complete.
8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (!texture_uploader_) {
8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return gfx::FrameTime::Now() + base::TimeDelta::FromMicroseconds(
8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        base::Time::kMicrosecondsPerSecond * kSoftwareUploadTickRate);
8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
808591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch  base::TimeDelta upload_one_texture_time =
8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      base::TimeDelta::FromMicroseconds(
810591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch          base::Time::kMicrosecondsPerSecond * kTextureUploadTickRate) /
8115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      uploads_per_tick;
8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
813521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)  size_t total_uploads = NumBlockingUploads() + uploads_per_tick;
8145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return gfx::FrameTime::Now() + upload_one_texture_time * total_uploads;
815926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
8165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ResourceProvider::Resource* ResourceProvider::GetResource(ResourceId id) {
8185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
8195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ResourceMap::iterator it = resources_.find(id);
820521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)  CHECK(it != resources_.end());
8215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return &it->second;
8225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const ResourceProvider::Resource* ResourceProvider::LockForRead(ResourceId id) {
8255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Resource* resource = GetResource(id);
8265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(!resource->locked_for_write ||
8275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         resource->set_pixels_completion_forced) <<
828521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)      "locked for write: " << resource->locked_for_write <<
8295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      " pixels completion forced: " << resource->set_pixels_completion_forced;
830521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)  DCHECK_EQ(resource->exported_count, 0);
8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Uninitialized! Call SetPixels or LockForWrite first.
8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(resource->allocated);
8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  LazyCreate(resource);
8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (resource->type == GLTexture && !resource->gl_id) {
8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK(resource->origin != Resource::Internal);
8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK(resource->mailbox.IsTexture());
8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Mailbox sync_points must be processed by a call to
8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // WaitSyncPointIfNeeded() prior to calling LockForRead().
8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK(!resource->mailbox.sync_point());
8435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLES2Interface* gl = ContextGL();
8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK(gl);
8465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resource->gl_id = texture_id_allocator_->NextId();
8475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLC(gl, gl->BindTexture(resource->target, resource->gl_id));
8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLC(gl,
8495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        gl->ConsumeTextureCHROMIUM(resource->mailbox.target(),
8505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                   resource->mailbox.name()));
8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (!resource->pixels && resource->has_shared_bitmap_id &&
8545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      shared_bitmap_manager_) {
85553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    scoped_ptr<SharedBitmap> bitmap =
8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        shared_bitmap_manager_->GetSharedBitmapFromId(
8575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            resource->size, resource->shared_bitmap_id);
8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (bitmap) {
8595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      resource->shared_bitmap = bitmap.release();
8605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      resource->pixels = resource->shared_bitmap->pixels();
8615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
8635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  resource->lock_for_read_count++;
8655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (resource->read_lock_fences_enabled) {
8665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (current_read_lock_fence_.get())
8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      current_read_lock_fence_->Set();
8685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resource->read_lock_fence = current_read_lock_fence_;
8695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
8705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return resource;
8725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ResourceProvider::UnlockForRead(ResourceId id) {
8755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
8765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ResourceMap::iterator it = resources_.find(id);
8775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  CHECK(it != resources_.end());
8785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Resource* resource = &it->second;
8805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK_GT(resource->lock_for_read_count, 0);
8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK_EQ(resource->exported_count, 0);
8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  resource->lock_for_read_count--;
8835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (resource->marked_for_deletion && !resource->lock_for_read_count) {
8845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!resource->child_id) {
8855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      // The resource belongs to this ResourceProvider, so it can be destroyed.
8865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      DeleteResourceInternal(it, Normal);
8875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
8885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      ChildMap::iterator child_it = children_.find(resource->child_id);
8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      ResourceIdArray unused;
8905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      unused.push_back(id);
8915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      DeleteAndReturnUnusedResourcesToChild(child_it, Normal, unused);
8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const ResourceProvider::Resource* ResourceProvider::LockForWrite(
8975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceId id) {
8985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Resource* resource = GetResource(id);
8995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(!resource->locked_for_write);
9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(!resource->lock_for_read_count);
9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK_EQ(resource->exported_count, 0);
9025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(resource->origin == Resource::Internal);
9035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(!resource->lost);
9045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(ReadLockFenceHasPassed(resource));
9055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  LazyAllocate(resource);
9065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  resource->locked_for_write = true;
9085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return resource;
9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
911926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool ResourceProvider::CanLockForWrite(ResourceId id) {
912926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  Resource* resource = GetResource(id);
913926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  return !resource->locked_for_write && !resource->lock_for_read_count &&
914926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)         !resource->exported_count && resource->origin == Resource::Internal &&
9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         !resource->lost && ReadLockFenceHasPassed(resource);
9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ResourceProvider::UnlockForWrite(ResourceId id) {
9195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Resource* resource = GetResource(id);
9205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(resource->locked_for_write);
9215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK_EQ(resource->exported_count, 0);
9225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(resource->origin == Resource::Internal);
9235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  resource->locked_for_write = false;
9245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
925926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
926926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)ResourceProvider::ScopedReadLockGL::ScopedReadLockGL(
9275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceProvider* resource_provider,
9285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceProvider::ResourceId resource_id)
9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : resource_provider_(resource_provider),
9305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      resource_id_(resource_id),
9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      texture_id_(resource_provider->LockForRead(resource_id)->gl_id) {
9325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(texture_id_);
9335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ResourceProvider::ScopedReadLockGL::~ScopedReadLockGL() {
936926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  resource_provider_->UnlockForRead(resource_id_);
9375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ResourceProvider::ScopedSamplerGL::ScopedSamplerGL(
9405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceProvider* resource_provider,
9415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceProvider::ResourceId resource_id,
9425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLenum filter)
9435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : ScopedReadLockGL(resource_provider, resource_id),
9445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      unit_(GL_TEXTURE0),
9455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      target_(resource_provider->BindForSampling(resource_id, unit_, filter)) {
9465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ResourceProvider::ScopedSamplerGL::ScopedSamplerGL(
9495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceProvider* resource_provider,
9505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceProvider::ResourceId resource_id,
9515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLenum unit,
9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLenum filter)
9535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : ScopedReadLockGL(resource_provider, resource_id),
9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      unit_(unit),
9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      target_(resource_provider->BindForSampling(resource_id, unit_, filter)) {
9565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ResourceProvider::ScopedSamplerGL::~ScopedSamplerGL() {
9595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ResourceProvider::ScopedWriteLockGL::ScopedWriteLockGL(
9625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceProvider* resource_provider,
9635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceProvider::ResourceId resource_id)
9645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : resource_provider_(resource_provider),
9655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      resource_id_(resource_id),
9665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      texture_id_(resource_provider->LockForWrite(resource_id)->gl_id) {
9675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(texture_id_);
9685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL() {
9715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  resource_provider_->UnlockForWrite(resource_id_);
9725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ResourceProvider::PopulateSkBitmapWithResource(
9755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SkBitmap* sk_bitmap, const Resource* resource) {
9765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK_EQ(RGBA_8888, resource->format);
9775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  SkImageInfo info = SkImageInfo::MakeN32Premul(resource->size.width(),
9785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                resource->size.height());
9795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  sk_bitmap->installPixels(info, resource->pixels, info.minRowBytes());
9805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ResourceProvider::ScopedReadLockSoftware::ScopedReadLockSoftware(
9835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceProvider* resource_provider,
9845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceProvider::ResourceId resource_id)
9855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : resource_provider_(resource_provider),
9865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      resource_id_(resource_id) {
9875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  const Resource* resource = resource_provider->LockForRead(resource_id);
9885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  wrap_mode_ = resource->wrap_mode;
9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ResourceProvider::PopulateSkBitmapWithResource(&sk_bitmap_, resource);
9905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ResourceProvider::ScopedReadLockSoftware::~ScopedReadLockSoftware() {
9935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  resource_provider_->UnlockForRead(resource_id_);
9945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ResourceProvider::ScopedWriteLockSoftware::ScopedWriteLockSoftware(
9975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceProvider* resource_provider,
9985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceProvider::ResourceId resource_id)
9995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : resource_provider_(resource_provider),
10005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      resource_id_(resource_id) {
10015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ResourceProvider::PopulateSkBitmapWithResource(
10025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      &sk_bitmap_, resource_provider->LockForWrite(resource_id));
10035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(valid());
10045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  sk_canvas_.reset(new SkCanvas(sk_bitmap_));
10055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ResourceProvider::ScopedWriteLockSoftware::~ScopedWriteLockSoftware() {
10085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  resource_provider_->UnlockForWrite(resource_id_);
10095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ResourceProvider::ResourceProvider(
10125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    OutputSurface* output_surface,
10135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SharedBitmapManager* shared_bitmap_manager,
10145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    BlockingTaskRunner* blocking_main_thread_task_runner,
10155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int highp_threshold_min,
10165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool use_rgba_4444_texture_format,
10175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t id_allocation_chunk_size,
10185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool use_distance_field_text)
10195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : output_surface_(output_surface),
10205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      shared_bitmap_manager_(shared_bitmap_manager),
10215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      blocking_main_thread_task_runner_(blocking_main_thread_task_runner),
10225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      lost_output_surface_(false),
10235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      highp_threshold_min_(highp_threshold_min),
10245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      next_id_(1),
10255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      next_child_(1),
10265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      default_resource_type_(InvalidType),
10275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      use_texture_storage_ext_(false),
10285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      use_texture_format_bgra_(false),
10295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      use_texture_usage_hint_(false),
10305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      use_compressed_texture_etc1_(false),
10315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      max_texture_size_(0),
10325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      best_texture_format_(RGBA_8888),
10335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      use_rgba_4444_texture_format_(use_rgba_4444_texture_format),
10345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      id_allocation_chunk_size_(id_allocation_chunk_size),
1035e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch      use_sync_query_(false),
10365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      use_distance_field_text_(use_distance_field_text) {
10375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(output_surface_->HasClient());
10385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(id_allocation_chunk_size_);
10395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ResourceProvider::InitializeSoftware() {
10425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
10435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK_NE(Bitmap, default_resource_type_);
10445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  CleanUpGLIfNeeded();
10465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  default_resource_type_ = Bitmap;
10485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Pick an arbitrary limit here similar to what hardware might.
10495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  max_texture_size_ = 16 * 1024;
10505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  best_texture_format_ = RGBA_8888;
10515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ResourceProvider::InitializeGL() {
10545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
10555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(!texture_uploader_);
10565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK_NE(GLTexture, default_resource_type_);
10575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(!texture_id_allocator_);
10585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(!buffer_id_allocator_);
10595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  default_resource_type_ = GLTexture;
10615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  const ContextProvider::Capabilities& caps =
10635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      output_surface_->context_provider()->ContextCapabilities();
10645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bool use_bgra = caps.gpu.texture_format_bgra8888;
10665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  use_texture_storage_ext_ = caps.gpu.texture_storage;
10675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  use_texture_format_bgra_ = caps.gpu.texture_format_bgra8888;
10685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  use_texture_usage_hint_ = caps.gpu.texture_usage;
10695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  use_compressed_texture_etc1_ = caps.gpu.texture_format_etc1;
10705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  use_sync_query_ = caps.gpu.sync_query;
10715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  GLES2Interface* gl = ContextGL();
10735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(gl);
10745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  texture_uploader_ = TextureUploader::Create(gl);
10765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  max_texture_size_ = 0;  // Context expects cleared value.
10775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  GLC(gl, gl->GetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size_));
10785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  best_texture_format_ = PlatformColor::BestTextureFormat(use_bgra);
10795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  texture_id_allocator_.reset(
10815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      new TextureIdAllocator(gl, id_allocation_chunk_size_));
10825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  buffer_id_allocator_.reset(
10835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      new BufferIdAllocator(gl, id_allocation_chunk_size_));
10845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1086926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void ResourceProvider::CleanUpGLIfNeeded() {
1087e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch  GLES2Interface* gl = ContextGL();
10885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (default_resource_type_ != GLTexture) {
10895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // We are not in GL mode, but double check before returning.
10905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK(!gl);
10915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK(!texture_uploader_);
10925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return;
10935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
10945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(gl);
10965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if DCHECK_IS_ON
10975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Check that all GL resources has been deleted.
10985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  for (ResourceMap::const_iterator itr = resources_.begin();
10995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       itr != resources_.end();
11005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       ++itr) {
11015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK_NE(GLTexture, itr->second.type);
11025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
11035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif  // DCHECK_IS_ON
11045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  texture_uploader_.reset();
11065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  texture_id_allocator_.reset();
11075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  buffer_id_allocator_.reset();
11085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  gl->Finish();
11095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int ResourceProvider::CreateChild(const ReturnCallback& return_callback) {
11125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
11135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Child child_info;
11155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  child_info.return_callback = return_callback;
11165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  int child = next_child_++;
11185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  children_[child] = child_info;
11195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return child;
11205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ResourceProvider::DestroyChild(int child_id) {
11235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ChildMap::iterator it = children_.find(child_id);
11245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(it != children_.end());
11255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DestroyChildInternal(it, Normal);
11265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ResourceProvider::DestroyChildInternal(ChildMap::iterator it,
11295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                            DeleteStyle style) {
1130591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch  DCHECK(thread_checker_.CalledOnValidThread());
11315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Child& child = it->second;
11335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(style == ForShutdown || !child.marked_for_deletion);
11345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ResourceIdArray resources_for_child;
11365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  for (ResourceIdMap::iterator child_it = child.child_to_parent_map.begin();
11385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       child_it != child.child_to_parent_map.end();
11395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       ++child_it) {
11405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceId id = child_it->second;
11415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resources_for_child.push_back(id);
11425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
11435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // If the child is going away, don't consider any resources in use.
11455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  child.in_use_resources.clear();
1146591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch  child.marked_for_deletion = true;
1147591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
11485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DeleteAndReturnUnusedResourcesToChild(it, style, resources_for_child);
11495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const ResourceProvider::ResourceIdMap& ResourceProvider::GetChildToParentMap(
11525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int child) const {
11535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
11545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ChildMap::const_iterator it = children_.find(child);
11555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(it != children_.end());
11565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(!it->second.marked_for_deletion);
11575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return it->second.child_to_parent_map;
11585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1159591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
11605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ResourceProvider::PrepareSendToParent(const ResourceIdArray& resources,
11615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                           TransferableResourceArray* list) {
11625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
11635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  GLES2Interface* gl = ContextGL();
11645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bool need_sync_point = false;
11655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  for (ResourceIdArray::const_iterator it = resources.begin();
11665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       it != resources.end();
11675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       ++it) {
11685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TransferableResource resource;
11695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TransferResource(gl, *it, &resource);
11705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!resource.mailbox_holder.sync_point && !resource.is_software)
11715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      need_sync_point = true;
11725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ++resources_.find(*it)->second.exported_count;
11735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    list->push_back(resource);
11745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
11755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (need_sync_point) {
11765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLuint sync_point = gl->InsertSyncPointCHROMIUM();
11775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (TransferableResourceArray::iterator it = list->begin();
11785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         it != list->end();
11795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)         ++it) {
11805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (!it->mailbox_holder.sync_point)
11815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        it->mailbox_holder.sync_point = sync_point;
11825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
11845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1186591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid ResourceProvider::ReceiveFromChild(
11875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int child, const TransferableResourceArray& resources) {
11885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
11895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  GLES2Interface* gl = ContextGL();
11905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Child& child_info = children_.find(child)->second;
11915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(!child_info.marked_for_deletion);
1192591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch  for (TransferableResourceArray::const_iterator it = resources.begin();
11935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       it != resources.end();
11945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       ++it) {
11955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceIdMap::iterator resource_in_map_it =
11965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        child_info.child_to_parent_map.find(it->id);
11975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (resource_in_map_it != child_info.child_to_parent_map.end()) {
119881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)      Resource& resource = resources_[resource_in_map_it->second];
11995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      resource.marked_for_deletion = false;
12005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      resource.imported_count++;
12015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      continue;
12025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
12035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if ((!it->is_software && !gl) ||
12055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        (it->is_software && !shared_bitmap_manager_)) {
12065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      TRACE_EVENT0("cc", "ResourceProvider::ReceiveFromChild dropping invalid");
12075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      ReturnedResourceArray to_return;
12085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      to_return.push_back(it->ToReturnedResource());
12095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      child_info.return_callback.Run(to_return,
12105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                     blocking_main_thread_task_runner_);
12115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      continue;
12125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
12135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceId local_id = next_id_++;
12155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Resource& resource = resources_[local_id];
12165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (it->is_software) {
12175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      resource = Resource(it->mailbox_holder.mailbox,
1218591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch                          it->size,
12195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                          Resource::Delegated,
12205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                          GL_LINEAR,
12215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                          it->is_repeated ? GL_REPEAT : GL_CLAMP_TO_EDGE);
12225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
12235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      resource = Resource(0,
12245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                          it->size,
12255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                          Resource::Delegated,
12265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                          it->mailbox_holder.texture_target,
12275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                          it->filter,
12285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                          0,
12295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                          it->is_repeated ? GL_REPEAT : GL_CLAMP_TO_EDGE,
12305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                          TextureHintImmutable,
12315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                          it->format);
123253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)      resource.mailbox = TextureMailbox(it->mailbox_holder.mailbox,
12335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        it->mailbox_holder.texture_target,
12345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        it->mailbox_holder.sync_point);
12355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
12365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resource.child_id = child;
12375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Don't allocate a texture for a child.
12385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resource.allocated = true;
12395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resource.imported_count = 1;
12405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resource.allow_overlay = it->allow_overlay;
12415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    child_info.parent_to_child_map[local_id] = it->id;
12425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    child_info.child_to_parent_map[it->id] = local_id;
12435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
12445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ResourceProvider::DeclareUsedResourcesFromChild(
12475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int child,
12485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const ResourceIdArray& resources_from_child) {
12495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
12505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ChildMap::iterator child_it = children_.find(child);
12525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(child_it != children_.end());
12535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Child& child_info = child_it->second;
12545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(!child_info.marked_for_deletion);
12555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  child_info.in_use_resources.clear();
12565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  for (size_t i = 0; i < resources_from_child.size(); ++i) {
12585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceIdMap::iterator it =
12595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        child_info.child_to_parent_map.find(resources_from_child[i]);
12605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK(it != child_info.child_to_parent_map.end());
12615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceId local_id = it->second;
12635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK(!resources_[local_id].marked_for_deletion);
12645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    child_info.in_use_resources.insert(local_id);
12655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
12665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ResourceIdArray unused;
12685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  for (ResourceIdMap::iterator it = child_info.child_to_parent_map.begin();
12695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       it != child_info.child_to_parent_map.end();
12705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       ++it) {
12715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceId local_id = it->second;
12725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool resource_is_in_use = child_info.in_use_resources.count(local_id) > 0;
12735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!resource_is_in_use)
12745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      unused.push_back(local_id);
12755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
12765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DeleteAndReturnUnusedResourcesToChild(child_it, Normal, unused);
12775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// static
12805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ResourceProvider::CompareResourceMapIteratorsByChildId(
12815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const std::pair<ReturnedResource, ResourceMap::iterator>& a,
12825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const std::pair<ReturnedResource, ResourceMap::iterator>& b) {
12835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  const ResourceMap::iterator& a_it = a.second;
12845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  const ResourceMap::iterator& b_it = b.second;
12855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  const Resource& a_resource = a_it->second;
12865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  const Resource& b_resource = b_it->second;
12875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return a_resource.child_id < b_resource.child_id;
12885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ResourceProvider::ReceiveReturnsFromParent(
12915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const ReturnedResourceArray& resources) {
12925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
12935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  GLES2Interface* gl = ContextGL();
12945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  int child_id = 0;
12965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ResourceIdArray resources_for_child;
12975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  std::vector<std::pair<ReturnedResource, ResourceMap::iterator> >
12995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      sorted_resources;
13005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  for (ReturnedResourceArray::const_iterator it = resources.begin();
13025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       it != resources.end();
13035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       ++it) {
13045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceId local_id = it->id;
13055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceMap::iterator map_iterator = resources_.find(local_id);
13065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Resource was already lost (e.g. it belonged to a child that was
13085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // destroyed).
13095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (map_iterator == resources_.end())
13105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      continue;
13115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    sorted_resources.push_back(
13135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        std::pair<ReturnedResource, ResourceMap::iterator>(*it, map_iterator));
13145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
13155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  std::sort(sorted_resources.begin(),
13175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            sorted_resources.end(),
13185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            CompareResourceMapIteratorsByChildId);
13195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ChildMap::iterator child_it = children_.end();
13215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  for (size_t i = 0; i < sorted_resources.size(); ++i) {
13225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ReturnedResource& returned = sorted_resources[i].first;
13235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceMap::iterator& map_iterator = sorted_resources[i].second;
13245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceId local_id = map_iterator->first;
1325e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    Resource* resource = &map_iterator->second;
13265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CHECK_GE(resource->exported_count, returned.count);
13285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resource->exported_count -= returned.count;
13295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resource->lost |= returned.lost;
13305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (resource->exported_count)
13315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      continue;
13325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Need to wait for the current read lock fence to pass before we can
13345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // recycle this resource.
13355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (resource->read_lock_fences_enabled) {
13365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (current_read_lock_fence_.get())
13375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        current_read_lock_fence_->Set();
13385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      resource->read_lock_fence = current_read_lock_fence_;
13395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (returned.sync_point) {
13425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      DCHECK(!resource->has_shared_bitmap_id);
1343e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch      if (resource->origin == Resource::Internal) {
13445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DCHECK(resource->gl_id);
13455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        GLC(gl, gl->WaitSyncPointCHROMIUM(returned.sync_point));
13465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      } else {
13475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DCHECK(!resource->gl_id);
13485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        resource->mailbox.set_sync_point(returned.sync_point);
13495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
13505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!resource->marked_for_deletion)
13535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      continue;
13545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!resource->child_id) {
13565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      // The resource belongs to this ResourceProvider, so it can be destroyed.
13575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      DeleteResourceInternal(map_iterator, Normal);
13585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      continue;
13595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK(resource->origin == Resource::Delegated);
13625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Delete the resource and return it to the child it came from one.
13635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (resource->child_id != child_id) {
13645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (child_id) {
13655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DCHECK_NE(resources_for_child.size(), 0u);
13665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DCHECK(child_it != children_.end());
13675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DeleteAndReturnUnusedResourcesToChild(
13685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            child_it, Normal, resources_for_child);
13695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        resources_for_child.clear();
13705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
13715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      child_it = children_.find(resource->child_id);
13735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      DCHECK(child_it != children_.end());
13745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      child_id = resource->child_id;
13755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
13765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resources_for_child.push_back(local_id);
13775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
13785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (child_id) {
13805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK_NE(resources_for_child.size(), 0u);
13815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK(child_it != children_.end());
13825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DeleteAndReturnUnusedResourcesToChild(
13835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        child_it, Normal, resources_for_child);
13845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
13855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ResourceProvider::TransferResource(GLES2Interface* gl,
13885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        ResourceId id,
13895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        TransferableResource* resource) {
13905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Resource* source = GetResource(id);
13915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(!source->locked_for_write);
13925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(!source->lock_for_read_count);
13935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(source->origin != Resource::External || source->mailbox.IsValid());
13945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(source->allocated);
13955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  resource->id = id;
13965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  resource->format = source->format;
13975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  resource->mailbox_holder.texture_target = source->target;
13985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  resource->filter = source->filter;
13995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  resource->size = source->size;
14005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  resource->is_repeated = (source->wrap_mode == GL_REPEAT);
14015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  resource->allow_overlay = source->allow_overlay;
14025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (source->type == Bitmap) {
14045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resource->mailbox_holder.mailbox = source->shared_bitmap_id;
14055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resource->is_software = true;
14065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  } else if (!source->mailbox.IsValid()) {
14075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LazyCreate(source);
14085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK(source->gl_id);
14095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK(source->origin == Resource::Internal);
14105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLC(gl,
14115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        gl->BindTexture(resource->mailbox_holder.texture_target,
14125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        source->gl_id));
14135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (source->image_id) {
14145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      DCHECK(source->dirty_image);
14155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      BindImageForSampling(source);
14165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
14175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This is a resource allocated by the compositor, we need to produce it.
14185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Don't set a sync point, the caller will do it.
14195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLC(gl, gl->GenMailboxCHROMIUM(resource->mailbox_holder.mailbox.name));
14205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLC(gl,
14215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        gl->ProduceTextureCHROMIUM(resource->mailbox_holder.texture_target,
14225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                   resource->mailbox_holder.mailbox.name));
14235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    source->mailbox = TextureMailbox(resource->mailbox_holder);
14245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  } else {
14255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK(source->mailbox.IsTexture());
14265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (source->image_id && source->dirty_image) {
14275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      DCHECK(source->gl_id);
14285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      DCHECK(source->origin == Resource::Internal);
14295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      GLC(gl,
14305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          gl->BindTexture(resource->mailbox_holder.texture_target,
14315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                          source->gl_id));
1432926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)      BindImageForSampling(source);
1433926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
1434926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // This is either an external resource, or a compositor resource that we
1435926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // already exported. Make sure to forward the sync point that we were given.
1436926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    resource->mailbox_holder.mailbox = source->mailbox.mailbox();
143753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    resource->mailbox_holder.texture_target = source->mailbox.target();
1438926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    resource->mailbox_holder.sync_point = source->mailbox.sync_point();
1439926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    source->mailbox.set_sync_point(0);
1440926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  }
1441926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
144253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
14435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ResourceProvider::DeleteAndReturnUnusedResourcesToChild(
14445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ChildMap::iterator child_it,
14455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DeleteStyle style,
14465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const ResourceIdArray& unused) {
14475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
14485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(child_it != children_.end());
14495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Child* child_info = &child_it->second;
14505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (unused.empty() && !child_info->marked_for_deletion)
14525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return;
1453926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1454926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  ReturnedResourceArray to_return;
1455926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1456926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  GLES2Interface* gl = ContextGL();
1457926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  bool need_sync_point = false;
14585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  for (size_t i = 0; i < unused.size(); ++i) {
14595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceId local_id = unused[i];
14605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceMap::iterator it = resources_.find(local_id);
14625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CHECK(it != resources_.end());
14635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Resource& resource = it->second;
14645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK(!resource.locked_for_write);
14665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK_EQ(0u, child_info->in_use_resources.count(local_id));
14675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK(child_info->parent_to_child_map.count(local_id));
14685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ResourceId child_id = child_info->parent_to_child_map[local_id];
14705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK(child_info->child_to_parent_map.count(child_id));
14715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool is_lost =
1473521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        resource.lost || (resource.type == GLTexture && lost_output_surface_);
1474521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    if (resource.exported_count > 0 || resource.lock_for_read_count > 0) {
14755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (style != ForShutdown) {
14765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Defer this until we receive the resource back from the parent or
14775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // the read lock is released.
14785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        resource.marked_for_deletion = true;
14795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        continue;
14805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      }
14815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      // We still have an exported_count, so we'll have to lose it.
14835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      is_lost = true;
14845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
14855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (gl && resource.filter != resource.original_filter) {
14875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      DCHECK(resource.target);
14885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      DCHECK(resource.gl_id);
14895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1490926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)      GLC(gl, gl->BindTexture(resource.target, resource.gl_id));
1491926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)      GLC(gl,
1492926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)          gl->TexParameteri(resource.target,
14935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                            GL_TEXTURE_MIN_FILTER,
14945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                            resource.original_filter));
14955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      GLC(gl,
1496926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)          gl->TexParameteri(resource.target,
1497926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                            GL_TEXTURE_MAG_FILTER,
14985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                            resource.original_filter));
14995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1500926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1501926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ReturnedResource returned;
1502926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    returned.id = child_id;
15035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    returned.sync_point = resource.mailbox.sync_point();
15045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!returned.sync_point && resource.type == GLTexture)
15055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      need_sync_point = true;
15065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    returned.count = resource.imported_count;
15075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    returned.lost = is_lost;
15085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    to_return.push_back(returned);
15095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    child_info->parent_to_child_map.erase(local_id);
15115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    child_info->child_to_parent_map.erase(child_id);
15125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resource.imported_count = 0;
15135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DeleteResourceInternal(it, style);
15145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
15155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (need_sync_point) {
15165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK(gl);
15175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLuint sync_point = gl->InsertSyncPointCHROMIUM();
15185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < to_return.size(); ++i) {
15195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if (!to_return[i].sync_point)
15205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        to_return[i].sync_point = sync_point;
15215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
15225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
1523926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
15245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (!to_return.empty())
15255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    child_info->return_callback.Run(to_return,
15265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                    blocking_main_thread_task_runner_);
15275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (child_info->marked_for_deletion &&
15295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      child_info->parent_to_child_map.empty()) {
15305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK(child_info->child_to_parent_map.empty());
15315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    children_.erase(child_it);
153253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)  }
15335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ResourceProvider::AcquirePixelBuffer(ResourceId id) {
15365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
15375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               "ResourceProvider::AcquirePixelBuffer");
15385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Resource* resource = GetResource(id);
15405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(resource->origin == Resource::Internal);
15415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK_EQ(resource->exported_count, 0);
15425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(!resource->image_id);
15435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK_NE(ETC1, resource->format);
15445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK_EQ(GLTexture, resource->type);
15465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  GLES2Interface* gl = ContextGL();
15475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(gl);
15485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (!resource->gl_pixel_buffer_id)
15495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resource->gl_pixel_buffer_id = buffer_id_allocator_->NextId();
15505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM,
15515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 resource->gl_pixel_buffer_id);
15525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  unsigned bytes_per_pixel = BitsPerPixel(resource->format) / 8;
15535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  gl->BufferData(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM,
15545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 resource->size.height() *
15555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                     RoundUp(bytes_per_pixel * resource->size.width(), 4u),
15565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 NULL,
15575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 GL_DYNAMIC_DRAW);
15585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0);
15595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ResourceProvider::ReleasePixelBuffer(ResourceId id) {
15625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
15635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               "ResourceProvider::ReleasePixelBuffer");
15645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Resource* resource = GetResource(id);
15665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(resource->origin == Resource::Internal);
15675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK_EQ(resource->exported_count, 0);
15685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(!resource->image_id);
15695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // The pixel buffer can be released while there is a pending "set pixels"
15715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // if completion has been forced. Any shared memory associated with this
15725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // pixel buffer will not be freed until the waitAsyncTexImage2DCHROMIUM
15735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // command has been processed on the service side. It is also safe to
15745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // reuse any query id associated with this resource before they complete
15755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // as each new query has a unique submit count.
15765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (resource->pending_set_pixels) {
15775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DCHECK(resource->set_pixels_completion_forced);
15785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resource->pending_set_pixels = false;
15795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resource->locked_for_write = false;
15805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
15815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK_EQ(GLTexture, resource->type);
15835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (!resource->gl_pixel_buffer_id)
15845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return;
15855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  GLES2Interface* gl = ContextGL();
15865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(gl);
15875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM,
15885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 resource->gl_pixel_buffer_id);
15895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  gl->BufferData(
15905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0, NULL, GL_DYNAMIC_DRAW);
15915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0);
15925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
15935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)uint8_t* ResourceProvider::MapPixelBuffer(ResourceId id, int* stride) {
15955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
15965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               "ResourceProvider::MapPixelBuffer");
15975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Resource* resource = GetResource(id);
15995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(resource->origin == Resource::Internal);
16005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK_EQ(resource->exported_count, 0);
16015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(!resource->image_id);
16025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  *stride = 0;
16045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK_EQ(GLTexture, resource->type);
16055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  GLES2Interface* gl = ContextGL();
16065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(gl);
16075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(resource->gl_pixel_buffer_id);
16085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM,
16095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 resource->gl_pixel_buffer_id);
16105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  uint8_t* image = static_cast<uint8_t*>(gl->MapBufferCHROMIUM(
16115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, GL_WRITE_ONLY));
16125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0);
16135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Buffer is required to be 4-byte aligned.
16145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  CHECK(!(reinterpret_cast<intptr_t>(image) & 3));
16155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return image;
16165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1618926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void ResourceProvider::UnmapPixelBuffer(ResourceId id) {
1619926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
1620926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)               "ResourceProvider::UnmapPixelBuffer");
1621926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1622926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  Resource* resource = GetResource(id);
16235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(resource->origin == Resource::Internal);
16245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK_EQ(resource->exported_count, 0);
16255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(!resource->image_id);
16265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK_EQ(GLTexture, resource->type);
16285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  GLES2Interface* gl = ContextGL();
16295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(gl);
16305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(resource->gl_pixel_buffer_id);
16315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM,
16325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 resource->gl_pixel_buffer_id);
16335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  gl->UnmapBufferCHROMIUM(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM);
16345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0);
16355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)GLenum ResourceProvider::BindForSampling(ResourceId resource_id,
16385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                         GLenum unit,
16395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                         GLenum filter) {
16405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(thread_checker_.CalledOnValidThread());
16415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  GLES2Interface* gl = ContextGL();
16425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ResourceMap::iterator it = resources_.find(resource_id);
16435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(it != resources_.end());
16445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Resource* resource = &it->second;
16455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(resource->lock_for_read_count);
16465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(!resource->locked_for_write || resource->set_pixels_completion_forced);
16475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ScopedSetActiveTexture scoped_active_tex(gl, unit);
16495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  GLenum target = resource->target;
16505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  GLC(gl, gl->BindTexture(target, resource->gl_id));
16515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (filter != resource->filter) {
16525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLC(gl, gl->TexParameteri(target, GL_TEXTURE_MIN_FILTER, filter));
16535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLC(gl, gl->TexParameteri(target, GL_TEXTURE_MAG_FILTER, filter));
16545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    resource->filter = filter;
16555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
16565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (resource->image_id && resource->dirty_image)
16585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    BindImageForSampling(resource);
16595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return target;
16615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
16625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ResourceProvider::BeginSetPixels(ResourceId id) {
16645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
16655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               "ResourceProvider::BeginSetPixels");
16665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Resource* resource = GetResource(id);
16685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(!resource->pending_set_pixels);
16695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  LazyCreate(resource);
16715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(resource->origin == Resource::Internal);
16725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(resource->gl_id || resource->allocated);
16735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(ReadLockFenceHasPassed(resource));
16745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(!resource->image_id);
16755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  bool allocate = !resource->allocated;
16775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  resource->allocated = true;
16785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  LockForWrite(id);
16795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK_EQ(GLTexture, resource->type);
16815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(resource->gl_id);
16825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  GLES2Interface* gl = ContextGL();
16835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(gl);
16845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(resource->gl_pixel_buffer_id);
16855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK_EQ(resource->target, static_cast<GLenum>(GL_TEXTURE_2D));
16865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  gl->BindTexture(GL_TEXTURE_2D, resource->gl_id);
16875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM,
16885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 resource->gl_pixel_buffer_id);
16895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (!resource->gl_upload_query_id)
16905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    gl->GenQueriesEXT(1, &resource->gl_upload_query_id);
16915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  gl->BeginQueryEXT(GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM,
16925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    resource->gl_upload_query_id);
16935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (allocate) {
16945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    gl->AsyncTexImage2DCHROMIUM(GL_TEXTURE_2D,
16955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                0, /* level */
16965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                GLInternalFormat(resource->format),
16975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                resource->size.width(),
16985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                resource->size.height(),
16995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                0, /* border */
17005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                GLDataFormat(resource->format),
17015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                GLDataType(resource->format),
17025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                NULL);
17035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  } else {
17045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    gl->AsyncTexSubImage2DCHROMIUM(GL_TEXTURE_2D,
17055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                   0, /* level */
17065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                   0, /* x */
17075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                   0, /* y */
17085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                   resource->size.width(),
17095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                   resource->size.height(),
17105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                   GLDataFormat(resource->format),
17115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                   GLDataType(resource->format),
17125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                   NULL);
1713926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  }
17145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  gl->EndQueryEXT(GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM);
17155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  gl->BindBuffer(GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM, 0);
1716926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
17175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  resource->pending_set_pixels = true;
17185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  resource->set_pixels_completion_forced = false;
17195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ResourceProvider::ForceSetPixelsToComplete(ResourceId id) {
17225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
17235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               "ResourceProvider::ForceSetPixelsToComplete");
17245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Resource* resource = GetResource(id);
17265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(resource->locked_for_write);
17285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(resource->pending_set_pixels);
17295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(!resource->set_pixels_completion_forced);
17305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (resource->gl_id) {
17325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLES2Interface* gl = ContextGL();
17335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLC(gl, gl->BindTexture(GL_TEXTURE_2D, resource->gl_id));
17345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLC(gl, gl->WaitAsyncTexImage2DCHROMIUM(GL_TEXTURE_2D));
17355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLC(gl, gl->BindTexture(GL_TEXTURE_2D, 0));
17365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
17375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  resource->set_pixels_completion_forced = true;
17395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
174153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool ResourceProvider::DidSetPixelsComplete(ResourceId id) {
17425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
17435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)               "ResourceProvider::DidSetPixelsComplete");
17445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Resource* resource = GetResource(id);
17465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1747e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch  DCHECK(resource->locked_for_write);
17485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(resource->pending_set_pixels);
1749e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch
1750e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch  if (resource->gl_id) {
17515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLES2Interface* gl = ContextGL();
1752e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    DCHECK(gl);
1753e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    DCHECK(resource->gl_upload_query_id);
1754e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    GLuint complete = 1;
1755e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    gl->GetQueryObjectuivEXT(
1756e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        resource->gl_upload_query_id, GL_QUERY_RESULT_AVAILABLE_EXT, &complete);
1757e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (!complete)
1758e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch      return false;
1759e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch  }
17605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1761e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch  resource->pending_set_pixels = false;
17625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  UnlockForWrite(id);
17635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return true;
1765926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
17665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ResourceProvider::CreateForTesting(ResourceId id) {
17685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  LazyCreate(GetResource(id));
1769926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
17705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)GLenum ResourceProvider::TargetForTesting(ResourceId id) {
17725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Resource* resource = GetResource(id);
17735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return resource->target;
17745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ResourceProvider::LazyCreate(Resource* resource) {
17775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (resource->type != GLTexture || resource->origin != Resource::Internal)
17785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return;
17795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (resource->gl_id)
17815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return;
17825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(resource->texture_pool);
17845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(resource->origin == Resource::Internal);
17855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(!resource->mailbox.IsValid());
17865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  resource->gl_id = texture_id_allocator_->NextId();
17875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  GLES2Interface* gl = ContextGL();
17895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(gl);
17905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Create and set texture properties. Allocation is delayed until needed.
17925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  GLC(gl, gl->BindTexture(resource->target, resource->gl_id));
17935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  GLC(gl,
17945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      gl->TexParameteri(
17955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          resource->target, GL_TEXTURE_MIN_FILTER, resource->original_filter));
17965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  GLC(gl,
17975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      gl->TexParameteri(
17985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          resource->target, GL_TEXTURE_MAG_FILTER, resource->original_filter));
17995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  GLC(gl,
18005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      gl->TexParameteri(
18015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          resource->target, GL_TEXTURE_WRAP_S, resource->wrap_mode));
18025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  GLC(gl,
18035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      gl->TexParameteri(
18045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          resource->target, GL_TEXTURE_WRAP_T, resource->wrap_mode));
18055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  GLC(gl,
18065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      gl->TexParameteri(
18075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          resource->target, GL_TEXTURE_POOL_CHROMIUM, resource->texture_pool));
18085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (use_texture_usage_hint_ && (resource->hint & TextureHintFramebuffer)) {
18095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLC(gl,
18105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        gl->TexParameteri(resource->target,
18115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                          GL_TEXTURE_USAGE_ANGLE,
18125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                          GL_FRAMEBUFFER_ATTACHMENT_ANGLE));
18135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
18145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ResourceProvider::AllocateForTesting(ResourceId id) {
18175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  LazyAllocate(GetResource(id));
18185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ResourceProvider::LazyAllocate(Resource* resource) {
18215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(resource);
18225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (resource->allocated)
18235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return;
18245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  LazyCreate(resource);
18255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (!resource->gl_id)
18265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return;
18275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  resource->allocated = true;
18285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  GLES2Interface* gl = ContextGL();
18295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  gfx::Size& size = resource->size;
18305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK_EQ(resource->target, static_cast<GLenum>(GL_TEXTURE_2D));
18315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ResourceFormat format = resource->format;
18325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  GLC(gl, gl->BindTexture(GL_TEXTURE_2D, resource->gl_id));
18335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (use_texture_storage_ext_ &&
18345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      IsFormatSupportedForStorage(format, use_texture_format_bgra_) &&
18355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      (resource->hint & TextureHintImmutable)) {
18365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLenum storage_format = TextureToStorageFormat(format);
18375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GLC(gl,
18385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        gl->TexStorage2DEXT(
18395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            GL_TEXTURE_2D, 1, storage_format, size.width(), size.height()));
18405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  } else {
18415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // ETC1 does not support preallocation.
1842e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    if (format != ETC1) {
18435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      GLC(gl,
18445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          gl->TexImage2D(GL_TEXTURE_2D,
18455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                         0,
18465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                         GLInternalFormat(format),
18475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                         size.width(),
18485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                         size.height(),
18495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                         0,
18505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                         GLDataFormat(format),
18515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                         GLDataType(format),
1852e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch                         NULL));
18535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
18545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
18555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
18565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ResourceProvider::BindImageForSampling(Resource* resource) {
18585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  GLES2Interface* gl = ContextGL();
18595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(resource->gl_id);
18605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(resource->image_id);
18615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Release image currently bound to texture.
18635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (resource->bound_image_id)
18645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    gl->ReleaseTexImage2DCHROMIUM(resource->target, resource->bound_image_id);
18655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  gl->BindTexImage2DCHROMIUM(resource->target, resource->image_id);
18665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  resource->bound_image_id = resource->image_id;
1867926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  resource->dirty_image = false;
1868926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1869926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1870926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void ResourceProvider::EnableReadLockFences(ResourceId id) {
1871926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  Resource* resource = GetResource(id);
1872926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  resource->read_lock_fences_enabled = true;
1873926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
18745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ResourceProvider::AcquireImage(ResourceId id) {
18765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  Resource* resource = GetResource(id);
18775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(resource->origin == Resource::Internal);
18785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK_EQ(resource->exported_count, 0);
18795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK_EQ(GLTexture, resource->type);
18805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (resource->image_id)
18825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return;
18835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  resource->allocated = true;
18855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  GLES2Interface* gl = ContextGL();
18865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(gl);
188793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  resource->image_id =
188893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)      gl->CreateImageCHROMIUM(resource->size.width(),
188993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)                              resource->size.height(),
189093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)                              TextureToStorageFormat(resource->format),
189193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)                              GL_IMAGE_MAP_CHROMIUM);
189293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  DCHECK(resource->image_id);
189393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
189493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
189593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)void ResourceProvider::ReleaseImage(ResourceId id) {
189693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)  Resource* resource = GetResource(id);
18975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(resource->origin == Resource::Internal);
18985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK_EQ(resource->exported_count, 0);
18995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK_EQ(GLTexture, resource->type);
19005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (!resource->image_id)
19025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return;
19035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  GLES2Interface* gl = ContextGL();
19055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(gl);
1906926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  gl->DestroyImageCHROMIUM(resource->image_id);
1907926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  resource->image_id = 0;
1908926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  resource->bound_image_id = 0;
1909926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  resource->dirty_image = false;
1910926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  resource->allocated = false;
19115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
19125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1913e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochuint8_t* ResourceProvider::MapImage(ResourceId id, int* stride) {
1914e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch  Resource* resource = GetResource(id);
1915e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch  DCHECK(ReadLockFenceHasPassed(resource));
1916e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch  DCHECK(resource->origin == Resource::Internal);
1917e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch  DCHECK_EQ(resource->exported_count, 0);
1918926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  DCHECK(resource->image_id);
1919926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1920926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  LockForWrite(id);
19215267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
1922926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  GLES2Interface* gl = ContextGL();
1923926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  DCHECK(gl);
1924926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)  // MapImageCHROMIUM should be called prior to GetImageParameterivCHROMIUM.
19255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  uint8_t* pixels =
1926      static_cast<uint8_t*>(gl->MapImageCHROMIUM(resource->image_id));
1927  gl->GetImageParameterivCHROMIUM(
1928      resource->image_id, GL_IMAGE_ROWBYTES_CHROMIUM, stride);
1929  return pixels;
1930}
1931
1932void ResourceProvider::UnmapImage(ResourceId id) {
1933  Resource* resource = GetResource(id);
1934  DCHECK(resource->origin == Resource::Internal);
1935  DCHECK_EQ(resource->exported_count, 0);
1936  DCHECK(resource->image_id);
1937  DCHECK(resource->locked_for_write);
1938
1939  GLES2Interface* gl = ContextGL();
1940  DCHECK(gl);
1941  gl->UnmapImageCHROMIUM(resource->image_id);
1942  resource->dirty_image = true;
1943
1944  UnlockForWrite(id);
1945}
1946
1947void ResourceProvider::AcquireSkSurface(ResourceId id) {
1948  Resource* resource = GetResource(id);
1949  DCHECK(resource->origin == Resource::Internal);
1950  DCHECK_EQ(resource->exported_count, 0);
1951  DCHECK_EQ(GLTexture, resource->type);
1952
1953  if (resource->sk_surface)
1954    return;
1955
1956  class GrContext* gr_context = GrContext();
1957  // TODO(alokp): Implement TestContextProvider::GrContext().
1958  if (!gr_context)
1959    return;
1960
1961  LazyAllocate(resource);
1962
1963  GrBackendTextureDesc desc;
1964  desc.fFlags = kRenderTarget_GrBackendTextureFlag;
1965  desc.fWidth = resource->size.width();
1966  desc.fHeight = resource->size.height();
1967  desc.fConfig = ToGrPixelConfig(resource->format);
1968  desc.fOrigin = kTopLeft_GrSurfaceOrigin;
1969  desc.fTextureHandle = resource->gl_id;
1970  skia::RefPtr<GrTexture> gr_texture =
1971      skia::AdoptRef(gr_context->wrapBackendTexture(desc));
1972  if (!gr_texture)
1973    return;
1974  SkSurface::TextRenderMode text_render_mode =
1975      use_distance_field_text_ ? SkSurface::kDistanceField_TextRenderMode
1976                               : SkSurface::kStandard_TextRenderMode;
1977  resource->sk_surface = skia::AdoptRef(SkSurface::NewRenderTargetDirect(
1978      gr_texture->asRenderTarget(), text_render_mode));
1979}
1980
1981void ResourceProvider::ReleaseSkSurface(ResourceId id) {
1982  Resource* resource = GetResource(id);
1983  DCHECK(resource->origin == Resource::Internal);
1984  DCHECK_EQ(resource->exported_count, 0);
1985  DCHECK_EQ(GLTexture, resource->type);
1986
1987  resource->sk_surface.clear();
1988}
1989
1990SkSurface* ResourceProvider::LockForWriteToSkSurface(ResourceId id) {
1991  Resource* resource = GetResource(id);
1992  DCHECK(resource->origin == Resource::Internal);
1993  DCHECK_EQ(resource->exported_count, 0);
1994  DCHECK_EQ(GLTexture, resource->type);
1995
1996  LockForWrite(id);
1997  return resource->sk_surface.get();
1998}
1999
2000void ResourceProvider::UnlockForWriteToSkSurface(ResourceId id) {
2001  UnlockForWrite(id);
2002}
2003
2004void ResourceProvider::CopyResource(ResourceId source_id, ResourceId dest_id) {
2005  TRACE_EVENT0("cc", "ResourceProvider::CopyResource");
2006
2007  Resource* source_resource = GetResource(source_id);
2008  DCHECK(!source_resource->lock_for_read_count);
2009  DCHECK(source_resource->origin == Resource::Internal);
2010  DCHECK_EQ(source_resource->exported_count, 0);
2011  DCHECK_EQ(GLTexture, source_resource->type);
2012  DCHECK(source_resource->allocated);
2013  LazyCreate(source_resource);
2014
2015  Resource* dest_resource = GetResource(dest_id);
2016  DCHECK(!dest_resource->locked_for_write);
2017  DCHECK(!dest_resource->lock_for_read_count);
2018  DCHECK(dest_resource->origin == Resource::Internal);
2019  DCHECK_EQ(dest_resource->exported_count, 0);
2020  DCHECK_EQ(GLTexture, dest_resource->type);
2021  LazyCreate(dest_resource);
2022
2023  DCHECK_EQ(source_resource->type, dest_resource->type);
2024  DCHECK_EQ(source_resource->format, dest_resource->format);
2025  DCHECK(source_resource->size == dest_resource->size);
2026
2027  GLES2Interface* gl = ContextGL();
2028  DCHECK(gl);
2029  if (source_resource->image_id && source_resource->dirty_image) {
2030    gl->BindTexture(source_resource->target, source_resource->gl_id);
2031    BindImageForSampling(source_resource);
2032  }
2033  DCHECK(use_sync_query_) << "CHROMIUM_sync_query extension missing";
2034  if (!source_resource->gl_read_lock_query_id)
2035    gl->GenQueriesEXT(1, &source_resource->gl_read_lock_query_id);
2036  gl->BeginQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM,
2037                    source_resource->gl_read_lock_query_id);
2038  DCHECK(!dest_resource->image_id);
2039  dest_resource->allocated = true;
2040  gl->CopyTextureCHROMIUM(dest_resource->target,
2041                          source_resource->gl_id,
2042                          dest_resource->gl_id,
2043                          0,
2044                          GLInternalFormat(dest_resource->format),
2045                          GLDataType(dest_resource->format));
2046  // End query and create a read lock fence that will prevent access to
2047  // source resource until CopyTextureCHROMIUM command has completed.
2048  gl->EndQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM);
2049  source_resource->read_lock_fence = make_scoped_refptr(
2050      new QueryFence(gl, source_resource->gl_read_lock_query_id));
2051}
2052
2053void ResourceProvider::WaitSyncPointIfNeeded(ResourceId id) {
2054  Resource* resource = GetResource(id);
2055  DCHECK_EQ(resource->exported_count, 0);
2056  DCHECK(resource->allocated);
2057  if (resource->type != GLTexture || resource->gl_id)
2058    return;
2059  if (!resource->mailbox.sync_point())
2060    return;
2061  DCHECK(resource->mailbox.IsValid());
2062  GLES2Interface* gl = ContextGL();
2063  DCHECK(gl);
2064  GLC(gl, gl->WaitSyncPointCHROMIUM(resource->mailbox.sync_point()));
2065  resource->mailbox.set_sync_point(0);
2066}
2067
2068GLint ResourceProvider::GetActiveTextureUnit(GLES2Interface* gl) {
2069  GLint active_unit = 0;
2070  gl->GetIntegerv(GL_ACTIVE_TEXTURE, &active_unit);
2071  return active_unit;
2072}
2073
2074GLES2Interface* ResourceProvider::ContextGL() const {
2075  ContextProvider* context_provider = output_surface_->context_provider();
2076  return context_provider ? context_provider->ContextGL() : NULL;
2077}
2078
2079class GrContext* ResourceProvider::GrContext() const {
2080  ContextProvider* context_provider = output_surface_->context_provider();
2081  return context_provider ? context_provider->GrContext() : NULL;
2082}
2083
2084}  // namespace cc
2085