aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/image/SkImage_Gpu.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/image/SkImage_Gpu.cpp')
-rw-r--r--src/image/SkImage_Gpu.cpp21
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];