diff options
author | Lingfeng Yang <lfy@google.com> | 2020-04-07 17:17:24 -0700 |
---|---|---|
committer | Lingfeng Yang <lfy@google.com> | 2020-04-08 00:25:12 +0000 |
commit | 09508110af709407956e3a92a218b054e638f7b0 (patch) | |
tree | 1d58fbe4812f5db0909a9b9b0f2e6742469840f4 | |
parent | 71cda1146bfc5c4e52e4377af03862d5a7e3542e (diff) | |
download | goldfish-opengl-09508110af709407956e3a92a218b054e638f7b0.tar.gz |
Fix SkQP tests (android 10 cts r3)
bug: 139956393
This addresses a bug where in Q CTS r3 (more recent than that we've used
to validate before), SkQP test cases fail due to glTexSubImage2D not
accounting for different settings for offset and row length.
Test: ./cts-tradefed run cts -m CtsSkQPTestCases on android 10 r3: 0 failures
Change-Id: I771d81bc831b4ea86bc4a985f311c687cb60694a
-rw-r--r-- | host/include/libOpenglRender/IOStream.h | 1 | ||||
-rw-r--r-- | shared/OpenglCodecCommon/GLClientState.cpp | 23 | ||||
-rw-r--r-- | shared/OpenglCodecCommon/GLClientState.h | 1 | ||||
-rw-r--r-- | system/GLESv2_enc/gl2_enc.cpp | 4 | ||||
-rw-r--r-- | system/enc_common/IOStream_common.cpp | 52 |
5 files changed, 79 insertions, 2 deletions
diff --git a/host/include/libOpenglRender/IOStream.h b/host/include/libOpenglRender/IOStream.h index 2f699bcd..159da1d3 100644 --- a/host/include/libOpenglRender/IOStream.h +++ b/host/include/libOpenglRender/IOStream.h @@ -94,6 +94,7 @@ public: } void readbackPixels(void* context, int width, int height, unsigned int format, unsigned int type, void* pixels); + void uploadPixels(void* context, int width, int height, unsigned int format, unsigned int type, const void* pixels); private: diff --git a/shared/OpenglCodecCommon/GLClientState.cpp b/shared/OpenglCodecCommon/GLClientState.cpp index c6140dbf..3f207b8e 100644 --- a/shared/OpenglCodecCommon/GLClientState.cpp +++ b/shared/OpenglCodecCommon/GLClientState.cpp @@ -875,6 +875,29 @@ void GLClientState::getPackingOffsets2D(GLsizei width, GLsizei height, GLenum fo *skipRows = m_pixelStore.pack_skip_rows; } +void GLClientState::getUnpackingOffsets2D(GLsizei width, GLsizei height, GLenum format, GLenum type, int* startOffset, int* pixelRowSize, int* totalRowSize, int* skipRows) const +{ + if (width <= 0 || height <= 0) { + *startOffset = 0; + *pixelRowSize = 0; + *totalRowSize = 0; + return; + } + + GLESTextureUtils::computePackingOffsets2D( + width, height, + format, type, + m_pixelStore.unpack_alignment, + m_pixelStore.unpack_row_length, + m_pixelStore.unpack_skip_pixels, + m_pixelStore.unpack_skip_rows, + startOffset, + pixelRowSize, + totalRowSize); + + *skipRows = m_pixelStore.unpack_skip_rows; +} + void GLClientState::setNumActiveUniformsInUniformBlock(GLuint program, GLuint uniformBlockIndex, GLint numActiveUniforms) { UniformBlockInfoKey key; key.program = program; diff --git a/shared/OpenglCodecCommon/GLClientState.h b/shared/OpenglCodecCommon/GLClientState.h index 51803389..f9f8ee3d 100644 --- a/shared/OpenglCodecCommon/GLClientState.h +++ b/shared/OpenglCodecCommon/GLClientState.h @@ -254,6 +254,7 @@ public: size_t pboNeededDataSize(GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, int pack) const; size_t clearBufferNumElts(GLenum buffer) const; void getPackingOffsets2D(GLsizei width, GLsizei height, GLenum format, GLenum type, int* startOffset, int* pixelRowSize, int* totalRowSize, int* skipRows) const; + void getUnpackingOffsets2D(GLsizei width, GLsizei height, GLenum format, GLenum type, int* startOffset, int* pixelRowSize, int* totalRowSize, int* skipRows) const; void setCurrentProgram(GLint program) { m_currentProgram = program; } void setCurrentShaderProgram(GLint program) { m_currentShaderProgram = program; } diff --git a/system/GLESv2_enc/gl2_enc.cpp b/system/GLESv2_enc/gl2_enc.cpp index 0df93f86..fb70443a 100644 --- a/system/GLESv2_enc/gl2_enc.cpp +++ b/system/GLESv2_enc/gl2_enc.cpp @@ -3344,7 +3344,7 @@ void glTexImage2D_enc(void *self , GLenum target, GLint level, GLint internalfor stream->writeFully(&__size_pixels,4); if (useChecksum) checksumCalculator->addBuffer(&__size_pixels,4); if (pixels != NULL) { - stream->writeFully(pixels, __size_pixels); + stream->uploadPixels(self, width, height, format, type, pixels); if (useChecksum) checksumCalculator->addBuffer(pixels, __size_pixels); } buf = stream->alloc(checksumSize); @@ -3497,7 +3497,7 @@ void glTexSubImage2D_enc(void *self , GLenum target, GLint level, GLint xoffset, stream->writeFully(&__size_pixels,4); if (useChecksum) checksumCalculator->addBuffer(&__size_pixels,4); if (pixels != NULL) { - stream->writeFully(pixels, __size_pixels); + stream->uploadPixels(self, width, height, format, type, pixels); if (useChecksum) checksumCalculator->addBuffer(pixels, __size_pixels); } buf = stream->alloc(checksumSize); diff --git a/system/enc_common/IOStream_common.cpp b/system/enc_common/IOStream_common.cpp index 901ad1db..1362d3e1 100644 --- a/system/enc_common/IOStream_common.cpp +++ b/system/enc_common/IOStream_common.cpp @@ -59,3 +59,55 @@ void IOStream::readbackPixels(void* context, int width, int height, unsigned int } } } + +void IOStream::uploadPixels(void* context, int width, int height, unsigned int format, unsigned int type, const void* pixels) { + GL2Encoder *ctx = (GL2Encoder *)context; + assert (ctx->state() != NULL); + + int startOffset = 0; + int pixelRowSize = 0; + int totalRowSize = 0; + int skipRows = 0; + + ctx->state()->getUnpackingOffsets2D(width, height, format, type, + &startOffset, + &pixelRowSize, + &totalRowSize, + &skipRows); + + size_t pixelDataSize = + ctx->state()->pixelDataSize( + width, height, 1, format, type, 0 /* is unpack */); + + if (startOffset == 0 && + pixelRowSize == totalRowSize) { + // fast path + writeFully(pixels, pixelDataSize); + } else if (pixelRowSize == totalRowSize) { + // fast path but with skip in the beginning + std::vector<char> paddingToDiscard(startOffset, 0); + writeFully(&paddingToDiscard[0], startOffset); + writeFully((char*)pixels + startOffset, pixelDataSize - startOffset); + } else { + int totalReadback = 0; + + if (startOffset > 0) { + std::vector<char> paddingToDiscard(startOffset, 0); + writeFully(&paddingToDiscard[0], startOffset); + totalReadback += startOffset; + } + // need to upload row by row + size_t paddingSize = totalRowSize - pixelRowSize; + std::vector<char> paddingToDiscard(paddingSize, 0); + + char* start = (char*)pixels + startOffset; + + for (int i = 0; i < height; i++) { + writeFully(start, pixelRowSize); + totalReadback += pixelRowSize; + writeFully(&paddingToDiscard[0], paddingSize); + totalReadback += paddingSize; + start += totalRowSize; + } + } +} |