Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1358)

Side by Side Diff: third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.h

Issue 2402603002: State management cleanup (Closed)
Patch Set: Make state dirtying explosive Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2010, Google Inc. All rights reserved. 2 * Copyright (c) 2010, Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 62
63 namespace blink { 63 namespace blink {
64 class Extensions3DUtil; 64 class Extensions3DUtil;
65 class ImageBuffer; 65 class ImageBuffer;
66 class StaticBitmapImage; 66 class StaticBitmapImage;
67 class WebExternalBitmap; 67 class WebExternalBitmap;
68 class WebExternalTextureLayer; 68 class WebExternalTextureLayer;
69 class WebGraphicsContext3DProvider; 69 class WebGraphicsContext3DProvider;
70 class WebLayer; 70 class WebLayer;
71 71
72 // OpenGL state the the DrawingBuffer may modify, which it will need to
73 // restore before returning from any of its methods.
74 struct PLATFORM_EXPORT DrawingBufferRestoreState {
75 bool scissorEnabled = false;
76
77 GLfloat clearColor[4] = {0, 0, 0, 0};
78 GLfloat clearDepth = 0;
79 GLint clearStencil = 0;
80
81 GLboolean colorMask[4] = {0, 0, 0, 0};
82 GLboolean depthMask = 0;
83 GLuint stencilMask = 0;
84
85 GLint packAlignment = 4;
86
87 // The bound 2D texture for the active texture unit.
88 GLuint activeTexture2DBinding = 0;
89 GLuint renderbufferBinding = 0;
90 GLuint drawFramebufferBinding = 0;
91 GLuint readFramebufferBinding = 0;
92 GLuint pixelUnpackBufferBinding = 0;
93 };
94
95 // An interface through which DrawingBuffer may query the state that it will
96 // need to reset from an object that is tracking this state.
97 class PLATFORM_EXPORT DrawingBufferStateTracker {
98 public:
99 virtual void GetDrawingBufferRestoreState(DrawingBufferRestoreState*) = 0;
100 };
101
72 // Manages a rendering target (framebuffer + attachment) for a canvas. Can 102 // Manages a rendering target (framebuffer + attachment) for a canvas. Can
73 // publish its rendering results to a WebLayer for compositing. 103 // publish its rendering results to a WebLayer for compositing.
74 class PLATFORM_EXPORT DrawingBuffer 104 class PLATFORM_EXPORT DrawingBuffer
75 : public NON_EXPORTED_BASE(cc::TextureLayerClient), 105 : public NON_EXPORTED_BASE(cc::TextureLayerClient),
76 public RefCounted<DrawingBuffer> { 106 public RefCounted<DrawingBuffer> {
77 WTF_MAKE_NONCOPYABLE(DrawingBuffer); 107 WTF_MAKE_NONCOPYABLE(DrawingBuffer);
78 108
79 public: 109 public:
80 enum PreserveDrawingBuffer { 110 enum PreserveDrawingBuffer {
81 Preserve, 111 Preserve,
82 Discard, 112 Discard,
83 }; 113 };
84 enum WebGLVersion { 114 enum WebGLVersion {
85 WebGL1, 115 WebGL1,
86 WebGL2, 116 WebGL2,
87 }; 117 };
88 118
89 enum ChromiumImageUsage { 119 enum ChromiumImageUsage {
90 AllowChromiumImage, 120 AllowChromiumImage,
91 DisallowChromiumImage, 121 DisallowChromiumImage,
92 }; 122 };
93 123
94 static PassRefPtr<DrawingBuffer> create( 124 static PassRefPtr<DrawingBuffer> create(
95 std::unique_ptr<WebGraphicsContext3DProvider>, 125 std::unique_ptr<WebGraphicsContext3DProvider>,
126 DrawingBufferStateTracker*,
96 const IntSize&, 127 const IntSize&,
97 bool premultipliedAlpha, 128 bool premultipliedAlpha,
98 bool wantAlphaChannel, 129 bool wantAlphaChannel,
99 bool wantDepthBuffer, 130 bool wantDepthBuffer,
100 bool wantStencilBuffer, 131 bool wantStencilBuffer,
101 bool wantAntialiasing, 132 bool wantAntialiasing,
102 PreserveDrawingBuffer, 133 PreserveDrawingBuffer,
103 WebGLVersion, 134 WebGLVersion,
104 ChromiumImageUsage); 135 ChromiumImageUsage);
105 static void forceNextDrawingBufferCreationToFail(); 136 static void forceNextDrawingBufferCreationToFail();
106 137
107 ~DrawingBuffer() override; 138 ~DrawingBuffer() override;
108 139
109 // Destruction will be completed after all mailboxes are released. 140 // Destruction will be completed after all mailboxes are released.
110 void beginDestruction(); 141 void beginDestruction();
111 142
112 // Issues a glClear() on all framebuffers associated with this DrawingBuffer. 143 // Issues a glClear() on all framebuffers associated with this DrawingBuffer.
113 // The caller is responsible for making the context current and setting the 144 // The caller is responsible for making the context current and setting the
114 // clear values and masks. Modifies the framebuffer binding. 145 // clear values and masks.
115 void clearFramebuffers(GLbitfield clearMask); 146 void clearFramebuffers(GLbitfield clearMask);
116 147
117 // Indicates whether the DrawingBuffer internally allocated a packed 148 // Indicates whether the DrawingBuffer internally allocated a packed
118 // depth-stencil renderbuffer in the situation where the end user only asked 149 // depth-stencil renderbuffer in the situation where the end user only asked
119 // for a depth buffer. In this case, we need to upgrade clears of the depth 150 // for a depth buffer. In this case, we need to upgrade clears of the depth
120 // buffer to clears of the depth and stencil buffers in order to avoid 151 // buffer to clears of the depth and stencil buffers in order to avoid
121 // performance problems on some GPUs. 152 // performance problems on some GPUs.
122 bool hasImplicitStencilBuffer() const { return m_hasImplicitStencilBuffer; } 153 bool hasImplicitStencilBuffer() const { return m_hasImplicitStencilBuffer; }
123 bool hasDepthBuffer() const { return !!m_depthStencilBuffer; } 154 bool hasDepthBuffer() const { return !!m_depthStencilBuffer; }
124 bool hasStencilBuffer() const { return !!m_depthStencilBuffer; } 155 bool hasStencilBuffer() const { return !!m_depthStencilBuffer; }
125 156
126 // Given the desired buffer size, provides the largest dimensions that will 157 // Given the desired buffer size, provides the largest dimensions that will
127 // fit in the pixel budget. 158 // fit in the pixel budget.
128 static IntSize adjustSize(const IntSize& desiredSize, 159 static IntSize adjustSize(const IntSize& desiredSize,
129 const IntSize& curSize, 160 const IntSize& curSize,
130 int maxTextureSize); 161 int maxTextureSize);
131 162
132 // Resizes (or allocates if necessary) all buffers attached to the default 163 // Resizes (or allocates if necessary) all buffers attached to the default
133 // framebuffer. Returns whether the operation was successful. Leaves GL 164 // framebuffer. Returns whether the operation was successful.
134 // bindings dirtied. 165 bool resize(const IntSize&);
135 bool reset(const IntSize&);
136 166
137 // Bind the default framebuffer to |target|. |target| must be 167 // Bind the default framebuffer to |target|. |target| must be
138 // GL_FRAMEBUFFER, GL_READ_FRAMEBUFFER, or GL_DRAW_FRAMEBUFFER. 168 // GL_FRAMEBUFFER, GL_READ_FRAMEBUFFER, or GL_DRAW_FRAMEBUFFER.
139 void bind(GLenum target); 169 void bind(GLenum target);
140 IntSize size() const { return m_size; } 170 IntSize size() const { return m_size; }
141 171
142 // Copies the multisample color buffer to the normal color buffer and leaves 172 // Resolves the multisample color buffer to the normal color buffer and leaves
143 // m_fbo bound. 173 // the resolved color buffer bound to GL_READ_FRAMEBUFFER and
144 void commit(); 174 // GL_DRAW_FRAMEBUFFER.
145 175 void resolveAndBindForReadAndDraw();
146 // commit should copy the full multisample buffer, and not respect the
147 // current scissor bounds. Track the state of the scissor test so that it
148 // can be disabled during calls to commit.
149 void setScissorEnabled(bool scissorEnabled) {
150 m_scissorEnabled = scissorEnabled;
151 }
152
153 // The DrawingBuffer needs to track the texture bound to texture unit 0.
154 // The bound texture is tracked to avoid costly queries during rendering.
155 void setTexture2DBinding(GLuint texture) { m_texture2DBinding = texture; }
156
157 void setPixelUnpackBufferBinding(GLuint buffer) {
158 DCHECK(m_webGLVersion > WebGL1);
159 m_pixelUnpackBufferBinding = buffer;
160 }
161
162 void notifyBufferDeleted(GLuint buffer) {
163 if (m_webGLVersion > WebGL1 && buffer == m_pixelUnpackBufferBinding) {
164 setPixelUnpackBufferBinding(0);
165 }
166 }
167
168 // The DrawingBuffer needs to track the currently bound framebuffer so it
169 // restore the binding when needed.
170 void setFramebufferBinding(GLenum target, GLuint fbo) {
171 switch (target) {
172 case GL_FRAMEBUFFER:
173 m_drawFramebufferBinding = fbo;
174 m_readFramebufferBinding = fbo;
175 break;
176 case GL_DRAW_FRAMEBUFFER:
177 m_drawFramebufferBinding = fbo;
178 break;
179 case GL_READ_FRAMEBUFFER:
180 m_readFramebufferBinding = fbo;
181 break;
182 default:
183 ASSERT(0);
184 }
185 }
186
187 // The DrawingBuffer needs to track the color mask and clear color so that
188 // it can restore it when needed.
189 void setClearColor(GLfloat* clearColor) {
190 memcpy(m_clearColor, clearColor, 4 * sizeof(GLfloat));
191 }
192
193 void setColorMask(GLboolean* colorMask) {
194 memcpy(m_colorMask, colorMask, 4 * sizeof(GLboolean));
195 }
196
197 // The DrawingBuffer needs to track the currently bound renderbuffer so it
198 // restore the binding when needed.
199 void setRenderbufferBinding(GLuint renderbuffer) {
200 m_renderbufferBinding = renderbuffer;
201 }
202
203 // Track the currently active texture unit. Texture unit 0 is used as host for
204 // a scratch texture.
205 void setActiveTextureUnit(GLint textureUnit) {
206 m_activeTextureUnit = textureUnit;
207 }
208 176
209 bool multisample() const; 177 bool multisample() const;
210 178
211 GLuint framebuffer() const;
212
213 bool discardFramebufferSupported() const { 179 bool discardFramebufferSupported() const {
214 return m_discardFramebufferSupported; 180 return m_discardFramebufferSupported;
215 } 181 }
216 182
217 void markContentsChanged(); 183 void markContentsChanged();
218 void setBufferClearNeeded(bool); 184 void setBufferClearNeeded(bool);
219 bool bufferClearNeeded() const; 185 bool bufferClearNeeded() const;
220 void setIsHidden(bool); 186 void setIsHidden(bool);
221 void setFilterQuality(SkFilterQuality); 187 void setFilterQuality(SkFilterQuality);
222 188
(...skipping 16 matching lines...) Expand all
239 bool PrepareTextureMailbox( 205 bool PrepareTextureMailbox(
240 cc::TextureMailbox* outMailbox, 206 cc::TextureMailbox* outMailbox,
241 std::unique_ptr<cc::SingleReleaseCallback>* outReleaseCallback) override; 207 std::unique_ptr<cc::SingleReleaseCallback>* outReleaseCallback) override;
242 208
243 // Returns a StaticBitmapImage backed by a texture containing the current 209 // Returns a StaticBitmapImage backed by a texture containing the current
244 // contents of the front buffer. This is done without any pixel copies. The 210 // contents of the front buffer. This is done without any pixel copies. The
245 // texture in the ImageBitmap is from the active ContextProvider on the 211 // texture in the ImageBitmap is from the active ContextProvider on the
246 // DrawingBuffer. 212 // DrawingBuffer.
247 PassRefPtr<StaticBitmapImage> transferToStaticBitmapImage(); 213 PassRefPtr<StaticBitmapImage> transferToStaticBitmapImage();
248 214
249 // Destroys the TEXTURE_2D binding for the owned context
250 bool copyToPlatformTexture(gpu::gles2::GLES2Interface*, 215 bool copyToPlatformTexture(gpu::gles2::GLES2Interface*,
251 GLuint texture, 216 GLuint texture,
252 GLenum internalFormat, 217 GLenum internalFormat,
253 GLenum destType, 218 GLenum destType,
254 GLint level, 219 GLint level,
255 bool premultiplyAlpha, 220 bool premultiplyAlpha,
256 bool flipY, 221 bool flipY,
257 SourceDrawingBuffer); 222 SourceDrawingBuffer);
258 223
259 void setPackAlignment(GLint param);
260
261 bool paintRenderingResultsToImageData(int&, 224 bool paintRenderingResultsToImageData(int&,
262 int&, 225 int&,
263 SourceDrawingBuffer, 226 SourceDrawingBuffer,
264 WTF::ArrayBufferContents&); 227 WTF::ArrayBufferContents&);
265 228
266 int sampleCount() const { return m_sampleCount; } 229 int sampleCount() const { return m_sampleCount; }
267 bool explicitResolveOfMultisampleData() const { 230 bool explicitResolveOfMultisampleData() const {
268 return m_antiAliasingMode == MSAAExplicitResolve; 231 return m_antiAliasingMode == MSAAExplicitResolve;
269 } 232 }
270 233
271 void restorePixelUnpackBufferBindings(); 234 // Rebind the read and draw framebuffers that WebGL is expecting.
272
273 // Bind to m_drawFramebufferBinding or m_readFramebufferBinding if it's not 0.
274 // Otherwise, bind to the default FBO.
275 void restoreFramebufferBindings(); 235 void restoreFramebufferBindings();
276 236
277 void restoreTextureBindings();
278
279 void addNewMailboxCallback(std::unique_ptr<WTF::Closure> closure) { 237 void addNewMailboxCallback(std::unique_ptr<WTF::Closure> closure) {
280 m_newMailboxCallback = std::move(closure); 238 m_newMailboxCallback = std::move(closure);
281 } 239 }
282 240
283 protected: // For unittests 241 protected: // For unittests
284 DrawingBuffer(std::unique_ptr<WebGraphicsContext3DProvider>, 242 DrawingBuffer(std::unique_ptr<WebGraphicsContext3DProvider>,
285 std::unique_ptr<Extensions3DUtil>, 243 std::unique_ptr<Extensions3DUtil>,
244 DrawingBufferStateTracker*,
286 bool discardFramebufferSupported, 245 bool discardFramebufferSupported,
287 bool wantAlphaChannel, 246 bool wantAlphaChannel,
288 bool premultipliedAlpha, 247 bool premultipliedAlpha,
289 PreserveDrawingBuffer, 248 PreserveDrawingBuffer,
290 WebGLVersion, 249 WebGLVersion,
291 bool wantsDepth, 250 bool wantsDepth,
292 bool wantsStencil, 251 bool wantsStencil,
293 ChromiumImageUsage); 252 ChromiumImageUsage);
294 253
295 bool initialize(const IntSize&, bool useMultisampling); 254 bool initialize(const IntSize&, bool useMultisampling);
296 255
297 // Shared memory bitmaps that were released by the compositor and can be used 256 // Shared memory bitmaps that were released by the compositor and can be used
298 // again by this DrawingBuffer. 257 // again by this DrawingBuffer.
299 struct RecycledBitmap { 258 struct RecycledBitmap {
300 std::unique_ptr<cc::SharedBitmap> bitmap; 259 std::unique_ptr<cc::SharedBitmap> bitmap;
301 IntSize size; 260 IntSize size;
302 }; 261 };
303 Vector<RecycledBitmap> m_recycledBitmaps; 262 Vector<RecycledBitmap> m_recycledBitmaps;
304 263
305 private: 264 private:
306 // All parameters necessary to generate the texture that will be passed to 265 friend class ScopedStateRestorer;
307 // prepareMailbox. 266 friend class ColorBuffer;
308 struct TextureParameters { 267
268 // This structure should wrap all public entrypoints that may modify GL state.
269 // It will restore all state when it drops out of scope.
270 class ScopedStateRestorer {
271 public:
272 ScopedStateRestorer(DrawingBuffer*);
273 ~ScopedStateRestorer();
274
275 // Mark parts of the state that are dirty and need to be restored.
276 void setClearStateDirty() { m_clearStateDirty = true; }
277 void setPixelPackAlignmentDirty() { m_pixelPackAlignmentDirty = true; }
278 void setTextureBindingDirty() { m_textureBindingDirty = true; }
279 void setRenderbufferBindingDirty() { m_renderbufferBindingDirty = true; }
280 void setFramebufferBindingDirty() { m_framebufferBindingDirty = true; }
281 void setPixelUnpackBufferBindingDirty() {
282 m_pixelUnpackBufferBindingDirty = true;
283 }
284
285 private:
286 RefPtr<DrawingBuffer> m_drawingBuffer;
287 bool m_clearStateDirty = false;
288 bool m_pixelPackAlignmentDirty = false;
289 bool m_textureBindingDirty = false;
290 bool m_renderbufferBindingDirty = false;
291 bool m_framebufferBindingDirty = false;
292 bool m_pixelUnpackBufferBindingDirty = false;
293 };
294
295 // All parameters necessary to generate the texture for the ColorBuffer.
296 struct ColorBufferParameters {
309 DISALLOW_NEW(); 297 DISALLOW_NEW();
310 GLenum target = 0; 298 GLenum target = 0;
311 GLenum internalColorFormat = 0; 299 GLenum internalColorFormat = 0;
312 300
313 // The internal color format used when allocating storage for the 301 // The internal color format used when allocating storage for the
314 // texture. This may be different from internalColorFormat if RGB 302 // texture. This may be different from internalColorFormat if RGB
315 // emulation is required. 303 // emulation is required.
316 GLenum creationInternalColorFormat = 0; 304 GLenum creationInternalColorFormat = 0;
317 GLenum colorFormat = 0; 305 GLenum colorFormat = 0;
318 }; 306 };
319 307
320 struct ColorBuffer : public RefCounted<ColorBuffer> { 308 struct ColorBuffer : public RefCounted<ColorBuffer> {
321 ColorBuffer(DrawingBuffer*, const TextureParameters&, const IntSize&); 309 ColorBuffer(DrawingBuffer*,
310 const ColorBufferParameters&,
311 const IntSize&,
312 GLuint textureId,
313 GLuint imageId);
322 ~ColorBuffer(); 314 ~ColorBuffer();
323 315
324 // The owning DrawingBuffer. Note that DrawingBuffer is explicitly destroyed 316 // The owning DrawingBuffer. Note that DrawingBuffer is explicitly destroyed
325 // by the beginDestruction method, which will eventually drain all of its 317 // by the beginDestruction method, which will eventually drain all of its
326 // ColorBuffers. 318 // ColorBuffers.
327 RefPtr<DrawingBuffer> drawingBuffer; 319 RefPtr<DrawingBuffer> drawingBuffer;
328 320
329 const TextureParameters parameters; 321 const ColorBufferParameters parameters;
330 const IntSize size; 322 const IntSize size;
331 323
332 GLuint textureId = 0; 324 const GLuint textureId = 0;
333 GLuint imageId = 0; 325 const GLuint imageId = 0;
334 326
335 // The mailbox used to send this buffer to the compositor. 327 // The mailbox used to send this buffer to the compositor.
336 gpu::Mailbox mailbox; 328 gpu::Mailbox mailbox;
337 329
338 // The sync token for when this buffer was sent to the compositor. 330 // The sync token for when this buffer was sent to the compositor.
339 gpu::SyncToken produceSyncToken; 331 gpu::SyncToken produceSyncToken;
340 332
341 // The sync token for when this buffer was received back from the 333 // The sync token for when this buffer was received back from the
342 // compositor. 334 // compositor.
343 gpu::SyncToken receiveSyncToken; 335 gpu::SyncToken receiveSyncToken;
344 336
345 private: 337 private:
346 WTF_MAKE_NONCOPYABLE(ColorBuffer); 338 WTF_MAKE_NONCOPYABLE(ColorBuffer);
347 }; 339 };
348 340
341 // The same as clearFramebuffers(), but leaves GL state dirty.
342 void clearFramebuffersInternal(GLbitfield clearMask);
343
344 // The same as reset(), but leaves GL state dirty.
345 bool resizeFramebufferInternal(const IntSize&);
346
347 // The same as commit(), but leaves GL state dirty.
348 void resolveMultisampleFramebufferInternal();
349
349 bool prepareTextureMailboxInternal( 350 bool prepareTextureMailboxInternal(
350 cc::TextureMailbox* outMailbox, 351 cc::TextureMailbox* outMailbox,
351 std::unique_ptr<cc::SingleReleaseCallback>* outReleaseCallback, 352 std::unique_ptr<cc::SingleReleaseCallback>* outReleaseCallback,
352 bool forceGpuResult); 353 bool forceGpuResult);
353 354
354 // Callbacks for mailboxes given to the compositor from PrepareTextureMailbox. 355 // Helper functions to be called only by prepareTextureMailboxInternal.
355 void gpuMailboxReleased(RefPtr<ColorBuffer>, 356 bool finishPrepareTextureMailboxGpu(
357 cc::TextureMailbox* outMailbox,
358 std::unique_ptr<cc::SingleReleaseCallback>* outReleaseCallback);
359 bool finishPrepareTextureMailboxSoftware(
360 cc::TextureMailbox* outMailbox,
361 std::unique_ptr<cc::SingleReleaseCallback>* outReleaseCallback);
362
363 // Callbacks for mailboxes given to the compositor from
364 // finishPrepareTextureMailboxGpu and finishPrepareTextureMailboxSoftware.
365 void mailboxReleasedGpu(RefPtr<ColorBuffer>,
356 const gpu::SyncToken&, 366 const gpu::SyncToken&,
357 bool lostResource); 367 bool lostResource);
358 void softwareMailboxReleased(std::unique_ptr<cc::SharedBitmap>, 368 void mailboxReleasedSoftware(std::unique_ptr<cc::SharedBitmap>,
359 const IntSize&, 369 const IntSize&,
360 const gpu::SyncToken&, 370 const gpu::SyncToken&,
361 bool lostResource); 371 bool lostResource);
362 372
363 // The texture parameters to use for a texture that will be backed by a 373 // The texture parameters to use for a texture that will be backed by a
364 // CHROMIUM_image. 374 // CHROMIUM_image, backed by a GpuMemoryBuffer.
365 TextureParameters chromiumImageTextureParameters(); 375 ColorBufferParameters gpuMemoryBufferColorBufferParameters();
366 376
367 // The texture parameters to use for a default texture. 377 // The texture parameters to use for an ordinary GL texture.
368 TextureParameters defaultTextureParameters(); 378 ColorBufferParameters textureColorBufferParameters();
369
370 // Creates and binds a texture with the given parameters. Returns 0 on
371 // failure, or the newly created texture id on success. The caller takes
372 // ownership of the newly created texture.
373 GLuint createColorTexture(const TextureParameters&);
374 379
375 // Attempts to allocator storage for, or resize all buffers. Returns whether 380 // Attempts to allocator storage for, or resize all buffers. Returns whether
376 // the operation was successful. 381 // the operation was successful.
377 bool resizeDefaultFramebuffer(const IntSize&); 382 bool resizeDefaultFramebuffer(const IntSize&);
378 383
379 void clearPlatformLayer(); 384 void clearPlatformLayer();
380 385
381 PassRefPtr<ColorBuffer> takeRecycledMailbox();
382
383 std::unique_ptr<cc::SharedBitmap> createOrRecycleBitmap(); 386 std::unique_ptr<cc::SharedBitmap> createOrRecycleBitmap();
384 387
385 // Updates the current size of the buffer, ensuring that 388 // Updates the current size of the buffer, ensuring that
386 // s_currentResourceUsePixels is updated. 389 // s_currentResourceUsePixels is updated.
387 void setSize(const IntSize& size); 390 void setSize(const IntSize& size);
388 391
389 // This is the order of bytes to use when doing a readback. 392 // This is the order of bytes to use when doing a readback.
390 enum ReadbackOrder { ReadbackRGBA, ReadbackSkia }; 393 enum ReadbackOrder { ReadbackRGBA, ReadbackSkia };
391 394
392 // Helper function which does a readback from the currently-bound 395 // Helper function which does a readback from the currently-bound
393 // framebuffer into a buffer of a certain size with 4-byte pixels. 396 // framebuffer into a buffer of a certain size with 4-byte pixels.
394 void readBackFramebuffer(unsigned char* pixels, 397 void readBackFramebuffer(unsigned char* pixels,
395 int width, 398 int width,
396 int height, 399 int height,
397 ReadbackOrder, 400 ReadbackOrder,
398 WebGLImageConversion::AlphaOp); 401 WebGLImageConversion::AlphaOp);
399 402
400 // Helper function to flip a bitmap vertically. 403 // Helper function to flip a bitmap vertically.
401 void flipVertically(uint8_t* data, int width, int height); 404 void flipVertically(uint8_t* data, int width, int height);
402 405
403 // Allocate a storage texture if possible. Otherwise, allocate a regular
404 // texture.
405 void allocateConditionallyImmutableTexture(GLenum target,
406 GLenum internalformat,
407 GLsizei width,
408 GLsizei height,
409 GLint border,
410 GLenum format,
411 GLenum type);
412
413 // If RGB emulation is required, then the CHROMIUM image's alpha channel 406 // If RGB emulation is required, then the CHROMIUM image's alpha channel
414 // must be immediately cleared after it is bound to a texture. Nothing 407 // must be immediately cleared after it is bound to a texture. Nothing
415 // should be allowed to change the alpha channel after this. 408 // should be allowed to change the alpha channel after this.
416 void clearChromiumImageAlpha(const ColorBuffer&); 409 void clearChromiumImageAlpha(const ColorBuffer&);
417 410
418 // Tries to create a CHROMIUM_image backed texture if 411 // Tries to create a CHROMIUM_image backed texture if
419 // RuntimeEnabledFeatures::webGLImageChromiumEnabled() is true. On failure, 412 // RuntimeEnabledFeatures::webGLImageChromiumEnabled() is true. On failure,
420 // or if the flag is false, creates a default texture. 413 // or if the flag is false, creates a default texture. Always returns a valid
421 RefPtr<ColorBuffer> createTextureAndAllocateMemory(const IntSize&); 414 // ColorBuffer.
415 RefPtr<ColorBuffer> createColorBuffer(const IntSize&);
422 416
423 // Creates and allocates space for a default texture. 417 // Creates or recycles a ColorBuffer of size |m_size|.
424 RefPtr<ColorBuffer> createDefaultTextureAndAllocateMemory(const IntSize&); 418 PassRefPtr<ColorBuffer> createOrRecycleColorBuffer();
425 419
426 // Attaches |m_backColorBuffer| to |m_fbo|, which is always the source for 420 // Attaches |m_backColorBuffer| to |m_fbo|, which is always the source for
427 // read operations. 421 // read operations.
428 void attachColorBufferToReadFramebuffer(); 422 void attachColorBufferToReadFramebuffer();
429 423
430 // Whether the WebGL client desires an explicit resolve. This is 424 // Whether the WebGL client desires an explicit resolve. This is
431 // implemented by forwarding all draw operations to a multisample 425 // implemented by forwarding all draw operations to a multisample
432 // renderbuffer, which is resolved before any read operations or swaps. 426 // renderbuffer, which is resolved before any read operations or swaps.
433 bool wantExplicitResolve(); 427 bool wantExplicitResolve();
434 428
435 // Whether the WebGL client wants a depth or stencil buffer. 429 // Whether the WebGL client wants a depth or stencil buffer.
436 bool wantDepthOrStencil(); 430 bool wantDepthOrStencil();
437 431
438 // The format to use when creating a multisampled renderbuffer. 432 // The format to use when creating a multisampled renderbuffer.
439 GLenum getMultisampledRenderbufferFormat(); 433 GLenum getMultisampledRenderbufferFormat();
440 434
435 // Weak, reset by beginDestruction.
436 DrawingBufferStateTracker* m_stateTracker = nullptr;
437
441 const PreserveDrawingBuffer m_preserveDrawingBuffer; 438 const PreserveDrawingBuffer m_preserveDrawingBuffer;
442 const WebGLVersion m_webGLVersion; 439 const WebGLVersion m_webGLVersion;
443 bool m_scissorEnabled = false;
444 GLuint m_texture2DBinding = 0;
445 GLuint m_pixelUnpackBufferBinding = 0;
446 GLuint m_drawFramebufferBinding = 0;
447 GLuint m_readFramebufferBinding = 0;
448 GLuint m_renderbufferBinding = 0;
449 GLenum m_activeTextureUnit = GL_TEXTURE0;
450 GLfloat m_clearColor[4];
451 GLboolean m_colorMask[4];
452 440
453 std::unique_ptr<WebGraphicsContext3DProvider> m_contextProvider; 441 std::unique_ptr<WebGraphicsContext3DProvider> m_contextProvider;
454 // Lifetime is tied to the m_contextProvider. 442 // Lifetime is tied to the m_contextProvider.
455 gpu::gles2::GLES2Interface* m_gl; 443 gpu::gles2::GLES2Interface* m_gl;
456 std::unique_ptr<Extensions3DUtil> m_extensionsUtil; 444 std::unique_ptr<Extensions3DUtil> m_extensionsUtil;
457 IntSize m_size = {-1, -1}; 445 IntSize m_size = {-1, -1};
458 const bool m_discardFramebufferSupported; 446 const bool m_discardFramebufferSupported;
459 const bool m_wantAlphaChannel; 447 const bool m_wantAlphaChannel;
460 const bool m_premultipliedAlpha; 448 const bool m_premultipliedAlpha;
461 const bool m_softwareRendering; 449 const bool m_softwareRendering;
462 bool m_hasImplicitStencilBuffer = false; 450 bool m_hasImplicitStencilBuffer = false;
463 bool m_storageTextureSupported = false; 451 bool m_storageTextureSupported = false;
464 452
465 // This is the ColorBuffer that was most recently presented to the compositor 453 std::unique_ptr<WTF::Closure> m_newMailboxCallback;
466 // by prepareTextureMailboxInternal.
467 RefPtr<ColorBuffer> m_frontColorBuffer;
468 454
469 std::unique_ptr<WTF::Closure> m_newMailboxCallback; 455 // The current state restorer, which is used to track state dirtying. It is in
456 // error to dirty state shared with WebGL while there is no existing state
457 // restorer. It is also in error to instantiate two state restorers at once.
458 ScopedStateRestorer* m_stateRestorer = nullptr;
470 459
471 // This is used when the user requests either a depth or stencil buffer. 460 // This is used when the user requests either a depth or stencil buffer.
472 GLuint m_depthStencilBuffer = 0; 461 GLuint m_depthStencilBuffer = 0;
473 462
474 // When wantExplicitResolve() returns true, the target of all draw 463 // When wantExplicitResolve() returns true, the target of all draw
475 // operations. 464 // operations.
476 GLuint m_multisampleFBO = 0; 465 GLuint m_multisampleFBO = 0;
477 466
478 // The id of the renderbuffer storage for |m_multisampleFBO|. 467 // The id of the renderbuffer storage for |m_multisampleFBO|.
479 GLuint m_multisampleRenderbuffer = 0; 468 GLuint m_multisampleRenderbuffer = 0;
480 469
481 // When wantExplicitResolve() returns false, the target of all draw and 470 // When wantExplicitResolve() returns false, the target of all draw and
482 // read operations. When wantExplicitResolve() returns true, the target of 471 // read operations. When wantExplicitResolve() returns true, the target of
483 // all read operations. A swap is performed by exchanging |m_backColorBuffer| 472 // all read operations.
484 // with |m_frontColorBuffer|.
485 GLuint m_fbo = 0; 473 GLuint m_fbo = 0;
486 474
487 // All information about the texture storage for |m_fbo|. 475 // The ColorBuffer that backs |m_fbo|.
488 RefPtr<ColorBuffer> m_backColorBuffer; 476 RefPtr<ColorBuffer> m_backColorBuffer;
489 477
478 // The ColorBuffer that was most recently presented to the compositor by
479 // prepareTextureMailboxInternal.
480 RefPtr<ColorBuffer> m_frontColorBuffer;
481
490 // True if our contents have been modified since the last presentation of this 482 // True if our contents have been modified since the last presentation of this
491 // buffer. 483 // buffer.
492 bool m_contentsChanged = true; 484 bool m_contentsChanged = true;
493 485
494 // True if commit() has been called since the last time markContentsChanged() 486 // True if commit() has been called since the last time markContentsChanged()
495 // had been called. 487 // had been called.
496 bool m_contentsChangeCommitted = false; 488 bool m_contentsChangeCommitted = false;
497 bool m_bufferClearNeeded = false; 489 bool m_bufferClearNeeded = false;
498 490
499 // Whether the client wants a depth or stencil buffer. 491 // Whether the client wants a depth or stencil buffer.
500 const bool m_wantDepth; 492 const bool m_wantDepth;
501 const bool m_wantStencil; 493 const bool m_wantStencil;
502 494
503 enum AntialiasingMode { 495 enum AntialiasingMode {
504 None, 496 None,
505 MSAAImplicitResolve, 497 MSAAImplicitResolve,
506 MSAAExplicitResolve, 498 MSAAExplicitResolve,
507 ScreenSpaceAntialiasing, 499 ScreenSpaceAntialiasing,
508 }; 500 };
509 501
510 AntialiasingMode m_antiAliasingMode = None; 502 AntialiasingMode m_antiAliasingMode = None;
511 503
512 int m_maxTextureSize = 0; 504 int m_maxTextureSize = 0;
513 int m_sampleCount = 0; 505 int m_sampleCount = 0;
514 int m_packAlignment = 4;
515 bool m_destructionInProgress = false; 506 bool m_destructionInProgress = false;
516 bool m_isHidden = false; 507 bool m_isHidden = false;
517 SkFilterQuality m_filterQuality = kLow_SkFilterQuality; 508 SkFilterQuality m_filterQuality = kLow_SkFilterQuality;
518 509
519 std::unique_ptr<WebExternalTextureLayer> m_layer; 510 std::unique_ptr<WebExternalTextureLayer> m_layer;
520 511
521 // Mailboxes that were released by the compositor can be used again by this 512 // Mailboxes that were released by the compositor can be used again by this
522 // DrawingBuffer. 513 // DrawingBuffer.
523 Deque<RefPtr<ColorBuffer>> m_recycledMailboxQueue; 514 Deque<RefPtr<ColorBuffer>> m_recycledColorBufferQueue;
524 515
525 // If the width and height of the Canvas's backing store don't 516 // If the width and height of the Canvas's backing store don't
526 // match those that we were given in the most recent call to 517 // match those that we were given in the most recent call to
527 // reshape(), then we need an intermediate bitmap to read back the 518 // reshape(), then we need an intermediate bitmap to read back the
528 // frame buffer into. This seems to happen when CSS styles are 519 // frame buffer into. This seems to happen when CSS styles are
529 // used to resize the Canvas. 520 // used to resize the Canvas.
530 SkBitmap m_resizingBitmap; 521 SkBitmap m_resizingBitmap;
531 522
532 // Used to flip a bitmap vertically.
533 Vector<uint8_t> m_scanline;
534
535 // In the case of OffscreenCanvas, we do not want to enable the 523 // In the case of OffscreenCanvas, we do not want to enable the
536 // WebGLImageChromium flag, so we replace all the 524 // WebGLImageChromium flag, so we replace all the
537 // RuntimeEnabledFeatures::webGLImageChromiumEnabled() call with 525 // RuntimeEnabledFeatures::webGLImageChromiumEnabled() call with
538 // shouldUseChromiumImage() calls, and set m_chromiumImageUsage to 526 // shouldUseChromiumImage() calls, and set m_chromiumImageUsage to
539 // DisallowChromiumImage in the case of OffscreenCanvas. 527 // DisallowChromiumImage in the case of OffscreenCanvas.
540 ChromiumImageUsage m_chromiumImageUsage; 528 ChromiumImageUsage m_chromiumImageUsage;
541 bool shouldUseChromiumImage(); 529 bool shouldUseChromiumImage();
542 }; 530 };
543 531
544 } // namespace blink 532 } // namespace blink
545 533
546 #endif // DrawingBuffer_h 534 #endif // DrawingBuffer_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698