0

Add DrawnRect to software renderer

This is intended to match the functionality inside 'SkiaRenderer' and
to avoid possible regression when using this feature when in software
mode.

Bug: 350764043
Change-Id: Ie56297fd57695d44a54ff262b02e53538a163557
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5676230
Commit-Queue: Peter McNeeley <petermcneeley@chromium.org>
Reviewed-by: Kyle Charbonneau <kylechar@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1323441}
This commit is contained in:
Peter McNeeley
2024-07-04 18:50:24 +00:00
committed by Chromium LUCI CQ
parent 3091e722b1
commit 68b8e676fa
7 changed files with 59 additions and 19 deletions

@ -85,7 +85,9 @@ DirectRenderer::DirectRenderer(const RendererSettings* settings,
resource_provider_(resource_provider),
overlay_processor_(overlay_processor),
allow_undamaged_nonroot_render_pass_to_skip_(base::FeatureList::IsEnabled(
features::kAllowUndamagedNonrootRenderPassToSkip)) {
features::kAllowUndamagedNonrootRenderPassToSkip)),
use_render_pass_drawn_rect_(
base::FeatureList::IsEnabled(features::kRenderPassDrawnRect)) {
DCHECK(output_surface_);
}
@ -1207,9 +1209,4 @@ gpu::Mailbox DirectRenderer::GetPrimaryPlaneOverlayTestingMailbox() {
return gpu::Mailbox();
}
gfx::Rect DirectRenderer::GetRenderPassBackingDrawnRect(
const AggregatedRenderPassId& render_pass_id) const {
return gfx::Rect();
}
} // namespace viz

@ -277,10 +277,10 @@ class VIZ_SERVICE_EXPORT DirectRenderer {
virtual void SetRenderPassBackingDrawnRect(
const AggregatedRenderPassId& render_pass_id,
const gfx::Rect& drawn_rect) {}
const gfx::Rect& drawn_rect) = 0;
virtual gfx::Rect GetRenderPassBackingDrawnRect(
const AggregatedRenderPassId& render_pass_id) const;
const AggregatedRenderPassId& render_pass_id) const = 0;
// Private interface implemented by subclasses for use by DirectRenderer.
virtual bool CanPartialSwap() = 0;

@ -49,4 +49,9 @@ void NullRenderer::CopyDrawnRenderPass(
const copy_output::RenderPassGeometry& geometry,
std::unique_ptr<CopyOutputRequest> request) {}
gfx::Rect NullRenderer::GetRenderPassBackingDrawnRect(
const AggregatedRenderPassId& render_pass_id) const {
return gfx::Rect();
}
} // namespace viz

@ -22,6 +22,14 @@ class VIZ_SERVICE_EXPORT NullRenderer : public DirectRenderer {
OverlayProcessorInterface* overlay_processor);
~NullRenderer() override;
protected:
void SetRenderPassBackingDrawnRect(
const AggregatedRenderPassId& render_pass_id,
const gfx::Rect& drawn_rect) override {}
gfx::Rect GetRenderPassBackingDrawnRect(
const AggregatedRenderPassId& render_pass_id) const override;
private:
void SwapBuffers(SwapFrameData swap_frame_data) override;
bool CanPartialSwap() override;

