| Index: third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.h | 
| diff --git a/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.h b/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.h | 
| index cf72de0b644fd67ebb0d7581cebb078188172d82..a568fd06e4b752ac3ad1cb5ce139dde57c4b2f05 100644 | 
| --- a/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.h | 
| +++ b/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.h | 
| @@ -317,23 +317,33 @@ class PLATFORM_EXPORT DrawingBuffer | 
| GLenum colorFormat = 0; | 
| }; | 
|  | 
| -  // If we used CHROMIUM_image as the backing storage for our buffers, | 
| -  // we need to know the mapping from texture id to image. | 
| -  struct TextureInfo { | 
| -    DISALLOW_NEW(); | 
| +  struct ColorBuffer : public RefCounted<ColorBuffer> { | 
| +    ColorBuffer(DrawingBuffer*, const TextureParameters&, const IntSize&); | 
| +    ~ColorBuffer(); | 
| + | 
| +    // The owning DrawingBuffer. Note that DrawingBuffer is explicitly destroyed | 
| +    // by the beginDestruction method, which will eventually drain all of its | 
| +    // ColorBuffers. | 
| +    RefPtr<DrawingBuffer> drawingBuffer; | 
| + | 
| +    const TextureParameters parameters; | 
| +    const IntSize size; | 
| + | 
| GLuint textureId = 0; | 
| GLuint imageId = 0; | 
| -    TextureParameters parameters; | 
| -  }; | 
|  | 
| -  struct MailboxInfo : public RefCounted<MailboxInfo> { | 
| -    MailboxInfo() = default; | 
| +    // The mailbox used to send this buffer to the compositor. | 
| gpu::Mailbox mailbox; | 
| -    TextureInfo textureInfo; | 
| -    IntSize size; | 
| + | 
| +    // The sync token for when this buffer was sent to the compositor. | 
| +    gpu::SyncToken produceSyncToken; | 
| + | 
| +    // The sync token for when this buffer was received back from the | 
| +    // compositor. | 
| +    gpu::SyncToken receiveSyncToken; | 
|  | 
| private: | 
| -    WTF_MAKE_NONCOPYABLE(MailboxInfo); | 
| +    WTF_MAKE_NONCOPYABLE(ColorBuffer); | 
| }; | 
|  | 
| bool prepareTextureMailboxInternal( | 
| @@ -342,7 +352,7 @@ class PLATFORM_EXPORT DrawingBuffer | 
| bool forceGpuResult); | 
|  | 
| // Callbacks for mailboxes given to the compositor from PrepareTextureMailbox. | 
| -  void gpuMailboxReleased(const gpu::Mailbox&, | 
| +  void gpuMailboxReleased(RefPtr<ColorBuffer>, | 
| const gpu::SyncToken&, | 
| bool lostResource); | 
| void softwareMailboxReleased(std::unique_ptr<cc::SharedBitmap>, | 
| @@ -368,10 +378,7 @@ class PLATFORM_EXPORT DrawingBuffer | 
|  | 
| void clearPlatformLayer(); | 
|  | 
| -  PassRefPtr<MailboxInfo> takeRecycledMailbox(); | 
| -  PassRefPtr<MailboxInfo> createNewMailbox(const TextureInfo&); | 
| -  void deleteMailbox(const gpu::Mailbox&, const gpu::SyncToken&); | 
| -  void freeRecycledMailboxes(); | 
| +  PassRefPtr<ColorBuffer> takeRecycledMailbox(); | 
|  | 
| std::unique_ptr<cc::SharedBitmap> createOrRecycleBitmap(); | 
|  | 
| @@ -402,25 +409,22 @@ class PLATFORM_EXPORT DrawingBuffer | 
| GLint border, | 
| GLenum format, | 
| GLenum type); | 
| -  // Allocate buffer storage to be sent to compositor using either texImage2D or | 
| -  // CHROMIUM_image based on available support. | 
| -  void deleteChromiumImageForTexture(TextureInfo*); | 
|  | 
| // If RGB emulation is required, then the CHROMIUM image's alpha channel | 
| // must be immediately cleared after it is bound to a texture. Nothing | 
| // should be allowed to change the alpha channel after this. | 
| -  void clearChromiumImageAlpha(const TextureInfo&); | 
| +  void clearChromiumImageAlpha(const ColorBuffer&); | 
|  | 
| // Tries to create a CHROMIUM_image backed texture if | 
| // RuntimeEnabledFeatures::webGLImageChromiumEnabled() is true. On failure, | 
| // or if the flag is false, creates a default texture. | 
| -  TextureInfo createTextureAndAllocateMemory(const IntSize&); | 
| +  RefPtr<ColorBuffer> createTextureAndAllocateMemory(const IntSize&); | 
|  | 
| // Creates and allocates space for a default texture. | 
| -  TextureInfo createDefaultTextureAndAllocateMemory(const IntSize&); | 
| +  RefPtr<ColorBuffer> createDefaultTextureAndAllocateMemory(const IntSize&); | 
|  | 
| -  // Attaches |m_colorBuffer| to |m_fbo|, which is always the source for read | 
| -  // operations. | 
| +  // Attaches |m_backColorBuffer| to |m_fbo|, which is always the source for | 
| +  // read operations. | 
| void attachColorBufferToReadFramebuffer(); | 
|  | 
| // Whether the WebGL client desires an explicit resolve. This is | 
| @@ -457,12 +461,10 @@ class PLATFORM_EXPORT DrawingBuffer | 
| const bool m_softwareRendering; | 
| bool m_hasImplicitStencilBuffer = false; | 
| bool m_storageTextureSupported = false; | 
| -  struct FrontBufferInfo { | 
| -    gpu::Mailbox mailbox; | 
| -    gpu::SyncToken produceSyncToken; | 
| -    TextureInfo texInfo; | 
| -  }; | 
| -  FrontBufferInfo m_frontColorBuffer; | 
| + | 
| +  // This is the ColorBuffer that was most recently presented to the compositor | 
| +  // by prepareTextureMailboxInternal. | 
| +  RefPtr<ColorBuffer> m_frontColorBuffer; | 
|  | 
| std::unique_ptr<WTF::Closure> m_newMailboxCallback; | 
|  | 
| @@ -478,12 +480,12 @@ class PLATFORM_EXPORT DrawingBuffer | 
|  | 
| // When wantExplicitResolve() returns false, the target of all draw and | 
| // read operations. When wantExplicitResolve() returns true, the target of | 
| -  // all read operations. A swap is performed by exchanging |m_colorBuffer| | 
| +  // all read operations. A swap is performed by exchanging |m_backColorBuffer| | 
| // with |m_frontColorBuffer|. | 
| GLuint m_fbo = 0; | 
|  | 
| // All information about the texture storage for |m_fbo|. | 
| -  TextureInfo m_colorBuffer; | 
| +  RefPtr<ColorBuffer> m_backColorBuffer; | 
|  | 
| // True if our contents have been modified since the last presentation of this | 
| // buffer. | 
| @@ -516,22 +518,9 @@ class PLATFORM_EXPORT DrawingBuffer | 
|  | 
| std::unique_ptr<WebExternalTextureLayer> m_layer; | 
|  | 
| -  // All of the mailboxes that this DrawingBuffer has ever created. | 
| -  Vector<RefPtr<MailboxInfo>> m_textureMailboxes; | 
| -  struct RecycledMailbox : RefCounted<RecycledMailbox> { | 
| -    RecycledMailbox(const gpu::Mailbox& mailbox, | 
| -                    const gpu::SyncToken& syncToken) | 
| -        : mailbox(mailbox), syncToken(syncToken) {} | 
| - | 
| -    gpu::Mailbox mailbox; | 
| -    gpu::SyncToken syncToken; | 
| - | 
| -   private: | 
| -    WTF_MAKE_NONCOPYABLE(RecycledMailbox); | 
| -  }; | 
| // Mailboxes that were released by the compositor can be used again by this | 
| // DrawingBuffer. | 
| -  Deque<RefPtr<RecycledMailbox>> m_recycledMailboxQueue; | 
| +  Deque<RefPtr<ColorBuffer>> m_recycledMailboxQueue; | 
|  | 
| // If the width and height of the Canvas's backing store don't | 
| // match those that we were given in the most recent call to | 
|  |