Index: third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp |
diff --git a/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp b/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp |
index 62c65c1e2aaa9b870113261a8833179db3a069bc..f85e17a3b5f2562795daca1724b67765f18c5f58 100644 |
--- a/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp |
+++ b/third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp |
@@ -858,7 +858,7 @@ void WebGL2RenderingContextBase::texStorage3D(GLenum target, GLsizei levels, GLe |
void WebGL2RenderingContextBase::texImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, DOMArrayBufferView* pixels) |
{ |
if (isContextLost() || !validateTexFunc3DTarget("texImage3D", target) |
- || !validateTexFunc("texImage3D", NotTexSubImage2D, SourceArrayBufferView, target, level, internalformat, width, height, depth, border, format, type, 0, 0, 0) |
+ || !validateTexFunc("texImage3D", NotTexSubImage, SourceArrayBufferView, target, level, internalformat, width, height, depth, border, format, type, 0, 0, 0) |
|| !validateTexFuncData("texImage3D", level, width, height, depth, format, type, pixels, NullAllowed)) |
return; |
@@ -876,49 +876,8 @@ void WebGL2RenderingContextBase::texImage3D(GLenum target, GLint level, GLint in |
tex->setLevelInfo(target, level, internalformat, width, height, depth, type); |
} |
-bool WebGL2RenderingContextBase::validateTexSubImage3D(const char* functionName, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, |
- GLenum format, GLenum type, GLsizei width, GLsizei height, GLsizei depth) |
-{ |
- if (!validateTexFunc3DTarget(functionName, target)) |
- return false; |
- |
- WebGLTexture* tex = validateTextureBinding(functionName, target, false); |
- if (!tex) |
- return false; |
- |
- if (!validateTexFuncLevel(functionName, target, level)) |
- return false; |
- |
- if (!tex->isValid(target, level)) { |
- synthesizeGLError(GL_INVALID_OPERATION, "texSubImage3D", "no previously defined texture image"); |
- return false; |
- } |
- |
- // Before checking if it is in the range, check if overflow happens first. |
- CheckedInt<GLint> maxX = xoffset, maxY = yoffset, maxZ = zoffset; |
- maxX += width; |
- maxY += height; |
- maxZ += depth; |
- if (!maxX.isValid() || !maxY.isValid() || !maxZ.isValid() |
- || maxX.value() > tex->getWidth(target, level) |
- || maxY.value() > tex->getHeight(target, level) |
- || maxZ.value() > tex->getDepth(target, level)) { |
- synthesizeGLError(GL_INVALID_VALUE, functionName, "dimensions out of range"); |
- return false; |
- } |
- |
- GLenum internalformat = tex->getInternalFormat(target, level); |
- if (!validateTexFuncFormatAndType(functionName, internalformat, format, type, level)) |
- return false; |
- |
- return true; |
-} |
- |
void WebGL2RenderingContextBase::texSubImage3DImpl(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLenum format, GLenum type, Image* image, WebGLImageConversion::ImageHtmlDomSource domSource, bool flipY, bool premultiplyAlpha) |
{ |
- if (!validateTexSubImage3D("texSubImage3D", target, level, xoffset, yoffset, zoffset, format, type, image->width(), image->height(), 1)) |
- return; |
- |
// All calling functions check isContextLost, so a duplicate check is not needed here. |
if (type == GL_UNSIGNED_INT_10F_11F_11F_REV) { |
// The UNSIGNED_INT_10F_11F_11F_REV type pack/unpack isn't implemented. |
@@ -951,12 +910,11 @@ void WebGL2RenderingContextBase::texSubImage3DImpl(GLenum target, GLint level, G |
void WebGL2RenderingContextBase::texSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, DOMArrayBufferView* pixels) |
{ |
- if (isContextLost() || !pixels || !validateTexSubImage3D("texSubImage3D", target, level, xoffset, yoffset, zoffset, format, type, width, height, depth) |
- || !validateTexFuncData("texSubImage3D", level, width, height, depth, format, type, pixels, NullAllowed)) |
+ if (isContextLost() || !validateTexFunc3DTarget("texSubImage3D", target) |
+ || !validateTexFunc("texSubImage3D", TexSubImage, SourceArrayBufferView, target, level, 0, width, height, depth, 0, format, type, xoffset, yoffset, zoffset) |
+ || !validateTexFuncData("texSubImage3D", level, width, height, depth, format, type, pixels, NullNotAllowed)) |
return; |
- // FIXME: Ensure pixels is large enough to contain the desired texture dimensions. |
- |
void* data = pixels->baseAddress(); |
Vector<uint8_t> tempData; |
bool changeUnpackParameters = false; |
@@ -974,7 +932,12 @@ void WebGL2RenderingContextBase::texSubImage3D(GLenum target, GLint level, GLint |
void WebGL2RenderingContextBase::texSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLenum format, GLenum type, ImageData* pixels) |
{ |
- if (isContextLost() || !pixels || !validateTexSubImage3D("texSubImage3D", target, level, xoffset, yoffset, zoffset, format, type, pixels->width(), pixels->height(), 1)) |
+ if (!pixels) { |
+ synthesizeGLError(GL_INVALID_VALUE, "texSubImage3D", "no image data"); |
+ return; |
+ } |
Zhenyao Mo
2015/12/30 20:17:05
if (pixels->data()->bufferBase()->isNeutered()) {
qiankun
2015/12/30 23:15:07
Done.
|
+ if (isContextLost() || !validateTexFunc3DTarget("texSubImage3D", target) |
+ || !validateTexFunc("texSubImage3D", TexSubImage, SourceImageData, target, level, 0, pixels->width(), pixels->height(), 1, 0, format, type, xoffset, yoffset, zoffset)) |
return; |
if (type == GL_UNSIGNED_INT_10F_11F_11F_REV) { |
@@ -1000,19 +963,25 @@ void WebGL2RenderingContextBase::texSubImage3D(GLenum target, GLint level, GLint |
void WebGL2RenderingContextBase::texSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLenum format, GLenum type, HTMLImageElement* image, ExceptionState& exceptionState) |
{ |
- if (isContextLost() || !image || !validateHTMLImageElement("texSubImage3D", image, exceptionState)) |
+ if (isContextLost() || !image || !validateHTMLImageElement("texSubImage3D", image, exceptionState) |
Zhenyao Mo
2015/12/30 20:17:05
Get rid of !image
qiankun
2015/12/30 23:15:07
Done.
|
+ || !validateTexFunc3DTarget("texSubImage3D", target)) |
return; |
RefPtr<Image> imageForRender = image->cachedImage()->image(); |
if (imageForRender->isSVGImage()) |
imageForRender = drawImageIntoBuffer(imageForRender.get(), image->width(), image->height(), "texSubImage3D"); |
+ if (!imageForRender || !validateTexFunc("texSubImage3D", TexSubImage, SourceHTMLImageElement, target, level, 0, imageForRender->width(), imageForRender->height(), 1, 0, format, type, xoffset, yoffset, zoffset)) |
+ return; |
+ |
texSubImage3DImpl(target, level, xoffset, yoffset, zoffset, format, type, imageForRender.get(), WebGLImageConversion::HtmlDomImage, m_unpackFlipY, m_unpackPremultiplyAlpha); |
} |
void WebGL2RenderingContextBase::texSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLenum format, GLenum type, HTMLCanvasElement* canvas, ExceptionState& exceptionState) |
{ |
- if (isContextLost() || !validateHTMLCanvasElement("texSubImage3D", canvas, exceptionState)) |
+ if (isContextLost() || !validateHTMLCanvasElement("texSubImage3D", canvas, exceptionState) |
+ || !validateTexFunc3DTarget("texSubImage3D", target) |
+ || !validateTexFunc("texSubImage3D", TexSubImage, SourceHTMLCanvasElement, target, level, 0, canvas->width(), canvas->height(), 1, 0, format, type, xoffset, yoffset, zoffset)) |
return; |
WebGLTexture* texture = validateTextureBinding("texSubImage3D", target, false); |
@@ -1032,7 +1001,9 @@ void WebGL2RenderingContextBase::texSubImage3D(GLenum target, GLint level, GLint |
void WebGL2RenderingContextBase::texSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLenum format, GLenum type, HTMLVideoElement* video, ExceptionState& exceptionState) |
{ |
- if (isContextLost() || !validateHTMLVideoElement("texSubImage3D", video, exceptionState)) |
+ if (isContextLost() || !validateHTMLVideoElement("texSubImage3D", video, exceptionState) |
+ || !validateTexFunc3DTarget("texSubImage3D", target) |
+ || !validateTexFunc("texSubImage3D", TexSubImage, SourceHTMLVideoElement, target, level, 0, video->videoWidth(), video->videoHeight(), 1, 0, format, type, xoffset, yoffset, zoffset)) |
return; |
RefPtr<Image> image = videoFrameToImage(video); |
@@ -1069,7 +1040,7 @@ void WebGL2RenderingContextBase::compressedTexImage3D(GLenum target, GLint level |
synthesizeGLError(GL_INVALID_VALUE, "compressedTexImage3D", "border not 0"); |
return; |
} |
- if (!validateCompressedTexDimensions("compressedTexImage3D", NotTexSubImage2D, target, level, width, height, depth, internalformat)) |
+ if (!validateCompressedTexDimensions("compressedTexImage3D", NotTexSubImage, target, level, width, height, depth, internalformat)) |
return; |
if (!validateCompressedTexFuncData("compressedTexImage3D", width, height, depth, internalformat, data)) |
return; |