#include "components/viz/service/display/direct_renderer.h"
#include <limits.h>
#include <stddef.h>
#include <algorithm>
#include <utility>
#include <vector>
#include "base/auto_reset.h"
#include "base/containers/circular_deque.h"
#include "base/lazy_instance.h"
#include "base/logging.h"
#include "base/memory/raw_ptr.h"
#include "base/metrics/histogram_macros.h"
#include "base/numerics/safe_conversions.h"
#include "base/timer/elapsed_timer.h"
#include "base/trace_event/trace_event.h"
#include "build/build_config.h"
#include "cc/base/math_util.h"
#include "cc/paint/filter_operations.h"
#include "components/viz/common/color_space_utils.h"
#include "components/viz/common/display/renderer_settings.h"
#include "components/viz/common/features.h"
#include "components/viz/common/frame_sinks/copy_output_request.h"
#include "components/viz/common/frame_sinks/copy_output_util.h"
#include "components/viz/common/quads/aggregated_render_pass_draw_quad.h"
#include "components/viz/common/quads/compositor_render_pass_draw_quad.h"
#include "components/viz/common/quads/draw_quad.h"
#include "components/viz/common/quads/solid_color_draw_quad.h"
#include "components/viz/common/resources/platform_color.h"
#include "components/viz/common/resources/shared_image_format.h"
#include "components/viz/common/resources/shared_image_format_utils.h"
#include "components/viz/common/viz_utils.h"
#include "components/viz/service/debugger/viz_debugger.h"
#include "components/viz/service/display/bsp_tree.h"
#include "components/viz/service/display/bsp_walk_action.h"
#include "components/viz/service/display/output_surface.h"
#include "components/viz/service/display/render_pass_alpha_type.h"
#include "components/viz/service/display/skia_output_surface.h"
#include "gpu/command_buffer/common/capabilities.h"
#include "media/base/video_util.h"
#include "ui/gfx/buffer_types.h"
#include "ui/gfx/display_color_spaces.h"
#include "ui/gfx/geometry/quad_f.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/rect_conversions.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/geometry/transform.h"
#include "ui/gfx/geometry/transform_util.h"
namespace viz {
namespace {
BASE_FEATURE(…);
enum class RenderPassDrawRectAssign { … };
}
DirectRenderer::DrawingFrame::DrawingFrame() = default;
DirectRenderer::DrawingFrame::~DrawingFrame() = default;
DirectRenderer::SwapFrameData::SwapFrameData() = default;
DirectRenderer::SwapFrameData::~SwapFrameData() = default;
DirectRenderer::SwapFrameData::SwapFrameData(SwapFrameData&&) = default;
DirectRenderer::SwapFrameData& DirectRenderer::SwapFrameData::operator=(
SwapFrameData&&) = default;
DirectRenderer::DirectRenderer(const RendererSettings* settings,
const DebugRendererSettings* debug_settings,
OutputSurface* output_surface,
DisplayResourceProvider* resource_provider,
OverlayProcessorInterface* overlay_processor)
: … { … }
DirectRenderer::~DirectRenderer() = default;
void DirectRenderer::Initialize() { … }
gfx::RectF DirectRenderer::QuadVertexRect() { … }
void DirectRenderer::QuadRectTransform(gfx::Transform* quad_rect_transform,
const gfx::Transform& quad_transform,
const gfx::RectF& quad_rect) { … }
gfx::AxisTransform2d DirectRenderer::CalculateTargetToDeviceTransform(
const gfx::Rect& draw_rect,
const gfx::Size& viewport_size) { … }
gfx::Rect DirectRenderer::MoveFromDrawToWindowSpace(
const gfx::Rect& draw_rect) const { … }
const DrawQuad* DirectRenderer::CanPassBeDrawnDirectly(
const AggregatedRenderPass* pass,
const RenderPassRequirements& requirements) { … }
void DirectRenderer::SetOutputSurfaceClipRect(const gfx::Rect& clip_rect) { … }
void DirectRenderer::SetVisible(bool visible) { … }
void DirectRenderer::ReallocatedFrameBuffers() { … }
void DirectRenderer::Reshape(
const OutputSurface::ReshapeParams& reshape_params) { … }
void DirectRenderer::DecideRenderPassAllocationsForFrame(
const AggregatedRenderPassList& render_passes_in_draw_order) { … }
void DirectRenderer::DrawFrame(
AggregatedRenderPassList* render_passes_in_draw_order,
float device_scale_factor,
const gfx::Size& device_viewport_size,
const gfx::DisplayColorSpaces& display_color_spaces,
SurfaceDamageRectList surface_damage_rect_list) { … }
gfx::Rect DirectRenderer::GetCurrentFramebufferDamage() const { … }
gfx::Rect DirectRenderer::GetTargetDamageBoundingRect() const { … }
gfx::Rect DirectRenderer::DeviceViewportRectInDrawSpace() const { … }
gfx::Rect DirectRenderer::OutputSurfaceRectInDrawSpace() const { … }
bool DirectRenderer::ShouldSkipQuad(const DrawQuad& quad,
const gfx::Rect& render_pass_scissor) { … }
void DirectRenderer::SetScissorStateForQuad(
const DrawQuad& quad,
const gfx::Rect& render_pass_scissor,
bool use_render_pass_scissor) { … }
void DirectRenderer::SetScissorTestRectInDrawSpace(
const gfx::Rect& draw_space_rect) { … }
void DirectRenderer::DoDrawPolygon(const DrawPolygon& poly,
const gfx::Rect& render_pass_scissor,
bool use_render_pass_scissor) { … }
const cc::FilterOperations* DirectRenderer::FiltersForPass(
AggregatedRenderPassId render_pass_id) const { … }
const cc::FilterOperations* DirectRenderer::BackdropFiltersForPass(
AggregatedRenderPassId render_pass_id) const { … }
const std::optional<gfx::RRectF> DirectRenderer::BackdropFilterBoundsForPass(
AggregatedRenderPassId render_pass_id) const { … }
bool DirectRenderer::SupportsBGRA() const { … }
void DirectRenderer::FlushPolygons(
base::circular_deque<std::unique_ptr<DrawPolygon>>* poly_list,
const gfx::Rect& render_pass_scissor,
bool use_render_pass_scissor) { … }
void DirectRenderer::DrawRenderPassAndExecuteCopyRequests(
AggregatedRenderPass* render_pass) { … }
void DirectRenderer::DrawRenderPass(const AggregatedRenderPass* render_pass) { … }
bool DirectRenderer::CanSkipRenderPass(
const AggregatedRenderPass* render_pass) const { … }
DirectRenderer::RenderPassRequirements
DirectRenderer::CalculateRenderPassRequirements(
const AggregatedRenderPass* render_pass) const { … }
gfx::ColorSpace DirectRenderer::RenderPassColorSpace(
const AggregatedRenderPass* render_pass) const { … }
void DirectRenderer::EnsureRenderPassAllocated(
const AggregatedRenderPass* render_pass) { … }
gfx::Rect DirectRenderer::ComputeScissorRectForRenderPass(
const AggregatedRenderPass* render_pass) const { … }
gfx::Size DirectRenderer::CalculateTextureSizeForRenderPass(
const AggregatedRenderPass* render_pass) const { … }
gfx::Size DirectRenderer::CalculateSizeForOutputSurface(
const gfx::Size& requested_viewport_size) { … }
void DirectRenderer::SetCurrentFrameForTesting(const DrawingFrame& frame) { … }
bool DirectRenderer::HasAllocatedResourcesForTesting(
const AggregatedRenderPassId& render_pass_id) const { … }
bool DirectRenderer::ShouldApplyRoundedCorner(const DrawQuad* quad) const { … }
float DirectRenderer::CurrentFrameSDRWhiteLevel() const { … }
bool DirectRenderer::ShouldApplyGradientMask(const DrawQuad* quad) const { … }
SharedImageFormat DirectRenderer::GetColorSpaceSharedImageFormat(
gfx::ColorSpace color_space) const { … }
DelegatedInkPointRendererBase* DirectRenderer::GetDelegatedInkPointRenderer(
bool create_if_necessary) { … }
void DirectRenderer::DrawDelegatedInkTrail() { … }
bool DirectRenderer::CompositeTimeTracingEnabled() { … }
void DirectRenderer::AddCompositeTimeTraces(base::TimeTicks ready_timestamp) { … }
gfx::Rect DirectRenderer::GetDelegatedInkTrailDamageRect() { … }
gpu::Mailbox DirectRenderer::GetPrimaryPlaneOverlayTestingMailbox() { … }
}