From 430a4f559cbc2bcd5d026e8b36ee46ddd80e9651 Mon Sep 17 00:00:00 2001 From: Geoff Lang Date: Fri, 21 Jul 2023 13:45:52 -0400 Subject: [PATCH] Fix read size validation for RGBX formats. GL_RGBX8_ANGLE is the only format where the upload format is 3-channel RGB, whilethe download format is 4-channel RGBX. As such, the internal format corresponding to format+type expects 3-byte input/output. The format is fixed here for readPixels to output 4 bytes per pixel. Bug: chromium:1458046 Change-Id: Iec737ed64bade003cfab50dc5f595eb4875e81e4 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4706957 Reviewed-by: Shahbaz Youssefi Commit-Queue: Shahbaz Youssefi --- src/libANGLE/formatutils.cpp | 10 +++++++++- src/libANGLE/renderer/vulkan/FramebufferVk.cpp | 9 --------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/libANGLE/formatutils.cpp b/src/libANGLE/formatutils.cpp index f2845dc9f..bb1389aaa 100644 --- a/src/libANGLE/formatutils.cpp +++ b/src/libANGLE/formatutils.cpp @@ -1702,7 +1702,15 @@ const InternalFormat &GetInternalFormatInfo(GLenum internalFormat, GLenum type) GLuint InternalFormat::computePixelBytes(GLenum formatType) const { const auto &typeInfo = GetTypeInfo(formatType); - GLuint components = typeInfo.specialInterpretation ? 1u : componentCount; + GLuint components = componentCount; + if (sizedInternalFormat == GL_RGBX8_ANGLE) + { + components = 4; + } + else if (typeInfo.specialInterpretation) + { + components = 1; + } return components * typeInfo.bytes; } diff --git a/src/libANGLE/renderer/vulkan/FramebufferVk.cpp b/src/libANGLE/renderer/vulkan/FramebufferVk.cpp index 8344099fd..3aff1e2aa 100644 --- a/src/libANGLE/renderer/vulkan/FramebufferVk.cpp +++ b/src/libANGLE/renderer/vulkan/FramebufferVk.cpp @@ -813,15 +813,6 @@ angle::Result FramebufferVk::readPixels(const gl::Context *context, gl::Buffer *packBuffer, void *pixels) { - // Note that GL_RGBX8_ANGLE is the only format where the upload format is 3-channel RGB, while - // the download format is 4-channel RGBX. As such, the internal format corresponding to - // format+type expects 3-byte input/output. The format is fixed here for readPixels to output - // 4 bytes per pixel. - if (format == GL_RGBX8_ANGLE) - { - format = GL_RGBA8; - } - // Clip read area to framebuffer. const gl::Extents &fbSize = getState().getReadPixelsAttachment(format)->getSize(); const gl::Rectangle fbRect(0, 0, fbSize.width, fbSize.height);