1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
|
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CC_LAYERS_TEXTURE_LAYER_IMPL_H_
#define CC_LAYERS_TEXTURE_LAYER_IMPL_H_
#include <memory>
#include <optional>
#include <string>
#include <vector>
#include "base/containers/flat_map.h"
#include "base/functional/callback.h"
#include "base/memory/ptr_util.h"
#include "cc/cc_export.h"
#include "cc/layers/layer_impl.h"
#include "components/viz/common/resources/release_callback.h"
#include "components/viz/common/resources/transferable_resource.h"
#include "ui/gfx/hdr_metadata.h"
namespace cc {
class CC_EXPORT TextureLayerImpl : public LayerImpl {
public:
static std::unique_ptr<TextureLayerImpl> Create(LayerTreeImpl* tree_impl,
int id) {
return base::WrapUnique(new TextureLayerImpl(tree_impl, id));
}
TextureLayerImpl(const TextureLayerImpl&) = delete;
~TextureLayerImpl() override;
TextureLayerImpl& operator=(const TextureLayerImpl&) = delete;
mojom::LayerType GetLayerType() const override;
std::unique_ptr<LayerImpl> CreateLayerImpl(
LayerTreeImpl* layer_tree_impl) const override;
bool IsSnappedToPixelGridInTarget() override;
void PushPropertiesTo(LayerImpl* layer) override;
bool WillDraw(DrawMode draw_mode,
viz::ClientResourceProvider* resource_provider) override;
void AppendQuads(const AppendQuadsContext& context,
viz::CompositorRenderPass* render_pass,
AppendQuadsData* append_quads_data) override;
SimpleEnclosedRegion VisibleOpaqueRegion() const override;
void ReleaseResources() override;
void OnPurgeMemory() override;
gfx::ContentColorUsage GetContentColorUsage() const override;
// These setter methods don't cause any implicit damage, so the texture client
// must explicitly invalidate if they intend to cause a visible change in the
// layer's output.
void SetTextureId(unsigned id);
void SetBlendBackgroundColor(bool blend);
void SetForceTextureToOpaque(bool opaque);
void SetUVTopLeft(const gfx::PointF& top_left);
void SetUVBottomRight(const gfx::PointF& bottom_right);
void SetHdrMetadata(const gfx::HDRMetadata& hdr_metadata);
void SetTransferableResource(const viz::TransferableResource& resource,
viz::ReleaseCallback release_callback);
bool NeedSetTransferableResource() const;
void SetInInvisibleLayerTree() override;
// Whether the resource may be evicted in background. If it returns true, main
// is responsible for making sure that the resource is imported again after a
// visibility change.
static bool MayEvictResourceInBackground(
viz::TransferableResource::ResourceSource source);
bool blend_background_color() const { return blend_background_color_; }
bool force_texture_to_opaque() const { return force_texture_to_opaque_; }
bool needs_set_resource_push() const { return needs_set_resource_push_; }
void ClearNeedsSetResourcePush() { needs_set_resource_push_ = false; }
gfx::PointF uv_top_left() const { return uv_top_left_; }
gfx::PointF uv_bottom_right() const { return uv_bottom_right_; }
const viz::TransferableResource& transferable_resource() const {
return transferable_resource_;
}
viz::ResourceId resource_id() const { return resource_id_; }
private:
TextureLayerImpl(LayerTreeImpl* tree_impl, int id);
void FreeTransferableResource();
void OnResourceEvicted();
bool blend_background_color_ = false;
bool force_texture_to_opaque_ = false;
// True while the |transferable_resource_| is owned by this layer, and
// becomes false once it is passed to another layer or to the
// viz::ClientResourceProvider, at which point we get back a |resource_id_|.
bool own_resource_ = false;
// True when a resource change should be pushed to the next tree.
bool needs_set_resource_push_ = false;
gfx::PointF uv_top_left_ = gfx::PointF();
gfx::PointF uv_bottom_right_ = gfx::PointF(1.f, 1.f);
// A TransferableResource from the layer's client that will be given
// to the display compositor.
viz::TransferableResource transferable_resource_;
// Local ResourceId for the TransferableResource, to be used with the
// compositor's viz::ClientResourceProvider in order to refer to the
// TransferableResource given to it.
viz::ResourceId resource_id_ = viz::kInvalidResourceId;
viz::ReleaseCallback release_callback_;
};
} // namespace cc
#endif // CC_LAYERS_TEXTURE_LAYER_IMPL_H_
|