Revert "Remove SkRuntimeShader::makeImage."

This reverts commit 65967ab2c9.

Reason for revert: used in Android - http://screen/3fk6K3RUWZG8x5f

Original change's description:
> Remove SkRuntimeShader::makeImage.
>
> We don't have any known users, and it no longer exposes anything that
> a user can't just do directly.
>
> Change-Id: Id653a6be3f265a2847b1670f3e6c054cf2d094a2
> Bug: skia:12482
> Reviewed-on: https://skia-review.googlesource.com/c/skia/+/453142
> Auto-Submit: John Stiles <johnstiles@google.com>
> Reviewed-by: Brian Osman <brianosman@google.com>
> Commit-Queue: John Stiles <johnstiles@google.com>

Bug: skia:12482
Change-Id: I6cc2e79796f53c42e9f53b7d9927c853e7e2d71c
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/453317
Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
Commit-Queue: Kevin Lubick <kjlubick@google.com>
Reviewed-by: Kevin Lubick <kjlubick@google.com>
Owners-Override: Kevin Lubick <kjlubick@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
This commit is contained in:
John Stiles 2021-09-28 13:18:49 +00:00 committed by SkCQ
parent 2045b981fb
commit 43264640f2
3 changed files with 105 additions and 3 deletions

View File

@ -7,9 +7,6 @@ Milestone 95
* Minimum supported iOS raised from 8 to 11. Skia may build back to iOS 9 but versions older
than 11 are not tested. Community contributions to support versions 9 and 10 of iOS may be
considered, but they may not be complex as they cannot be tested.
* Removed SkRuntimeEffect::makeImage. This didn't end up providing any useful benefit compared
to the general-case SkRuntimeEffect::makeShader API.
https://review.skia.org/453142
* * *

View File

@ -192,6 +192,13 @@ public:
const SkMatrix* localMatrix,
bool isOpaque) const;
sk_sp<SkImage> makeImage(GrRecordingContext*,
sk_sp<SkData> uniforms,
SkSpan<ChildPtr> children,
const SkMatrix* localMatrix,
SkImageInfo resultInfo,
bool mipmapped) const;
sk_sp<SkColorFilter> makeColorFilter(sk_sp<SkData> uniforms) const;
sk_sp<SkColorFilter> makeColorFilter(sk_sp<SkData> uniforms,
sk_sp<SkColorFilter> children[],
@ -443,6 +450,10 @@ public:
~SkRuntimeShaderBuilder();
sk_sp<SkShader> makeShader(const SkMatrix* localMatrix, bool isOpaque);
sk_sp<SkImage> makeImage(GrRecordingContext*,
const SkMatrix* localMatrix,
SkImageInfo resultInfo,
bool mipmapped);
private:
using INHERITED = SkRuntimeEffectBuilder;

View File

@ -1254,6 +1254,88 @@ sk_sp<SkShader> SkRuntimeEffect::makeShader(sk_sp<SkData> uniforms,
children, isOpaque));
}
sk_sp<SkImage> SkRuntimeEffect::makeImage(GrRecordingContext* rContext,
sk_sp<SkData> uniforms,
SkSpan<ChildPtr> children,
const SkMatrix* localMatrix,
SkImageInfo resultInfo,
bool mipmapped) const {
if (rContext) {
#if SK_SUPPORT_GPU
if (!rContext->priv().caps()->mipmapSupport()) {
mipmapped = false;
}
auto fillContext = rContext->priv().makeSFC(resultInfo,
SkBackingFit::kExact,
/*sample count*/ 1,
GrMipmapped(mipmapped));
if (!fillContext) {
return nullptr;
}
uniforms = get_xformed_uniforms(this, std::move(uniforms), resultInfo.colorSpace());
SkASSERT(uniforms);
SkSimpleMatrixProvider matrixProvider(SkMatrix::I());
GrColorInfo colorInfo(resultInfo.colorInfo());
GrFPArgs args(rContext, matrixProvider, &colorInfo);
SkSTArray<8, std::unique_ptr<GrFragmentProcessor>> childFPs;
for (size_t i = 0; i < children.size(); ++i) {
// TODO: add support for other types of child effects
if (SkShader* shader = children[i].shader()) {
childFPs.push_back(as_SB(shader)->asFragmentProcessor(args));
} else {
return nullptr;
}
}
auto fp = GrSkSLFP::MakeWithData(sk_ref_sp(this),
"runtime_image",
/*inputFP=*/nullptr,
/*destColorFP=*/nullptr,
std::move(uniforms),
SkMakeSpan(childFPs));
if (localMatrix) {
SkMatrix invLM;
if (!localMatrix->invert(&invLM)) {
return nullptr;
}
fillContext->fillWithFP(invLM, std::move(fp));
} else {
fillContext->fillWithFP(std::move(fp));
}
return sk_sp<SkImage>(new SkImage_Gpu(sk_ref_sp(rContext),
kNeedNewImageUniqueID,
fillContext->readSurfaceView(),
resultInfo.colorInfo()));
#else
return nullptr;
#endif
}
if (resultInfo.alphaType() == kUnpremul_SkAlphaType) {
// We don't have a good way of supporting this right now. In this case the runtime effect
// will produce a unpremul value. The shader generated from it is assumed to produce
// premul and RGB get pinned to A. Moreover, after the blend in premul the new dst is
// unpremul'ed, producing a double unpremul result.
return nullptr;
}
auto surf = SkSurface::MakeRaster(resultInfo);
if (!surf) {
return nullptr;
}
SkCanvas* canvas = surf->getCanvas();
SkTLazy<SkCanvas> tempCanvas;
auto shader = this->makeShader(std::move(uniforms), children, localMatrix, false);
if (!shader) {
return nullptr;
}
SkPaint paint;
paint.setShader(std::move(shader));
paint.setBlendMode(SkBlendMode::kSrc);
canvas->drawPaint(paint);
// TODO: Specify snapshot should have mip levels if mipmapped is true.
return surf->makeImageSnapshot();
}
sk_sp<SkColorFilter> SkRuntimeEffect::makeColorFilter(sk_sp<SkData> uniforms,
sk_sp<SkColorFilter> childColorFilters[],
size_t childCount) const {
@ -1352,6 +1434,18 @@ SkRuntimeShaderBuilder::SkRuntimeShaderBuilder(sk_sp<SkRuntimeEffect> effect)
SkRuntimeShaderBuilder::~SkRuntimeShaderBuilder() = default;
sk_sp<SkImage> SkRuntimeShaderBuilder::makeImage(GrRecordingContext* recordingContext,
const SkMatrix* localMatrix,
SkImageInfo resultInfo,
bool mipmapped) {
return this->effect()->makeImage(recordingContext,
this->uniforms(),
SkMakeSpan(this->children(), this->numChildren()),
localMatrix,
resultInfo,
mipmapped);
}
sk_sp<SkShader> SkRuntimeShaderBuilder::makeShader(const SkMatrix* localMatrix, bool isOpaque) {
return this->effect()->makeShader(this->uniforms(),
SkMakeSpan(this->children(), this->numChildren()),