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