slim: Add UIResourceLayer AppendQuads
Add UI resource paths to get resource info, upload resources. Mark all resources for deletion in FrameSinkImpl destructor to avoid DCHECKs. Bug: 1408128 Change-Id: Icd3488fc3c46932036a10596c541d3a4d67973c1 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4261401 Reviewed-by: Kyle Charbonneau <kylechar@chromium.org> Commit-Queue: Bo Liu <boliu@chromium.org> Cr-Commit-Position: refs/heads/main@{#1107776}
This commit is contained in:
@@ -53,6 +53,10 @@ FrameSinkImpl::FrameSinkImpl(
|
|||||||
io_thread_id_(io_thread_id) {}
|
io_thread_id_(io_thread_id) {}
|
||||||
|
|
||||||
FrameSinkImpl::~FrameSinkImpl() {
|
FrameSinkImpl::~FrameSinkImpl() {
|
||||||
|
for (const auto& uploaded_resource_pair : uploaded_resources_) {
|
||||||
|
resource_provider_.RemoveImportedResource(
|
||||||
|
uploaded_resource_pair.second.viz_resource_id);
|
||||||
|
}
|
||||||
resource_provider_.ShutdownAndReleaseAllResources();
|
resource_provider_.ShutdownAndReleaseAllResources();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -231,6 +231,17 @@ void LayerTreeImpl::NotifyPropertyChanged() {
|
|||||||
SetNeedsDraw();
|
SetNeedsDraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
viz::ResourceId LayerTreeImpl::GetVizResourceId(cc::UIResourceId id) {
|
||||||
|
if (!frame_sink_) {
|
||||||
|
return viz::kInvalidResourceId;
|
||||||
|
}
|
||||||
|
return frame_sink_->GetVizResourceId(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool LayerTreeImpl::IsUIResourceOpaque(int resource_id) {
|
||||||
|
return !frame_sink_ || frame_sink_->IsUIResourceOpaque(resource_id);
|
||||||
|
}
|
||||||
|
|
||||||
void LayerTreeImpl::AddSurfaceRange(const viz::SurfaceRange& range) {
|
void LayerTreeImpl::AddSurfaceRange(const viz::SurfaceRange& range) {
|
||||||
DCHECK(range.IsValid());
|
DCHECK(range.IsValid());
|
||||||
DCHECK(!referenced_surfaces_.contains(range));
|
DCHECK(!referenced_surfaces_.contains(range));
|
||||||
@@ -292,6 +303,20 @@ void LayerTreeImpl::GenerateCompositorFrame(
|
|||||||
// * Surface embedding fields (referenced surfaces, activation dependency,
|
// * Surface embedding fields (referenced surfaces, activation dependency,
|
||||||
// deadline)
|
// deadline)
|
||||||
TRACE_EVENT0("cc", "slim::LayerTreeImpl::ProduceFrame");
|
TRACE_EVENT0("cc", "slim::LayerTreeImpl::ProduceFrame");
|
||||||
|
|
||||||
|
for (auto& resource_request :
|
||||||
|
ui_resource_manager_.TakeUIResourcesRequests()) {
|
||||||
|
switch (resource_request.GetType()) {
|
||||||
|
case cc::UIResourceRequest::UI_RESOURCE_CREATE:
|
||||||
|
frame_sink_->UploadUIResource(resource_request.GetId(),
|
||||||
|
resource_request.GetBitmap());
|
||||||
|
break;
|
||||||
|
case cc::UIResourceRequest::UI_RESOURCE_DELETE:
|
||||||
|
frame_sink_->MarkUIResourceForDeletion(resource_request.GetId());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
auto render_pass = viz::CompositorRenderPass::Create();
|
auto render_pass = viz::CompositorRenderPass::Create();
|
||||||
render_pass->SetNew(viz::CompositorRenderPassId(root_->id()),
|
render_pass->SetNew(viz::CompositorRenderPassId(root_->id()),
|
||||||
/*output_rect=*/device_viewport_rect_,
|
/*output_rect=*/device_viewport_rect_,
|
||||||
|
@@ -87,6 +87,8 @@ class COMPONENT_EXPORT(CC_SLIM) LayerTreeImpl : public LayerTree,
|
|||||||
// Internal methods called by Layers.
|
// Internal methods called by Layers.
|
||||||
void NotifyTreeChanged();
|
void NotifyTreeChanged();
|
||||||
void NotifyPropertyChanged();
|
void NotifyPropertyChanged();
|
||||||
|
viz::ResourceId GetVizResourceId(cc::UIResourceId id);
|
||||||
|
bool IsUIResourceOpaque(int resource_id);
|
||||||
void AddSurfaceRange(const viz::SurfaceRange& range);
|
void AddSurfaceRange(const viz::SurfaceRange& range);
|
||||||
void RemoveSurfaceRange(const viz::SurfaceRange& range);
|
void RemoveSurfaceRange(const viz::SurfaceRange& range);
|
||||||
|
|
||||||
|
@@ -15,12 +15,16 @@
|
|||||||
#include "cc/slim/test_frame_sink_impl.h"
|
#include "cc/slim/test_frame_sink_impl.h"
|
||||||
#include "cc/slim/test_layer_tree_client.h"
|
#include "cc/slim/test_layer_tree_client.h"
|
||||||
#include "cc/slim/test_layer_tree_impl.h"
|
#include "cc/slim/test_layer_tree_impl.h"
|
||||||
|
#include "cc/slim/ui_resource_layer.h"
|
||||||
#include "components/viz/common/frame_sinks/begin_frame_args.h"
|
#include "components/viz/common/frame_sinks/begin_frame_args.h"
|
||||||
#include "components/viz/common/quads/compositor_frame.h"
|
#include "components/viz/common/quads/compositor_frame.h"
|
||||||
#include "components/viz/common/quads/solid_color_draw_quad.h"
|
#include "components/viz/common/quads/solid_color_draw_quad.h"
|
||||||
|
#include "components/viz/common/quads/texture_draw_quad.h"
|
||||||
|
#include "components/viz/common/resources/transferable_resource.h"
|
||||||
#include "components/viz/common/surfaces/local_surface_id.h"
|
#include "components/viz/common/surfaces/local_surface_id.h"
|
||||||
#include "components/viz/test/draw_quad_matchers.h"
|
#include "components/viz/test/draw_quad_matchers.h"
|
||||||
#include "testing/gtest/include/gtest/gtest.h"
|
#include "testing/gtest/include/gtest/gtest.h"
|
||||||
|
#include "third_party/skia/include/core/SkBitmap.h"
|
||||||
#include "ui/gfx/geometry/rect.h"
|
#include "ui/gfx/geometry/rect.h"
|
||||||
|
|
||||||
namespace cc::slim {
|
namespace cc::slim {
|
||||||
@@ -305,6 +309,85 @@ TEST_F(SlimLayerTreeCompositorFrameTest, AxisAlignedClip) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(SlimLayerTreeCompositorFrameTest, UIResourceLayerAppendQuads) {
|
||||||
|
auto ui_resource_layer = UIResourceLayer::Create();
|
||||||
|
ui_resource_layer->SetBounds(viewport_.size());
|
||||||
|
ui_resource_layer->SetIsDrawable(true);
|
||||||
|
layer_tree_->SetRoot(ui_resource_layer);
|
||||||
|
|
||||||
|
viz::ResourceId first_resource_id = viz::kInvalidResourceId;
|
||||||
|
{
|
||||||
|
auto image_info =
|
||||||
|
SkImageInfo::Make(1, 1, kN32_SkColorType, kPremul_SkAlphaType);
|
||||||
|
SkBitmap bitmap;
|
||||||
|
bitmap.allocPixels(image_info);
|
||||||
|
bitmap.setImmutable();
|
||||||
|
ui_resource_layer->SetBitmap(bitmap);
|
||||||
|
|
||||||
|
viz::CompositorFrame frame = ProduceFrame();
|
||||||
|
ASSERT_EQ(frame.render_pass_list.size(), 1u);
|
||||||
|
auto& pass = frame.render_pass_list.back();
|
||||||
|
ASSERT_THAT(pass->quad_list,
|
||||||
|
ElementsAre(AllOf(viz::IsTextureQuad(), viz::HasRect(viewport_),
|
||||||
|
viz::HasVisibleRect(viewport_),
|
||||||
|
viz::HasTransform(gfx::Transform()))));
|
||||||
|
const viz::TextureDrawQuad* texture_quad =
|
||||||
|
viz::TextureDrawQuad::MaterialCast(pass->quad_list.front());
|
||||||
|
EXPECT_TRUE(texture_quad->needs_blending);
|
||||||
|
EXPECT_NE(viz::kInvalidResourceId, texture_quad->resource_id());
|
||||||
|
EXPECT_EQ(gfx::PointF(0.0f, 0.0f), texture_quad->uv_top_left);
|
||||||
|
EXPECT_EQ(gfx::PointF(1.0f, 1.0f), texture_quad->uv_bottom_right);
|
||||||
|
EXPECT_EQ(1.0f, texture_quad->vertex_opacity[0]);
|
||||||
|
EXPECT_EQ(1.0f, texture_quad->vertex_opacity[1]);
|
||||||
|
EXPECT_EQ(1.0f, texture_quad->vertex_opacity[2]);
|
||||||
|
EXPECT_EQ(1.0f, texture_quad->vertex_opacity[3]);
|
||||||
|
|
||||||
|
ASSERT_EQ(frame.resource_list.size(), 1u);
|
||||||
|
EXPECT_EQ(frame.resource_list[0].id, texture_quad->resource_id());
|
||||||
|
EXPECT_EQ(frame.resource_list[0].size, gfx::Size(1, 1));
|
||||||
|
first_resource_id = texture_quad->resource_id();
|
||||||
|
|
||||||
|
ASSERT_EQ(frame_sink_->uploaded_resources().size(), 1u);
|
||||||
|
EXPECT_EQ(frame_sink_->uploaded_resources().begin()->second.viz_resource_id,
|
||||||
|
texture_quad->resource_id());
|
||||||
|
}
|
||||||
|
|
||||||
|
ui_resource_layer->SetUV(gfx::PointF(0.25f, 0.25f),
|
||||||
|
gfx::PointF(0.75f, 0.75f));
|
||||||
|
ui_resource_layer->SetVertexOpacity(0.1f, 0.2f, 0.3f, 0.4f);
|
||||||
|
{
|
||||||
|
auto image_info =
|
||||||
|
SkImageInfo::Make(2, 2, kN32_SkColorType, kPremul_SkAlphaType);
|
||||||
|
SkBitmap bitmap;
|
||||||
|
bitmap.allocPixels(image_info);
|
||||||
|
bitmap.setImmutable();
|
||||||
|
ui_resource_layer->SetBitmap(bitmap);
|
||||||
|
|
||||||
|
viz::CompositorFrame frame = ProduceFrame();
|
||||||
|
ASSERT_EQ(frame.render_pass_list.size(), 1u);
|
||||||
|
auto& pass = frame.render_pass_list.back();
|
||||||
|
ASSERT_THAT(pass->quad_list,
|
||||||
|
ElementsAre(AllOf(viz::IsTextureQuad(), viz::HasRect(viewport_),
|
||||||
|
viz::HasVisibleRect(viewport_),
|
||||||
|
viz::HasTransform(gfx::Transform()))));
|
||||||
|
const viz::TextureDrawQuad* texture_quad =
|
||||||
|
viz::TextureDrawQuad::MaterialCast(pass->quad_list.front());
|
||||||
|
EXPECT_TRUE(texture_quad->needs_blending);
|
||||||
|
EXPECT_NE(viz::kInvalidResourceId, texture_quad->resource_id());
|
||||||
|
EXPECT_EQ(gfx::PointF(0.25f, 0.25f), texture_quad->uv_top_left);
|
||||||
|
EXPECT_EQ(gfx::PointF(0.75f, 0.75f), texture_quad->uv_bottom_right);
|
||||||
|
EXPECT_EQ(0.1f, texture_quad->vertex_opacity[0]);
|
||||||
|
EXPECT_EQ(0.2f, texture_quad->vertex_opacity[1]);
|
||||||
|
EXPECT_EQ(0.3f, texture_quad->vertex_opacity[2]);
|
||||||
|
EXPECT_EQ(0.4f, texture_quad->vertex_opacity[3]);
|
||||||
|
|
||||||
|
ASSERT_EQ(frame.resource_list.size(), 1u);
|
||||||
|
EXPECT_EQ(frame.resource_list[0].id, texture_quad->resource_id());
|
||||||
|
EXPECT_EQ(frame.resource_list[0].size, gfx::Size(2, 2));
|
||||||
|
EXPECT_NE(first_resource_id, texture_quad->resource_id());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
} // namespace cc::slim
|
} // namespace cc::slim
|
||||||
|
@@ -95,6 +95,9 @@ bool TestFrameSinkImpl::BindToClient(FrameSinkImplClient* client) {
|
|||||||
client_ = client;
|
client_ = client;
|
||||||
frame_sink_ = mojo_sink_.get();
|
frame_sink_ = mojo_sink_.get();
|
||||||
bind_to_client_called_ = true;
|
bind_to_client_called_ = true;
|
||||||
|
if (bind_to_client_result_) {
|
||||||
|
context_provider_->BindToCurrentSequence();
|
||||||
|
}
|
||||||
return bind_to_client_result_;
|
return bind_to_client_result_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -32,6 +32,12 @@ class TestFrameSinkImpl : public FrameSinkImpl {
|
|||||||
bool BindToClient(FrameSinkImplClient* client) override;
|
bool BindToClient(FrameSinkImplClient* client) override;
|
||||||
void SetNeedsBeginFrame(bool needs_begin_frame) override;
|
void SetNeedsBeginFrame(bool needs_begin_frame) override;
|
||||||
|
|
||||||
|
using FrameSinkImpl::UploadedResourceMap;
|
||||||
|
using FrameSinkImpl::UploadedUIResource;
|
||||||
|
const UploadedResourceMap& uploaded_resources() const {
|
||||||
|
return uploaded_resources_;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class TestMojoCompositorFrameSink;
|
class TestMojoCompositorFrameSink;
|
||||||
TestFrameSinkImpl(
|
TestFrameSinkImpl(
|
||||||
|
@@ -10,8 +10,8 @@
|
|||||||
#include "cc/slim/features.h"
|
#include "cc/slim/features.h"
|
||||||
#include "cc/slim/layer_tree_impl.h"
|
#include "cc/slim/layer_tree_impl.h"
|
||||||
#include "components/viz/common/quads/compositor_render_pass.h"
|
#include "components/viz/common/quads/compositor_render_pass.h"
|
||||||
#include "components/viz/common/quads/solid_color_draw_quad.h"
|
|
||||||
#include "components/viz/common/quads/texture_draw_quad.h"
|
#include "components/viz/common/quads/texture_draw_quad.h"
|
||||||
|
#include "components/viz/common/resources/resource_id.h"
|
||||||
|
|
||||||
namespace cc::slim {
|
namespace cc::slim {
|
||||||
|
|
||||||
@@ -137,4 +137,32 @@ void UIResourceLayer::SetUIResourceIdInternal(cc::UIResourceId resource_id) {
|
|||||||
NotifyPropertyChanged();
|
NotifyPropertyChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void UIResourceLayer::AppendQuads(viz::CompositorRenderPass& render_pass,
|
||||||
|
const gfx::Transform& transform,
|
||||||
|
const gfx::Rect* clip) {
|
||||||
|
viz::ResourceId viz_resource_id =
|
||||||
|
static_cast<LayerTreeImpl*>(layer_tree())->GetVizResourceId(resource_id_);
|
||||||
|
if (viz_resource_id == viz::kInvalidResourceId) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
viz::SharedQuadState* quad_state =
|
||||||
|
CreateAndAppendSharedQuadState(render_pass, transform, clip);
|
||||||
|
|
||||||
|
viz::TextureDrawQuad* quad =
|
||||||
|
render_pass.CreateAndAppendDrawQuad<viz::TextureDrawQuad>();
|
||||||
|
constexpr bool kFlipped = false;
|
||||||
|
constexpr bool kNearest = false;
|
||||||
|
constexpr bool kPremultiplied = true;
|
||||||
|
constexpr bool kSecureOutputOnly = false;
|
||||||
|
constexpr auto kVideoType = gfx::ProtectedVideoType::kClear;
|
||||||
|
const bool needs_blending = !static_cast<LayerTreeImpl*>(layer_tree())
|
||||||
|
->IsUIResourceOpaque(resource_id_);
|
||||||
|
quad->SetNew(quad_state, quad_state->quad_layer_rect,
|
||||||
|
quad_state->visible_quad_layer_rect, needs_blending,
|
||||||
|
viz_resource_id, kPremultiplied, uv_top_left(),
|
||||||
|
uv_bottom_right(), SkColors::kTransparent, vertex_opacity_,
|
||||||
|
kFlipped, kNearest, kSecureOutputOnly, kVideoType);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace cc::slim
|
} // namespace cc::slim
|
||||||
|
@@ -59,6 +59,9 @@ class COMPONENT_EXPORT(CC_SLIM) UIResourceLayer : public Layer {
|
|||||||
const auto& vertex_opacity() const { return vertex_opacity_; }
|
const auto& vertex_opacity() const { return vertex_opacity_; }
|
||||||
|
|
||||||
bool HasDrawableContent() const override;
|
bool HasDrawableContent() const override;
|
||||||
|
void AppendQuads(viz::CompositorRenderPass& render_pass,
|
||||||
|
const gfx::Transform& transform,
|
||||||
|
const gfx::Rect* clip) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
cc::UIResourceLayer* cc_layer() const;
|
cc::UIResourceLayer* cc_layer() const;
|
||||||
|
Reference in New Issue
Block a user