| // 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. | |
| #ifndef GPU_COMMAND_BUFFER_CLIENT_CLIENT_DISCARDABLE_TEXTURE_MANAGER_H_ | |
| #define GPU_COMMAND_BUFFER_CLIENT_CLIENT_DISCARDABLE_TEXTURE_MANAGER_H_ | |
| #include <map> | |
| #include "base/synchronization/lock.h" | |
| #include "gpu/command_buffer/client/client_discardable_manager.h" | |
| #include "gpu/gpu_export.h" | |
| namespace gpu { | |
| // A helper class used to manage discardable textures. Makes use of | |
| // ClientDiscardableManager. Used by the GLES2 Implementation. | |
| // | |
| // NOTE: The presence of locking on this class does not make it threadsafe. | |
| // The underlying locking *only* allows calling TextureIsValid, | |
| // LockTexture, and TextureIsDeletedForTracing without holding the GL context | |
| // lock. All other calls still require that the context lock be held. | |
| class GPU_EXPORT ClientDiscardableTextureManager { | |
| public: | |
| ClientDiscardableTextureManager(); | |
| ~ClientDiscardableTextureManager(); | |
| ClientDiscardableHandle InitializeTexture(CommandBuffer* command_buffer, | |
| uint32_t texture_id); | |
| bool LockTexture(uint32_t texture_id); | |
| void UnlockTexture(uint32_t texture_id, bool* should_unbind_texture); | |
| // Must be called by the GLES2Implementation when a texture is being deleted | |
| // to allow tracking memory to be reclaimed. | |
| void FreeTexture(uint32_t texture_id); | |
| bool TextureIsValid(uint32_t texture_id) const; | |
| // Tracing only functions. | |
| bool TextureIsDeletedForTracing(uint32_t texture_id) const; | |
| // Test only functions. | |
| ClientDiscardableManager* DiscardableManagerForTesting() { | |
| return &discardable_manager_; | |
| } | |
| ClientDiscardableHandle GetHandleForTesting(uint32_t texture_id); | |
| private: | |
| struct TextureEntry { | |
| TextureEntry(ClientDiscardableHandle::Id id); | |
| TextureEntry(const TextureEntry& other); | |
| TextureEntry& operator=(const TextureEntry& other); | |
| ClientDiscardableHandle::Id id; | |
| // Tracks the lock count of the given texture. Used to unbind texture | |
| // the texture when fully unlocked. | |
| uint32_t client_lock_count = 1; | |
| }; | |
| // Access to other members must always be done with |lock_| held. | |
| mutable base::Lock lock_; | |
| std::map<uint32_t, TextureEntry> texture_entries_; | |
| ClientDiscardableManager discardable_manager_; | |
| DISALLOW_COPY_AND_ASSIGN(ClientDiscardableTextureManager); | |
| }; | |
| } // namespace gpu | |
| #endif // GPU_COMMAND_BUFFER_CLIENT_CLIENT_DISCARDABLE_TEXTURE_MANAGER_H_ |