Index: Source/modules/webgl/WebGLRenderingContextBase.cpp |
diff --git a/Source/modules/webgl/WebGLRenderingContextBase.cpp b/Source/modules/webgl/WebGLRenderingContextBase.cpp |
index 4e53c20f450f360fc3c6306714410d5e20994055..ca419d66592160103dc8cdd92f313b4a331ae582 100644 |
--- a/Source/modules/webgl/WebGLRenderingContextBase.cpp |
+++ b/Source/modules/webgl/WebGLRenderingContextBase.cpp |
@@ -1582,6 +1582,8 @@ void WebGLRenderingContextBase::bufferDataImpl(GLenum target, long long size, co |
if (!validateValueFitNonNegInt32("bufferData", "size", size)) |
return; |
+ buffer->setSize(size); |
+ |
webContext()->bufferData(target, static_cast<GLsizeiptr>(size), data, usage); |
} |
@@ -3678,6 +3680,32 @@ DOMArrayBufferView::ViewType WebGLRenderingContextBase::readPixelsExpectedArrayB |
} |
} |
+bool WebGLRenderingContextBase::validateReadPixelsFuncParameters(GLsizei width, GLsizei height, GLenum format, GLenum type, long long bufferSize) |
+{ |
+ if (!validateReadPixelsFormatAndType(format, type)) |
+ return false; |
+ WebGLFramebuffer* readFramebufferBinding = nullptr; |
+ GLenum readBufferInternalFormat = 0, readBufferType = 0; |
+ if (!validateReadBufferAndGetInfo("readPixels", readFramebufferBinding, &readBufferInternalFormat, &readBufferType)) |
+ return false; |
+ if (!validateReadPixelsFormatTypeCombination(format, type, readBufferInternalFormat, readBufferType)) |
+ return false; |
+ |
+ // Calculate array size, taking into consideration of PACK_ALIGNMENT. |
+ unsigned totalBytesRequired = 0; |
+ unsigned padding = 0; |
+ GLenum error = WebGLImageConversion::computeImageSizeInBytes(format, type, width, height, m_packAlignment, &totalBytesRequired, &padding); |
+ if (error != GL_NO_ERROR) { |
+ synthesizeGLError(error, "readPixels", "invalid dimensions"); |
+ return false; |
+ } |
+ if (bufferSize < static_cast<long long>(totalBytesRequired)) { |
+ synthesizeGLError(GL_INVALID_OPERATION, "readPixels", "buffer is not large enough for dimensions"); |
+ return false; |
+ } |
+ return true; |
+} |
+ |
void WebGLRenderingContextBase::readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, DOMArrayBufferView* pixels) |
{ |
if (isContextLost()) |
@@ -3690,13 +3718,8 @@ void WebGLRenderingContextBase::readPixels(GLint x, GLint y, GLsizei width, GLsi |
synthesizeGLError(GL_INVALID_VALUE, "readPixels", "no destination ArrayBufferView"); |
return; |
} |
- if (!validateReadPixelsFormatAndType(format, type)) |
- return; |
- GLenum readBufferInternalFormat = 0, readBufferType = 0; |
- WebGLFramebuffer* readFramebufferBinding = nullptr; |
- if (!validateReadBufferAndGetInfo("readPixels", readFramebufferBinding, &readBufferInternalFormat, &readBufferType)) |
- return; |
- if (!validateReadPixelsFormatTypeCombination(format, type, readBufferInternalFormat, readBufferType)) |
+ |
+ if (!validateReadPixelsFuncParameters(width, height, format, type, static_cast<long long>(pixels->byteLength()))) |
return; |
DOMArrayBufferView::ViewType expectedViewType = readPixelsExpectedArrayBufferViewType(type); |
@@ -3706,22 +3729,11 @@ void WebGLRenderingContextBase::readPixels(GLint x, GLint y, GLsizei width, GLsi |
return; |
} |
- // Calculate array size, taking into consideration of PACK_ALIGNMENT. |
- unsigned totalBytesRequired = 0; |
- unsigned padding = 0; |
- GLenum error = WebGLImageConversion::computeImageSizeInBytes(format, type, width, height, m_packAlignment, &totalBytesRequired, &padding); |
- if (error != GL_NO_ERROR) { |
- synthesizeGLError(error, "readPixels", "invalid dimensions"); |
- return; |
- } |
- if (pixels->byteLength() < totalBytesRequired) { |
- synthesizeGLError(GL_INVALID_OPERATION, "readPixels", "ArrayBufferView not large enough for dimensions"); |
- return; |
- } |
- |
clearIfComposited(); |
void* data = pixels->baseAddress(); |
+ GLenum target = isWebGL2OrHigher() ? GL_READ_FRAMEBUFFER : GL_FRAMEBUFFER; |
+ WebGLFramebuffer* readFramebufferBinding = getFramebufferBinding(target); |
{ |
ScopedDrawingBufferBinder binder(drawingBuffer(), readFramebufferBinding); |
webContext()->readPixels(x, y, width, height, format, type, data); |