| Index: third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
|
| diff --git a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
|
| index 8640a99c01c8f48c942bbb4828c555ca238d1aa8..3807e6db60af008c9ca66a598604ffff3475087a 100644
|
| --- a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
|
| +++ b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
|
| @@ -749,10 +749,22 @@ ScriptPromise WebGLRenderingContextBase::commit(
|
| if (!drawingBuffer()) {
|
| return offscreenCanvas()->commit(nullptr, false, scriptState);
|
| }
|
| - // TODO(crbug.com/646864): Make commit() work correctly with
|
| - // { preserveDrawingBuffer : true }.
|
| +
|
| + RefPtr<StaticBitmapImage> image;
|
| + if (creationAttributes().preserveDrawingBuffer()) {
|
| + int width = drawingBuffer()->size().width();
|
| + int height = drawingBuffer()->size().height();
|
| + SkImageInfo imageInfo =
|
| + SkImageInfo::Make(width, height, kRGBA_8888_SkColorType,
|
| + creationAttributes().alpha() ? kPremul_SkAlphaType
|
| + : kOpaque_SkAlphaType);
|
| + image = StaticBitmapImage::create(makeImageSnapshot(imageInfo));
|
| + } else {
|
| + image = drawingBuffer()->transferToStaticBitmapImage();
|
| + }
|
| +
|
| return offscreenCanvas()->commit(
|
| - std::move(drawingBuffer()->transferToStaticBitmapImage()),
|
| + std::move(image),
|
| drawingBuffer()->contextProvider()->isSoftwareRendering(), scriptState);
|
| }
|
|
|
| @@ -782,6 +794,27 @@ PassRefPtr<Image> WebGLRenderingContextBase::getImage(
|
| return buffer->newImageSnapshot(hint, reason);
|
| }
|
|
|
| +sk_sp<SkImage> WebGLRenderingContextBase::makeImageSnapshot(
|
| + SkImageInfo& imageInfo) {
|
| + drawingBuffer()->resolveAndBindForReadAndDraw();
|
| + gpu::gles2::GLES2Interface* gl = SharedGpuContext::gl();
|
| +
|
| + SkSurfaceProps disableLCDProps(0, kUnknown_SkPixelGeometry);
|
| + sk_sp<SkSurface> surface = SkSurface::MakeRenderTarget(
|
| + SharedGpuContext::gr(), SkBudgeted::kYes, imageInfo, 0,
|
| + imageInfo.alphaType() == kOpaque_SkAlphaType ? nullptr
|
| + : &disableLCDProps);
|
| + GLuint textureId = skia::GrBackendObjectToGrGLTextureInfo(
|
| + surface->getTextureHandle(
|
| + SkSurface::kDiscardWrite_TextureHandleAccess))
|
| + ->fID;
|
| +
|
| + drawingBuffer()->copyToPlatformTexture(
|
| + gl, textureId, GL_RGBA, GL_UNSIGNED_BYTE, 0, true, false, IntPoint(0, 0),
|
| + IntRect(IntPoint(0, 0), drawingBuffer()->size()), BackBuffer);
|
| + return surface->makeImageSnapshot();
|
| +}
|
| +
|
| ImageData* WebGLRenderingContextBase::toImageData(SnapshotReason reason) {
|
| ImageData* imageData = nullptr;
|
| // TODO(ccameron): WebGL should produce sRGB images.
|
| @@ -795,27 +828,11 @@ ImageData* WebGLRenderingContextBase::toImageData(SnapshotReason reason) {
|
|
|
| int width = drawingBuffer()->size().width();
|
| int height = drawingBuffer()->size().height();
|
| - OpacityMode opacityMode = creationAttributes().alpha() ? NonOpaque : Opaque;
|
| -
|
| - drawingBuffer()->resolveAndBindForReadAndDraw();
|
| - gpu::gles2::GLES2Interface* gl = SharedGpuContext::gl();
|
| - SkImageInfo imageInfo = SkImageInfo::Make(
|
| - width, height, kRGBA_8888_SkColorType,
|
| - Opaque == opacityMode ? kOpaque_SkAlphaType : kPremul_SkAlphaType);
|
| - SkSurfaceProps disableLCDProps(0, kUnknown_SkPixelGeometry);
|
| - sk_sp<SkSurface> surface = SkSurface::MakeRenderTarget(
|
| - SharedGpuContext::gr(), SkBudgeted::kYes, imageInfo, 0,
|
| - Opaque == opacityMode ? nullptr : &disableLCDProps);
|
| - GLuint textureId = skia::GrBackendObjectToGrGLTextureInfo(
|
| - surface->getTextureHandle(
|
| - SkSurface::kDiscardWrite_TextureHandleAccess))
|
| - ->fID;
|
| -
|
| - drawingBuffer()->copyToPlatformTexture(
|
| - gl, textureId, GL_RGBA, GL_UNSIGNED_BYTE, 0, true, false,
|
| - IntPoint(0, 0), IntRect(IntPoint(0, 0), drawingBuffer()->size()),
|
| - BackBuffer);
|
| - sk_sp<SkImage> snapshot = surface->makeImageSnapshot();
|
| + SkImageInfo imageInfo =
|
| + SkImageInfo::Make(width, height, kRGBA_8888_SkColorType,
|
| + creationAttributes().alpha() ? kPremul_SkAlphaType
|
| + : kOpaque_SkAlphaType);
|
| + sk_sp<SkImage> snapshot = makeImageSnapshot(imageInfo);
|
| if (snapshot) {
|
| imageData = ImageData::create(drawingBuffer()->size());
|
| snapshot->readPixels(imageInfo, imageData->data()->data(),
|
| @@ -4118,7 +4135,8 @@ void WebGLRenderingContextBase::readPixelsHelper(GLint x,
|
| return;
|
| // Due to WebGL's same-origin restrictions, it is not possible to
|
| // taint the origin using the WebGL API.
|
| - ASSERT(canvas()->originClean());
|
| + DCHECK(canvas() ? canvas()->originClean() : offscreenCanvas()->originClean());
|
| +
|
| // Validate input parameters.
|
| if (!pixels) {
|
| synthesizeGLError(GL_INVALID_VALUE, "readPixels",
|
|
|