// Copyright 2018 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 MEDIA_GPU_ANDROID_TEXTURE_POOL_H_ #define MEDIA_GPU_ANDROID_TEXTURE_POOL_H_ #include "base/containers/flat_set.h" #include "base/containers/unique_ptr_adapters.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/threading/thread_checker.h" #include "gpu/ipc/service/command_buffer_stub.h" #include "media/gpu/media_gpu_export.h" namespace gpu { namespace gles2 { class AbstractTexture; } // namespace gles2 } // namespace gpu namespace media { class CommandBufferHelper; // Owns Textures that are used to hold decoded video frames. Allows them to // outlive the decoder that created them, since decoders are torn down when the // pipeline is suspended, but decoded frames can be on-screen indefinitely. // TODO(tmathmeyer): Convert this into a pool. Right now, we just constantly // add new textures and remove them. class MEDIA_GPU_EXPORT TexturePool : public base::RefCounted { public: TexturePool(scoped_refptr helper); // Add a new texture into the pool. This may only be done before |stub_| is // destroyed. When |stub_| is destroyed, we will destroy any textures that // are in the pool. // // Note that if we were really a pool this would mean "add |texture| into the // pool of available textures". There would be some other call to allocate // a texture from the pool. void AddTexture(std::unique_ptr texture); // Release a texture back into the pool. |texture| must have been added to // the pool previously, and not released. Otherwise, this is undefined. // Note: since we don't actually pool things, this just forgets |texture|. // It's okay if this is called after we've lost |stub_|. If |sync_token| is // not null, then we'll wait for that token before taking any action. void ReleaseTexture(gpu::gles2::AbstractTexture* texture, const gpu::SyncToken& sync_token); protected: virtual ~TexturePool(); // Called after a sync token has been released, to free |texture|. void OnSyncTokenReleased(gpu::gles2::AbstractTexture* texture); // Called when |stub_| notifies us that the underlying stub will be destroyed. void OnWillDestroyStub(bool have_context); private: friend class base::RefCounted; THREAD_CHECKER(thread_checker_); scoped_refptr helper_; base::flat_set, base::UniquePtrComparator> pool_; base::WeakPtrFactory weak_factory_; }; } // namespace media #endif // MEDIA_GPU_ANDROID_TEXTURE_POOL_H_