Create AggregatedRenderPassList from CompositorRenderPassList 07/265407/4
authorChandan Padhi <c.padhi@samsung.com>
Mon, 18 Oct 2021 14:40:39 +0000 (20:10 +0530)
committerChandan Padhi <c.padhi@samsung.com>
Wed, 20 Oct 2021 10:55:14 +0000 (16:25 +0530)
CompositorFrame received on the browser/gpu process contains
CompositorRenderPassList. However, GLRenderer now expects
AggregatedRenderPassList due to upstream changes[1].
Therefore, it is necessary to create AggregatedRenderPassList
from CompositorRenderPassList for GLRenderer to draw the frames.

[1] https://chromium-review.googlesource.com/c/chromium/src/+/2321397

Change-Id: If59f45be60fc25eb2d4f3a54ed870ae1c8751d99
Signed-off-by: Chandan Padhi <c.padhi@samsung.com>
tizen_src/chromium_impl/content/browser/compositor/evasgl_delegated_frame_host.cc
tizen_src/chromium_impl/content/browser/compositor/evasgl_delegated_frame_host.h

index 4237aeeeb1f7f99f18f16f0f410f6d859596a1d5..cd34f2d0470f6b505bdca53a79e572741fa75e4c 100644 (file)
@@ -37,9 +37,8 @@ void EvasGLDelegatedFrameHost::Initialize() {
 
   auto resource_provider = std::make_unique<viz::DisplayResourceProviderGL>(
       output_surface_->context_provider(), false /* enable_shared_images */);
-  resource_provider_ = std::move(resource_provider);
 
-  child_id_ = resource_provider_->CreateChild(
+  child_id_ = resource_provider->CreateChild(
       base::BindRepeating(&EvasGLDelegatedFrameHost::UnrefResources,
                           weak_ptr_factory_.GetWeakPtr()),
       viz::SurfaceId());
@@ -47,11 +46,54 @@ void EvasGLDelegatedFrameHost::Initialize() {
   renderer_ = std::make_unique<viz::GLRenderer>(
       &settings_, &debug_settings_, output_surface_.get(),
       resource_provider.get(), nullptr, nullptr);
+  resource_provider_ = std::move(resource_provider);
   renderer_->Initialize();
   renderer_->SetVisible(true);
   is_initialized_ = true;
 }
 
+void EvasGLDelegatedFrameHost::CreateAggregatedRenderPassList(
+    const viz::CompositorRenderPassList& source_pass_list) {
+  render_pass_list_.clear();
+  for (const auto& source : source_pass_list) {
+    size_t sqs_size = source->shared_quad_state_list.size();
+    size_t dq_size = source->quad_list.size();
+    auto copy_pass =
+        std::make_unique<viz::AggregatedRenderPass>(sqs_size, dq_size);
+    copy_pass->SetAll(
+        render_pass_id_generator_.GenerateNextId(), source->output_rect,
+        source->damage_rect, source->transform_to_root_target, source->filters,
+        source->backdrop_filters, source->backdrop_filter_bounds,
+        gfx::ContentColorUsage::kSRGB, source->has_transparent_background,
+        source->cache_render_pass, source->has_damage_from_contributing_content,
+        source->generate_mipmap);
+
+    if (source->shared_quad_state_list.empty()) {
+      DCHECK(source->quad_list.empty());
+      render_pass_list_.push_back(std::move(copy_pass));
+      continue;
+    }
+
+    viz::SharedQuadStateList::ConstIterator sqs_iter =
+        source->shared_quad_state_list.begin();
+    viz::SharedQuadState* copy_shared_quad_state =
+        copy_pass->CreateAndAppendSharedQuadState();
+    *copy_shared_quad_state = **sqs_iter;
+    for (auto* quad : source->quad_list) {
+      while (quad->shared_quad_state != *sqs_iter) {
+        ++sqs_iter;
+        DCHECK(sqs_iter != source->shared_quad_state_list.end());
+        copy_shared_quad_state = copy_pass->CreateAndAppendSharedQuadState();
+        *copy_shared_quad_state = **sqs_iter;
+      }
+      DCHECK(quad->shared_quad_state == *sqs_iter);
+
+      copy_pass->CopyFromAndAppendDrawQuad(quad);
+    }
+    render_pass_list_.push_back(std::move(copy_pass));
+  }
+}
+
 void EvasGLDelegatedFrameHost::SwapDelegatedFrame(
     const viz::LocalSurfaceId& local_surface_id,
     viz::CompositorFrame frame) {
@@ -72,7 +114,7 @@ void EvasGLDelegatedFrameHost::SwapDelegatedFrame(
   size_t reserve_size = frame.resource_list.size();
   resources_in_frame.reserve(reserve_size);
   for (const auto& pass : frame.render_pass_list) {
-    for (const auto& quad : pass->quad_list) {
+    for (auto* quad : pass->quad_list) {
       for (viz::ResourceId& resource_id : quad->resources) {
         auto it = resource_map.find(resource_id);
         if (it == resource_map.end()) {
@@ -92,7 +134,7 @@ void EvasGLDelegatedFrameHost::SwapDelegatedFrame(
   // [TODO] it does not need to invoke evas_object_image_pixels_dirty_set()
   // when |invalid_frame| is true.
   if (!invalid_frame)
-    render_pass_list_ = std::move(frame.render_pass_list);
+    CreateAggregatedRenderPassList(std::move(frame.render_pass_list));
 
   ClearRenderPasses(resources_in_frame);
 
@@ -113,13 +155,13 @@ void EvasGLDelegatedFrameHost::RenderDelegatedFrame(const gfx::Rect& bounds) {
 
   display::DeviceDisplayInfoEfl display_info;
 
-  viz::CompositorRenderPassList render_pass_list;
+  viz::AggregatedRenderPassList render_pass_list;
   for (const auto& source : render_pass_list_)
     render_pass_list.push_back(source->DeepCopy());
 
   gfx::Size device_viewport_size = gfx::Size(bounds.width(), bounds.height());
 
-  viz::CompositorRenderPass* root_render_pass = render_pass_list.back().get();
+  viz::AggregatedRenderPass* root_render_pass = render_pass_list.back().get();
   root_render_pass->output_rect.set_width(bounds.width());
   root_render_pass->output_rect.set_height(bounds.height());
 
@@ -132,12 +174,12 @@ void EvasGLDelegatedFrameHost::RenderDelegatedFrame(const gfx::Rect& bounds) {
     }
     TransformRootRenderPass(root_render_pass, bounds, rotation);
   }
-#if !defined(EWK_BRINGUP)  // FIXME: m94 bringup
+
   renderer_->DecideRenderPassAllocationsForFrame(render_pass_list);
   // Draw frame by compositing render passes.
   renderer_->DrawFrame(&render_pass_list, display_info.GetDIPScale(),
-                       device_viewport_size, gfx::DisplayColorSpaces());
-#endif
+                       device_viewport_size, gfx::DisplayColorSpaces(),
+                       viz::SurfaceDamageRectList());
 }
 
 void EvasGLDelegatedFrameHost::UnrefResources(
@@ -151,13 +193,13 @@ bool EvasGLDelegatedFrameHost::ShouldTransformRootRenderPass(int rotation) {
 }
 
 void EvasGLDelegatedFrameHost::TransformRootRenderPass(
-    viz::CompositorRenderPass* root_render_pass,
+    viz::AggregatedRenderPass* root_render_pass,
     const gfx::Rect& bounds,
     int rotation) {
   double scale_x, scale_y, m01, m10, translate_x, translate_y, new_scale_x,
       new_scale_y, new_m01, new_m10, new_translate_x, new_translate_y;
 
-  for (const auto& shared_quad_state :
+  for (const auto* shared_quad_state :
        root_render_pass->shared_quad_state_list) {
     // Rotate model by matrix transformation
     skia::Matrix44 matrix =
index ade39b55dc9fd3bec0b77025cab0ebecf1012ca4..0cdd16db9d0fedbe5525af4b862d18760f7c5d37 100644 (file)
@@ -9,6 +9,7 @@
 
 #include "base/memory/weak_ptr.h"
 #include "components/viz/common/display/renderer_settings.h"
+#include "components/viz/common/quads/aggregated_render_pass.h"
 #include "components/viz/common/quads/compositor_frame.h"
 #include "components/viz/service/display/direct_renderer.h"
 #include "content/common/content_export.h"
@@ -46,9 +47,11 @@ class CONTENT_EXPORT EvasGLDelegatedFrameHost
   void RenderDelegatedFrame(const gfx::Rect& bounds);
 
  private:
+  void CreateAggregatedRenderPassList(
+      const viz::CompositorRenderPassList& source_pass_list);
   void UnrefResources(std::vector<viz::ReturnedResource> resources);
   bool ShouldTransformRootRenderPass(int rotation);
-  void TransformRootRenderPass(viz::CompositorRenderPass* root_render_pass,
+  void TransformRootRenderPass(viz::AggregatedRenderPass* root_render_pass,
                                const gfx::Rect& bounds,
                                int rotation);
   void ClearRenderPasses(
@@ -64,7 +67,8 @@ class CONTENT_EXPORT EvasGLDelegatedFrameHost
   viz::DebugRendererSettings debug_settings_;
   std::unique_ptr<viz::DisplayResourceProvider> resource_provider_;
   int child_id_;
-  viz::CompositorRenderPassList render_pass_list_;
+  viz::AggregatedRenderPassId::Generator render_pass_id_generator_;
+  viz::AggregatedRenderPassList render_pass_list_;
   viz::ResourceIdSet resources_in_frame_;
   std::vector<viz::ReturnedResource> returned_resources_;
   std::unique_ptr<viz::DirectRenderer> renderer_;