| Index: third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.cpp
|
| diff --git a/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.cpp b/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.cpp
|
| index 8f39aba0c4cd451a1368f9e802ff74ab607a4351..d5f2fe7387d81e90e828bf51832487a7ce01e17e 100644
|
| --- a/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.cpp
|
| +++ b/third_party/WebKit/Source/platform/graphics/gpu/DrawingBuffer.cpp
|
| @@ -357,7 +357,8 @@ bool DrawingBuffer::prepareTextureMailboxInternal(
|
| attachColorBufferToReadFramebuffer();
|
|
|
| if (m_discardFramebufferSupported) {
|
| - // Explicitly discard framebuffer to save GPU memory bandwidth for tile-based GPU arch.
|
| + // Explicitly discard the framebuffer to save GPU memory bandwidth for
|
| + // tile-based GPU arch.
|
| const GLenum attachments[3] = {GL_COLOR_ATTACHMENT0, GL_DEPTH_ATTACHMENT,
|
| GL_STENCIL_ATTACHMENT};
|
| m_gl->BindFramebuffer(GL_FRAMEBUFFER, m_fbo);
|
| @@ -439,7 +440,8 @@ void DrawingBuffer::softwareMailboxReleased(
|
| }
|
|
|
| PassRefPtr<StaticBitmapImage> DrawingBuffer::transferToStaticBitmapImage() {
|
| - // This can be null if the context is lost before the first call to grContext().
|
| + // This can be null if the context is lost before the first call to
|
| + // grContext().
|
| GrContext* grContext = m_contextProvider->grContext();
|
|
|
| cc::TextureMailbox textureMailbox;
|
| @@ -452,7 +454,9 @@ PassRefPtr<StaticBitmapImage> DrawingBuffer::transferToStaticBitmapImage() {
|
| }
|
| if (!success) {
|
| // If we can't get a mailbox, return an transparent black ImageBitmap.
|
| - // The only situation this could happen is when two or more calls to transferToImageBitmap are made back-to-back, or when the context gets lost.
|
| + // The only situation in which this could happen is when two or more calls
|
| + // to transferToImageBitmap are made back-to-back, or when the context gets
|
| + // lost.
|
| sk_sp<SkSurface> surface =
|
| SkSurface::MakeRasterN32Premul(m_size.width(), m_size.height());
|
| return StaticBitmapImage::create(surface->makeImageSnapshot());
|
| @@ -461,18 +465,20 @@ PassRefPtr<StaticBitmapImage> DrawingBuffer::transferToStaticBitmapImage() {
|
| DCHECK_EQ(m_size.width(), textureMailbox.size_in_pixels().width());
|
| DCHECK_EQ(m_size.height(), textureMailbox.size_in_pixels().height());
|
|
|
| - // Make our own textureId that is a reference on the same texture backing being used as the front
|
| - // buffer (which was returned from PrepareTextureMailbox()).
|
| - // We do not need to wait on the sync token in |textureMailbox| since the mailbox was produced on
|
| - // the same |m_gl| context that we are using here. Similarly, the |releaseCallback| will run on
|
| - // the same context so we don't need to send a sync token for this consume action back to it.
|
| - // TODO(danakj): Instead of using PrepareTextureMailbox(), we could just use the actual texture id and
|
| - // avoid needing to produce/consume a mailbox.
|
| + // Make our own textureId that is a reference on the same texture backing
|
| + // being used as the front buffer (which was returned from
|
| + // PrepareTextureMailbox()). We do not need to wait on the sync token in
|
| + // |textureMailbox| since the mailbox was produced on the same |m_gl| context
|
| + // that we are using here. Similarly, the |releaseCallback| will run on the
|
| + // same context so we don't need to send a sync token for this consume action
|
| + // back to it.
|
| + // TODO(danakj): Instead of using PrepareTextureMailbox(), we could just use
|
| + // the actual texture id and avoid needing to produce/consume a mailbox.
|
| GLuint textureId = m_gl->CreateAndConsumeTextureCHROMIUM(
|
| GL_TEXTURE_2D, textureMailbox.name());
|
| - // Return the mailbox but report that the resource is lost to prevent trying to use
|
| - // the backing for future frames. We keep it alive with our own reference to the
|
| - // backing via our |textureId|.
|
| + // Return the mailbox but report that the resource is lost to prevent trying
|
| + // to use the backing for future frames. We keep it alive with our own
|
| + // reference to the backing via our |textureId|.
|
| releaseCallback->Run(gpu::SyncToken(), true /* lostResource */);
|
|
|
| // Store that texture id as the backing for an SkImage.
|
| @@ -489,16 +495,19 @@ PassRefPtr<StaticBitmapImage> DrawingBuffer::transferToStaticBitmapImage() {
|
| sk_sp<SkImage> skImage =
|
| SkImage::MakeFromAdoptedTexture(grContext, backendTexture);
|
|
|
| - // We reuse the same mailbox name from above since our texture id was consumed from it.
|
| + // We reuse the same mailbox name from above since our texture id was consumed
|
| + // from it.
|
| const auto& skImageMailbox = textureMailbox.mailbox();
|
| - // Use the sync token generated after producing the mailbox. Waiting for this before trying to use
|
| - // the mailbox with some other context will ensure it is valid. We wouldn't need to wait for the
|
| - // consume done in this function because the texture id it generated would only be valid for the
|
| + // Use the sync token generated after producing the mailbox. Waiting for this
|
| + // before trying to use the mailbox with some other context will ensure it is
|
| + // valid. We wouldn't need to wait for the consume done in this function
|
| + // because the texture id it generated would only be valid for the
|
| // DrawingBuffer's context anyways.
|
| const auto& skImageSyncToken = textureMailbox.sync_token();
|
|
|
| - // TODO(xidachen): Create a small pool of recycled textures from ImageBitmapRenderingContext's
|
| - // transferFromImageBitmap, and try to use them in DrawingBuffer.
|
| + // TODO(xidachen): Create a small pool of recycled textures from
|
| + // ImageBitmapRenderingContext's transferFromImageBitmap, and try to use them
|
| + // in DrawingBuffer.
|
| return AcceleratedStaticBitmapImage::createFromWebGLContextImage(
|
| std::move(skImage), skImageMailbox, skImageSyncToken);
|
| }
|
| @@ -640,10 +649,11 @@ bool DrawingBuffer::initialize(const IntSize& size, bool useMultisampling) {
|
| m_antiAliasingMode = ScreenSpaceAntialiasing;
|
| }
|
| }
|
| - // TODO(dshwang): enable storage texture on all platform. crbug.com/557848
|
| - // Linux ATI bot fails WebglConformance.conformance_textures_misc_tex_image_webgl
|
| - // So use storage texture only if ScreenSpaceAntialiasing is enabled,
|
| - // because ScreenSpaceAntialiasing is much faster with storage texture.
|
| + // TODO(dshwang): Enable storage textures on all platforms. crbug.com/557848
|
| + // The Linux ATI bot fails
|
| + // WebglConformance.conformance_textures_misc_tex_image_webgl, so use storage
|
| + // textures only if ScreenSpaceAntialiasing is enabled, because
|
| + // ScreenSpaceAntialiasing is much faster with storage textures.
|
| m_storageTextureSupported =
|
| (m_webGLVersion > WebGL1 ||
|
| m_extensionsUtil->supportsExtension("GL_EXT_texture_storage")) &&
|
| @@ -666,7 +676,8 @@ bool DrawingBuffer::initialize(const IntSize& size, bool useMultisampling) {
|
| }
|
|
|
| if (m_gl->GetGraphicsResetStatusKHR() != GL_NO_ERROR) {
|
| - // It's possible that the drawing buffer allocation provokes a context loss, so check again just in case. http://crbug.com/512302
|
| + // It's possible that the drawing buffer allocation provokes a context loss,
|
| + // so check again just in case. http://crbug.com/512302
|
| return false;
|
| }
|
|
|
| @@ -694,7 +705,8 @@ bool DrawingBuffer::copyToPlatformTexture(gpu::gles2::GLES2Interface* gl,
|
| GL_TEXTURE_2D, internalFormat, destType, level))
|
| return false;
|
|
|
| - // Contexts may be in a different share group. We must transfer the texture through a mailbox first
|
| + // Contexts may be in a different share group. We must transfer the texture
|
| + // through a mailbox first.
|
| GLint textureId = 0;
|
| GLenum target = 0;
|
| gpu::Mailbox mailbox;
|
| @@ -851,8 +863,8 @@ void DrawingBuffer::resizeDepthStencil(const IntSize& size) {
|
| else
|
| m_gl->RenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES,
|
| size.width(), size.height());
|
| - // For ES 2.0 contexts DEPTH_STENCIL is not available natively, so we emulate it
|
| - // at the command buffer level for WebGL contexts.
|
| + // For ES 2.0 contexts DEPTH_STENCIL is not available natively, so we emulate
|
| + // it at the command buffer level for WebGL contexts.
|
| m_gl->FramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
|
| GL_RENDERBUFFER, m_depthStencilBuffer);
|
| m_gl->BindRenderbuffer(GL_RENDERBUFFER, 0);
|
| @@ -888,7 +900,8 @@ bool DrawingBuffer::resizeDefaultFramebuffer(const IntSize& size) {
|
| }
|
|
|
| void DrawingBuffer::clearFramebuffers(GLbitfield clearMask) {
|
| - // We will clear the multisample FBO, but we also need to clear the non-multisampled buffer.
|
| + // We will clear the multisample FBO, but we also need to clear the
|
| + // non-multisampled buffer.
|
| if (m_multisampleFBO) {
|
| m_gl->BindFramebuffer(GL_FRAMEBUFFER, m_fbo);
|
| m_gl->Clear(GL_COLOR_BUFFER_BIT);
|
| @@ -911,7 +924,8 @@ IntSize DrawingBuffer::adjustSize(const IntSize& desiredSize,
|
| int maxTextureSize) {
|
| IntSize adjustedSize = desiredSize;
|
|
|
| - // Clamp if the desired size is greater than the maximum texture size for the device.
|
| + // Clamp if the desired size is greater than the maximum texture size for the
|
| + // device.
|
| if (adjustedSize.height() > maxTextureSize)
|
| adjustedSize.setHeight(maxTextureSize);
|
|
|
|
|