WebRenderUserData.h (12579B)
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_WEBRENDERUSERDATA_H 8 #define GFX_WEBRENDERUSERDATA_H 9 10 #include <vector> 11 #include "mozilla/gfx/DrawEventRecorderTypes.h" 12 #include "mozilla/webrender/WebRenderAPI.h" 13 #include "mozilla/image/WebRenderImageProvider.h" 14 #include "mozilla/layers/AnimationInfo.h" 15 #include "mozilla/layers/LayersTypes.h" 16 #include "mozilla/UniquePtr.h" 17 #include "nsIFrame.h" 18 #include "nsRefPtrHashtable.h" 19 #include "nsTHashSet.h" 20 #include "ImageTypes.h" 21 #include "ImgDrawResult.h" 22 #include "DisplayItemClip.h" 23 24 namespace mozilla { 25 26 class nsDisplayItemGeometry; 27 28 namespace webgpu { 29 class WebGPUChild; 30 } 31 32 namespace wr { 33 class IpcResourceUpdateQueue; 34 } 35 36 namespace gfx { 37 class SourceSurface; 38 } 39 40 namespace layers { 41 42 class BasicLayerManager; 43 class CanvasRenderer; 44 class ImageClient; 45 class ImageContainer; 46 class WebRenderBridgeChild; 47 class WebRenderCanvasData; 48 class WebRenderCanvasRenderer; 49 class WebRenderCanvasRendererAsync; 50 class WebRenderImageData; 51 class WebRenderImageProviderData; 52 class WebRenderFallbackData; 53 class RenderRootStateManager; 54 class WebRenderGroupData; 55 56 class WebRenderBackgroundData { 57 public: 58 WebRenderBackgroundData(wr::LayoutRect aBounds, wr::ColorF aColor) 59 : mBounds(aBounds), mColor(aColor) {} 60 void AddWebRenderCommands(wr::DisplayListBuilder& aBuilder); 61 62 protected: 63 wr::LayoutRect mBounds; 64 wr::ColorF mColor; 65 }; 66 67 /// Parent class for arbitrary WebRender-specific data that can be associated 68 /// to an nsFrame. 69 class WebRenderUserData { 70 public: 71 typedef nsTHashSet<RefPtr<WebRenderUserData>> WebRenderUserDataRefTable; 72 73 static bool SupportsAsyncUpdate(nsIFrame* aFrame); 74 75 static bool ProcessInvalidateForImage(nsIFrame* aFrame, DisplayItemType aType, 76 image::ImageProviderId aProviderId); 77 78 NS_INLINE_DECL_REFCOUNTING(WebRenderUserData) 79 80 WebRenderUserData(RenderRootStateManager* aManager, nsDisplayItem* aItem); 81 WebRenderUserData(RenderRootStateManager* aManager, uint32_t mDisplayItemKey, 82 nsIFrame* aFrame); 83 84 virtual WebRenderImageData* AsImageData() { return nullptr; } 85 virtual WebRenderImageProviderData* AsImageProviderData() { return nullptr; } 86 virtual WebRenderFallbackData* AsFallbackData() { return nullptr; } 87 virtual WebRenderCanvasData* AsCanvasData() { return nullptr; } 88 virtual WebRenderGroupData* AsGroupData() { return nullptr; } 89 90 enum class UserDataType { 91 eImage, 92 eFallback, 93 eAPZAnimation, 94 eAnimation, 95 eCanvas, 96 eRemote, 97 eGroup, 98 eMask, 99 eImageProvider, // ImageLib 100 eInProcessImage, 101 }; 102 103 virtual UserDataType GetType() = 0; 104 bool IsUsed() { return mUsed; } 105 void SetUsed(bool aUsed) { mUsed = aUsed; } 106 nsIFrame* GetFrame() { return mFrame; } 107 uint32_t GetDisplayItemKey() { return mDisplayItemKey; } 108 void RemoveFromTable(); 109 virtual nsDisplayItemGeometry* GetGeometry() { return nullptr; } 110 111 protected: 112 virtual ~WebRenderUserData(); 113 114 WebRenderBridgeChild* WrBridge() const; 115 116 RefPtr<RenderRootStateManager> mManager; 117 nsIFrame* mFrame; 118 uint32_t mDisplayItemKey; 119 WebRenderUserDataRefTable* mTable; 120 bool mUsed; 121 }; 122 123 struct WebRenderUserDataKey { 124 WebRenderUserDataKey(uint32_t aFrameKey, 125 WebRenderUserData::UserDataType aType) 126 : mFrameKey(aFrameKey), mType(aType) {} 127 128 bool operator==(const WebRenderUserDataKey& other) const { 129 return mFrameKey == other.mFrameKey && mType == other.mType; 130 } 131 PLDHashNumber Hash() const { 132 return HashGeneric( 133 mFrameKey, 134 static_cast<std::underlying_type<decltype(mType)>::type>(mType)); 135 } 136 137 uint32_t mFrameKey; 138 WebRenderUserData::UserDataType mType; 139 }; 140 141 typedef nsRefPtrHashtable< 142 nsGenericHashKey<mozilla::layers::WebRenderUserDataKey>, WebRenderUserData> 143 WebRenderUserDataTable; 144 145 /// Holds some data used to share TextureClient/ImageClient with the parent 146 /// process. 147 class WebRenderImageData : public WebRenderUserData { 148 public: 149 WebRenderImageData(RenderRootStateManager* aManager, nsDisplayItem* aItem); 150 WebRenderImageData(RenderRootStateManager* aManager, uint32_t aDisplayItemKey, 151 nsIFrame* aFrame); 152 virtual ~WebRenderImageData(); 153 154 WebRenderImageData* AsImageData() override { return this; } 155 UserDataType GetType() override { return UserDataType::eImage; } 156 static UserDataType Type() { return UserDataType::eImage; } 157 Maybe<wr::ImageKey> GetImageKey() { return mKey; } 158 void SetImageKey(const wr::ImageKey& aKey); 159 already_AddRefed<ImageClient> GetImageClient(); 160 161 Maybe<wr::ImageKey> UpdateImageKey(ImageContainer* aContainer, 162 wr::IpcResourceUpdateQueue& aResources, 163 bool aFallback = false); 164 165 void CreateAsyncImageWebRenderCommands( 166 mozilla::wr::DisplayListBuilder& aBuilder, ImageContainer* aContainer, 167 const StackingContextHelper& aSc, const LayoutDeviceRect& aBounds, 168 const LayoutDeviceRect& aSCBounds, wr::WrRotation aRotation, 169 const wr::ImageRendering& aFilter, const wr::MixBlendMode& aMixBlendMode, 170 bool aIsBackfaceVisible); 171 172 void CreateImageClientIfNeeded(); 173 174 bool IsAsync() { return mPipelineId.isSome(); } 175 176 void ClearImageKey(); 177 178 protected: 179 Maybe<wr::ImageKey> mKey; 180 RefPtr<TextureClient> mTextureOfImage; 181 RefPtr<ImageClient> mImageClient; 182 Maybe<wr::PipelineId> mPipelineId; 183 RefPtr<ImageContainer> mContainer; 184 }; 185 186 /// Holds some data used to share ImageLib results with the parent process. 187 /// This may be either in the form of a blob recording or a rasterized surface. 188 class WebRenderImageProviderData final : public WebRenderUserData { 189 public: 190 WebRenderImageProviderData(RenderRootStateManager* aManager, 191 nsDisplayItem* aItem); 192 WebRenderImageProviderData(RenderRootStateManager* aManager, 193 uint32_t aDisplayItemKey, nsIFrame* aFrame); 194 ~WebRenderImageProviderData() override; 195 196 WebRenderImageProviderData* AsImageProviderData() override { return this; } 197 UserDataType GetType() override { return UserDataType::eImageProvider; } 198 static UserDataType Type() { return UserDataType::eImageProvider; } 199 200 Maybe<wr::ImageKey> UpdateImageKey(image::WebRenderImageProvider* aProvider, 201 image::ImgDrawResult aDrawResult, 202 wr::IpcResourceUpdateQueue& aResources); 203 204 bool Invalidate(image::ImageProviderId aProviderId) const; 205 206 protected: 207 RefPtr<image::WebRenderImageProvider> mProvider; 208 Maybe<wr::ImageKey> mKey; 209 image::ImgDrawResult mDrawResult = image::ImgDrawResult::NOT_READY; 210 }; 211 212 /// Used for fallback rendering. 213 /// 214 /// In most cases this uses blob images but it can also render on the content 215 /// side directly into a texture. 216 class WebRenderFallbackData : public WebRenderUserData { 217 public: 218 WebRenderFallbackData(RenderRootStateManager* aManager, nsDisplayItem* aItem); 219 WebRenderFallbackData(RenderRootStateManager* aManager, 220 uint32_t aDisplayItemKey, nsIFrame* aFrame); 221 virtual ~WebRenderFallbackData(); 222 223 WebRenderFallbackData* AsFallbackData() override { return this; } 224 UserDataType GetType() override { return UserDataType::eFallback; } 225 static UserDataType Type() { return UserDataType::eFallback; } 226 nsDisplayItemGeometry* GetGeometry() override { return mGeometry.get(); } 227 228 void SetInvalid(bool aInvalid) { mInvalid = aInvalid; } 229 bool IsInvalid() { return mInvalid; } 230 void SetFonts(const std::vector<RefPtr<gfx::ScaledFont>>& aFonts) { 231 mFonts = aFonts; 232 } 233 Maybe<wr::BlobImageKey> GetBlobImageKey() { return mBlobKey; } 234 void SetBlobImageKey(const wr::BlobImageKey& aKey); 235 Maybe<wr::ImageKey> GetImageKey(); 236 237 /// Create a WebRenderImageData to manage the image we are about to render 238 /// into. 239 WebRenderImageData* PaintIntoImage(); 240 241 gfx::DrawEventRecorderPrivate_ExternalSurfacesHolder mExternalSurfaces; 242 UniquePtr<nsDisplayItemGeometry> mGeometry; 243 DisplayItemClip mClip; 244 nsRect mBounds; 245 nsRect mBuildingRect; 246 gfx::MatrixScales mScale; 247 float mOpacity; 248 249 protected: 250 void ClearImageKey(); 251 252 std::vector<RefPtr<gfx::ScaledFont>> mFonts; 253 Maybe<wr::BlobImageKey> mBlobKey; 254 // When rendering into a blob image, mImageData is null. It is non-null only 255 // when we render directly into a texture on the content side. 256 RefPtr<WebRenderImageData> mImageData; 257 bool mInvalid; 258 }; 259 260 class WebRenderAPZAnimationData : public WebRenderUserData { 261 public: 262 WebRenderAPZAnimationData(RenderRootStateManager* aManager, 263 nsDisplayItem* aItem); 264 WebRenderAPZAnimationData(RenderRootStateManager* aManager, 265 uint32_t aDisplayItemKey, nsIFrame* aFrame); 266 virtual ~WebRenderAPZAnimationData() = default; 267 268 UserDataType GetType() override { return UserDataType::eAPZAnimation; } 269 static UserDataType Type() { return UserDataType::eAPZAnimation; } 270 uint64_t GetAnimationId() { return mAnimationId; } 271 272 private: 273 uint64_t mAnimationId; 274 }; 275 276 class WebRenderAnimationData : public WebRenderUserData { 277 public: 278 WebRenderAnimationData(RenderRootStateManager* aManager, 279 nsDisplayItem* aItem); 280 WebRenderAnimationData(RenderRootStateManager* aManager, 281 uint32_t aDisplayItemKey, nsIFrame* aFrame); 282 virtual ~WebRenderAnimationData(); 283 284 UserDataType GetType() override { return UserDataType::eAnimation; } 285 static UserDataType Type() { return UserDataType::eAnimation; } 286 AnimationInfo& GetAnimationInfo() { return mAnimationInfo; } 287 288 protected: 289 AnimationInfo mAnimationInfo; 290 }; 291 292 class WebRenderCanvasData : public WebRenderUserData { 293 public: 294 WebRenderCanvasData(RenderRootStateManager* aManager, nsDisplayItem* aItem); 295 WebRenderCanvasData(RenderRootStateManager* aManager, 296 uint32_t aDisplayItemKey, nsIFrame* aFrame); 297 virtual ~WebRenderCanvasData(); 298 299 WebRenderCanvasData* AsCanvasData() override { return this; } 300 UserDataType GetType() override { return UserDataType::eCanvas; } 301 static UserDataType Type() { return UserDataType::eCanvas; } 302 303 void ClearCanvasRenderer(); 304 WebRenderCanvasRendererAsync* GetCanvasRenderer(); 305 WebRenderCanvasRendererAsync* CreateCanvasRenderer(); 306 bool SetCanvasRenderer(CanvasRenderer* aCanvasRenderer); 307 308 void SetImageContainer(ImageContainer* aImageContainer); 309 ImageContainer* GetImageContainer(); 310 void ClearImageContainer(); 311 312 protected: 313 RefPtr<WebRenderCanvasRendererAsync> mCanvasRenderer; 314 RefPtr<ImageContainer> mContainer; 315 }; 316 317 class WebRenderMaskData : public WebRenderUserData { 318 public: 319 explicit WebRenderMaskData(RenderRootStateManager* aManager, 320 nsDisplayItem* aItem); 321 explicit WebRenderMaskData(RenderRootStateManager* aManager, 322 uint32_t aDisplayItemKey, nsIFrame* aFrame); 323 virtual ~WebRenderMaskData() { 324 MOZ_COUNT_DTOR(WebRenderMaskData); 325 ClearImageKey(); 326 } 327 328 void ClearImageKey(); 329 void Invalidate(); 330 331 UserDataType GetType() override { return UserDataType::eMask; } 332 static UserDataType Type() { return UserDataType::eMask; } 333 334 Maybe<wr::BlobImageKey> mBlobKey; 335 std::vector<RefPtr<gfx::ScaledFont>> mFonts; 336 gfx::DrawEventRecorderPrivate_ExternalSurfacesHolder mExternalSurfaces; 337 LayerIntRect mItemRect; 338 nsPoint mMaskOffset; 339 nsStyleImageLayers mMaskStyle; 340 gfx::MatrixScales mScale; 341 bool mShouldHandleOpacity; 342 }; 343 344 extern void DestroyWebRenderUserDataTable(WebRenderUserDataTable* aTable); 345 346 struct WebRenderUserDataProperty { 347 NS_DECLARE_FRAME_PROPERTY_WITH_DTOR(Key, WebRenderUserDataTable, 348 DestroyWebRenderUserDataTable) 349 }; 350 351 template <class T> 352 already_AddRefed<T> GetWebRenderUserData(const nsIFrame* aFrame, 353 uint32_t aPerFrameKey) { 354 MOZ_ASSERT(aFrame); 355 WebRenderUserDataTable* userDataTable = 356 aFrame->GetProperty(WebRenderUserDataProperty::Key()); 357 if (!userDataTable) { 358 return nullptr; 359 } 360 361 WebRenderUserData* data = 362 userDataTable->GetWeak(WebRenderUserDataKey(aPerFrameKey, T::Type())); 363 if (data) { 364 RefPtr<T> result = static_cast<T*>(data); 365 return result.forget(); 366 } 367 368 return nullptr; 369 } 370 371 } // namespace layers 372 } // namespace mozilla 373 374 #endif /* GFX_WEBRENDERUSERDATA_H */