Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(804)

Unified Diff: third_party/WebKit/Source/modules/webgl/WebGL2RenderingContextBase.cpp

Issue 1557603002: Unify validation for TexSubImage{2D|3D} (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;

Powered by Google App Engine
This is Rietveld 408576698