blob: 0b9651a440055fb10f3af4ab3ad56549f46d9b11 [file] [log] [blame]
// 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<TexturePool> {
public:
TexturePool(scoped_refptr<CommandBufferHelper> 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<gpu::gles2::AbstractTexture> 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<TexturePool>;
THREAD_CHECKER(thread_checker_);
scoped_refptr<CommandBufferHelper> helper_;
base::flat_set<std::unique_ptr<gpu::gles2::AbstractTexture>,
base::UniquePtrComparator>
pool_;
base::WeakPtrFactory<TexturePool> weak_factory_;
};
} // namespace media
#endif // MEDIA_GPU_ANDROID_TEXTURE_POOL_H_