| Index: tests/ImageTest.cpp
 | 
| diff --git a/tests/ImageTest.cpp b/tests/ImageTest.cpp
 | 
| index 575fc1c287b6fd30a868b5a580031dbbb4229ade..1bf56c53a2d85acdf1dd17fda7ec59ff9870e020 100644
 | 
| --- a/tests/ImageTest.cpp
 | 
| +++ b/tests/ImageTest.cpp
 | 
| @@ -5,6 +5,9 @@
 | 
|   * found in the LICENSE file.
 | 
|   */
 | 
|  
 | 
| +#include <functional>
 | 
| +#include "DMGpuSupport.h"
 | 
| +
 | 
|  #include "SkBitmap.h"
 | 
|  #include "SkCanvas.h"
 | 
|  #include "SkData.h"
 | 
| @@ -21,12 +24,6 @@
 | 
|  #include "SkUtils.h"
 | 
|  #include "Test.h"
 | 
|  
 | 
| -#if SK_SUPPORT_GPU
 | 
| -#include "GrContext.h"
 | 
| -#include "gl/GrGLInterface.h"
 | 
| -#include "gl/GrGLUtil.h"
 | 
| -#endif
 | 
| -
 | 
|  static void assert_equal(skiatest::Reporter* reporter, SkImage* a, const SkIRect* subsetA,
 | 
|                           SkImage* b) {
 | 
|      const int widthA = subsetA ? subsetA->width() : a->width();
 | 
| @@ -87,6 +84,15 @@ static SkImage* create_data_image() {
 | 
|      SkAutoTUnref<SkData> data(create_image_data(&info));
 | 
|      return SkImage::NewRasterData(info, data, info.minRowBytes());
 | 
|  }
 | 
| +#if SK_SUPPORT_GPU // not gpu-specific but currently only used in GPU tests
 | 
| +static SkImage* create_picture_image() {
 | 
| +    SkPictureRecorder recorder;
 | 
| +    SkCanvas* canvas = recorder.beginRecording(10, 10);
 | 
| +    canvas->clear(SK_ColorCYAN);
 | 
| +    SkAutoTUnref<SkPicture> picture(recorder.endRecording());
 | 
| +    return SkImage::NewFromPicture(picture, SkISize::Make(10, 10), nullptr, nullptr);
 | 
| +};
 | 
| +#endif
 | 
|  // Want to ensure that our Release is called when the owning image is destroyed
 | 
|  struct RasterDataHolder {
 | 
|      RasterDataHolder() : fReleaseCount(0) {}
 | 
| @@ -376,6 +382,64 @@ DEF_GPUTEST_FOR_NATIVE_CONTEXT(SkImage_Gpu2Cpu, reporter, context) {
 | 
|          REPORTER_ASSERT(reporter, !SkBitmapCache::Find(uniqueID, &cachedBitmap));
 | 
|      }
 | 
|  }
 | 
| +
 | 
| +DEF_GPUTEST_FOR_NATIVE_CONTEXT(SkImage_newTextureImage, reporter, context, glContext) {
 | 
| +    GrContextFactory otherFactory;
 | 
| +    GrContextFactory::ContextInfo otherContextInfo =
 | 
| +        otherFactory.getContextInfo(GrContextFactory::kNative_GLContextType);
 | 
| +    glContext->makeCurrent();
 | 
| +
 | 
| +    std::function<SkImage*()> imageFactories[] = {
 | 
| +        create_image,
 | 
| +        create_codec_image,
 | 
| +        create_data_image,
 | 
| +        // Create an image from a picture.
 | 
| +        create_picture_image,
 | 
| +        // Create a texture image.
 | 
| +        [context] { return create_gpu_image(context); },
 | 
| +        // Create a texture image in a another GrContext.
 | 
| +        [glContext, otherContextInfo] {
 | 
| +            otherContextInfo.fGLContext->makeCurrent();
 | 
| +            SkImage* otherContextImage = create_gpu_image(otherContextInfo.fGrContext);
 | 
| +            glContext->makeCurrent();
 | 
| +            return otherContextImage;
 | 
| +        }
 | 
| +    };
 | 
| +
 | 
| +    for (auto factory : imageFactories) {
 | 
| +        SkAutoTUnref<SkImage> image(factory());
 | 
| +        if (!image) {
 | 
| +            ERRORF(reporter, "Error creating image.");
 | 
| +            continue;
 | 
| +        }
 | 
| +        GrTexture* origTexture = as_IB(image)->peekTexture();
 | 
| +
 | 
| +        SkAutoTUnref<SkImage> texImage(image->newTextureImage(context));
 | 
| +        if (!texImage) {
 | 
| +            // We execpt to fail if image comes from a different GrContext.
 | 
| +            if (!origTexture || origTexture->getContext() == context) {
 | 
| +                ERRORF(reporter, "newTextureImage failed.");
 | 
| +            }
 | 
| +            continue;
 | 
| +        }
 | 
| +        GrTexture* copyTexture = as_IB(texImage)->peekTexture();
 | 
| +        if (!copyTexture) {
 | 
| +            ERRORF(reporter, "newTextureImage returned non-texture image.");
 | 
| +            continue;
 | 
| +        }
 | 
| +        if (origTexture) {
 | 
| +            if (origTexture != copyTexture) {
 | 
| +                ERRORF(reporter, "newTextureImage made unnecessary texture copy.");
 | 
| +            }
 | 
| +        }
 | 
| +        if (image->width() != texImage->width() || image->height() != texImage->height()) {
 | 
| +            ERRORF(reporter, "newTextureImage changed the image size.");
 | 
| +        }
 | 
| +        if (image->isOpaque() != texImage->isOpaque()) {
 | 
| +            ERRORF(reporter, "newTextureImage changed image opaqueness.");
 | 
| +        }
 | 
| +    }
 | 
| +}
 | 
|  #endif
 | 
|  
 | 
|  // https://bug.skia.org/4390
 | 
| 
 |