Rewrite GrTextureMaker to disentangle bitmap case from base class and give GPU object a say in what copying needs to be done.
Committed: https://skia.googlesource.com/skia/+/fcffaf22d697f06f903c3193308f9dc54a959f79
Committed: https://skia.googlesource.com/skia/+/1a197ea31e0aac7ea312e9a6c0d9f5df626b0350
Review URL: https://codereview.chromium.org/1409163002
diff --git a/src/gpu/GrGpu.cpp b/src/gpu/GrGpu.cpp
index 96728f3..48fc740 100644
--- a/src/gpu/GrGpu.cpp
+++ b/src/gpu/GrGpu.cpp
@@ -55,6 +55,37 @@
////////////////////////////////////////////////////////////////////////////////
+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