| 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 ebed1a63bf97b77e8b8df2cf6e7183f5125193fd..8b7603878fc650ce7d6436cf0e1b066233e4aaa8 100644
|
| --- a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
|
| +++ b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp
|
| @@ -514,6 +514,29 @@ private:
|
| Member<WebGLRenderingContextBase> m_context;
|
| };
|
|
|
| +class ScopedUnpackParametersResetRestore {
|
| + STACK_ALLOCATED();
|
| +
|
| +public:
|
| + explicit ScopedUnpackParametersResetRestore(WebGLRenderingContextBase* context, bool enabled = true)
|
| + : m_context(context)
|
| + , m_enabled(enabled)
|
| + {
|
| + if (enabled)
|
| + m_context->resetUnpackParameters();
|
| + }
|
| +
|
| + ~ScopedUnpackParametersResetRestore()
|
| + {
|
| + if (m_enabled)
|
| + m_context->restoreUnpackParameters();
|
| + }
|
| +
|
| +private:
|
| + Member<WebGLRenderingContextBase> m_context;
|
| + bool m_enabled;
|
| +};
|
| +
|
| static void formatWebGLStatusString(const String& glInfo, const String& infostring, String& statusMessage)
|
| {
|
| if (!infostring.isEmpty())
|
| @@ -4024,7 +4047,7 @@ void WebGLRenderingContextBase::texImageImpl(TexImageFunctionID functionID, GLen
|
| }
|
| }
|
|
|
| - resetUnpackParameters();
|
| + ScopedUnpackParametersResetRestore temporaryResetUnpack(this);
|
| if (functionID == TexImage2D) {
|
| texImage2DBase(target, level, internalformat, imageExtractor.imageWidth(), imageExtractor.imageHeight(), 0, format, type, needConversion ? data.data() : imagePixelData);
|
| } else if (functionID == TexSubImage2D) {
|
| @@ -4033,7 +4056,6 @@ void WebGLRenderingContextBase::texImageImpl(TexImageFunctionID functionID, GLen
|
| DCHECK_EQ(functionID, TexSubImage3D);
|
| contextGL()->TexSubImage3D(target, level, xoffset, yoffset, zoffset, imageExtractor.imageWidth(), imageExtractor.imageHeight(), 1, format, type, needConversion ? data.data() : imagePixelData);
|
| }
|
| - restoreUnpackParameters();
|
| }
|
|
|
| bool WebGLRenderingContextBase::validateTexFunc(const char* functionName, TexImageFunctionType functionType, TexFuncValidationSourceType sourceType, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, GLint xoffset, GLint yoffset, GLint zoffset)
|
| @@ -4175,14 +4197,11 @@ void WebGLRenderingContextBase::texImageHelperDOMArrayBufferView(TexImageFunctio
|
| return;
|
| }
|
|
|
| - if (changeUnpackAlignment)
|
| - resetUnpackParameters();
|
| + ScopedUnpackParametersResetRestore temporaryResetUnpack(this, changeUnpackAlignment);
|
| if (functionID == TexImage2D)
|
| texImage2DBase(target, level, internalformat, width, height, border, format, type, data);
|
| else if (functionID == TexSubImage2D)
|
| contextGL()->TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, data);
|
| - if (changeUnpackAlignment)
|
| - restoreUnpackParameters();
|
| }
|
|
|
| void WebGLRenderingContextBase::texImage2D(GLenum target, GLint level, GLint internalformat,
|
| @@ -4232,7 +4251,7 @@ void WebGLRenderingContextBase::texImageHelperImageData(TexImageFunctionID funct
|
| return;
|
| }
|
| }
|
| - resetUnpackParameters();
|
| + ScopedUnpackParametersResetRestore temporaryResetUnpack(this);
|
| if (functionID == TexImage2D) {
|
| texImage2DBase(target, level, internalformat, pixels->width(), pixels->height(), border, format, type, needConversion ? data.data() : pixels->data()->data());
|
| } else if (functionID == TexSubImage2D) {
|
| @@ -4241,7 +4260,6 @@ void WebGLRenderingContextBase::texImageHelperImageData(TexImageFunctionID funct
|
| DCHECK_EQ(functionID, TexSubImage3D);
|
| contextGL()->TexSubImage3D(target, level, xoffset, yoffset, zoffset, pixels->width(), pixels->height(), depth, format, type, needConversion ? data.data() : pixels->data()->data());
|
| }
|
| - restoreUnpackParameters();
|
| }
|
|
|
| void WebGLRenderingContextBase::texImage2D(GLenum target, GLint level, GLint internalformat,
|
| @@ -4479,6 +4497,13 @@ void WebGLRenderingContextBase::texImageHelperHTMLVideoElement(TexImageFunctionI
|
| }
|
| }
|
|
|
| + {
|
| + ScopedUnpackParametersResetRestore(this, m_unpackFlipY || m_unpackPremultiplyAlpha);
|
| + if (video->texImageImpl(getTexImageFunctionName(functionID), target, contextGL(), level, internalformat, format, type, xoffset, yoffset, zoffset,
|
| + m_unpackFlipY, m_unpackPremultiplyAlpha && m_unpackColorspaceConversion == GL_NONE))
|
| + return;
|
| + }
|
| +
|
| RefPtr<Image> image = videoFrameToImage(video);
|
| if (!image)
|
| return;
|
| @@ -4559,7 +4584,7 @@ void WebGLRenderingContextBase::texImageHelperImageBitmap(TexImageFunctionID fun
|
| return;
|
| }
|
| }
|
| - resetUnpackParameters();
|
| + ScopedUnpackParametersResetRestore temporaryResetUnpack(this);
|
| if (functionID == TexImage2D) {
|
| texImage2DBase(target, level, internalformat, bitmap->width(), bitmap->height(), 0, format, type, needConversion ? data.data() : pixelDataPtr);
|
| } else if (functionID == TexSubImage2D) {
|
| @@ -4568,7 +4593,6 @@ void WebGLRenderingContextBase::texImageHelperImageBitmap(TexImageFunctionID fun
|
| DCHECK_EQ(functionID, TexSubImage3D);
|
| contextGL()->TexSubImage3D(target, level, xoffset, yoffset, zoffset, bitmap->width(), bitmap->height(), 1, format, type, needConversion ? data.data() : pixelDataPtr);
|
| }
|
| - restoreUnpackParameters();
|
| }
|
|
|
| void WebGLRenderingContextBase::texImage2D(GLenum target, GLint level, GLint internalformat,
|
|
|