Chromium Code Reviews| Index: Source/modules/webgl/WebGLRenderingContextBase.cpp |
| diff --git a/Source/modules/webgl/WebGLRenderingContextBase.cpp b/Source/modules/webgl/WebGLRenderingContextBase.cpp |
| index 53aaea0151620316a369e2c80916623f0b6df6ab..9e933a5873dd32b897c815a27752f5e44d2681e6 100644 |
| --- a/Source/modules/webgl/WebGLRenderingContextBase.cpp |
| +++ b/Source/modules/webgl/WebGLRenderingContextBase.cpp |
| @@ -222,33 +222,6 @@ void WebGLRenderingContextBase::willDestroyContext(WebGLRenderingContextBase* co |
| namespace { |
| -// ScopedDrawingBufferBinder is used for ReadPixels/CopyTexImage2D/CopySubImage2D to read from |
| -// a multisampled DrawingBuffer. In this situation, we need to blit to a single sampled buffer |
| -// for reading, during which the bindings could be changed and need to be recovered. |
| -class ScopedDrawingBufferBinder { |
| - STACK_ALLOCATED(); |
| -public: |
| - ScopedDrawingBufferBinder(DrawingBuffer* drawingBuffer, WebGLFramebuffer* framebufferBinding) |
| - : m_drawingBuffer(drawingBuffer) |
| - , m_readFramebufferBinding(framebufferBinding) |
| - { |
| - // Commit DrawingBuffer if needed (e.g., for multisampling) |
| - if (!m_readFramebufferBinding && m_drawingBuffer) |
| - m_drawingBuffer->commit(); |
| - } |
| - |
| - ~ScopedDrawingBufferBinder() |
| - { |
| - // Restore DrawingBuffer if needed |
| - if (!m_readFramebufferBinding && m_drawingBuffer) |
| - m_drawingBuffer->restoreFramebufferBindings(); |
| - } |
| - |
| -private: |
| - DrawingBuffer* m_drawingBuffer; |
| - Member<WebGLFramebuffer> m_readFramebufferBinding; |
| -}; |
| - |
| GLint clamp(GLint value, GLint min, GLint max) |
| { |
| if (value < min) |
| @@ -1896,33 +1869,8 @@ void WebGLRenderingContextBase::copyTexSubImage2D(GLenum target, GLint level, GL |
| { |
| if (isContextLost()) |
| return; |
| - if (!validateTexFuncLevel("copyTexSubImage2D", target, level)) |
| - return; |
| - WebGLTexture* tex = validateTextureBinding("copyTexSubImage2D", target, true); |
| - if (!tex) |
| - return; |
| - if (!validateSize("copyTexSubImage2D", xoffset, yoffset) || !validateSize("copyTexSubImage2D", width, height)) |
| - return; |
| - // Before checking if it is in the range, check if overflow happens first. |
| - Checked<GLint, RecordOverflow> maxX = xoffset; |
| - maxX += width; |
| - Checked<GLint, RecordOverflow> maxY = yoffset; |
| - maxY += height; |
| - if (maxX.hasOverflowed() || maxY.hasOverflowed()) { |
| - synthesizeGLError(GL_INVALID_VALUE, "copyTexSubImage2D", "bad dimensions"); |
| - return; |
| - } |
| - if (maxX.unsafeGet() > tex->getWidth(target, level) || maxY.unsafeGet() > tex->getHeight(target, level)) { |
| - synthesizeGLError(GL_INVALID_VALUE, "copyTexSubImage2D", "rectangle out of range"); |
| - return; |
| - } |
| - GLenum internalformat = tex->getInternalFormat(target, level); |
| - if (!validateSettableTexFormat("copyTexSubImage2D", internalformat)) |
| - return; |
| - if (!isTexInternalFormatColorBufferCombinationValid(internalformat, boundFramebufferColorFormat())) { |
| - synthesizeGLError(GL_INVALID_OPERATION, "copyTexSubImage2D", "framebuffer is incompatible format"); |
| + if (!validateCopyTexSubImage("copyTexSubImage2D", target, level, xoffset, yoffset, 0, x, y, width, height)) |
| return; |
| - } |
| WebGLFramebuffer* readFramebufferBinding = nullptr; |
| if (!validateReadBufferAndGetInfo("copyTexSubImage2D", readFramebufferBinding, nullptr, nullptr)) |
| return; |
| @@ -5388,9 +5336,9 @@ bool WebGLRenderingContextBase::validateLocationLength(const char* functionName, |
| return true; |
| } |
| -bool WebGLRenderingContextBase::validateSize(const char* functionName, GLint x, GLint y) |
| +bool WebGLRenderingContextBase::validateSize(const char* functionName, GLint x, GLint y, GLint z) |
| { |
| - if (x < 0 || y < 0) { |
| + if (x < 0 || y < 0 || z < 0) { |
| synthesizeGLError(GL_INVALID_VALUE, functionName, "size < 0"); |
| return false; |
| } |
| @@ -5670,6 +5618,39 @@ bool WebGLRenderingContextBase::validateTexFuncData(const char* functionName, GL |
| return true; |
| } |
| +bool WebGLRenderingContextBase::validateCopyTexSubImage(const char* functionName, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) |
| +{ |
| + if (!validateTexFuncLevel(functionName, target, level)) |
| + return false; |
| + WebGLTexture* tex = validateTextureBinding(functionName, target, true); |
| + if (!tex) |
| + return false; |
| + if (!validateSize(functionName, xoffset, yoffset, zoffset) || !validateSize(functionName, width, height)) |
| + return false; |
| + // Before checking if it is in the range, check if overflow happens first. |
| + Checked<GLint, RecordOverflow> maxX = xoffset; |
| + maxX += width; |
| + Checked<GLint, RecordOverflow> maxY = yoffset; |
| + maxY += height; |
| + if (maxX.hasOverflowed() || maxY.hasOverflowed()) { |
| + synthesizeGLError(GL_INVALID_VALUE, functionName, "bad dimensions"); |
| + return false; |
| + } |
| + if (maxX.unsafeGet() > tex->getWidth(target, level) || maxY.unsafeGet() > tex->getHeight(target, level) || zoffset >= tex->getDepth(target, level)) { |
| + synthesizeGLError(GL_INVALID_VALUE, functionName, "rectangle out of range"); |
| + return false; |
| + } |
| + GLenum internalformat = tex->getInternalFormat(target, level); |
| + if (!validateSettableTexFormat(functionName, internalformat)) |
| + return false; |
| + if (!isTexInternalFormatColorBufferCombinationValid(internalformat, boundFramebufferColorFormat())) { |
|
Zhenyao Mo
2015/08/26 23:44:38
I don't think boundFramebufferColorFormat() does t
Ken Russell (switch to Gerrit)
2015/08/27 02:01:03
Agreed, boundFramebufferColorFormat looks like it
|
| + synthesizeGLError(GL_INVALID_OPERATION, functionName, "framebuffer is incompatible format"); |
| + return false; |
| + } |
| + |
| + return true; |
| +} |
| + |
| bool WebGLRenderingContextBase::validateCompressedTexFormat(GLenum format) |
| { |
| return m_compressedTextureFormats.contains(format); |