Set GL_PACK_ALIGNMENT before calling glReadPixels
authorbsalomon <bsalomon@google.com>
Tue, 15 Dec 2015 20:37:38 +0000 (12:37 -0800)
committerCommit bot <commit-bot@chromium.org>
Tue, 15 Dec 2015 20:37:38 +0000 (12:37 -0800)
Review URL: https://codereview.chromium.org/1525193002

include/gpu/GrTypes.h
src/gpu/gl/GrGLGpu.cpp
tests/ReadWriteAlphaTest.cpp

index cf3773c..dbcb9a6 100644 (file)
@@ -363,26 +363,6 @@ static inline size_t GrBytesPerPixel(GrPixelConfig config) {
     }
 }
 
-static inline size_t GrUnpackAlignment(GrPixelConfig config) {
-    SkASSERT(!GrPixelConfigIsCompressed(config));
-    switch (config) {
-        case kAlpha_8_GrPixelConfig:
-            return 1;
-        case kRGB_565_GrPixelConfig:
-        case kRGBA_4444_GrPixelConfig:
-        case kAlpha_half_GrPixelConfig:
-        case kRGBA_half_GrPixelConfig:
-            return 2;
-        case kRGBA_8888_GrPixelConfig:
-        case kBGRA_8888_GrPixelConfig:
-        case kSRGBA_8888_GrPixelConfig:
-        case kRGBA_float_GrPixelConfig:
-            return 4;
-        default:
-            return 0;
-    }
-}
-
 static inline bool GrPixelConfigIsOpaque(GrPixelConfig config) {
     switch (config) {
         case kETC1_GrPixelConfig:
index 02d3b4a..17cbfb5 100644 (file)
@@ -648,6 +648,27 @@ bool GrGLGpu::onWritePixels(GrSurface* surface,
     return false;
 }
 
+// For GL_[UN]PACK_ALIGNMENT.
+static inline GrGLint config_alignment(GrPixelConfig config) {
+    SkASSERT(!GrPixelConfigIsCompressed(config));
+    switch (config) {
+        case kAlpha_8_GrPixelConfig:
+            return 1;
+        case kRGB_565_GrPixelConfig:
+        case kRGBA_4444_GrPixelConfig:
+        case kAlpha_half_GrPixelConfig:
+        case kRGBA_half_GrPixelConfig:
+            return 2;
+        case kRGBA_8888_GrPixelConfig:
+        case kBGRA_8888_GrPixelConfig:
+        case kSRGBA_8888_GrPixelConfig:
+        case kRGBA_float_GrPixelConfig:
+            return 4;
+        default:
+            return 0;
+    }
+}
+
 static inline GrGLenum check_alloc_error(const GrSurfaceDesc& desc,
                                          const GrGLInterface* interface) {
     if (SkToBool(desc.fFlags & kCheckAllocation_GrSurfaceFlag)) {
@@ -790,8 +811,7 @@ bool GrGLGpu::uploadTexData(const GrSurfaceDesc& desc,
         if (glFlipY) {
             GL_CALL(PixelStorei(GR_GL_UNPACK_FLIP_Y, GR_GL_TRUE));
         }
-        GL_CALL(PixelStorei(GR_GL_UNPACK_ALIGNMENT,
-              static_cast<GrGLint>(GrUnpackAlignment(dataConfig))));
+        GL_CALL(PixelStorei(GR_GL_UNPACK_ALIGNMENT, config_alignment(dataConfig)));
     }
     bool succeeded = true;
     if (isNewTexture &&
@@ -2097,6 +2117,8 @@ bool GrGLGpu::onReadPixels(GrSurface* surface,
     if (flipY && this->glCaps().packFlipYSupport()) {
         GL_CALL(PixelStorei(GR_GL_PACK_REVERSE_ROW_ORDER, 1));
     }
+    GL_CALL(PixelStorei(GR_GL_PACK_ALIGNMENT, config_alignment(config)));
+
     GL_CALL(ReadPixels(readRect.fLeft, readRect.fBottom,
                        readRect.fWidth, readRect.fHeight,
                        format, type, readDst));
index a40f2c6..1ee6b09 100644 (file)
@@ -13,8 +13,9 @@
 #include "GrContext.h"
 #include "SkGpuDevice.h"
 
-static const int X_SIZE = 12;
-static const int Y_SIZE = 12;
+// This was made indivisible by 4 to ensure we test setting GL_PACK_ALIGNMENT properly.
+static const int X_SIZE = 13;
+static const int Y_SIZE = 13;
 
 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ReadWriteAlpha, reporter, context) {
     unsigned char textureData[X_SIZE][Y_SIZE];