Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit d0d033a

Browse files
bsalomonSkia Commit-Bot
authored andcommitted
GrBicubicEffect uses GrTextureEffect.
This opens the door to, but doesn't add support for, applying this effect to other child processor types. Fixes issue when applying effect to rectangle textures where steps were done using increments of 1/w and 1/h instead of 1. Change-Id: I74e20d6c96931c337b22b156a61c8e279c6fbc62 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/259420 Commit-Queue: Brian Salomon <bsalomon@google.com> Reviewed-by: Greg Daniel <egdaniel@google.com>
1 parent cfdfb22 commit d0d033a

6 files changed

Lines changed: 174 additions & 202 deletions

File tree

src/gpu/GrSurfaceContext.cpp

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -637,13 +637,10 @@ std::unique_ptr<GrRenderTargetContext> GrSurfaceContext::rescale(
637637
} else if (nextH == srcH) {
638638
dir = GrBicubicEffect::Direction::kX;
639639
}
640-
if (srcW != texView.proxy()->width() || srcH != texView.proxy()->height()) {
641-
auto domain = GrTextureDomain::MakeTexelDomain(
642-
SkIRect::MakeXYWH(srcX, srcY, srcW, srcH), GrTextureDomain::kClamp_Mode);
643-
fp = GrBicubicEffect::Make(std::move(texView), matrix, domain, dir, prevAlphaType);
644-
} else {
645-
fp = GrBicubicEffect::Make(std::move(texView), matrix, dir, prevAlphaType);
646-
}
640+
static constexpr GrSamplerState::WrapMode kWM = GrSamplerState::WrapMode::kClamp;
641+
auto subset = SkRect::MakeXYWH(srcX, srcY, srcW, srcH);
642+
fp = GrBicubicEffect::MakeSubset(std::move(texView), prevAlphaType, matrix, kWM, kWM,
643+
subset, dir, *this->caps());
647644
if (xform) {
648645
fp = GrColorSpaceXformEffect::Make(std::move(fp), std::move(xform));
649646
}

src/gpu/GrTextureProducer.cpp

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -193,35 +193,26 @@ std::unique_ptr<GrFragmentProcessor> GrTextureProducer::createFragmentProcessorF
193193
SkASSERT(view.asTextureProxy());
194194
const auto& caps = *fContext->priv().caps();
195195
SkAlphaType srcAlphaType = this->alphaType();
196+
auto wm = fDomainNeedsDecal ? GrSamplerState::WrapMode::kClampToBorder
197+
: GrSamplerState::WrapMode::kClamp;
196198
if (filterOrNullForBicubic) {
197-
GrSamplerState::WrapMode wrapMode = fDomainNeedsDecal
198-
? GrSamplerState::WrapMode::kClampToBorder
199-
: GrSamplerState::WrapMode::kClamp;
200-
GrSamplerState samplerState(wrapMode, *filterOrNullForBicubic);
199+
GrSamplerState samplerState(wm, *filterOrNullForBicubic);
201200
if (kNoDomain_DomainMode == domainMode) {
202201
return GrTextureEffect::Make(std::move(view), srcAlphaType, textureMatrix, samplerState,
203202
caps);
204203
}
205204
return GrTextureEffect::MakeSubset(std::move(view), srcAlphaType, textureMatrix,
206205
samplerState, domain, caps);
207206
} else {
208-
static const GrSamplerState::WrapMode kClampClamp[] = {
209-
GrSamplerState::WrapMode::kClamp, GrSamplerState::WrapMode::kClamp};
210-
static const GrSamplerState::WrapMode kDecalDecal[] = {
211-
GrSamplerState::WrapMode::kClampToBorder, GrSamplerState::WrapMode::kClampToBorder};
212207

213208
static constexpr auto kDir = GrBicubicEffect::Direction::kXY;
214-
bool clampToBorderSupport = caps.clampToBorderSupport();
215-
if (kDomain_DomainMode == domainMode || (fDomainNeedsDecal && !clampToBorderSupport)) {
216-
GrTextureDomain::Mode wrapMode = fDomainNeedsDecal ? GrTextureDomain::kDecal_Mode
217-
: GrTextureDomain::kClamp_Mode;
218-
return GrBicubicEffect::Make(std::move(view), textureMatrix, kClampClamp, wrapMode,
219-
wrapMode, kDir, srcAlphaType,
220-
kDomain_DomainMode == domainMode ? &domain : nullptr);
209+
const auto& caps = *fContext->priv().caps();
210+
if (kDomain_DomainMode == domainMode) {
211+
return GrBicubicEffect::MakeSubset(std::move(view), srcAlphaType, textureMatrix, wm, wm,
212+
domain, kDir, caps);
221213
} else {
222-
return GrBicubicEffect::Make(std::move(view), textureMatrix,
223-
fDomainNeedsDecal ? kDecalDecal : kClampClamp, kDir,
224-
srcAlphaType);
214+
return GrBicubicEffect::Make(std::move(view), srcAlphaType, textureMatrix, wm, wm, kDir,
215+
caps);
225216
}
226217
}
227218
}

src/gpu/SkGpuDevice.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -938,16 +938,18 @@ void SkGpuDevice::drawBitmapTile(const SkBitmap& bitmap,
938938
if (needsTextureDomain && (SkCanvas::kStrict_SrcRectConstraint == constraint)) {
939939
if (bicubic) {
940940
static constexpr auto kDir = GrBicubicEffect::Direction::kXY;
941-
fp = GrBicubicEffect::Make(std::move(view), texMatrix, srcRect, kDir, srcAlphaType);
941+
fp = GrBicubicEffect::MakeSubset(std::move(view), srcAlphaType, texMatrix,
942+
samplerState.wrapModeX(), samplerState.wrapModeY(),
943+
srcRect, kDir, caps);
942944
} else {
943945
fp = GrTextureEffect::MakeSubset(std::move(view), srcAlphaType, texMatrix,
944946
samplerState, srcRect, caps);
945947
}
946948
} else if (bicubic) {
947949
SkASSERT(GrSamplerState::Filter::kNearest == samplerState.filter());
948-
GrSamplerState::WrapMode wrapMode[2] = {samplerState.wrapModeX(), samplerState.wrapModeY()};
949950
static constexpr auto kDir = GrBicubicEffect::Direction::kXY;
950-
fp = GrBicubicEffect::Make(std::move(view), texMatrix, wrapMode, kDir, srcAlphaType);
951+
fp = GrBicubicEffect::Make(std::move(view), srcAlphaType, texMatrix,
952+
samplerState.wrapModeX(), samplerState.wrapModeY(), kDir, caps);
951953
} else {
952954
fp = GrTextureEffect::Make(std::move(view), srcAlphaType, texMatrix, samplerState, caps);
953955
}

0 commit comments

Comments
 (0)