Chromium Code Reviews| Index: src/image/SkImage_Gpu.cpp |
| diff --git a/src/image/SkImage_Gpu.cpp b/src/image/SkImage_Gpu.cpp |
| index 4003631c8a206e3a297f0064dea797aed3fa4a11..d9ae619e5fa43b485055f9888401a57ca255a7ce 100644 |
| --- a/src/image/SkImage_Gpu.cpp |
| +++ b/src/image/SkImage_Gpu.cpp |
| @@ -144,42 +144,27 @@ SkImage* SkImage::NewFromAdoptedTexture(GrContext* ctx, const GrBackendTextureDe |
| return new_wrapped_texture_common(ctx, desc, at, kAdopt_GrWrapOwnership, NULL, NULL); |
| } |
| -SkImage* SkImage::NewFromTextureCopy(GrContext* ctx, const GrBackendTextureDesc& srcDesc, |
| +SkImage* SkImage::NewFromTextureCopy(GrContext* ctx, const GrBackendTextureDesc& desc, |
| SkAlphaType at) { |
| - const bool isBudgeted = true; |
| - const SkSurface::Budgeted budgeted = SkSurface::kYes_Budgeted; |
| - |
| - if (srcDesc.fWidth <= 0 || srcDesc.fHeight <= 0) { |
| + if (desc.fWidth <= 0 || desc.fHeight <= 0) { |
| return NULL; |
| } |
| + |
| SkAutoTUnref<GrTexture> src(ctx->textureProvider()->wrapBackendTexture( |
| - srcDesc, kBorrow_GrWrapOwnership)); |
| + desc, kBorrow_GrWrapOwnership)); |
| if (!src) { |
| return NULL; |
| } |
| - GrSurfaceDesc dstDesc; |
| - // need to be a rendertarget for readpixels to work, instead of kNone_GrSurfaceFlags |
| - dstDesc.fFlags = kRenderTarget_GrSurfaceFlag; |
| - dstDesc.fOrigin = srcDesc.fOrigin; |
| - dstDesc.fWidth = srcDesc.fWidth; |
| - dstDesc.fHeight = srcDesc.fHeight; |
| - dstDesc.fConfig = srcDesc.fConfig; |
| - dstDesc.fSampleCnt = srcDesc.fSampleCnt; |
| - |
| - SkAutoTUnref<GrTexture> dst(ctx->textureProvider()->createTexture( |
| - dstDesc, isBudgeted, NULL, 0)); |
| + const bool isBudgeted = true; |
| + SkAutoTUnref<GrTexture> dst(GrDeepCopyTexture(src, isBudgeted)); |
| if (!dst) { |
| return NULL; |
| } |
| - const SkIRect srcR = SkIRect::MakeWH(dstDesc.fWidth, dstDesc.fHeight); |
| - const SkIPoint dstP = SkIPoint::Make(0, 0); |
| - ctx->copySurface(dst, src, srcR, dstP, GrContext::kFlushWrites_PixelOp); |
| - |
| + const SkSurface::Budgeted budgeted = SkSurface::kYes_Budgeted; |
| const int sampleCount = 0; // todo: make this an explicit parameter to newSurface()? |
| - return SkNEW_ARGS(SkImage_Gpu, (dstDesc.fWidth, dstDesc.fHeight, at, dst, sampleCount, |
| - budgeted)); |
| + return SkNEW_ARGS(SkImage_Gpu, (desc.fWidth, desc.fHeight, at, dst, sampleCount, budgeted)); |
| } |
| SkImage* SkImage::NewFromYUVTexturesCopy(GrContext* ctx , SkYUVColorSpace colorSpace, |
| @@ -256,3 +241,23 @@ SkImage* SkImage::NewFromYUVTexturesCopy(GrContext* ctx , SkYUVColorSpace colorS |
| return SkNEW_ARGS(SkImage_Gpu, (dstDesc.fWidth, dstDesc.fHeight, kOpaque_SkAlphaType, dst, 0, |
| budgeted)); |
| } |
| + |
| +/////////////////////////////////////////////////////////////////////////////////////////////////// |
| + |
| +GrTexture* GrDeepCopyTexture(GrTexture* src, bool budgeted) { |
| + GrContext* ctx = src->getContext(); |
| + |
| + GrSurfaceDesc desc = src->desc(); |
| + // need to be a rendertarget for readpixels to work, instead of kNone_GrSurfaceFlags |
|
robertphillips
2015/07/06 20:43:47
Should the copied texture inherit the src's kCheck
reed2
2015/07/07 01:18:03
You tell me. I didn't know about that flag. What i
robertphillips
2015/07/07 12:23:59
Tracing through the code it looks like this should
|
| + desc.fFlags = kRenderTarget_GrSurfaceFlag; |
| + GrTexture* dst = ctx->textureProvider()->createTexture(desc, budgeted, NULL, 0); |
| + if (!dst) { |
| + return NULL; |
| + } |
| + |
| + const SkIRect srcR = SkIRect::MakeWH(desc.fWidth, desc.fHeight); |
| + const SkIPoint dstP = SkIPoint::Make(0, 0); |
| + ctx->copySurface(dst, src, srcR, dstP, GrContext::kFlushWrites_PixelOp); |
| + return dst; |
| +} |
| + |