@ -1060,8 +1060,6 @@ SkiaRenderer::SkiaRenderer(const RendererSettings* settings,
#endif
lock_set_for_external_use_(resource_provider, skia_output_surface_),
is_using_raw_draw_(features::IsUsingRawDraw()) {
use_render_pass_drawn_rect_ =
base::FeatureList::IsEnabled(features::kRenderPassDrawnRect);
#if BUILDFLAG(IS_WIN)
// |OverlayProcessorWin| can cause a render pass to reallocate during partial
// delegation, so we need to ensure the contents of all render passes are

@ -221,7 +221,7 @@ void SoftwareRenderer::BeginDrawingRenderPass(
} else {
auto it = render_pass_bitmaps_.find(render_pass->id);
DCHECK(it != render_pass_bitmaps_.end());
SkBitmap& bitmap = it->second;
SkBitmap& bitmap = it->second.bitmap;
current_framebuffer_canvas_ = std::make_unique<SkCanvas>(
bitmap, skia::LegacyDisplayGlobals::GetSkSurfaceProps());
@ -527,7 +527,7 @@ void SoftwareRenderer::DrawRenderPassQuad(
auto it = render_pass_bitmaps_.find(quad->render_pass_id);
if (it == render_pass_bitmaps_.end())
return;
SkBitmap& source_bitmap = it->second;
SkBitmap& source_bitmap = it->second.bitmap;
SkRect dest_rect = gfx::RectFToSkRect(QuadVertexRect());
SkRect dest_visible_rect =
@ -1005,7 +1005,7 @@ void SoftwareRenderer::UpdateRenderPassTextures(
gfx::Size required_size = render_pass_it->second.size;
// The RenderPassRequirements have a hint, which is only used for gpu
// compositing so it is ignored here.
const SkBitmap& bitmap = pair.second;
const SkBitmap& bitmap = pair.second.bitmap;
bool size_appropriate = bitmap.width() >= required_size.width() &&
bitmap.height() >= required_size.height();
@ -1024,8 +1024,8 @@ void SoftwareRenderer::AllocateRenderPassResourceIfNeeded(
const RenderPassRequirements& requirements) {
auto it = render_pass_bitmaps_.find(render_pass_id);
if (it != render_pass_bitmaps_.end()) {
DCHECK(it->second.width() >= requirements.size.width() &&
it->second.height() >= requirements.size.height());
DCHECK(it->second.bitmap.width() >= requirements.size.width() &&
it->second.bitmap.height() >= requirements.size.height());
return;
}
@ -1055,10 +1055,28 @@ bool SoftwareRenderer::IsRenderPassResourceAllocated(
gfx::Size SoftwareRenderer::GetRenderPassBackingPixelSize(
const AggregatedRenderPassId& render_pass_id) {
auto it = render_pass_bitmaps_.find(render_pass_id);
DCHECK(it != render_pass_bitmaps_.end());
SkBitmap& bitmap = it->second;
SkBitmap& bitmap = render_pass_bitmaps_.at(render_pass_id).bitmap;
return gfx::Size(bitmap.width(), bitmap.height());
}
void SoftwareRenderer::SetRenderPassBackingDrawnRect(
const AggregatedRenderPassId& render_pass_id,
const gfx::Rect& drawn_rect) {
render_pass_bitmaps_.at(render_pass_id).drawn_rect = drawn_rect;
}
gfx::Rect SoftwareRenderer::GetRenderPassBackingDrawnRect(
const AggregatedRenderPassId& render_pass_id) const {
auto it = render_pass_bitmaps_.find(render_pass_id);
if (it != render_pass_bitmaps_.end()) {
return it->second.drawn_rect;
} else {
// DirectRenderer can call this before it has allocated a render pass
// backing if this is the first contiguous frame we're seeing
// |render_pass_id|. This can happen because it calculates the render pass
// scissor rect before it actually allocates the backing.
return gfx::Rect();
}
}
} // namespace viz

@ -13,6 +13,7 @@
#include "components/viz/service/display/direct_renderer.h"
#include "components/viz/service/display/display_resource_provider_software.h"
#include "components/viz/service/viz_service_export.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/latency/latency_info.h"
namespace viz {
@ -66,7 +67,19 @@ class VIZ_SERVICE_EXPORT SoftwareRenderer : public DirectRenderer {
std::unique_ptr<CopyOutputRequest> request) override;
void DidChangeVisibility() override;
protected:
void SetRenderPassBackingDrawnRect(
const AggregatedRenderPassId& render_pass_id,
const gfx::Rect& drawn_rect) override;
gfx::Rect GetRenderPassBackingDrawnRect(
const AggregatedRenderPassId& render_pass_id) const override;
private:
struct RenderPassBitmapBacking {
SkBitmap bitmap;
gfx::Rect drawn_rect;
};
void ClearCanvas(SkColor color);
void ClearFramebuffer();
void SetClipRect(const gfx::Rect& rect);
@ -107,7 +120,8 @@ class VIZ_SERVICE_EXPORT SoftwareRenderer : public DirectRenderer {
}
// A map from RenderPass id to the bitmap used to draw the RenderPass from.
base::flat_map<AggregatedRenderPassId, SkBitmap> render_pass_bitmaps_;
base::flat_map<AggregatedRenderPassId, RenderPassBitmapBacking>
render_pass_bitmaps_;
bool is_scissor_enabled_ = false;
gfx::Rect scissor_rect_;