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