/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef GFX_WEBRENDERMESSAGEUTILS_H #define GFX_WEBRENDERMESSAGEUTILS_H #include "chrome/common/ipc_message_utils.h" #include "ipc/EnumSerializer.h" #include "ipc/IPCMessageUtils.h" #include "mozilla/dom/MediaIPCUtils.h" #include "mozilla/webrender/WebRenderTypes.h" #include "mozilla/webrender/webrender_ffi.h" namespace IPC { template <> struct ParamTraits { typedef mozilla::wr::ByteBuffer paramType; static void Write(MessageWriter* aWriter, const paramType& aParam) { WriteParam(aWriter, aParam.mLength); aWriter->WriteBytes(aParam.mData, aParam.mLength); } static bool Read(MessageReader* aReader, paramType* aResult) { size_t length; return ReadParam(aReader, &length) && aResult->Allocate(length) && aReader->ReadBytesInto(aResult->mData, length); } }; template <> struct ParamTraits { typedef mozilla::wr::ImageDescriptor paramType; static void Write(MessageWriter* aWriter, const paramType& aParam) { WriteParam(aWriter, aParam.format); WriteParam(aWriter, aParam.width); WriteParam(aWriter, aParam.height); WriteParam(aWriter, aParam.stride); WriteParam(aWriter, aParam.opacity); } static ReadResult Read(MessageReader* aReader) { mozilla::wr::ImageFormat format; int32_t width; int32_t height; int32_t stride; mozilla::wr::OpacityType opacity; if (!ReadParam(aReader, &format) || !ReadParam(aReader, &width) || !ReadParam(aReader, &height) || !ReadParam(aReader, &stride) || !ReadParam(aReader, &opacity)) { return {}; } if (width < 0 || height < 0 || stride < 0) { return {}; } if (stride != 0) { int bpp = mozilla::gfx::BytesPerPixel( mozilla::wr::ImageFormatToSurfaceFormat(format)); if (bpp <= 0 || stride / bpp < width) { return {}; } } return paramType(mozilla::gfx::IntSize(width, height), stride, format, opacity); } }; template <> struct ParamTraits : public ContiguousEnumSerializer< mozilla::wr::GeckoDisplayListType::Tag, mozilla::wr::GeckoDisplayListType::Tag::None, mozilla::wr::GeckoDisplayListType::Tag::Sentinel> {}; template <> struct ParamTraits { typedef mozilla::wr::GeckoDisplayListType paramType; static void Write(MessageWriter* aWriter, const paramType& aParam) { WriteParam(aWriter, aParam.tag); switch (aParam.tag) { case mozilla::wr::GeckoDisplayListType::Tag::None: break; case mozilla::wr::GeckoDisplayListType::Tag::Partial: WriteParam(aWriter, aParam.partial._0); break; case mozilla::wr::GeckoDisplayListType::Tag::Full: WriteParam(aWriter, aParam.full._0); break; default: MOZ_RELEASE_ASSERT(false, "bad enum variant"); } } static bool Read(MessageReader* aReader, paramType* aResult) { if (!ReadParam(aReader, &aResult->tag)) { return false; } switch (aResult->tag) { case mozilla::wr::GeckoDisplayListType::Tag::None: return true; case mozilla::wr::GeckoDisplayListType::Tag::Partial: return ReadParam(aReader, &aResult->partial._0); case mozilla::wr::GeckoDisplayListType::Tag::Full: return ReadParam(aReader, &aResult->full._0); default: MOZ_RELEASE_ASSERT(false, "bad enum variant"); } } }; DEFINE_IPC_SERIALIZER_WITH_FIELDS(mozilla::wr::BuiltDisplayListDescriptor, gecko_display_list_type, builder_start_time, builder_finish_time, send_start_time, total_clip_nodes, total_spatial_nodes); } // namespace IPC namespace mozilla { template <> inline auto TiedFields(mozilla::wr::IdNamespace& a) { return std::tie(a.mHandle); } template <> inline auto TiedFields(mozilla::wr::ImageKey& a) { return std::tie(a.mNamespace, a.mHandle); } template <> inline auto TiedFields( mozilla::wr::BlobImageKey& a) { return std::tie(a._0); } template <> inline auto TiedFields( mozilla::wr::SnapshotImageKey& a) { return std::tie(a._0); } template <> inline auto TiedFields(mozilla::wr::FontKey& a) { return std::tie(a.mNamespace, a.mHandle); } template <> inline auto TiedFields( mozilla::wr::FontInstanceKey& a) { return std::tie(a.mNamespace, a.mHandle); } template <> inline auto TiedFields( mozilla::wr::FontInstanceFlags& a) { return std::tie(a._0); } template <> inline auto TiedFields( mozilla::wr::SyntheticItalics& a) { return std::tie(a.angle); } template <> inline auto TiedFields( mozilla::wr::FontInstanceOptions& a) { return std::tie(a.flags, a.synthetic_italics, a.render_mode, a._padding); } template <> inline auto TiedFields( mozilla::wr::FontInstancePlatformOptions& a) { #if defined(XP_WIN) return std::tie(a.gamma, a.contrast, a.cleartype_level); #elif defined(XP_MACOSX) return std::tie(a.unused); #else return std::tie(a.lcd_filter, a.hinting, a.gamma, a.enhanced_contrast); #endif } template <> inline auto TiedFields( mozilla::wr::ExternalImageId& a) { return std::tie(a._0); } template <> inline auto TiedFields(mozilla::wr::PipelineId& a) { return std::tie(a.mNamespace, a.mHandle); } template <> inline auto TiedFields(mozilla::wr::LayoutSize& a) { return std::tie(a.width, a.height); } template <> inline auto TiedFields(mozilla::wr::LayoutRect& a) { return std::tie(a.min, a.max); } template <> inline auto TiedFields(mozilla::wr::LayoutPoint& a) { return std::tie(a.x, a.y); } template <> inline auto TiedFields( mozilla::wr::InternerSubReport& a) { #define _COMMA , #define _(X) a.X return std::tie(WEBRENDER_FOR_EACH_INTERNER(_, _COMMA)); #undef _ #undef _COMMA } template <> inline auto TiedFields( mozilla::wr::InterningMemoryReport& a) { return std::tie(a.interners, a.data_stores); } template <> inline auto TiedFields( mozilla::wr::MemoryReport& a) { // clang-format off return std::tie( a.clip_stores, a.hit_testers, a.fonts, a.weak_fonts, a.images, a.rasterized_blobs, a.shader_cache, a.interning, a.display_list, a.upload_staging_memory, a.swgl, a.frame_allocator, a.render_tasks, a.vertex_data_textures, a.render_target_textures, a.picture_tile_textures, a.atlas_textures, a.standalone_textures, a.texture_cache_structures, a.depth_target_textures, a.texture_upload_pbos, a.swap_chain, a.render_texture_hosts, a.upload_staging_textures ); // clang-format on } template <> inline auto TiedFields( mozilla::wr::RenderReasons& a) { return std::tie(a._0); } } // namespace mozilla namespace IPC { template <> struct ParamTraits : public ParamTraits_TiedFields {}; template <> struct ParamTraits : public ParamTraits_TiedFields {}; template <> struct ParamTraits : public ParamTraits_TiedFields {}; template <> struct ParamTraits : public ParamTraits_TiedFields {}; template <> struct ParamTraits : public ParamTraits_TiedFields {}; template <> struct ParamTraits : public ParamTraits_TiedFields {}; template <> struct ParamTraits : public ParamTraits_TiedFields {}; template <> struct ParamTraits : public ParamTraits_TiedFields {}; template <> struct ParamTraits : public ParamTraits_TiedFields {}; #if !(defined(XP_MACOSX) || defined(XP_WIN)) template <> struct ParamTraits : public ContiguousEnumSerializer {}; template <> struct ParamTraits : public ContiguousEnumSerializer {}; #endif // !(defined(XP_MACOSX) || defined(XP_WIN)) template <> struct ParamTraits : public ParamTraits_TiedFields { }; template <> struct ParamTraits : public ParamTraits_TiedFields {}; template <> struct ParamTraits : public ParamTraits_TiedFields {}; template <> struct ParamTraits : public ContiguousEnumSerializer {}; template <> struct ParamTraits : public ParamTraits_TiedFields {}; template <> struct ParamTraits : public ParamTraits_TiedFields {}; template <> struct ParamTraits : public ParamTraits_TiedFields {}; template <> struct ParamTraits : public ContiguousEnumSerializer {}; template <> struct ParamTraits : public ContiguousEnumSerializer {}; template <> struct ParamTraits : public ContiguousEnumSerializer {}; template <> struct ParamTraits : public ContiguousEnumSerializer {}; template <> struct ParamTraits : public ParamTraits_TiedFields {}; template <> struct ParamTraits : public ParamTraits_TiedFields {}; template <> struct ParamTraits : public ParamTraits_TiedFields {}; template <> struct ParamTraits : public ContiguousEnumSerializer {}; template <> struct ParamTraits : public ContiguousEnumSerializer {}; template <> struct ParamTraits : public ParamTraits_TiedFields {}; template <> struct ParamTraits : public ParamTraits_TiedFields {}; template <> struct ParamTraits : public ContiguousEnumSerializer { }; } // namespace IPC #endif // GFX_WEBRENDERMESSAGEUTILS_H