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 43cecb80cf7d1dea7439344d236cedbc0d454db0..569e2d6ab7fbb805f7defe8f9a74a7c23c6e5c62 100644 |
--- a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp |
+++ b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp |
@@ -864,6 +864,87 @@ static const FormatType kSupportedFormatTypesES3[] = { |
{ GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8 }, |
}; |
+bool isUnsignedIntegerFormat(GLenum internalformat) |
+{ |
+ switch (internalformat) { |
+ case GL_R8UI: |
+ case GL_R16UI: |
+ case GL_R32UI: |
+ case GL_RG8UI: |
+ case GL_RG16UI: |
+ case GL_RG32UI: |
+ case GL_RGB8UI: |
+ case GL_RGB16UI: |
+ case GL_RGB32UI: |
+ case GL_RGBA8UI: |
+ case GL_RGB10_A2UI: |
+ case GL_RGBA16UI: |
+ case GL_RGBA32UI: |
+ return true; |
+ default: |
+ return false; |
+ } |
+} |
+ |
+bool isSignedIntegerFormat(GLenum internalformat) |
+{ |
+ switch (internalformat) { |
+ case GL_R8I: |
+ case GL_R16I: |
+ case GL_R32I: |
+ case GL_RG8I: |
+ case GL_RG16I: |
+ case GL_RG32I: |
+ case GL_RGB8I: |
+ case GL_RGB16I: |
+ case GL_RGB32I: |
+ case GL_RGBA8I: |
+ case GL_RGBA16I: |
+ case GL_RGBA32I: |
+ return true; |
+ default: |
+ return false; |
+ } |
+} |
+ |
+bool isIntegerFormat(GLenum internalformat) |
+{ |
+ return (isUnsignedIntegerFormat(internalformat) || isSignedIntegerFormat(internalformat)); |
+} |
+ |
+bool isFloatType(GLenum type) |
+{ |
+ switch (type) { |
+ case GL_FLOAT: |
+ case GL_HALF_FLOAT: |
+ case GL_HALF_FLOAT_OES: |
+ case GL_UNSIGNED_INT_10F_11F_11F_REV: |
+ return true; |
+ default: |
+ return false; |
+ } |
+} |
+ |
+bool isSRGBFormat(GLenum internalformat) |
+{ |
+ switch (internalformat) { |
+ case GL_SRGB_EXT: |
+ case GL_SRGB_ALPHA_EXT: |
+ case GL_SRGB8: |
+ case GL_SRGB8_ALPHA8: |
+ return true; |
+ default: |
+ return false; |
+ } |
+} |
+ |
+bool canUseTexImage2DCanvasByGPU(GLenum internalformat, GLenum type) |
+{ |
+ if (isFloatType(type) || isIntegerFormat(internalformat) || isSRGBFormat(internalformat)) |
+ return false; |
+ return true; |
+} |
+ |
} // namespace anonymous |
WebGLRenderingContextBase::WebGLRenderingContextBase(HTMLCanvasElement* passedCanvas, PassOwnPtr<WebGraphicsContext3D> context, const WebGLContextAttributes& requestedAttributes) |
@@ -4353,9 +4434,9 @@ void WebGLRenderingContextBase::texImage2D(GLenum target, GLint level, GLenum in |
WebGLTexture* texture = validateTextureBinding("texImage2D", target, true); |
ASSERT(texture); |
- // texImage2DCanvasByGPU relies on copyTextureCHROMIUM which doesn't support float type. |
- bool isFloatType = type == GL_FLOAT || type == GL_HALF_FLOAT || type == GL_HALF_FLOAT_OES; |
- if (!canvas->renderingContext() || !canvas->renderingContext()->isAccelerated() || isFloatType) { |
+ // texImage2DCanvasByGPU relies on copyTextureCHROMIUM which doesn't support float/integer/sRGB internal format. |
+ // FIXME: relax the constrains if copyTextureCHROMIUM is upgraded to handle more formats. |
+ if (!canvas->renderingContext() || !canvas->renderingContext()->isAccelerated() || !canUseTexImage2DCanvasByGPU(internalformat, type)) { |
// 2D canvas has only FrontBuffer. |
texImage2DImpl(target, level, internalformat, format, type, canvas->copiedImage(FrontBuffer, PreferAcceleration).get(), |
WebGLImageConversion::HtmlDomCanvas, m_unpackFlipY, m_unpackPremultiplyAlpha); |
@@ -4611,8 +4692,10 @@ void WebGLRenderingContextBase::texSubImage2D(GLenum target, GLint level, GLint |
WebGLTexture* texture = validateTextureBinding("texSubImage2D", target, true); |
ASSERT(texture); |
- bool isFloatType = type == GL_FLOAT || type == GL_HALF_FLOAT || type == GL_HALF_FLOAT_OES; |
- if (!canvas->renderingContext() || !canvas->renderingContext()->isAccelerated() || isFloatType) { |
+ GLenum internalformat = texture->getInternalFormat(target, level); |
+ // texImage2DCanvasByGPU relies on copyTextureCHROMIUM which doesn't support float/integer/sRGB internal format. |
+ // FIXME: relax the constrains if copyTextureCHROMIUM is upgraded to handle more formats. |
+ if (!canvas->renderingContext() || !canvas->renderingContext()->isAccelerated() || !canUseTexImage2DCanvasByGPU(internalformat, type)) { |
// 2D canvas has only FrontBuffer. |
texSubImage2DImpl(target, level, xoffset, yoffset, format, type, canvas->copiedImage(FrontBuffer, PreferAcceleration).get(), |
WebGLImageConversion::HtmlDomCanvas, m_unpackFlipY, m_unpackPremultiplyAlpha); |