This is an automated email from the git hooks/post-receive script.
pierov pushed a commit to annotated tag FIREFOX_102_4_0esr_BUILD1 in repository tor-browser.
commit 0fa01d6241a01b902fb10c4d46cdbf819c661c02 Author: Ashly Hale ahale@mozilla.com AuthorDate: Mon Oct 3 13:27:12 2022 +0000
Bug 1789729 - Implement webgl.max-size-per-texture-mib r=jgilbert a=RyanVM
Differential Revision: https://phabricator.services.mozilla.com/D156903 --- dom/canvas/WebGLTextureUpload.cpp | 33 +++++++++++++++++++++++++------- modules/libpref/init/StaticPrefList.yaml | 5 +++++ 2 files changed, 31 insertions(+), 7 deletions(-)
diff --git a/dom/canvas/WebGLTextureUpload.cpp b/dom/canvas/WebGLTextureUpload.cpp index 2135cb813e2d..0666d9936b4c 100644 --- a/dom/canvas/WebGLTextureUpload.cpp +++ b/dom/canvas/WebGLTextureUpload.cpp @@ -764,9 +764,27 @@ static bool ValidateCompressedTexImageRestrictions( return true; }
-static bool ValidateTargetForFormat(const WebGLContext* webgl, - TexImageTarget target, - const webgl::FormatInfo* format) { +static bool ValidateFormatAndSize(const WebGLContext* webgl, + TexImageTarget target, + const webgl::FormatInfo* format, + const uvec3& size) { + // Check if texture size will likely be rejected by the driver and give a more + // meaningful error message. + auto baseImageSize = CheckedInt<uint64_t>(format->estimatedBytesPerPixel) * + (uint32_t)size.x * (uint32_t)size.y * (uint32_t)size.z; + if (target == LOCAL_GL_TEXTURE_CUBE_MAP) { + baseImageSize *= 6; + } + if (!baseImageSize.isValid() || + baseImageSize.value() > + (uint64_t)StaticPrefs::webgl_max_size_per_texture_mib() * + (1024 * 1024)) { + webgl->ErrorOutOfMemory( + "Texture size too large; base image mebibytes > " + "webgl.max-size-per-texture-mib"); + return false; + } + // GLES 3.0.4 p127: // "Textures with a base internal format of DEPTH_COMPONENT or DEPTH_STENCIL // are supported by texture image specification commands only if `target` is @@ -834,7 +852,7 @@ void WebGLTexture::TexStorage(TexTarget target, uint32_t levels, } auto dstFormat = dstUsage->format;
- if (!ValidateTargetForFormat(mContext, testTarget, dstFormat)) return; + if (!ValidateFormatAndSize(mContext, testTarget, dstFormat, size)) return;
if (dstFormat->compression) { if (!ValidateCompressedTexImageRestrictions(mContext, testTarget, 0, @@ -1007,7 +1025,7 @@ void WebGLTexture::TexImage(uint32_t level, GLenum respecFormat, }
const auto& dstFormat = dstUsage->format; - if (!ValidateTargetForFormat(mContext, imageTarget, dstFormat)) return; + if (!ValidateFormatAndSize(mContext, imageTarget, dstFormat, size)) return;
if (!mContext->IsWebGL2() && dstFormat->d) { if (imageTarget != LOCAL_GL_TEXTURE_2D || blob->HasData() || level != 0) { @@ -1200,7 +1218,8 @@ void WebGLTexture::CompressedTexImage(bool sub, GLenum imageTarget, } MOZ_ASSERT(imageInfo);
- if (!ValidateTargetForFormat(mContext, imageTarget, usage->format)) return; + if (!ValidateFormatAndSize(mContext, imageTarget, usage->format, size)) + return; if (!ValidateCompressedTexImageRestrictions(mContext, imageTarget, level, usage->format, size)) { return; @@ -1836,7 +1855,7 @@ void WebGLTexture::CopyTexImage(GLenum imageTarget, uint32_t level, dstUsage = ValidateCopyDestUsage(mContext, srcFormat, respecFormat); if (!dstUsage) return;
- if (!ValidateTargetForFormat(mContext, imageTarget, dstUsage->format)) + if (!ValidateFormatAndSize(mContext, imageTarget, dstUsage->format, size)) return; } else { if (!ValidateTexImageSelection(imageTarget, level, dstOffset, size, diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml index 3b38ccde5cd4..34f47f3e51cd 100644 --- a/modules/libpref/init/StaticPrefList.yaml +++ b/modules/libpref/init/StaticPrefList.yaml @@ -13175,6 +13175,11 @@ value: 300 mirror: always
+- name: webgl.max-size-per-texture-mib + type: RelaxedAtomicUint32 + value: 1024 + mirror: always + - name: webgl.max-warnings-per-context type: RelaxedAtomicUint32 value: 32