| OLD | NEW |
| 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 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 65 | 65 |
| 66 // Manages a rendering target (framebuffer + attachment) for a canvas. Can publ
ish its rendering | 66 // Manages a rendering target (framebuffer + attachment) for a canvas. Can publ
ish its rendering |
| 67 // results to a WebLayer for compositing. | 67 // results to a WebLayer for compositing. |
| 68 class PLATFORM_EXPORT DrawingBuffer : public RefCounted<DrawingBuffer>, public W
ebExternalTextureLayerClient { | 68 class PLATFORM_EXPORT DrawingBuffer : public RefCounted<DrawingBuffer>, public W
ebExternalTextureLayerClient { |
| 69 WTF_MAKE_NONCOPYABLE(DrawingBuffer); | 69 WTF_MAKE_NONCOPYABLE(DrawingBuffer); |
| 70 public: | 70 public: |
| 71 enum PreserveDrawingBuffer { | 71 enum PreserveDrawingBuffer { |
| 72 Preserve, | 72 Preserve, |
| 73 Discard | 73 Discard |
| 74 }; | 74 }; |
| 75 enum WebGLVersion { |
| 76 WebGL1, |
| 77 WebGL2, |
| 78 }; |
| 75 | 79 |
| 76 static PassRefPtr<DrawingBuffer> create( | 80 static PassRefPtr<DrawingBuffer> create( |
| 77 std::unique_ptr<WebGraphicsContext3DProvider>, | 81 std::unique_ptr<WebGraphicsContext3DProvider>, |
| 78 const IntSize&, | 82 const IntSize&, |
| 79 bool premultipliedAlpha, | 83 bool premultipliedAlpha, |
| 80 bool wantAlphaChannel, | 84 bool wantAlphaChannel, |
| 81 bool wantDepthBuffer, | 85 bool wantDepthBuffer, |
| 82 bool wantStencilBuffer, | 86 bool wantStencilBuffer, |
| 83 bool wantAntialiasing, | 87 bool wantAntialiasing, |
| 84 PreserveDrawingBuffer); | 88 PreserveDrawingBuffer, |
| 89 WebGLVersion); |
| 85 static void forceNextDrawingBufferCreationToFail(); | 90 static void forceNextDrawingBufferCreationToFail(); |
| 86 | 91 |
| 87 ~DrawingBuffer() override; | 92 ~DrawingBuffer() override; |
| 88 | 93 |
| 89 // Destruction will be completed after all mailboxes are released. | 94 // Destruction will be completed after all mailboxes are released. |
| 90 void beginDestruction(); | 95 void beginDestruction(); |
| 91 | 96 |
| 92 // Issues a glClear() on all framebuffers associated with this DrawingBuffer
. The caller is responsible for | 97 // Issues a glClear() on all framebuffers associated with this DrawingBuffer
. The caller is responsible for |
| 93 // making the context current and setting the clear values and masks. Modifi
es the framebuffer binding. | 98 // making the context current and setting the clear values and masks. Modifi
es the framebuffer binding. |
| 94 void clearFramebuffers(GLbitfield clearMask); | 99 void clearFramebuffers(GLbitfield clearMask); |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 void addNewMailboxCallback(std::unique_ptr<WTF::Closure> closure) { m_newMai
lboxCallback = std::move(closure); } | 225 void addNewMailboxCallback(std::unique_ptr<WTF::Closure> closure) { m_newMai
lboxCallback = std::move(closure); } |
| 221 | 226 |
| 222 protected: // For unittests | 227 protected: // For unittests |
| 223 DrawingBuffer( | 228 DrawingBuffer( |
| 224 std::unique_ptr<WebGraphicsContext3DProvider>, | 229 std::unique_ptr<WebGraphicsContext3DProvider>, |
| 225 std::unique_ptr<Extensions3DUtil>, | 230 std::unique_ptr<Extensions3DUtil>, |
| 226 bool discardFramebufferSupported, | 231 bool discardFramebufferSupported, |
| 227 bool wantAlphaChannel, | 232 bool wantAlphaChannel, |
| 228 bool premultipliedAlpha, | 233 bool premultipliedAlpha, |
| 229 PreserveDrawingBuffer, | 234 PreserveDrawingBuffer, |
| 235 WebGLVersion, |
| 230 bool wantsDepth, | 236 bool wantsDepth, |
| 231 bool wantsStencil); | 237 bool wantsStencil); |
| 232 | 238 |
| 233 bool initialize(const IntSize&, bool useMultisampling); | 239 bool initialize(const IntSize&, bool useMultisampling); |
| 234 | 240 |
| 235 private: | 241 private: |
| 236 // All parameters necessary to generate the texture that will be passed to | 242 // All parameters necessary to generate the texture that will be passed to |
| 237 // prepareMailbox. | 243 // prepareMailbox. |
| 238 struct TextureParameters { | 244 struct TextureParameters { |
| 239 DISALLOW_NEW(); | 245 DISALLOW_NEW(); |
| 240 GLenum target = 0; | 246 GLenum target = 0; |
| 241 GLenum internalColorFormat = 0; | 247 GLenum internalColorFormat = 0; |
| 242 | 248 |
| 243 // The internal color format used when allocating storage for the | 249 // The internal color format used when allocating storage for the |
| 244 // texture. This may be different from internalColorFormat if RGB | 250 // texture. This may be different from internalColorFormat if RGB |
| 245 // emulation is required. | 251 // emulation is required. |
| 246 GLenum creationInternalColorFormat = 0; | 252 GLenum creationInternalColorFormat = 0; |
| 247 GLenum colorFormat = 0; | 253 GLenum colorFormat = 0; |
| 248 }; | 254 }; |
| 249 | 255 |
| 250 // If we used CHROMIUM_image as the backing storage for our buffers, | 256 // If we used CHROMIUM_image as the backing storage for our buffers, |
| 251 // we need to know the mapping from texture id to image. | 257 // we need to know the mapping from texture id to image. |
| 252 struct TextureInfo { | 258 struct TextureInfo { |
| 253 DISALLOW_NEW(); | 259 DISALLOW_NEW(); |
| 254 GLuint textureId = 0; | 260 GLuint textureId = 0; |
| 255 GLuint imageId = 0; | 261 GLuint imageId = 0; |
| 262 bool immutable = false; |
| 256 | 263 |
| 257 // A GpuMemoryBuffer is a concept that the compositor understands. and | 264 // A GpuMemoryBuffer is a concept that the compositor understands. and |
| 258 // is able to operate on. The id is scoped to renderer process. | 265 // is able to operate on. The id is scoped to renderer process. |
| 259 GLint gpuMemoryBufferId = -1; | 266 GLint gpuMemoryBufferId = -1; |
| 260 | 267 |
| 261 TextureParameters parameters; | 268 TextureParameters parameters; |
| 262 }; | 269 }; |
| 263 | 270 |
| 264 struct MailboxInfo : public RefCounted<MailboxInfo> { | 271 struct MailboxInfo : public RefCounted<MailboxInfo> { |
| 265 WTF_MAKE_NONCOPYABLE(MailboxInfo); | 272 WTF_MAKE_NONCOPYABLE(MailboxInfo); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 314 ReadbackSkia | 321 ReadbackSkia |
| 315 }; | 322 }; |
| 316 | 323 |
| 317 // Helper function which does a readback from the currently-bound | 324 // Helper function which does a readback from the currently-bound |
| 318 // framebuffer into a buffer of a certain size with 4-byte pixels. | 325 // framebuffer into a buffer of a certain size with 4-byte pixels. |
| 319 void readBackFramebuffer(unsigned char* pixels, int width, int height, Readb
ackOrder, WebGLImageConversion::AlphaOp); | 326 void readBackFramebuffer(unsigned char* pixels, int width, int height, Readb
ackOrder, WebGLImageConversion::AlphaOp); |
| 320 | 327 |
| 321 // Helper function to flip a bitmap vertically. | 328 // Helper function to flip a bitmap vertically. |
| 322 void flipVertically(uint8_t* data, int width, int height); | 329 void flipVertically(uint8_t* data, int width, int height); |
| 323 | 330 |
| 324 // Helper to texImage2D with pixel==0 case: pixels are initialized to 0. | 331 // Allocate a storage texture if possible. Otherwise, allocate a regular tex
ture. |
| 325 // By default, alignment is 4, the OpenGL default setting. | 332 void allocateConditionallyImmutableTexture(GLenum target, GLenum internalfor
mat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type); |
| 326 void texImage2DResourceSafe(GLenum target, GLint level, GLenum internalforma
t, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, GLin
t alignment = 4); | |
| 327 // Allocate buffer storage to be sent to compositor using either texImage2D
or CHROMIUM_image based on available support. | 333 // Allocate buffer storage to be sent to compositor using either texImage2D
or CHROMIUM_image based on available support. |
| 328 void deleteChromiumImageForTexture(TextureInfo*); | 334 void deleteChromiumImageForTexture(TextureInfo*); |
| 329 | 335 |
| 330 // If RGB emulation is required, then the CHROMIUM image's alpha channel | 336 // If RGB emulation is required, then the CHROMIUM image's alpha channel |
| 331 // must be immediately cleared after it is bound to a texture. Nothing | 337 // must be immediately cleared after it is bound to a texture. Nothing |
| 332 // should be allowed to change the alpha channel after this. | 338 // should be allowed to change the alpha channel after this. |
| 333 void clearChromiumImageAlpha(const TextureInfo&); | 339 void clearChromiumImageAlpha(const TextureInfo&); |
| 334 | 340 |
| 335 // Tries to create a CHROMIUM_image backed texture if | 341 // Tries to create a CHROMIUM_image backed texture if |
| 336 // RuntimeEnabledFeatures::webGLImageChromiumEnabled() is true. On failure, | 342 // RuntimeEnabledFeatures::webGLImageChromiumEnabled() is true. On failure, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 351 // renderbuffer, which is resolved before any read operations or swaps. | 357 // renderbuffer, which is resolved before any read operations or swaps. |
| 352 bool wantExplicitResolve(); | 358 bool wantExplicitResolve(); |
| 353 | 359 |
| 354 // Whether the WebGL client wants a depth or stencil buffer. | 360 // Whether the WebGL client wants a depth or stencil buffer. |
| 355 bool wantDepthOrStencil(); | 361 bool wantDepthOrStencil(); |
| 356 | 362 |
| 357 // The format to use when creating a multisampled renderbuffer. | 363 // The format to use when creating a multisampled renderbuffer. |
| 358 GLenum getMultisampledRenderbufferFormat(); | 364 GLenum getMultisampledRenderbufferFormat(); |
| 359 | 365 |
| 360 const PreserveDrawingBuffer m_preserveDrawingBuffer; | 366 const PreserveDrawingBuffer m_preserveDrawingBuffer; |
| 367 const WebGLVersion m_webGLVersion; |
| 361 bool m_scissorEnabled = false; | 368 bool m_scissorEnabled = false; |
| 362 GLuint m_texture2DBinding = 0; | 369 GLuint m_texture2DBinding = 0; |
| 363 GLuint m_drawFramebufferBinding = 0; | 370 GLuint m_drawFramebufferBinding = 0; |
| 364 GLuint m_readFramebufferBinding = 0; | 371 GLuint m_readFramebufferBinding = 0; |
| 365 GLuint m_renderbufferBinding = 0; | 372 GLuint m_renderbufferBinding = 0; |
| 366 GLenum m_activeTextureUnit = GL_TEXTURE0; | 373 GLenum m_activeTextureUnit = GL_TEXTURE0; |
| 367 GLfloat m_clearColor[4]; | 374 GLfloat m_clearColor[4]; |
| 368 GLboolean m_colorMask[4]; | 375 GLboolean m_colorMask[4]; |
| 369 | 376 |
| 370 std::unique_ptr<WebGraphicsContext3DProvider> m_contextProvider; | 377 std::unique_ptr<WebGraphicsContext3DProvider> m_contextProvider; |
| 371 // Lifetime is tied to the m_contextProvider. | 378 // Lifetime is tied to the m_contextProvider. |
| 372 gpu::gles2::GLES2Interface* m_gl; | 379 gpu::gles2::GLES2Interface* m_gl; |
| 373 std::unique_ptr<Extensions3DUtil> m_extensionsUtil; | 380 std::unique_ptr<Extensions3DUtil> m_extensionsUtil; |
| 374 IntSize m_size = { -1, -1 }; | 381 IntSize m_size = { -1, -1 }; |
| 375 const bool m_discardFramebufferSupported; | 382 const bool m_discardFramebufferSupported; |
| 376 const bool m_wantAlphaChannel; | 383 const bool m_wantAlphaChannel; |
| 377 const bool m_premultipliedAlpha; | 384 const bool m_premultipliedAlpha; |
| 378 bool m_hasImplicitStencilBuffer = false; | 385 bool m_hasImplicitStencilBuffer = false; |
| 386 bool m_storageTextureSupported = false; |
| 379 struct FrontBufferInfo { | 387 struct FrontBufferInfo { |
| 380 TextureInfo texInfo; | 388 TextureInfo texInfo; |
| 381 WebExternalTextureMailbox mailbox; | 389 WebExternalTextureMailbox mailbox; |
| 382 }; | 390 }; |
| 383 FrontBufferInfo m_frontColorBuffer; | 391 FrontBufferInfo m_frontColorBuffer; |
| 384 | 392 |
| 385 std::unique_ptr<WTF::Closure> m_newMailboxCallback; | 393 std::unique_ptr<WTF::Closure> m_newMailboxCallback; |
| 386 | 394 |
| 387 // This is used when the user requests either a depth or stencil buffer. | 395 // This is used when the user requests either a depth or stencil buffer. |
| 388 GLuint m_depthStencilBuffer = 0; | 396 GLuint m_depthStencilBuffer = 0; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 444 // used to resize the Canvas. | 452 // used to resize the Canvas. |
| 445 SkBitmap m_resizingBitmap; | 453 SkBitmap m_resizingBitmap; |
| 446 | 454 |
| 447 // Used to flip a bitmap vertically. | 455 // Used to flip a bitmap vertically. |
| 448 Vector<uint8_t> m_scanline; | 456 Vector<uint8_t> m_scanline; |
| 449 }; | 457 }; |
| 450 | 458 |
| 451 } // namespace blink | 459 } // namespace blink |
| 452 | 460 |
| 453 #endif // DrawingBuffer_h | 461 #endif // DrawingBuffer_h |
| OLD | NEW |