WebRenderMessageUtils.h (14453B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #ifndef GFX_WEBRENDERMESSAGEUTILS_H 8 #define GFX_WEBRENDERMESSAGEUTILS_H 9 10 #include "chrome/common/ipc_message_utils.h" 11 12 #include "ipc/EnumSerializer.h" 13 #include "ipc/IPCMessageUtils.h" 14 #include "mozilla/IsEnumCase.h" 15 #include "mozilla/ParamTraits_IsEnumCase.h" 16 #include "mozilla/ParamTraits_TiedFields.h" 17 #include "mozilla/webrender/webrender_ffi.h" 18 #include "mozilla/webrender/WebRenderTypes.h" 19 #include "mozilla/dom/MediaIPCUtils.h" 20 21 namespace IPC { 22 23 template <> 24 struct ParamTraits<mozilla::wr::ByteBuffer> { 25 typedef mozilla::wr::ByteBuffer paramType; 26 27 static void Write(MessageWriter* aWriter, const paramType& aParam) { 28 WriteParam(aWriter, aParam.mLength); 29 aWriter->WriteBytes(aParam.mData, aParam.mLength); 30 } 31 32 static bool Read(MessageReader* aReader, paramType* aResult) { 33 size_t length; 34 return ReadParam(aReader, &length) && aResult->Allocate(length) && 35 aReader->ReadBytesInto(aResult->mData, length); 36 } 37 }; 38 39 template <> 40 struct ParamTraits<mozilla::wr::ImageDescriptor> { 41 typedef mozilla::wr::ImageDescriptor paramType; 42 43 static void Write(MessageWriter* aWriter, const paramType& aParam) { 44 WriteParam(aWriter, aParam.format); 45 WriteParam(aWriter, aParam.width); 46 WriteParam(aWriter, aParam.height); 47 WriteParam(aWriter, aParam.stride); 48 WriteParam(aWriter, aParam.opacity); 49 } 50 51 static bool Read(MessageReader* aReader, paramType* aResult) { 52 return ReadParam(aReader, &aResult->format) && 53 ReadParam(aReader, &aResult->width) && 54 ReadParam(aReader, &aResult->height) && 55 ReadParam(aReader, &aResult->stride) && 56 ReadParam(aReader, &aResult->opacity); 57 } 58 }; 59 60 template <> 61 struct ParamTraits<mozilla::wr::GeckoDisplayListType::Tag> 62 : public ContiguousEnumSerializer< 63 mozilla::wr::GeckoDisplayListType::Tag, 64 mozilla::wr::GeckoDisplayListType::Tag::None, 65 mozilla::wr::GeckoDisplayListType::Tag::Sentinel> {}; 66 67 template <> 68 struct ParamTraits<mozilla::wr::GeckoDisplayListType> { 69 typedef mozilla::wr::GeckoDisplayListType paramType; 70 71 static void Write(MessageWriter* aWriter, const paramType& aParam) { 72 WriteParam(aWriter, aParam.tag); 73 switch (aParam.tag) { 74 case mozilla::wr::GeckoDisplayListType::Tag::None: 75 break; 76 case mozilla::wr::GeckoDisplayListType::Tag::Partial: 77 WriteParam(aWriter, aParam.partial._0); 78 break; 79 case mozilla::wr::GeckoDisplayListType::Tag::Full: 80 WriteParam(aWriter, aParam.full._0); 81 break; 82 default: 83 MOZ_RELEASE_ASSERT(false, "bad enum variant"); 84 } 85 } 86 87 static bool Read(MessageReader* aReader, paramType* aResult) { 88 if (!ReadParam(aReader, &aResult->tag)) { 89 return false; 90 } 91 switch (aResult->tag) { 92 case mozilla::wr::GeckoDisplayListType::Tag::None: 93 return true; 94 case mozilla::wr::GeckoDisplayListType::Tag::Partial: 95 return ReadParam(aReader, &aResult->partial._0); 96 case mozilla::wr::GeckoDisplayListType::Tag::Full: 97 return ReadParam(aReader, &aResult->full._0); 98 default: 99 MOZ_RELEASE_ASSERT(false, "bad enum variant"); 100 } 101 } 102 }; 103 104 template <> 105 struct ParamTraits<mozilla::wr::BuiltDisplayListDescriptor> { 106 typedef mozilla::wr::BuiltDisplayListDescriptor paramType; 107 108 static void Write(MessageWriter* aWriter, const paramType& aParam) { 109 WriteParam(aWriter, aParam.gecko_display_list_type); 110 WriteParam(aWriter, aParam.builder_start_time); 111 WriteParam(aWriter, aParam.builder_finish_time); 112 WriteParam(aWriter, aParam.send_start_time); 113 WriteParam(aWriter, aParam.total_clip_nodes); 114 WriteParam(aWriter, aParam.total_spatial_nodes); 115 WriteParam(aWriter, aParam.cache_size); 116 } 117 118 static bool Read(MessageReader* aReader, paramType* aResult) { 119 return ReadParam(aReader, &aResult->gecko_display_list_type) && 120 ReadParam(aReader, &aResult->builder_start_time) && 121 ReadParam(aReader, &aResult->builder_finish_time) && 122 ReadParam(aReader, &aResult->send_start_time) && 123 ReadParam(aReader, &aResult->total_clip_nodes) && 124 ReadParam(aReader, &aResult->total_spatial_nodes) && 125 ReadParam(aReader, &aResult->cache_size); 126 } 127 }; 128 129 } // namespace IPC 130 namespace mozilla { 131 template <> 132 inline auto TiedFields<mozilla::wr::IdNamespace>(mozilla::wr::IdNamespace& a) { 133 return std::tie(a.mHandle); 134 } 135 136 template <> 137 inline auto TiedFields<mozilla::wr::ImageKey>(mozilla::wr::ImageKey& a) { 138 return std::tie(a.mNamespace, a.mHandle); 139 } 140 141 template <> 142 inline auto TiedFields<mozilla::wr::BlobImageKey>( 143 mozilla::wr::BlobImageKey& a) { 144 return std::tie(a._0); 145 } 146 147 template <> 148 inline auto TiedFields<mozilla::wr::SnapshotImageKey>( 149 mozilla::wr::SnapshotImageKey& a) { 150 return std::tie(a._0); 151 } 152 153 template <> 154 inline auto TiedFields<mozilla::wr::FontKey>(mozilla::wr::FontKey& a) { 155 return std::tie(a.mNamespace, a.mHandle); 156 } 157 template <> 158 inline auto TiedFields<mozilla::wr::FontInstanceKey>( 159 mozilla::wr::FontInstanceKey& a) { 160 return std::tie(a.mNamespace, a.mHandle); 161 } 162 163 template <> 164 inline auto TiedFields<mozilla::wr::FontInstanceFlags>( 165 mozilla::wr::FontInstanceFlags& a) { 166 return std::tie(a._0); 167 } 168 169 template <> 170 inline auto TiedFields<mozilla::wr::SyntheticItalics>( 171 mozilla::wr::SyntheticItalics& a) { 172 return std::tie(a.angle); 173 } 174 175 template <> 176 inline auto TiedFields<mozilla::wr::FontInstanceOptions>( 177 mozilla::wr::FontInstanceOptions& a) { 178 return std::tie(a.flags, a.synthetic_italics, a.render_mode, a._padding); 179 } 180 181 // - 182 183 #if !(defined(XP_MACOSX) || defined(XP_WIN)) 184 185 template <> 186 inline constexpr bool IsEnumCase<wr::FontLCDFilter>( 187 const wr::FontLCDFilter raw) { 188 switch (raw) { 189 case wr::FontLCDFilter::None: 190 case wr::FontLCDFilter::Default: 191 case wr::FontLCDFilter::Light: 192 case wr::FontLCDFilter::Legacy: 193 case wr::FontLCDFilter::Sentinel: 194 return true; 195 } 196 return false; 197 } 198 199 template <> 200 inline constexpr bool IsEnumCase<wr::FontHinting>(const wr::FontHinting raw) { 201 switch (raw) { 202 case wr::FontHinting::None: 203 case wr::FontHinting::Mono: 204 case wr::FontHinting::Light: 205 case wr::FontHinting::Normal: 206 case wr::FontHinting::LCD: 207 case wr::FontHinting::Sentinel: 208 return true; 209 } 210 return false; 211 } 212 213 #endif // !(defined(XP_MACOSX) || defined(XP_WIN)) 214 215 // - 216 217 template <> 218 inline auto TiedFields<mozilla::wr::FontInstancePlatformOptions>( 219 mozilla::wr::FontInstancePlatformOptions& a) { 220 #if defined(XP_WIN) 221 return std::tie(a.gamma, a.contrast, a.cleartype_level); 222 #elif defined(XP_MACOSX) 223 return std::tie(a.unused); 224 #else 225 return std::tie(a.lcd_filter, a.hinting); 226 #endif 227 } 228 229 template <> 230 inline auto TiedFields<mozilla::wr::ExternalImageId>( 231 mozilla::wr::ExternalImageId& a) { 232 return std::tie(a._0); 233 } 234 235 template <> 236 inline auto TiedFields<mozilla::wr::PipelineId>(mozilla::wr::PipelineId& a) { 237 return std::tie(a.mNamespace, a.mHandle); 238 } 239 240 template <> 241 inline auto TiedFields<mozilla::wr::LayoutSize>(mozilla::wr::LayoutSize& a) { 242 return std::tie(a.width, a.height); 243 } 244 template <> 245 inline auto TiedFields<mozilla::wr::LayoutRect>(mozilla::wr::LayoutRect& a) { 246 return std::tie(a.min, a.max); 247 } 248 template <> 249 inline auto TiedFields<mozilla::wr::LayoutPoint>(mozilla::wr::LayoutPoint& a) { 250 return std::tie(a.x, a.y); 251 } 252 253 template <> 254 inline constexpr bool IsEnumCase<wr::OpacityType>(const wr::OpacityType raw) { 255 switch (raw) { 256 case wr::OpacityType::Opaque: 257 case wr::OpacityType::HasAlphaChannel: 258 case wr::OpacityType::Sentinel: 259 return true; 260 } 261 return false; 262 } 263 264 template <> 265 inline constexpr bool IsEnumCase<wr::FontRenderMode>( 266 const wr::FontRenderMode raw) { 267 switch (raw) { 268 case wr::FontRenderMode::Mono: 269 case wr::FontRenderMode::Alpha: 270 case wr::FontRenderMode::Subpixel: 271 case wr::FontRenderMode::Sentinel: 272 return true; 273 } 274 return false; 275 } 276 277 template <> 278 inline auto TiedFields<mozilla::wr::InternerSubReport>( 279 mozilla::wr::InternerSubReport& a) { 280 #define _COMMA , 281 #define _(X) a.X 282 return std::tie(WEBRENDER_FOR_EACH_INTERNER(_, _COMMA)); 283 #undef _ 284 #undef _COMMA 285 } 286 287 template <> 288 inline auto TiedFields<mozilla::wr::InterningMemoryReport>( 289 mozilla::wr::InterningMemoryReport& a) { 290 return std::tie(a.interners, a.data_stores); 291 } 292 293 template <> 294 inline auto TiedFields<mozilla::wr::MemoryReport>( 295 mozilla::wr::MemoryReport& a) { 296 // clang-format off 297 return std::tie( 298 a.clip_stores, 299 a.hit_testers, 300 a.fonts, 301 a.weak_fonts, 302 a.images, 303 a.rasterized_blobs, 304 a.shader_cache, 305 a.interning, 306 a.display_list, 307 a.upload_staging_memory, 308 a.swgl, 309 a.frame_allocator, 310 a.render_tasks, 311 a.vertex_data_textures, 312 a.render_target_textures, 313 a.picture_tile_textures, 314 a.atlas_textures, 315 a.standalone_textures, 316 a.texture_cache_structures, 317 a.depth_target_textures, 318 a.texture_upload_pbos, 319 a.swap_chain, 320 a.render_texture_hosts, 321 a.upload_staging_textures 322 ); 323 // clang-format on 324 } 325 326 template <> 327 inline auto TiedFields<mozilla::wr::RenderReasons>( 328 mozilla::wr::RenderReasons& a) { 329 return std::tie(a._0); 330 } 331 332 } // namespace mozilla 333 namespace IPC { 334 template <> 335 struct ParamTraits<mozilla::wr::IdNamespace> 336 : public ParamTraits_TiedFields<mozilla::wr::IdNamespace> {}; 337 338 template <> 339 struct ParamTraits<mozilla::wr::ImageKey> 340 : public ParamTraits_TiedFields<mozilla::wr::ImageKey> {}; 341 342 template <> 343 struct ParamTraits<mozilla::wr::BlobImageKey> 344 : public ParamTraits_TiedFields<mozilla::wr::BlobImageKey> {}; 345 346 template <> 347 struct ParamTraits<mozilla::wr::SnapshotImageKey> 348 : public ParamTraits_TiedFields<mozilla::wr::SnapshotImageKey> {}; 349 350 template <> 351 struct ParamTraits<mozilla::wr::FontKey> 352 : public ParamTraits_TiedFields<mozilla::wr::FontKey> {}; 353 354 template <> 355 struct ParamTraits<mozilla::wr::FontInstanceKey> 356 : public ParamTraits_TiedFields<mozilla::wr::FontInstanceKey> {}; 357 358 template <> 359 struct ParamTraits<mozilla::wr::FontInstanceFlags> 360 : public ParamTraits_TiedFields<mozilla::wr::FontInstanceFlags> {}; 361 362 template <> 363 struct ParamTraits<mozilla::wr::SyntheticItalics> 364 : public ParamTraits_TiedFields<mozilla::wr::SyntheticItalics> {}; 365 366 template <> 367 struct ParamTraits<mozilla::wr::FontInstanceOptions> 368 : public ParamTraits_TiedFields<mozilla::wr::FontInstanceOptions> {}; 369 370 #if !(defined(XP_MACOSX) || defined(XP_WIN)) 371 372 template <> 373 struct ParamTraits<mozilla::wr::FontLCDFilter> 374 : public ParamTraits_IsEnumCase<mozilla::wr::FontLCDFilter> {}; 375 376 template <> 377 struct ParamTraits<mozilla::wr::FontHinting> 378 : public ParamTraits_IsEnumCase<mozilla::wr::FontHinting> {}; 379 380 #endif // !(defined(XP_MACOSX) || defined(XP_WIN)) 381 382 template <> 383 struct ParamTraits<mozilla::wr::FontInstancePlatformOptions> 384 : public ParamTraits_TiedFields<mozilla::wr::FontInstancePlatformOptions> { 385 }; 386 387 template <> 388 struct ParamTraits<mozilla::wr::ExternalImageId> 389 : public ParamTraits_TiedFields<mozilla::wr::ExternalImageId> {}; 390 391 template <> 392 struct ParamTraits<mozilla::wr::PipelineId> 393 : public ParamTraits_TiedFields<mozilla::wr::PipelineId> {}; 394 395 template <> 396 struct ParamTraits<mozilla::wr::ImageFormat> 397 : public ContiguousEnumSerializer<mozilla::wr::ImageFormat, 398 mozilla::wr::ImageFormat::R8, 399 mozilla::wr::ImageFormat::Sentinel> {}; 400 401 template <> 402 struct ParamTraits<mozilla::wr::LayoutSize> 403 : public ParamTraits_TiedFields<mozilla::wr::LayoutSize> {}; 404 405 template <> 406 struct ParamTraits<mozilla::wr::LayoutRect> 407 : public ParamTraits_TiedFields<mozilla::wr::LayoutRect> {}; 408 409 template <> 410 struct ParamTraits<mozilla::wr::LayoutPoint> 411 : public ParamTraits_TiedFields<mozilla::wr::LayoutPoint> {}; 412 413 template <> 414 struct ParamTraits<mozilla::wr::ImageRendering> 415 : public ContiguousEnumSerializer<mozilla::wr::ImageRendering, 416 mozilla::wr::ImageRendering::Auto, 417 mozilla::wr::ImageRendering::Sentinel> {}; 418 419 template <> 420 struct ParamTraits<mozilla::wr::MixBlendMode> 421 : public ContiguousEnumSerializer<mozilla::wr::MixBlendMode, 422 mozilla::wr::MixBlendMode::Normal, 423 mozilla::wr::MixBlendMode::Sentinel> {}; 424 425 template <> 426 struct ParamTraits<mozilla::wr::WebRenderError> 427 : public ContiguousEnumSerializer<mozilla::wr::WebRenderError, 428 mozilla::wr::WebRenderError::INITIALIZE, 429 mozilla::wr::WebRenderError::Sentinel> {}; 430 431 template <> 432 struct ParamTraits<mozilla::wr::WrRotation> 433 : public ContiguousEnumSerializer<mozilla::wr::WrRotation, 434 mozilla::wr::WrRotation::Degree0, 435 mozilla::wr::WrRotation::Sentinel> {}; 436 437 template <> 438 struct ParamTraits<mozilla::wr::InternerSubReport> 439 : public ParamTraits_TiedFields<mozilla::wr::InternerSubReport> {}; 440 441 template <> 442 struct ParamTraits<mozilla::wr::InterningMemoryReport> 443 : public ParamTraits_TiedFields<mozilla::wr::InterningMemoryReport> {}; 444 445 template <> 446 struct ParamTraits<mozilla::wr::MemoryReport> 447 : public ParamTraits_TiedFields<mozilla::wr::MemoryReport> {}; 448 449 template <> 450 struct ParamTraits<mozilla::wr::OpacityType> 451 : public ParamTraits_IsEnumCase<mozilla::wr::OpacityType> {}; 452 453 template <> 454 struct ParamTraits<mozilla::wr::FontRenderMode> 455 : public ParamTraits_IsEnumCase<mozilla::wr::FontRenderMode> {}; 456 457 template <> 458 struct ParamTraits<mozilla::wr::ExternalImageKeyPair> 459 : public ParamTraits_TiedFields<mozilla::wr::ExternalImageKeyPair> {}; 460 461 template <> 462 struct ParamTraits<mozilla::wr::RenderReasons> 463 : public ParamTraits_TiedFields<mozilla::wr::RenderReasons> {}; 464 465 template <> 466 struct ParamTraits<mozilla::wr::ExternalImageSource> 467 : public ContiguousEnumSerializer<mozilla::wr::ExternalImageSource, 468 mozilla::wr::ExternalImageSource::Unknown, 469 mozilla::wr::ExternalImageSource::Last> { 470 }; 471 472 } // namespace IPC 473 474 #endif // GFX_WEBRENDERMESSAGEUTILS_H