| OLD | NEW |
| (Empty) |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef GL_GLEXT_PROTOTYPES | |
| 6 #define GL_GLEXT_PROTOTYPES | |
| 7 #endif | |
| 8 #include <GLES2/gl2extmojo.h> | |
| 9 | |
| 10 #include "mojo/gpu/gl_context.h" | |
| 11 #include "mojo/gpu/gl_texture.h" | |
| 12 #include "mojo/gpu/texture_cache.h" | |
| 13 #include "mojo/services/geometry/interfaces/geometry.mojom.h" | |
| 14 | |
| 15 namespace mojo { | |
| 16 | |
| 17 TextureCache::TextureInfo::TextureInfo() : texture_(), resource_id_(0u) {} | |
| 18 TextureCache::TextureInfo::TextureInfo(scoped_ptr<mojo::GLTexture> texture, | |
| 19 uint32_t resource_id) | |
| 20 : texture_(texture.Pass()), resource_id_(resource_id) {} | |
| 21 TextureCache::TextureInfo::~TextureInfo() {} | |
| 22 | |
| 23 TextureCache::TextureCache(base::WeakPtr<mojo::GLContext> gl_context, | |
| 24 mojo::ResourceReturnerPtr* out_resource_returner) | |
| 25 : gl_context_(gl_context), returner_binding_(this), next_resource_id_(0u) { | |
| 26 if (out_resource_returner) { | |
| 27 returner_binding_.Bind(GetProxy(out_resource_returner)); | |
| 28 } | |
| 29 } | |
| 30 | |
| 31 TextureCache::~TextureCache() {} | |
| 32 | |
| 33 scoped_ptr<TextureCache::TextureInfo> TextureCache::GetTexture( | |
| 34 const mojo::Size& requested_size) { | |
| 35 // Sift through our available textures to find one the correct size. If one | |
| 36 // exists use it. As we find textures of the wrong size, clean them up. | |
| 37 while (!available_textures_.empty()) { | |
| 38 // Get the next available texture's resource id. | |
| 39 uint32_t available_resource_id = available_textures_.front(); | |
| 40 available_textures_.pop_front(); | |
| 41 | |
| 42 // Get the texture information from the texture map. | |
| 43 auto texture_iterator = | |
| 44 resource_to_texture_map_.find(available_resource_id); | |
| 45 mojo::Size texture_size = texture_iterator->second->size(); | |
| 46 scoped_ptr<TextureInfo> texture_info(new TextureInfo( | |
| 47 texture_iterator->second.Pass(), texture_iterator->first)); | |
| 48 resource_to_texture_map_.erase(texture_iterator); | |
| 49 | |
| 50 // Get the sync point from the sync point map. | |
| 51 auto sync_point_iterator = | |
| 52 resource_to_sync_point_map_.find(available_resource_id); | |
| 53 int sync_point = sync_point_iterator->second; | |
| 54 resource_to_sync_point_map_.erase(sync_point_iterator); | |
| 55 | |
| 56 // If the texture is the right size, use it. | |
| 57 if (texture_size.width == requested_size.width && | |
| 58 texture_size.height == requested_size.height) { | |
| 59 gl_context_->MakeCurrent(); | |
| 60 glWaitSyncPointCHROMIUM(sync_point); | |
| 61 return texture_info; | |
| 62 } | |
| 63 } | |
| 64 | |
| 65 // If our context is invalid return an empty scoped ptr. | |
| 66 if (!gl_context_) { | |
| 67 return scoped_ptr<TextureInfo>(); | |
| 68 } | |
| 69 | |
| 70 // We couldn't find an existing texture to reuse, create a new one! | |
| 71 scoped_ptr<mojo::GLTexture> new_texture( | |
| 72 new mojo::GLTexture(gl_context_, requested_size)); | |
| 73 next_resource_id_++; | |
| 74 scoped_ptr<TextureInfo> texture_info( | |
| 75 new TextureInfo(new_texture.Pass(), next_resource_id_)); | |
| 76 return texture_info; | |
| 77 } | |
| 78 | |
| 79 void TextureCache::NotifyPendingResourceReturn( | |
| 80 uint32_t resource_id, | |
| 81 scoped_ptr<mojo::GLTexture> texture) { | |
| 82 resource_to_texture_map_[resource_id] = texture.Pass(); | |
| 83 } | |
| 84 | |
| 85 // mojo::ResourceReturner | |
| 86 void TextureCache::ReturnResources( | |
| 87 mojo::Array<mojo::ReturnedResourcePtr> resources) { | |
| 88 if (!gl_context_) { | |
| 89 return; | |
| 90 } | |
| 91 gl_context_->MakeCurrent(); | |
| 92 for (size_t i = 0u; i < resources.size(); ++i) { | |
| 93 mojo::ReturnedResourcePtr resource = resources[i].Pass(); | |
| 94 DCHECK_EQ(1, resource->count); | |
| 95 auto it = resource_to_texture_map_.find(resource->id); | |
| 96 // Ignore the returned resource if we haven't been notified of its pending | |
| 97 // return. | |
| 98 if (it != resource_to_texture_map_.end()) { | |
| 99 available_textures_.push_back(resource->id); | |
| 100 resource_to_sync_point_map_[resource->id] = resource->sync_point; | |
| 101 } | |
| 102 } | |
| 103 } | |
| 104 } // namespace mojo | |
| OLD | NEW |