Packing fix Unified and fixed packing and unpacking computations. Change-Id: I1ea2bcf28945a9f105152a6836f11bcb2859750c Reviewed-on: https://swiftshader-review.googlesource.com/4715 Tested-by: Alexis Hétu <sugoi@google.com> Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/common/Image.cpp b/src/OpenGL/common/Image.cpp index ef335b8..81dd0c6 100644 --- a/src/OpenGL/common/Image.cpp +++ b/src/OpenGL/common/Image.cpp
@@ -1082,6 +1082,12 @@ return (rawPitch + alignment - 1) & ~(alignment - 1); } + size_t ComputePackingOffset(GLenum format, GLenum type, GLsizei width, GLsizei height, GLint alignment, GLint skipImages, GLint skipRows, GLint skipPixels) + { + GLsizei pitchB = ComputePitch(width, format, type, alignment); + return (skipImages * height + skipRows) * pitchB + skipPixels * ComputePixelSize(format, type); + } + inline GLsizei ComputeCompressedPitch(GLsizei width, GLenum format) { return ComputeCompressedSize(width, 1, format); @@ -1198,9 +1204,10 @@ void Image::loadImageData(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const UnpackInfo& unpackInfo, const void *input) { - GLsizei inputPitch = ComputePitch((unpackInfo.rowLength == 0) ? width : unpackInfo.rowLength, format, type, unpackInfo.alignment); + GLsizei inputWidth = (unpackInfo.rowLength == 0) ? width : unpackInfo.rowLength; + GLsizei inputPitch = ComputePitch(inputWidth, format, type, unpackInfo.alignment); GLsizei inputHeight = (unpackInfo.imageHeight == 0) ? height : unpackInfo.imageHeight; - input = ((char*)input) + (unpackInfo.skipImages * inputHeight + unpackInfo.skipRows) * inputPitch + unpackInfo.skipPixels; + input = ((char*)input) + ComputePackingOffset(format, type, inputWidth, inputHeight, unpackInfo.alignment, unpackInfo.skipImages, unpackInfo.skipRows, unpackInfo.skipPixels); sw::Format selectedInternalFormat = SelectInternalFormat(format, type); if(selectedInternalFormat == sw::FORMAT_NULL) {
diff --git a/src/OpenGL/common/Image.hpp b/src/OpenGL/common/Image.hpp index feabae9..8fa08c1 100644 --- a/src/OpenGL/common/Image.hpp +++ b/src/OpenGL/common/Image.hpp
@@ -30,6 +30,7 @@ sw::Format SelectInternalFormat(GLenum format, GLenum type); GLsizei ComputePitch(GLsizei width, GLenum format, GLenum type, GLint alignment); GLsizei ComputeCompressedSize(GLsizei width, GLsizei height, GLenum format); +size_t ComputePackingOffset(GLenum format, GLenum type, GLsizei width, GLsizei height, GLint alignment, GLint skipImages, GLint skipRows, GLint skipPixels); class Image : public sw::Surface, public gl::Object {