| // Copyright (c) 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "gpu/command_buffer/client/client_discardable_texture_manager.h" |
| |
| namespace gpu { |
| |
| ClientDiscardableTextureManager::TextureEntry::TextureEntry( |
| ClientDiscardableHandle::Id id) |
| : id(id) {} |
| ClientDiscardableTextureManager::TextureEntry::TextureEntry( |
| const TextureEntry& other) = default; |
| ClientDiscardableTextureManager::TextureEntry& |
| ClientDiscardableTextureManager::TextureEntry::operator=( |
| const TextureEntry& other) = default; |
| |
| ClientDiscardableTextureManager::ClientDiscardableTextureManager() = default; |
| ClientDiscardableTextureManager::~ClientDiscardableTextureManager() = default; |
| |
| ClientDiscardableHandle ClientDiscardableTextureManager::InitializeTexture( |
| CommandBuffer* command_buffer, |
| uint32_t texture_id) { |
| base::AutoLock hold(lock_); |
| DCHECK(texture_entries_.find(texture_id) == texture_entries_.end()); |
| ClientDiscardableHandle::Id handle_id = |
| discardable_manager_.CreateHandle(command_buffer); |
| if (handle_id.is_null()) |
| return ClientDiscardableHandle(); |
| |
| // We must have a valid handle here, since the id was generated above and |
| // should be in locked state. |
| texture_entries_.emplace(texture_id, TextureEntry(handle_id)); |
| return discardable_manager_.GetHandle(handle_id); |
| } |
| |
| bool ClientDiscardableTextureManager::LockTexture(uint32_t texture_id) { |
| base::AutoLock hold(lock_); |
| auto found = texture_entries_.find(texture_id); |
| if (found == texture_entries_.end()) |
| return false; |
| |
| TextureEntry& entry = found->second; |
| if (!discardable_manager_.LockHandle(entry.id)) { |
| DCHECK_EQ(0u, entry.client_lock_count); |
| return false; |
| } |
| |
| ++entry.client_lock_count; |
| return true; |
| } |
| |
| void ClientDiscardableTextureManager::UnlockTexture( |
| uint32_t texture_id, |
| bool* should_unbind_texture) { |
| base::AutoLock hold(lock_); |
| auto found = texture_entries_.find(texture_id); |
| DCHECK(found != texture_entries_.end()); |
| TextureEntry& entry = found->second; |
| DCHECK_GT(entry.client_lock_count, 0u); |
| --entry.client_lock_count; |
| *should_unbind_texture = (0u == entry.client_lock_count); |
| } |
| |
| void ClientDiscardableTextureManager::FreeTexture(uint32_t texture_id) { |
| base::AutoLock hold(lock_); |
| auto found = texture_entries_.find(texture_id); |
| if (found == texture_entries_.end()) |
| return; |
| ClientDiscardableHandle::Id discardable_id = found->second.id; |
| texture_entries_.erase(found); |
| return discardable_manager_.FreeHandle(discardable_id); |
| } |
| |
| bool ClientDiscardableTextureManager::TextureIsValid( |
| uint32_t texture_id) const { |
| base::AutoLock hold(lock_); |
| return texture_entries_.find(texture_id) != texture_entries_.end(); |
| } |
| |
| bool ClientDiscardableTextureManager::TextureIsDeletedForTracing( |
| uint32_t texture_id) const { |
| base::AutoLock hold(lock_); |
| auto found = texture_entries_.find(texture_id); |
| if (found == texture_entries_.end()) |
| return true; |
| return discardable_manager_.HandleIsDeletedForTracing(found->second.id); |
| } |
| |
| ClientDiscardableHandle ClientDiscardableTextureManager::GetHandleForTesting( |
| uint32_t texture_id) { |
| base::AutoLock hold(lock_); |
| auto found = texture_entries_.find(texture_id); |
| DCHECK(found != texture_entries_.end()); |
| return discardable_manager_.GetHandle(found->second.id); |
| } |
| |
| } // namespace gpu |