Index: src/gpu/GrGpu.cpp |
diff --git a/src/gpu/GrGpu.cpp b/src/gpu/GrGpu.cpp |
index 96728f3ba80d16950b34225840061b0bc04de32d..48fc740ae0d9697059c7356ff8f3e1bc6e4ceca6 100644 |
--- a/src/gpu/GrGpu.cpp |
+++ b/src/gpu/GrGpu.cpp |
@@ -55,6 +55,37 @@ void GrGpu::contextAbandoned() {} |
//////////////////////////////////////////////////////////////////////////////// |
+bool GrGpu::makeCopyForTextureParams(int width, int height, const GrTextureParams& textureParams, |
+ GrTextureParamsAdjuster::CopyParams* copyParams) const { |
+ bool doCopy = false; |
+ const GrCaps& caps = *this->caps(); |
+ if (textureParams.isTiled() && !caps.npotTextureTileSupport() && |
+ (!SkIsPow2(width) || !SkIsPow2(height))) { |
+ doCopy = true; |
+ copyParams->fWidth = GrNextPow2(SkTMax(width, caps.minTextureSize())); |
+ copyParams->fHeight = GrNextPow2(SkTMax(height, caps.minTextureSize())); |
+ } else if (width < caps.minTextureSize() || height < caps.minTextureSize()) { |
+ // The small texture issues appear to be with tiling. Hence it seems ok to scale |
+ // them up using the GPU. If issues persist we may need to CPU-stretch. |
+ doCopy = true; |
+ copyParams->fWidth = SkTMax(width, caps.minTextureSize()); |
+ copyParams->fHeight = SkTMax(height, caps.minTextureSize()); |
+ } |
+ if (doCopy) { |
+ switch (textureParams.filterMode()) { |
+ case GrTextureParams::kNone_FilterMode: |
+ copyParams->fFilter = GrTextureParams::kNone_FilterMode; |
+ break; |
+ case GrTextureParams::kBilerp_FilterMode: |
+ case GrTextureParams::kMipMap_FilterMode: |
+ // We are only ever scaling up so no reason to ever indicate kMipMap. |
+ copyParams->fFilter = GrTextureParams::kBilerp_FilterMode; |
+ break; |
+ } |
+ } |
+ return doCopy; |
+} |
+ |
static GrSurfaceOrigin resolve_origin(GrSurfaceOrigin origin, bool renderTarget) { |
// By default, GrRenderTargets are GL's normal orientation so that they |
// can be drawn to by the outside world without the client having |