Coverage Report

Created: 2018-09-25 14:53

/work/obj-fuzz/dist/include/mozilla/layers/AsyncCanvasRenderer.h
Line
Count
Source (jump to first uncovered line)
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 MOZILLA_LAYERS_ASYNCCANVASRENDERER_H_
8
#define MOZILLA_LAYERS_ASYNCCANVASRENDERER_H_
9
10
#include "LayersTypes.h"
11
#include "mozilla/gfx/Point.h"          // for IntSize
12
#include "mozilla/Mutex.h"
13
#include "nsCOMPtr.h"                   // for nsCOMPtr
14
15
class nsICanvasRenderingContextInternal;
16
class nsIInputStream;
17
class nsISerialEventTarget;
18
19
namespace mozilla {
20
21
namespace gfx {
22
class DataSourceSurface;
23
}
24
25
namespace gl {
26
class GLContext;
27
}
28
29
namespace dom {
30
class HTMLCanvasElement;
31
}
32
33
namespace layers {
34
35
class CanvasClient;
36
class TextureClient;
37
38
/**
39
 * Since HTMLCanvasElement and OffscreenCanvas are not thread-safe, we create
40
 * AsyncCanvasRenderer which is thread-safe wrapper object for communicating
41
 * among main, worker and ImageBridgeChild threads.
42
 *
43
 * Each HTMLCanvasElement object is responsible for creating
44
 * AsyncCanvasRenderer object. Once Canvas is transfered to worker,
45
 * OffscreenCanvas will keep reference pointer of this object.
46
 *
47
 * Sometimes main thread needs AsyncCanvasRenderer's result, such as layers
48
 * fallback to BasicLayerManager or calling toDataURL in Javascript. Simply call
49
 * GetSurface() in main thread will readback the result to mSurface.
50
 *
51
 * If layers backend is LAYERS_CLIENT, this object will pass to ImageBridgeChild
52
 * for submitting frames to Compositor.
53
 */
54
class AsyncCanvasRenderer final
55
{
56
  NS_INLINE_DECL_THREADSAFE_REFCOUNTING(AsyncCanvasRenderer)
57
58
public:
59
  AsyncCanvasRenderer();
60
61
  void NotifyElementAboutAttributesChanged();
62
  void NotifyElementAboutInvalidation();
63
64
  void SetCanvasClient(CanvasClient* aClient);
65
66
  void SetWidth(uint32_t aWidth)
67
0
  {
68
0
    mWidth = aWidth;
69
0
  }
70
71
  void SetHeight(uint32_t aHeight)
72
0
  {
73
0
    mHeight = aHeight;
74
0
  }
75
76
  void SetIsAlphaPremultiplied(bool aIsAlphaPremultiplied)
77
0
  {
78
0
    mIsAlphaPremultiplied = aIsAlphaPremultiplied;
79
0
  }
80
81
  // Active thread means the thread which spawns GLContext.
82
  void SetActiveEventTarget();
83
  void ResetActiveEventTarget();
84
85
  // This will readback surface and return the surface
86
  // in the DataSourceSurface.
87
  // Can be called in main thread only.
88
  already_AddRefed<gfx::DataSourceSurface> GetSurface();
89
90
  // For SharedSurface_Basic case, before the frame sending to the compositor,
91
  // we readback it to a texture client because SharedSurface_Basic cannot shared.
92
  // We don't want to readback it again here, so just copy the content of that
93
  // texture client here to avoid readback again.
94
  void CopyFromTextureClient(TextureClient *aClient);
95
96
  // Readback current WebGL's content and convert it to InputStream. This
97
  // function called GetSurface implicitly and GetSurface handles only get
98
  // called in the main thread. So this function can be called in main thread.
99
  nsresult
100
  GetInputStream(const char *aMimeType,
101
                 const char16_t *aEncoderOptions,
102
                 nsIInputStream **aStream);
103
104
  gfx::IntSize GetSize() const
105
0
  {
106
0
    return gfx::IntSize(mWidth, mHeight);
107
0
  }
108
109
  CompositableHandle GetCanvasClientAsyncHandle() const
110
0
  {
111
0
    return mCanvasClientAsyncHandle;
112
0
  }
113
114
  CanvasClient* GetCanvasClient() const
115
0
  {
116
0
    return mCanvasClient;
117
0
  }
118
119
  already_AddRefed<nsISerialEventTarget> GetActiveEventTarget();
120
121
  // The lifetime is controllered by HTMLCanvasElement.
122
  // Only accessed in main thread.
123
  dom::HTMLCanvasElement* mHTMLCanvasElement;
124
125
  // Only accessed in active thread.
126
  nsICanvasRenderingContextInternal* mContext;
127
128
  // We need to keep a reference to the context around here, otherwise the
129
  // canvas' surface texture destructor will deref and destroy it too early
130
  // Only accessed in active thread.
131
  RefPtr<gl::GLContext> mGLContext;
132
private:
133
134
  virtual ~AsyncCanvasRenderer();
135
136
  // Readback current WebGL's content and return it as DataSourceSurface.
137
  already_AddRefed<gfx::DataSourceSurface> UpdateTarget();
138
139
  bool mIsAlphaPremultiplied;
140
141
  uint32_t mWidth;
142
  uint32_t mHeight;
143
  CompositableHandle mCanvasClientAsyncHandle;
144
145
  // The lifetime of this pointer is controlled by OffscreenCanvas
146
  // Can be accessed in active thread and ImageBridge thread.
147
  // But we never accessed it at the same time on both thread. So no
148
  // need to protect this member.
149
  CanvasClient* mCanvasClient;
150
151
  // When backend is LAYER_BASIC and SharedSurface type is Basic.
152
  // CanvasClient will readback the GLContext to a TextureClient
153
  // in order to send frame to compositor. To avoid readback again,
154
  // we copy from this TextureClient to this mSurfaceForBasic directly
155
  // by calling CopyFromTextureClient().
156
  RefPtr<gfx::DataSourceSurface> mSurfaceForBasic;
157
158
  // Protect non thread-safe objects.
159
  Mutex mMutex;
160
161
  // Can be accessed in any thread, need protect by mutex.
162
  nsCOMPtr<nsISerialEventTarget> mActiveEventTarget;
163
};
164
165
} // namespace layers
166
} // namespace mozilla
167
168
#endif // MOZILLA_LAYERS_ASYNCCANVASRENDERER_H_