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:

committed by
Chromium LUCI CQ

parent
3091e722b1
commit
68b8e676fa
@ -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_;
|
||||
|
Reference in New Issue
Block a user