#ifndef CC_LAYERS_TEXTURE_LAYER_H_
#define CC_LAYERS_TEXTURE_LAYER_H_
#include <memory>
#include <string>
#include <vector>
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/synchronization/lock.h"
#include "base/task/sequenced_task_runner.h"
#include "base/threading/thread_checker.h"
#include "cc/cc_export.h"
#include "cc/layers/layer.h"
#include "cc/resources/cross_thread_shared_bitmap.h"
#include "cc/resources/shared_bitmap_id_registrar.h"
#include "components/viz/common/resources/release_callback.h"
#include "components/viz/common/resources/transferable_resource.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/gfx/hdr_metadata.h"
namespace gpu {
struct SyncToken;
}
namespace cc {
class TextureLayer;
class TextureLayerClient;
class CC_EXPORT TextureLayer : public Layer, SharedBitmapIdRegistrar {
public:
class CC_EXPORT TransferableResourceHolder
: public base::RefCountedThreadSafe<TransferableResourceHolder> {
public:
TransferableResourceHolder(const TransferableResourceHolder&) = delete;
TransferableResourceHolder& operator=(const TransferableResourceHolder&) =
delete;
const viz::TransferableResource& resource() const { return resource_; }
void Return(
scoped_refptr<base::SequencedTaskRunner> main_thread_task_runner,
const gpu::SyncToken& sync_token,
bool is_lost);
static scoped_refptr<TransferableResourceHolder> Create(
const viz::TransferableResource& resource,
viz::ReleaseCallback release_callback);
protected:
virtual ~TransferableResourceHolder();
private:
friend class base::RefCountedThreadSafe<TransferableResourceHolder>;
explicit TransferableResourceHolder(
const viz::TransferableResource& resource,
viz::ReleaseCallback release_callback);
const viz::TransferableResource resource_;
viz::ReleaseCallback release_callback_;
scoped_refptr<base::SequencedTaskRunner> release_callback_task_runner_;
gpu::SyncToken sync_token_;
bool is_lost_ = false;
};
static scoped_refptr<TextureLayer> CreateForMailbox(
TextureLayerClient* client);
TextureLayer(const TextureLayer&) = delete;
TextureLayer& operator=(const TextureLayer&) = delete;
void ClearClient();
void ClearTexture();
std::unique_ptr<LayerImpl> CreateLayerImpl(
LayerTreeImpl* tree_impl) const override;
void SetFlipped(bool flipped);
bool flipped() const { return flipped_.Read(*this); }
void SetNearestNeighbor(bool nearest_neighbor);
void SetUV(const gfx::PointF& top_left, const gfx::PointF& bottom_right);
void SetPremultipliedAlpha(bool premultiplied_alpha);
void SetBlendBackgroundColor(bool blend);
void SetForceTextureToOpaque(bool opaque);
void SetTransferableResource(const viz::TransferableResource& resource,
viz::ReleaseCallback release_callback);
void SetHDRConfiguration(gfx::HDRMode mode,
absl::optional<gfx::HDRMetadata> hdr_metadata);
void SetLayerTreeHost(LayerTreeHost* layer_tree_host) override;
bool Update() override;
bool IsSnappedToPixelGridInTarget() const override;
void PushPropertiesTo(LayerImpl* layer,
const CommitState& commit_state,
const ThreadUnsafeCommitState& unsafe_state) override;
SharedBitmapIdRegistration RegisterSharedBitmapId(
const viz::SharedBitmapId& id,
scoped_refptr<CrossThreadSharedBitmap> bitmap) override;
const viz::TransferableResource current_transferable_resource() const {
if (const auto& resource_holder = resource_holder_.Read(*this))
return resource_holder->resource();
return viz::TransferableResource();
}
protected:
explicit TextureLayer(TextureLayerClient* client);
~TextureLayer() override;
bool HasDrawableContent() const override;
private:
void SetTransferableResourceInternal(
const viz::TransferableResource& resource,
viz::ReleaseCallback release_callback,
bool requires_commit);
friend SharedBitmapIdRegistration;
void UnregisterSharedBitmapId(viz::SharedBitmapId id);
ProtectedSequenceForbidden<raw_ptr<TextureLayerClient>> client_;
ProtectedSequenceReadable<bool> flipped_;
ProtectedSequenceReadable<bool> nearest_neighbor_;
ProtectedSequenceReadable<gfx::PointF> uv_top_left_;
ProtectedSequenceReadable<gfx::PointF> uv_bottom_right_;
ProtectedSequenceReadable<bool> premultiplied_alpha_;
ProtectedSequenceReadable<bool> blend_background_color_;
ProtectedSequenceReadable<bool> force_texture_to_opaque_;
ProtectedSequenceReadable<gfx::HDRMode> hdr_mode_;
ProtectedSequenceWritable<absl::optional<gfx::HDRMetadata>> hdr_metadata_;
ProtectedSequenceWritable<scoped_refptr<TransferableResourceHolder>>
resource_holder_;
ProtectedSequenceWritable<bool> needs_set_resource_;
typedef base::flat_map<viz::SharedBitmapId,
scoped_refptr<CrossThreadSharedBitmap>>
BitMapMap;
ProtectedSequenceWritable<BitMapMap> to_register_bitmaps_;
ProtectedSequenceWritable<BitMapMap> registered_bitmaps_;
ProtectedSequenceWritable<std::vector<viz::SharedBitmapId>>
to_unregister_bitmap_ids_;
const base::WeakPtrFactory<TextureLayer> weak_ptr_factory_{this};
};
}
#endif