blob: 6eb03697cdc378de7de826ba54058372f391af4f [file] [log] [blame]
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SERVICES_VIZ_PUBLIC_CPP_COMPOSITING_QUADS_MOJOM_TRAITS_H_
#define SERVICES_VIZ_PUBLIC_CPP_COMPOSITING_QUADS_MOJOM_TRAITS_H_
#include <optional>
#include "base/check.h"
#include "base/containers/span.h"
#include "base/memory/raw_ptr_exclusion.h"
#include "base/memory/stack_allocated.h"
#include "base/notreached.h"
#include "base/unguessable_token.h"
#include "cc/mojom/paint_flags_mojom_traits.h"
#include "components/viz/common/quads/compositor_render_pass_draw_quad.h"
#include "components/viz/common/quads/debug_border_draw_quad.h"
#include "components/viz/common/quads/picture_draw_quad.h"
#include "components/viz/common/quads/shared_element_draw_quad.h"
#include "components/viz/common/quads/solid_color_draw_quad.h"
#include "components/viz/common/quads/surface_draw_quad.h"
#include "components/viz/common/quads/texture_draw_quad.h"
#include "components/viz/common/quads/tile_draw_quad.h"
#include "components/viz/common/quads/video_hole_draw_quad.h"
#include "components/viz/common/resources/resource_id.h"
#include "components/viz/common/view_transition_element_resource_id.h"
#include "services/viz/public/cpp/compositing/filter_operation_mojom_traits.h"
#include "services/viz/public/cpp/compositing/filter_operations_mojom_traits.h"
#include "services/viz/public/cpp/compositing/shared_quad_state_mojom_traits.h"
#include "services/viz/public/cpp/compositing/surface_range_mojom_traits.h"
#include "services/viz/public/cpp/compositing/view_transition_element_resource_id_mojom_traits.h"
#include "services/viz/public/mojom/compositing/quads.mojom-shared.h"
#include "skia/public/mojom/skcolor4f_mojom_traits.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/gfx/geometry/mojom/geometry_mojom_traits.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/hdr_metadata.h"
#include "ui/gfx/mojom/hdr_metadata_mojom_traits.h"
namespace mojo {
viz::DrawQuad* AllocateAndConstruct(
viz::mojom::DrawQuadStateDataView::Tag material,
viz::QuadList* list);
template <>
struct EnumTraits<viz::mojom::ProtectedVideoState, gfx::ProtectedVideoType> {
static viz::mojom::ProtectedVideoState ToMojom(
gfx::ProtectedVideoType input) {
switch (input) {
case gfx::ProtectedVideoType::kClear:
return viz::mojom::ProtectedVideoState::kClear;
case gfx::ProtectedVideoType::kHardwareProtected:
return viz::mojom::ProtectedVideoState::kHardwareProtected;
case gfx::ProtectedVideoType::kSoftwareProtected:
return viz::mojom::ProtectedVideoState::kSoftwareProtected;
}
NOTREACHED();
}
static bool FromMojom(viz::mojom::ProtectedVideoState input,
gfx::ProtectedVideoType* out) {
switch (input) {
case viz::mojom::ProtectedVideoState::kClear:
*out = gfx::ProtectedVideoType::kClear;
return true;
case viz::mojom::ProtectedVideoState::kHardwareProtected:
*out = gfx::ProtectedVideoType::kHardwareProtected;
return true;
case viz::mojom::ProtectedVideoState::kSoftwareProtected:
*out = gfx::ProtectedVideoType::kSoftwareProtected;
return true;
}
NOTREACHED();
}
};
template <>
struct EnumTraits<viz::mojom::OverlayPriority, viz::OverlayPriority> {
static viz::mojom::OverlayPriority ToMojom(viz::OverlayPriority input) {
switch (input) {
case viz::OverlayPriority::kLow:
return viz::mojom::OverlayPriority::kLow;
case viz::OverlayPriority::kRegular:
return viz::mojom::OverlayPriority::kRegular;
case viz::OverlayPriority::kRequired:
return viz::mojom::OverlayPriority::kRequired;
}
NOTREACHED();
}
static bool FromMojom(viz::mojom::OverlayPriority input,
viz::OverlayPriority* out) {
switch (input) {
case viz::mojom::OverlayPriority::kLow:
*out = viz::OverlayPriority::kLow;
return true;
case viz::mojom::OverlayPriority::kRegular:
*out = viz::OverlayPriority::kRegular;
return true;
case viz::mojom::OverlayPriority::kRequired:
*out = viz::OverlayPriority::kRequired;
return true;
}
NOTREACHED();
}
};
template <>
struct StructTraits<viz::mojom::RoundedDisplayMasksInfoDataView,
viz::TextureDrawQuad::RoundedDisplayMasksInfo> {
static bool is_horizontally_positioned(
const viz::TextureDrawQuad::RoundedDisplayMasksInfo& input) {
return input.is_horizontally_positioned;
}
static base::span<const uint8_t> radii(
const viz::TextureDrawQuad::RoundedDisplayMasksInfo& input) {
return input.radii;
}
static bool Read(viz::mojom::RoundedDisplayMasksInfoDataView data,
viz::TextureDrawQuad::RoundedDisplayMasksInfo* out);
};
template <>
struct UnionTraits<viz::mojom::DrawQuadStateDataView, viz::DrawQuad> {
static viz::mojom::DrawQuadStateDataView::Tag GetTag(
const viz::DrawQuad& quad) {
switch (quad.material) {
case viz::DrawQuad::Material::kInvalid:
break;
case viz::DrawQuad::Material::kAggregatedRenderPass:
break;
case viz::DrawQuad::Material::kDebugBorder:
return viz::mojom::DrawQuadStateDataView::Tag::kDebugBorderQuadState;
case viz::DrawQuad::Material::kPictureContent:
break;
case viz::DrawQuad::Material::kCompositorRenderPass:
return viz::mojom::DrawQuadStateDataView::Tag::kRenderPassQuadState;
case viz::DrawQuad::Material::kSolidColor:
return viz::mojom::DrawQuadStateDataView::Tag::kSolidColorQuadState;
case viz::DrawQuad::Material::kSurfaceContent:
return viz::mojom::DrawQuadStateDataView::Tag::kSurfaceQuadState;
case viz::DrawQuad::Material::kTextureContent:
return viz::mojom::DrawQuadStateDataView::Tag::kTextureQuadState;
case viz::DrawQuad::Material::kTiledContent:
return viz::mojom::DrawQuadStateDataView::Tag::kTileQuadState;
case viz::DrawQuad::Material::kVideoHole:
return viz::mojom::DrawQuadStateDataView::Tag::kVideoHoleQuadState;
case viz::DrawQuad::Material::kSharedElement:
return viz::mojom::DrawQuadStateDataView::Tag::kSharedElementQuadState;
}
NOTREACHED();
}
static const viz::DrawQuad& debug_border_quad_state(
const viz::DrawQuad& quad) {
return quad;
}
static const viz::DrawQuad& render_pass_quad_state(
const viz::DrawQuad& quad) {
return quad;
}
static const viz::DrawQuad& solid_color_quad_state(
const viz::DrawQuad& quad) {
return quad;
}
static const viz::DrawQuad& surface_quad_state(const viz::DrawQuad& quad) {
return quad;
}
static const viz::DrawQuad& texture_quad_state(const viz::DrawQuad& quad) {
return quad;
}
static const viz::DrawQuad& tile_quad_state(const viz::DrawQuad& quad) {
return quad;
}
static const viz::DrawQuad& stream_video_quad_state(
const viz::DrawQuad& quad) {
return quad;
}
static const viz::DrawQuad& video_hole_quad_state(const viz::DrawQuad& quad) {
return quad;
}
static const viz::DrawQuad& shared_element_quad_state(
const viz::DrawQuad& quad) {
return quad;
}
static bool Read(viz::mojom::DrawQuadStateDataView data, viz::DrawQuad* out) {
switch (data.tag()) {
case viz::mojom::DrawQuadStateDataView::Tag::kDebugBorderQuadState:
return data.ReadDebugBorderQuadState(out);
case viz::mojom::DrawQuadStateDataView::Tag::kRenderPassQuadState:
return data.ReadRenderPassQuadState(out);
case viz::mojom::DrawQuadStateDataView::Tag::kSolidColorQuadState:
return data.ReadSolidColorQuadState(out);
case viz::mojom::DrawQuadStateDataView::Tag::kSurfaceQuadState:
return data.ReadSurfaceQuadState(out);
case viz::mojom::DrawQuadStateDataView::Tag::kTextureQuadState:
return data.ReadTextureQuadState(out);
case viz::mojom::DrawQuadStateDataView::Tag::kTileQuadState:
return data.ReadTileQuadState(out);
case viz::mojom::DrawQuadStateDataView::Tag::kVideoHoleQuadState:
return data.ReadVideoHoleQuadState(out);
case viz::mojom::DrawQuadStateDataView::Tag::kSharedElementQuadState:
return data.ReadSharedElementQuadState(out);
}
NOTREACHED();
}
};
template <>
struct StructTraits<viz::mojom::SharedElementQuadStateDataView, viz::DrawQuad> {
static const viz::ViewTransitionElementResourceId& element_resource_id(
const viz::DrawQuad& input) {
const viz::SharedElementDrawQuad* quad =
viz::SharedElementDrawQuad::MaterialCast(&input);
return quad->element_resource_id;
}
static bool Read(viz::mojom::SharedElementQuadStateDataView data,
viz::DrawQuad* out);
};
template <>
struct StructTraits<viz::mojom::VideoHoleQuadStateDataView, viz::DrawQuad> {
static const base::UnguessableToken& overlay_plane_id(
const viz::DrawQuad& input) {
const viz::VideoHoleDrawQuad* quad =
viz::VideoHoleDrawQuad::MaterialCast(&input);
return quad->overlay_plane_id;
}
static bool Read(viz::mojom::VideoHoleQuadStateDataView data,
viz::DrawQuad* out);
};
template <>
struct StructTraits<viz::mojom::DebugBorderQuadStateDataView, viz::DrawQuad> {
static SkColor4f color(const viz::DrawQuad& input) {
const viz::DebugBorderDrawQuad* quad =
viz::DebugBorderDrawQuad::MaterialCast(&input);
return quad->color;
}
static int32_t width(const viz::DrawQuad& input) {
const viz::DebugBorderDrawQuad* quad =
viz::DebugBorderDrawQuad::MaterialCast(&input);
return quad->width;
}
static bool Read(viz::mojom::DebugBorderQuadStateDataView data,
viz::DrawQuad* out);
};
template <>
struct StructTraits<viz::mojom::CompositorRenderPassQuadStateDataView,
viz::DrawQuad> {
static viz::CompositorRenderPassId render_pass_id(
const viz::DrawQuad& input) {
const viz::CompositorRenderPassDrawQuad* quad =
viz::CompositorRenderPassDrawQuad::MaterialCast(&input);
DCHECK(quad->render_pass_id);
return quad->render_pass_id;
}
static viz::ResourceId mask_resource_id(const viz::DrawQuad& input) {
const viz::CompositorRenderPassDrawQuad* quad =
viz::CompositorRenderPassDrawQuad::MaterialCast(&input);
return quad->mask_resource_id();
}
static const gfx::RectF& mask_uv_rect(const viz::DrawQuad& input) {
const viz::CompositorRenderPassDrawQuad* quad =
viz::CompositorRenderPassDrawQuad::MaterialCast(&input);
return quad->mask_uv_rect;
}
static const gfx::Size& mask_texture_size(const viz::DrawQuad& input) {
const viz::CompositorRenderPassDrawQuad* quad =
viz::CompositorRenderPassDrawQuad::MaterialCast(&input);
return quad->mask_texture_size;
}
static const gfx::Vector2dF& filters_scale(const viz::DrawQuad& input) {
const viz::CompositorRenderPassDrawQuad* quad =
viz::CompositorRenderPassDrawQuad::MaterialCast(&input);
return quad->filters_scale;
}
static const gfx::PointF& filters_origin(const viz::DrawQuad& input) {
const viz::CompositorRenderPassDrawQuad* quad =
viz::CompositorRenderPassDrawQuad::MaterialCast(&input);
return quad->filters_origin;
}
static const gfx::RectF& tex_coord_rect(const viz::DrawQuad& input) {
const viz::CompositorRenderPassDrawQuad* quad =
viz::CompositorRenderPassDrawQuad::MaterialCast(&input);
return quad->tex_coord_rect;
}
static bool force_anti_aliasing_off(const viz::DrawQuad& input) {
const viz::CompositorRenderPassDrawQuad* quad =
viz::CompositorRenderPassDrawQuad::MaterialCast(&input);
return quad->force_anti_aliasing_off;
}
static float backdrop_filter_quality(const viz::DrawQuad& input) {
const viz::CompositorRenderPassDrawQuad* quad =
viz::CompositorRenderPassDrawQuad::MaterialCast(&input);
return quad->backdrop_filter_quality;
}
static bool intersects_damage_under(const viz::DrawQuad& input) {
const viz::CompositorRenderPassDrawQuad* quad =
viz::CompositorRenderPassDrawQuad::MaterialCast(&input);
return quad->intersects_damage_under;
}
static bool Read(viz::mojom::CompositorRenderPassQuadStateDataView data,
viz::DrawQuad* out);
};
template <>
struct StructTraits<viz::mojom::SolidColorQuadStateDataView, viz::DrawQuad> {
static SkColor4f color(const viz::DrawQuad& input) {
const viz::SolidColorDrawQuad* quad =
viz::SolidColorDrawQuad::MaterialCast(&input);
return quad->color;
}
static bool force_anti_aliasing_off(const viz::DrawQuad& input) {
const viz::SolidColorDrawQuad* quad =
viz::SolidColorDrawQuad::MaterialCast(&input);
return quad->force_anti_aliasing_off;
}
static bool Read(viz::mojom::SolidColorQuadStateDataView data,
viz::DrawQuad* out);
};
template <>
struct StructTraits<viz::mojom::SurfaceQuadStateDataView, viz::DrawQuad> {
static const viz::SurfaceRange& surface_range(const viz::DrawQuad& input) {
const viz::SurfaceDrawQuad* quad =
viz::SurfaceDrawQuad::MaterialCast(&input);
return quad->surface_range;
}
static const SkColor4f default_background_color(const viz::DrawQuad& input) {
const viz::SurfaceDrawQuad* quad =
viz::SurfaceDrawQuad::MaterialCast(&input);
return quad->default_background_color;
}
static bool stretch_content_to_fill_bounds(const viz::DrawQuad& input) {
const viz::SurfaceDrawQuad* quad =
viz::SurfaceDrawQuad::MaterialCast(&input);
return quad->stretch_content_to_fill_bounds;
}
static bool is_reflection(const viz::DrawQuad& input) {
const viz::SurfaceDrawQuad* quad =
viz::SurfaceDrawQuad::MaterialCast(&input);
return quad->is_reflection;
}
static bool allow_merge(const viz::DrawQuad& input) {
const viz::SurfaceDrawQuad* quad =
viz::SurfaceDrawQuad::MaterialCast(&input);
return quad->allow_merge;
}
static std::optional<cc::PaintFlags::FilterQuality>
override_child_filter_quality(const viz::DrawQuad& input) {
const viz::SurfaceDrawQuad* quad =
viz::SurfaceDrawQuad::MaterialCast(&input);
return quad->override_child_filter_quality;
}
static std::optional<cc::PaintFlags::DynamicRangeLimitMixture>
override_child_dynamic_range_limit(const viz::DrawQuad& input) {
const viz::SurfaceDrawQuad* quad =
viz::SurfaceDrawQuad::MaterialCast(&input);
return quad->override_child_dynamic_range_limit;
}
static bool Read(viz::mojom::SurfaceQuadStateDataView data,
viz::DrawQuad* out);
};
template <>
struct StructTraits<viz::mojom::TextureQuadStateDataView, viz::DrawQuad> {
static viz::ResourceId resource_id(const viz::DrawQuad& input) {
const viz::TextureDrawQuad* quad =
viz::TextureDrawQuad::MaterialCast(&input);
return quad->resource_id;
}
static viz::TextureDrawQuad::RoundedDisplayMasksInfo
rounded_display_masks_info(const viz::DrawQuad& input) {
const viz::TextureDrawQuad* quad =
viz::TextureDrawQuad::MaterialCast(&input);
return quad->rounded_display_masks_info;
}
static const gfx::PointF& uv_top_left(const viz::DrawQuad& input) {
const viz::TextureDrawQuad* quad =
viz::TextureDrawQuad::MaterialCast(&input);
return quad->uv_top_left;
}
static const gfx::PointF& uv_bottom_right(const viz::DrawQuad& input) {
const viz::TextureDrawQuad* quad =
viz::TextureDrawQuad::MaterialCast(&input);
return quad->uv_bottom_right;
}
static SkColor4f background_color(const viz::DrawQuad& input) {
const viz::TextureDrawQuad* quad =
viz::TextureDrawQuad::MaterialCast(&input);
return quad->background_color;
}
static bool force_rgbx(const viz::DrawQuad& input) {
const viz::TextureDrawQuad* quad =
viz::TextureDrawQuad::MaterialCast(&input);
return quad->force_rgbx;
}
static bool nearest_neighbor(const viz::DrawQuad& input) {
const viz::TextureDrawQuad* quad =
viz::TextureDrawQuad::MaterialCast(&input);
return quad->nearest_neighbor;
}
static cc::PaintFlags::DynamicRangeLimitMixture dynamic_range_limit(
const viz::DrawQuad& input) {
const viz::TextureDrawQuad* quad =
viz::TextureDrawQuad::MaterialCast(&input);
return quad->dynamic_range_limit;
}
static bool secure_output_only(const viz::DrawQuad& input) {
const viz::TextureDrawQuad* quad =
viz::TextureDrawQuad::MaterialCast(&input);
return quad->secure_output_only;
}
static bool is_video_frame(const viz::DrawQuad& input) {
const viz::TextureDrawQuad* quad =
viz::TextureDrawQuad::MaterialCast(&input);
return quad->is_video_frame;
}
static gfx::ProtectedVideoType protected_video_type(
const viz::DrawQuad& input) {
const viz::TextureDrawQuad* quad =
viz::TextureDrawQuad::MaterialCast(&input);
return quad->protected_video_type;
}
static viz::OverlayPriority overlay_priority_hint(
const viz::DrawQuad& input) {
const viz::TextureDrawQuad* quad =
viz::TextureDrawQuad::MaterialCast(&input);
return quad->overlay_priority_hint;
}
static const std::optional<gfx::Rect>& damage_rect(
const viz::DrawQuad& input) {
const viz::TextureDrawQuad* quad =
viz::TextureDrawQuad::MaterialCast(&input);
return quad->damage_rect;
}
static bool Read(viz::mojom::TextureQuadStateDataView data,
viz::DrawQuad* out);
};
template <>
struct StructTraits<viz::mojom::TileQuadStateDataView, viz::DrawQuad> {
static const gfx::RectF& tex_coord_rect(const viz::DrawQuad& input) {
const viz::TileDrawQuad* quad = viz::TileDrawQuad::MaterialCast(&input);
return quad->tex_coord_rect;
}
static bool nearest_neighbor(const viz::DrawQuad& input) {
const viz::TileDrawQuad* quad = viz::TileDrawQuad::MaterialCast(&input);
return quad->nearest_neighbor;
}
static viz::ResourceId resource_id(const viz::DrawQuad& input) {
const viz::TileDrawQuad* quad = viz::TileDrawQuad::MaterialCast(&input);
return quad->resource_id;
}
static bool force_anti_aliasing_off(const viz::DrawQuad& input) {
const viz::TileDrawQuad* quad = viz::TileDrawQuad::MaterialCast(&input);
return quad->force_anti_aliasing_off;
}
static bool Read(viz::mojom::TileQuadStateDataView data, viz::DrawQuad* out);
};
struct DrawQuadWithSharedQuadState {
// RAW_PTR_EXCLUSION: Performance reasons (based on analysis of speedometer3).
RAW_PTR_EXCLUSION const viz::DrawQuad* quad = nullptr;
RAW_PTR_EXCLUSION const viz::SharedQuadState* shared_quad_state = nullptr;
};
template <>
struct StructTraits<viz::mojom::DrawQuadDataView, DrawQuadWithSharedQuadState> {
static const gfx::Rect& rect(const DrawQuadWithSharedQuadState& input) {
return input.quad->rect;
}
static const gfx::Rect& visible_rect(
const DrawQuadWithSharedQuadState& input) {
return input.quad->visible_rect;
}
static bool needs_blending(const DrawQuadWithSharedQuadState& input) {
return input.quad->needs_blending;
}
static OptSharedQuadState sqs(const DrawQuadWithSharedQuadState& input) {
return {input.shared_quad_state};
}
static const viz::DrawQuad& draw_quad_state(
const DrawQuadWithSharedQuadState& input) {
return *input.quad;
}
};
// This StructTraits is only used for deserialization within
// CompositorRenderPasses.
template <>
struct StructTraits<viz::mojom::DrawQuadDataView, viz::DrawQuad> {
static bool Read(viz::mojom::DrawQuadDataView data, viz::DrawQuad* out);
};
template <>
struct ArrayTraits<viz::QuadList> {
using Element = DrawQuadWithSharedQuadState;
struct ConstIterator {
STACK_ALLOCATED();
public:
explicit ConstIterator(const viz::QuadList::ConstIterator& it)
: it(it), last_shared_quad_state(nullptr) {}
viz::QuadList::ConstIterator it;
const viz::SharedQuadState* last_shared_quad_state = nullptr;
};
static ConstIterator GetBegin(const viz::QuadList& input) {
return ConstIterator(input.begin());
}
static void AdvanceIterator(ConstIterator& iterator) { // NOLINT
iterator.last_shared_quad_state = (*iterator.it)->shared_quad_state;
++iterator.it;
}
static Element GetValue(ConstIterator& iterator) { // NOLINT
DrawQuadWithSharedQuadState dq = {*iterator.it, nullptr};
// Only serialize the SharedQuadState if we haven't seen it before and
// therefore have not already serialized it.
const viz::SharedQuadState* current_sqs = (*iterator.it)->shared_quad_state;
if (current_sqs != iterator.last_shared_quad_state)
dq.shared_quad_state = current_sqs;
return dq;
}
static size_t GetSize(const viz::QuadList& input) { return input.size(); }
};
} // namespace mojo
#endif // SERVICES_VIZ_PUBLIC_CPP_COMPOSITING_QUADS_MOJOM_TRAITS_H_