| 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
|
|
|