diff options
Diffstat (limited to 'src/image/SkImage_Gpu.cpp')
-rw-r--r-- | src/image/SkImage_Gpu.cpp | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp index 1a89ba42ae..7b24858c2f 100644 --- a/src/image/SkImage_Gpu.cpp +++ b/src/image/SkImage_Gpu.cpp @@ -370,6 +370,10 @@ sk_sp<SkImage> SkImage_Gpu::MakeFromYUVATexturesCopyImpl(GrContext* ctx, bool nv12 = (yuvaIndices[1].fIndex == yuvaIndices[2].fIndex); auto ct = nv12 ? kRGBA_8888_SkColorType : kAlpha_8_SkColorType; + // We need to make a copy of the input backend textures because we need to preserve the result + // of validate_backend_texture. + GrBackendTexture yuvaTexturesCopy[4]; + for (int i = 0; i < 4; ++i) { // Validate that the yuvaIndices refer to valid backend textures. SkYUVAIndex& yuvaIndex = yuvaIndices[i]; @@ -382,12 +386,14 @@ sk_sp<SkImage> SkImage_Gpu::MakeFromYUVATexturesCopyImpl(GrContext* ctx, // at most 4 images sources being passed in, could not have a index more than 3. return nullptr; } - auto texture = yuvaTextures[yuvaIndex.fIndex]; - // TODO: Instead of using assumption about whether it is NV12 format to guess colorType, - // actually use channel information here. - if (!validate_backend_texture(ctx, texture, &texture.fConfig, ct, kPremul_SkAlphaType, - nullptr)) { - return nullptr; + if (!yuvaTexturesCopy[yuvaIndex.fIndex].isValid()) { + yuvaTexturesCopy[yuvaIndex.fIndex] = yuvaTextures[yuvaIndex.fIndex]; + // TODO: Instead of using assumption about whether it is NV12 format to guess colorType, + // actually use channel information here. + if (!validate_backend_texture(ctx, yuvaTexturesCopy[i], &yuvaTexturesCopy[i].fConfig, + ct, kPremul_SkAlphaType, nullptr)) { + return nullptr; + } } // TODO: Check that for each plane, the channel actually exist in the image source we are @@ -406,8 +412,9 @@ sk_sp<SkImage> SkImage_Gpu::MakeFromYUVATexturesCopyImpl(GrContext* ctx, } if (!tempTextureProxies[textureIndex]) { + SkASSERT(yuvaTexturesCopy[textureIndex].isValid()); tempTextureProxies[textureIndex] = - proxyProvider->wrapBackendTexture(yuvaTextures[textureIndex], origin); + proxyProvider->wrapBackendTexture(yuvaTexturesCopy[textureIndex], origin); } } sk_sp<GrTextureProxy> yProxy = tempTextureProxies[yuvaIndices[0].fIndex]; |