aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLingfeng Yang <lfy@google.com>2020-04-07 17:17:24 -0700
committerLingfeng Yang <lfy@google.com>2020-04-08 00:25:12 +0000
commit09508110af709407956e3a92a218b054e638f7b0 (patch)
tree1d58fbe4812f5db0909a9b9b0f2e6742469840f4
parent71cda1146bfc5c4e52e4377af03862d5a7e3542e (diff)
downloadgoldfish-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.h1
-rw-r--r--shared/OpenglCodecCommon/GLClientState.cpp23
-rw-r--r--shared/OpenglCodecCommon/GLClientState.h1
-rw-r--r--system/GLESv2_enc/gl2_enc.cpp4
-rw-r--r--system/enc_common/IOStream_common.cpp52
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;
+ }
+ }
+}