1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 
6 #ifndef GPU_CanvasContext_H_
7 #define GPU_CanvasContext_H_
8 
9 #include "nsICanvasRenderingContextInternal.h"
10 #include "nsWrapperCache.h"
11 #include "ObjectModel.h"
12 #include "SwapChain.h"
13 #include "mozilla/webrender/WebRenderAPI.h"
14 
15 namespace mozilla {
16 namespace dom {
17 class Promise;
18 enum class GPUTextureFormat : uint8_t;
19 }  // namespace dom
20 namespace layers {
21 class WebRenderLocalCanvasData;
22 };
23 namespace webgpu {
24 class Adapter;
25 class SwapChain;
26 class Texture;
27 
28 class CanvasContext final : public nsICanvasRenderingContextInternal,
29                             public nsWrapperCache {
30  private:
31   virtual ~CanvasContext();
32   void Cleanup();
33 
34  public:
35   // nsISupports interface + CC
36   NS_DECL_CYCLE_COLLECTING_ISUPPORTS
37   NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(CanvasContext)
38 
39   CanvasContext();
40 
41   JSObject* WrapObject(JSContext* aCx,
42                        JS::Handle<JSObject*> aGivenProto) override;
43 
44   void RemoveSwapChain();
45 
46   Maybe<wr::ImageKey> GetImageKey() const;
47   wr::ImageKey CreateImageKey(layers::RenderRootStateManager* aManager);
48   bool UpdateWebRenderLocalCanvasData(
49       layers::WebRenderLocalCanvasData* aCanvasData);
50 
51   wr::ExternalImageId mExternalImageId;
52 
53  public:  // nsICanvasRenderingContextInternal
GetWidth()54   int32_t GetWidth() override { return mWidth; }
GetHeight()55   int32_t GetHeight() override { return mHeight; }
56 
SetDimensions(int32_t aWidth,int32_t aHeight)57   NS_IMETHOD SetDimensions(int32_t aWidth, int32_t aHeight) override {
58     mWidth = aWidth;
59     mHeight = aHeight;
60     return NS_OK;
61   }
InitializeWithDrawTarget(nsIDocShell * aShell,NotNull<gfx::DrawTarget * > aTarget)62   NS_IMETHOD InitializeWithDrawTarget(
63       nsIDocShell* aShell, NotNull<gfx::DrawTarget*> aTarget) override {
64     return NS_OK;
65   }
66 
GetImageBuffer(int32_t * aFormat)67   mozilla::UniquePtr<uint8_t[]> GetImageBuffer(int32_t* aFormat) override {
68     MOZ_CRASH("todo");
69   }
GetInputStream(const char * aMimeType,const nsAString & aEncoderOptions,nsIInputStream ** aStream)70   NS_IMETHOD GetInputStream(const char* aMimeType,
71                             const nsAString& aEncoderOptions,
72                             nsIInputStream** aStream) override {
73     *aStream = nullptr;
74     return NS_OK;
75   }
76 
GetSurfaceSnapshot(gfxAlphaType * aOutAlphaType)77   already_AddRefed<mozilla::gfx::SourceSurface> GetSurfaceSnapshot(
78       gfxAlphaType* aOutAlphaType) override {
79     return nullptr;
80   }
81 
SetOpaqueValueFromOpaqueAttr(bool aOpaqueAttrValue)82   void SetOpaqueValueFromOpaqueAttr(bool aOpaqueAttrValue) override {}
GetIsOpaque()83   bool GetIsOpaque() override { return true; }
Reset()84   NS_IMETHOD Reset() override { return NS_OK; }
85   already_AddRefed<Layer> GetCanvasLayer(nsDisplayListBuilder* aBuilder,
86                                          Layer* aOldLayer,
87                                          LayerManager* aManager) override;
88   bool UpdateWebRenderCanvasData(nsDisplayListBuilder* aBuilder,
89                                  WebRenderCanvasData* aCanvasData) override;
MarkContextClean()90   void MarkContextClean() override {}
91 
Redraw(const gfxRect & aDirty)92   NS_IMETHOD Redraw(const gfxRect& aDirty) override { return NS_OK; }
SetIsIPC(bool aIsIPC)93   NS_IMETHOD SetIsIPC(bool aIsIPC) override { return NS_OK; }
94 
DidRefresh()95   void DidRefresh() override {}
96 
MarkContextCleanForFrameCapture()97   void MarkContextCleanForFrameCapture() override {}
IsContextCleanForFrameCapture()98   bool IsContextCleanForFrameCapture() override { return false; }
99 
100  public:
101   dom::GPUTextureFormat GetSwapChainPreferredFormat(Adapter& aAdapter) const;
102   RefPtr<SwapChain> ConfigureSwapChain(const dom::GPUSwapChainDescriptor& aDesc,
103                                        ErrorResult& aRv);
104 
105  private:
106   uint32_t mWidth = 0, mHeight = 0;
107 
108   RefPtr<SwapChain> mSwapChain;
109   RefPtr<layers::RenderRootStateManager> mRenderRootStateManager;
110   Maybe<wr::ImageKey> mImageKey;
111 };
112 
113 }  // namespace webgpu
114 }  // namespace mozilla
115 
116 #endif  // GPU_CanvasContext_H_
117