Switch GrTextureToYUVPlanes over to newDrawContext calls

GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1970743002

Review-Url: https://codereview.chromium.org/1970743002
This commit is contained in:
robertphillips 2016-05-11 08:34:39 -07:00 committed by Commit bot
parent 93eeadf7a1
commit ebf30e8415
2 changed files with 59 additions and 75 deletions

View File

@ -196,6 +196,8 @@ public:
/**
* Create both a GrRenderTarget and a matching GrDrawContext to wrap it.
* The created GrRenderTarget will always be budgeted.
* We guarantee that "asTexture" will succeed for drawContexts created
* via this entry point.
*/
sk_sp<GrDrawContext> newDrawContext(SkBackingFit fit,
int width, int height,

View File

@ -52,11 +52,11 @@ bool GrTextureToYUVPlanes(GrTexture* texture, const SkISize sizes[3], void* cons
if (GrContext* context = texture->getContext()) {
// Depending on the relative sizes of the y, u, and v planes we may do 1 to 3 draws/
// readbacks.
SkAutoTUnref<GrTexture> yuvTex;
SkAutoTUnref<GrTexture> yTex;
SkAutoTUnref<GrTexture> uvTex;
SkAutoTUnref<GrTexture> uTex;
SkAutoTUnref<GrTexture> vTex;
sk_sp<GrDrawContext> yuvDrawContext;
sk_sp<GrDrawContext> yDrawContext;
sk_sp<GrDrawContext> uvDrawContext;
sk_sp<GrDrawContext> uDrawContext;
sk_sp<GrDrawContext> vDrawContext;
GrPixelConfig singleChannelPixelConfig;
if (context->caps()->isConfigRenderable(kAlpha_8_GrPixelConfig, false)) {
@ -69,105 +69,79 @@ bool GrTextureToYUVPlanes(GrTexture* texture, const SkISize sizes[3], void* cons
// sizes however we optimize for two other cases - all planes are the same (1 draw to YUV),
// and U and V are the same but Y differs (2 draws, one for Y, one for UV).
if (sizes[0] == sizes[1] && sizes[1] == sizes[2]) {
GrSurfaceDesc yuvDesc;
yuvDesc.fConfig = kRGBA_8888_GrPixelConfig;
yuvDesc.fFlags = kRenderTarget_GrSurfaceFlag;
yuvDesc.fWidth = sizes[0].fWidth;
yuvDesc.fHeight = sizes[0].fHeight;
yuvTex.reset(context->textureProvider()->createApproxTexture(yuvDesc));
if (!yuvTex) {
yuvDrawContext = context->newDrawContext(SkBackingFit::kApprox,
sizes[0].fWidth, sizes[0].fHeight,
kRGBA_8888_GrPixelConfig);
if (!yuvDrawContext) {
return false;
}
} else {
GrSurfaceDesc yDesc;
yDesc.fConfig = singleChannelPixelConfig;
yDesc.fFlags = kRenderTarget_GrSurfaceFlag;
yDesc.fWidth = sizes[0].fWidth;
yDesc.fHeight = sizes[0].fHeight;
yTex.reset(context->textureProvider()->createApproxTexture(yDesc));
if (!yTex) {
yDrawContext = context->newDrawContext(SkBackingFit::kApprox,
sizes[0].fWidth, sizes[0].fHeight,
singleChannelPixelConfig);
if (!yDrawContext) {
return false;
}
if (sizes[1] == sizes[2]) {
GrSurfaceDesc uvDesc;
// TODO: Add support for GL_RG when available.
uvDesc.fConfig = kRGBA_8888_GrPixelConfig;
uvDesc.fFlags = kRenderTarget_GrSurfaceFlag;
uvDesc.fWidth = sizes[1].fWidth;
uvDesc.fHeight = sizes[1].fHeight;
uvTex.reset(context->textureProvider()->createApproxTexture(uvDesc));
if (!uvTex) {
uvDrawContext = context->newDrawContext(SkBackingFit::kApprox,
sizes[1].fWidth, sizes[1].fHeight,
kRGBA_8888_GrPixelConfig);
if (!uvDrawContext) {
return false;
}
} else {
GrSurfaceDesc uvDesc;
uvDesc.fConfig = singleChannelPixelConfig;
uvDesc.fFlags = kRenderTarget_GrSurfaceFlag;
uvDesc.fWidth = sizes[1].fWidth;
uvDesc.fHeight = sizes[1].fHeight;
uTex.reset(context->textureProvider()->createApproxTexture(uvDesc));
uvDesc.fWidth = sizes[2].fWidth;
uvDesc.fHeight = sizes[2].fHeight;
vTex.reset(context->textureProvider()->createApproxTexture(uvDesc));
if (!uTex || !vTex) {
uDrawContext = context->newDrawContext(SkBackingFit::kApprox,
sizes[1].fWidth, sizes[1].fHeight,
singleChannelPixelConfig);
vDrawContext = context->newDrawContext(SkBackingFit::kApprox,
sizes[2].fWidth, sizes[2].fHeight,
singleChannelPixelConfig);
if (!uDrawContext || !vDrawContext) {
return false;
}
}
}
// Do all the draws before any readback.
if (yuvTex) {
sk_sp<GrDrawContext> dc(context->drawContext(sk_ref_sp(yuvTex->asRenderTarget())));
if (!dc) {
if (yuvDrawContext) {
if (!convert_texture(texture, yuvDrawContext.get(),
sizes[0].fWidth, sizes[0].fHeight,
colorSpace, GrYUVEffect::CreateRGBToYUV)) {
return false;
}
if (!convert_texture(texture, dc.get(), sizes[0].fWidth, sizes[0].fHeight, colorSpace,
GrYUVEffect::CreateRGBToYUV)) {
return false;
}
} else {
SkASSERT(yTex);
sk_sp<GrDrawContext> dc(context->drawContext(sk_ref_sp(yTex->asRenderTarget())));
if (!dc) {
SkASSERT(yDrawContext);
if (!convert_texture(texture, yDrawContext.get(),
sizes[0].fWidth, sizes[0].fHeight,
colorSpace, GrYUVEffect::CreateRGBToY)) {
return false;
}
if (!convert_texture(texture, dc.get(), sizes[0].fWidth, sizes[0].fHeight, colorSpace,
GrYUVEffect::CreateRGBToY)) {
return false;
}
if (uvTex) {
dc = context->drawContext(sk_ref_sp(uvTex->asRenderTarget()));
if (!dc) {
return false;
}
if (!convert_texture(texture, dc.get(), sizes[1].fWidth, sizes[1].fHeight,
if (uvDrawContext) {
if (!convert_texture(texture, uvDrawContext.get(),
sizes[1].fWidth, sizes[1].fHeight,
colorSpace, GrYUVEffect::CreateRGBToUV)) {
return false;
}
} else {
SkASSERT(uTex && vTex);
dc = context->drawContext(sk_ref_sp(uTex->asRenderTarget()));
if (!dc) {
return false;
}
if (!convert_texture(texture, dc.get(), sizes[1].fWidth, sizes[1].fHeight,
SkASSERT(uDrawContext && vDrawContext);
if (!convert_texture(texture, uDrawContext.get(),
sizes[1].fWidth, sizes[1].fHeight,
colorSpace, GrYUVEffect::CreateRGBToU)) {
return false;
}
dc = context->drawContext(sk_ref_sp(vTex->asRenderTarget()));
if (!dc) {
return false;
}
if (!convert_texture(texture, dc.get(), sizes[2].fWidth, sizes[2].fHeight,
if (!convert_texture(texture, vDrawContext.get(),
sizes[2].fWidth, sizes[2].fHeight,
colorSpace, GrYUVEffect::CreateRGBToV)) {
return false;
}
}
}
if (yuvTex) {
if (yuvDrawContext) {
SkASSERT(sizes[0] == sizes[1] && sizes[1] == sizes[2]);
sk_sp<GrTexture> yuvTex(yuvDrawContext->asTexture());
SkASSERT(yuvTex);
SkISize yuvSize = sizes[0];
// We have no kRGB_888 pixel format, so readback rgba and then copy three channels.
SkAutoSTMalloc<128 * 128, uint32_t> tempYUV(yuvSize.fWidth * yuvSize.fHeight);
@ -198,13 +172,17 @@ bool GrTextureToYUVPlanes(GrTexture* texture, const SkISize sizes[3], void* cons
}
return true;
} else {
SkASSERT(yDrawContext);
sk_sp<GrTexture> yTex(yDrawContext->asTexture());
SkASSERT(yTex);
if (!yTex->readPixels(0, 0, sizes[0].fWidth, sizes[0].fHeight,
kAlpha_8_GrPixelConfig, planes[0], rowBytes[0])) {
return false;
}
if (uvTex) {
if (uvDrawContext) {
SkASSERT(sizes[1].fWidth == sizes[2].fWidth);
sk_sp<GrTexture> uvTex(uvDrawContext->asTexture());
SkASSERT(uvTex);
SkISize uvSize = sizes[1];
// We have no kRG_88 pixel format, so readback rgba and then copy two channels.
SkAutoSTMalloc<128 * 128, uint32_t> tempUV(uvSize.fWidth * uvSize.fHeight);
@ -231,13 +209,17 @@ bool GrTextureToYUVPlanes(GrTexture* texture, const SkISize sizes[3], void* cons
}
return true;
} else {
SkASSERT(uTex && vTex);
if (!uTex->readPixels(0, 0, sizes[1].fWidth, sizes[1].fHeight,
kAlpha_8_GrPixelConfig, planes[1], rowBytes[1])) {
SkASSERT(uDrawContext && vDrawContext);
sk_sp<GrTexture> tex(uDrawContext->asTexture());
SkASSERT(tex);
if (!tex->readPixels(0, 0, sizes[1].fWidth, sizes[1].fHeight,
kAlpha_8_GrPixelConfig, planes[1], rowBytes[1])) {
return false;
}
if (!vTex->readPixels(0, 0, sizes[2].fWidth, sizes[2].fHeight,
kAlpha_8_GrPixelConfig, planes[2], rowBytes[2])) {
tex = vDrawContext->asTexture();
SkASSERT(tex);
if (!tex->readPixels(0, 0, sizes[2].fWidth, sizes[2].fHeight,
kAlpha_8_GrPixelConfig, planes[2], rowBytes[2])) {
return false;
}
return true;