1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2012 Google Inc. 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "Test.h" 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// This test is specific to the GPU backend. 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#if SK_SUPPORT_GPU 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrContext.h" 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrContextPriv.h" 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrProxyProvider.h" 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrResourceProvider.h" 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrSurfaceContext.h" 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrSurfaceProxy.h" 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrTextureProxy.h" 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h" 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkSurface.h" 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// This was made indivisible by 4 to ensure we test setting GL_PACK_ALIGNMENT properly. 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic const int X_SIZE = 13; 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic const int Y_SIZE = 13; 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void validate_alpha_data(skiatest::Reporter* reporter, int w, int h, const uint8_t* actual, 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot size_t actualRowBytes, const uint8_t* expected, SkString extraMsg) { 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int y = 0; y < h; ++y) { 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int x = 0; x < w; ++x) { 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot uint8_t a = actual[y * actualRowBytes + x]; 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot uint8_t e = expected[y * w + x]; 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (e != a) { 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ERRORF(reporter, 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot "Failed alpha readback. Expected: 0x%02x, Got: 0x%02x at (%d,%d), %s", 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot e, a, x, y, extraMsg.c_str()); 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return; 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_GPUTEST_FOR_RENDERING_CONTEXTS(ReadWriteAlpha, reporter, ctxInfo) { 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrContext* context = ctxInfo.grContext(); 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrProxyProvider* proxyProvider = context->contextPriv().proxyProvider(); 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot unsigned char alphaData[X_SIZE * Y_SIZE]; 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static const int kClearValue = 0x2; 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool match; 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static const size_t kRowBytes[] = {0, X_SIZE, X_SIZE + 1, 2 * X_SIZE - 1}; 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot { 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrSurfaceDesc desc; 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot desc.fFlags = kNone_GrSurfaceFlags; 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot desc.fOrigin = kTopLeft_GrSurfaceOrigin; 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot desc.fConfig = kAlpha_8_GrPixelConfig; // it is a single channel texture 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot desc.fWidth = X_SIZE; 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot desc.fHeight = Y_SIZE; 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // We are initializing the texture with zeros here 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot memset(alphaData, 0, X_SIZE * Y_SIZE); 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<GrTextureProxy> proxy = proxyProvider->createTextureProxy(desc, SkBudgeted::kNo, 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot alphaData, 0); 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!proxy) { 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ERRORF(reporter, "Could not create alpha texture."); 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return; 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<GrSurfaceContext> sContext(context->contextPriv().makeWrappedSurfaceContext( 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot std::move(proxy))); 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkImageInfo ii = SkImageInfo::MakeA8(X_SIZE, Y_SIZE); 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkSurface> surf(SkSurface::MakeRenderTarget(context, SkBudgeted::kNo, ii)); 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // create a distinctive texture 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int y = 0; y < Y_SIZE; ++y) { 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int x = 0; x < X_SIZE; ++x) { 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot alphaData[y * X_SIZE + x] = y*X_SIZE+x; 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (auto rowBytes : kRowBytes) { 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // upload the texture (do per-rowbytes iteration because we may overwrite below). 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool result = sContext->writePixels(ii, alphaData, 0, 0, 0); 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, result, "Initial A8 writePixels failed"); 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot size_t nonZeroRowBytes = rowBytes ? rowBytes : X_SIZE; 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot std::unique_ptr<uint8_t[]> readback(new uint8_t[nonZeroRowBytes * Y_SIZE]); 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // clear readback to something non-zero so we can detect readback failures 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot memset(readback.get(), kClearValue, nonZeroRowBytes * Y_SIZE); 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // read the texture back 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot result = sContext->readPixels(ii, readback.get(), rowBytes, 0, 0); 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, result, "Initial A8 readPixels failed"); 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // make sure the original & read back versions match 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString msg; 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot msg.printf("rb:%d A8", SkToU32(rowBytes)); 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot validate_alpha_data(reporter, X_SIZE, Y_SIZE, readback.get(), nonZeroRowBytes, 102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot alphaData, msg); 103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Now try writing to a single channel surface (if we could create one). 105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (surf) { 106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkCanvas* canvas = surf->getCanvas(); 107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint paint; 109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkRect rect = SkRect::MakeLTRB(-10, -10, X_SIZE + 10, Y_SIZE + 10); 111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColor(SK_ColorWHITE); 113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawRect(rect, paint); 115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot memset(readback.get(), kClearValue, nonZeroRowBytes * Y_SIZE); 117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot result = surf->readPixels(ii, readback.get(), nonZeroRowBytes, 0, 0); 118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, result, "A8 readPixels after clear failed"); 119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot match = true; 121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int y = 0; y < Y_SIZE && match; ++y) { 122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int x = 0; x < X_SIZE && match; ++x) { 123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot uint8_t rbValue = readback.get()[y * nonZeroRowBytes + x]; 124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (0xFF != rbValue) { 125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ERRORF(reporter, 126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot "Failed alpha readback after clear. Expected: 0xFF, Got: 0x%02x" 127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot " at (%d,%d), rb:%d", rbValue, x, y, SkToU32(rowBytes)); 128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot match = false; 129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static const GrPixelConfig kRGBAConfigs[] { 137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kRGBA_8888_GrPixelConfig, 138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kBGRA_8888_GrPixelConfig, 139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kSRGBA_8888_GrPixelConfig 140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int y = 0; y < Y_SIZE; ++y) { 143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int x = 0; x < X_SIZE; ++x) { 144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot alphaData[y * X_SIZE + x] = y*X_SIZE+x; 145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkImageInfo dstInfo = SkImageInfo::Make(X_SIZE, Y_SIZE, 149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kAlpha_8_SkColorType, 150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kPremul_SkAlphaType); 151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Attempt to read back just alpha from a RGBA/BGRA texture. Once with a texture-only src and 153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // once with a render target. 154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (auto config : kRGBAConfigs) { 155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int rt = 0; rt < 2; ++rt) { 156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrSurfaceDesc desc; 157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot desc.fFlags = rt ? kRenderTarget_GrSurfaceFlag : kNone_GrSurfaceFlags; 158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot desc.fOrigin = rt ? kBottomLeft_GrSurfaceOrigin : kTopLeft_GrSurfaceOrigin; 159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot desc.fConfig = config; 160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot desc.fWidth = X_SIZE; 161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot desc.fHeight = Y_SIZE; 162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot uint32_t rgbaData[X_SIZE * Y_SIZE]; 164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Make the alpha channel of the rgba texture come from alphaData. 165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int y = 0; y < Y_SIZE; ++y) { 166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int x = 0; x < X_SIZE; ++x) { 167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot rgbaData[y * X_SIZE + x] = GrColorPackRGBA(6, 7, 8, alphaData[y * X_SIZE + x]); 168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<GrTextureProxy> proxy = proxyProvider->createTextureProxy(desc, SkBudgeted::kNo, 172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot rgbaData, 0); 173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!proxy) { 174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // We always expect to be able to create a RGBA texture 175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!rt && kRGBA_8888_GrPixelConfig == desc.fConfig) { 176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ERRORF(reporter, "Failed to create RGBA texture."); 177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 178fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot continue; 179fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 180fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 181fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<GrSurfaceContext> sContext = context->contextPriv().makeWrappedSurfaceContext( 182fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot std::move(proxy)); 183fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 184fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (auto rowBytes : kRowBytes) { 185fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot size_t nonZeroRowBytes = rowBytes ? rowBytes : X_SIZE; 186fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 187fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot std::unique_ptr<uint8_t[]> readback(new uint8_t[nonZeroRowBytes * Y_SIZE]); 188fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Clear so we don't accidentally see values from previous iteration. 189fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot memset(readback.get(), kClearValue, nonZeroRowBytes * Y_SIZE); 190fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 191fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // read the texture back 192fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool result = sContext->readPixels(dstInfo, readback.get(), rowBytes, 0, 0); 193fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, result, "8888 readPixels failed"); 194fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 195fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // make sure the original & read back versions match 196fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString msg; 197fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot msg.printf("rt:%d, rb:%d 8888", rt, SkToU32(rowBytes)); 198fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot validate_alpha_data(reporter, X_SIZE, Y_SIZE, readback.get(), nonZeroRowBytes, 199fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot alphaData, msg); 200fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 201fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 202fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 203fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 204fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 205fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif 206