sk_sp<GrTextureProxy> GrTextureProducer::refTextureProxyForParams( const GrSamplerState& sampler, SkColorSpace* dstColorSpace, sk_sp<SkColorSpace>* proxyColorSpace, SkScalar scaleAdjust[2]) { // Check that the caller pre-initialized scaleAdjust SkASSERT(!scaleAdjust || (scaleAdjust[0] == 1 && scaleAdjust[1] == 1)); // Check that if the caller passed nullptr for scaleAdjust that we're in the case where there // can be no scaling. SkDEBUGCODE(bool expectNoScale = (sampler.filter() != GrSamplerState::Filter::kMipMap && !sampler.isRepeated())); SkASSERT(scaleAdjust || expectNoScale); int mipCount = SkMipMap::ComputeLevelCount(this->width(), this->height()); bool willBeMipped = GrSamplerState::Filter::kMipMap == sampler.filter() && mipCount && fContext->contextPriv().caps()->mipMapSupport(); auto result = this->onRefTextureProxyForParams(sampler, dstColorSpace, proxyColorSpace, willBeMipped, scaleAdjust); // Check to make sure that if we say the texture willBeMipped that the returned texture has mip // maps, unless the config is not copyable. SkASSERT(!result || !willBeMipped || result->mipMapped() == GrMipMapped::kYes || !fContext->contextPriv().caps()->isConfigCopyable(result->config())); // Check that the "no scaling expected" case always returns a proxy of the same size as the // producer. SkASSERT(!result || !expectNoScale || (result->width() == this->width() && result->height() == this->height())); return result; }
bool GrGpu::IsACopyNeededForTextureParams(const GrCaps* caps, GrTextureProxy* texProxy, int width, int height, const GrSamplerState& textureParams, GrTextureProducer::CopyParams* copyParams, SkScalar scaleAdjust[2]) { if (texProxy) { // If the texture format itself doesn't support repeat wrap mode or mipmapping (and // those capabilities are required) force a copy. if ((textureParams.isRepeated() && texProxy->texPriv().isClampOnly()) || (GrSamplerState::Filter::kMipMap == textureParams.filter() && texProxy->texPriv().doesNotSupportMipMaps())) { copyParams->fFilter = GrSamplerState::Filter::kNearest; copyParams->fWidth = texProxy->width(); copyParams->fHeight = texProxy->height(); return true; } } if (textureParams.isRepeated() && !caps->npotTextureTileSupport() && (!SkIsPow2(width) || !SkIsPow2(height))) { SkASSERT(scaleAdjust); copyParams->fWidth = GrNextPow2(width); copyParams->fHeight = GrNextPow2(height); SkASSERT(scaleAdjust); scaleAdjust[0] = ((SkScalar) copyParams->fWidth) / width; scaleAdjust[1] = ((SkScalar) copyParams->fHeight) / height; switch (textureParams.filter()) { case GrSamplerState::Filter::kNearest: copyParams->fFilter = GrSamplerState::Filter::kNearest; break; case GrSamplerState::Filter::kBilerp: case GrSamplerState::Filter::kMipMap: // We are only ever scaling up so no reason to ever indicate kMipMap. copyParams->fFilter = GrSamplerState::Filter::kBilerp; break; } return true; } return false; }