449b1157a7
Renames the provider to SkMatrixProvider, which is now also able to provide the local-to-device matrix. Everywhere that does paint conversion and FP generation now has access to the entire matrix provider, instead of just the CTM. This will allow the SkSL FP (and others) to fetch other matrix state. Change-Id: Iffb00bae0d438da0e8de3eebe75183ed6d440fd6 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/284040 Reviewed-by: Brian Salomon <bsalomon@google.com> Reviewed-by: Michael Ludwig <michaelludwig@google.com> Commit-Queue: Brian Osman <brianosman@google.com>
100 lines
3.8 KiB
C++
100 lines
3.8 KiB
C++
/*
|
|
* Copyright 2019 Google LLC.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
#include "gm/gm.h"
|
|
#include "include/effects/SkGradientShader.h"
|
|
#include "src/core/SkMatrixProvider.h"
|
|
#include "src/gpu/GrBitmapTextureMaker.h"
|
|
#include "src/gpu/GrClip.h"
|
|
#include "src/gpu/GrContextPriv.h"
|
|
#include "src/gpu/GrRenderTargetContextPriv.h"
|
|
#include "src/gpu/glsl/GrGLSLFragmentShaderBuilder.h"
|
|
#include "src/gpu/ops/GrFillRectOp.h"
|
|
#include "tools/Resources.h"
|
|
|
|
class SampleMatrixConstantEffect : public GrFragmentProcessor {
|
|
public:
|
|
static constexpr GrProcessor::ClassID CLASS_ID = (GrProcessor::ClassID) 1;
|
|
|
|
SampleMatrixConstantEffect(std::unique_ptr<GrFragmentProcessor> child)
|
|
: INHERITED(CLASS_ID, kNone_OptimizationFlags) {
|
|
child->setSampleMatrix(SkSL::SampleMatrix(SkSL::SampleMatrix::Kind::kVariable));
|
|
this->registerChildProcessor(std::move(child));
|
|
}
|
|
|
|
const char* name() const override { return "SampleMatrixConstantEffect"; }
|
|
|
|
std::unique_ptr<GrFragmentProcessor> clone() const override {
|
|
SkASSERT(false);
|
|
return nullptr;
|
|
}
|
|
|
|
void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override {
|
|
}
|
|
|
|
bool onIsEqual(const GrFragmentProcessor& that) const override {
|
|
return this == &that;
|
|
}
|
|
|
|
private:
|
|
GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
|
|
typedef GrFragmentProcessor INHERITED;
|
|
};
|
|
|
|
class GLSLSampleMatrixConstantEffect : public GrGLSLFragmentProcessor {
|
|
void emitCode(EmitArgs& args) override {
|
|
GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
|
|
SkString sample = this->invokeChildWithMatrix(0, args, "float3x3(0.5)");
|
|
fragBuilder->codeAppendf("%s = %s;\n", args.fOutputColor, sample.c_str());
|
|
}
|
|
};
|
|
|
|
GrGLSLFragmentProcessor* SampleMatrixConstantEffect::onCreateGLSLInstance() const {
|
|
return new GLSLSampleMatrixConstantEffect();
|
|
}
|
|
|
|
|
|
DEF_SIMPLE_GPU_GM(sample_matrix_constant, ctx, rtCtx, canvas, 512, 256) {
|
|
{
|
|
SkRect bounds = SkRect::MakeIWH(256, 256);
|
|
SkBitmap bmp;
|
|
GetResourceAsBitmap("images/mandrill_256.png", &bmp);
|
|
GrBitmapTextureMaker maker(ctx, bmp, GrImageTexGenPolicy::kDraw);
|
|
auto view = maker.view(GrMipMapped::kNo);
|
|
std::unique_ptr<GrFragmentProcessor> imgFP =
|
|
GrTextureEffect::Make(std::move(view), bmp.alphaType(), SkMatrix());
|
|
auto fp = std::unique_ptr<GrFragmentProcessor>(
|
|
new SampleMatrixConstantEffect(std::move(imgFP)));
|
|
|
|
GrPaint paint;
|
|
paint.addCoverageFragmentProcessor(std::move(fp));
|
|
rtCtx->drawRect(GrNoClip(), std::move(paint), GrAA::kNo, SkMatrix::I(), bounds);
|
|
}
|
|
|
|
{
|
|
GrPaint paint;
|
|
SkRect bounds = SkRect::MakeLTRB(256, 0, 512, 256);
|
|
static constexpr SkColor colors[] = { 0xff00ff00, 0xffff00ff };
|
|
static constexpr SkScalar pos[] = { 0.0f, 1.0f };
|
|
const SkPoint pts[] = {{ 256, 0 }, { 512, 0 }};
|
|
|
|
auto shader = SkGradientShader::MakeLinear(pts, colors, pos,
|
|
SK_ARRAY_COUNT(colors),
|
|
SkTileMode::kRepeat);
|
|
SkMatrix matrix;
|
|
SkSimpleMatrixProvider matrixProvider(matrix);
|
|
GrColorInfo colorInfo;
|
|
GrFPArgs args(ctx, matrixProvider, kHigh_SkFilterQuality, &colorInfo);
|
|
std::unique_ptr<GrFragmentProcessor> gradientFP = as_SB(shader)->asFragmentProcessor(args);
|
|
auto fp = std::unique_ptr<GrFragmentProcessor>(
|
|
new SampleMatrixConstantEffect(std::move(gradientFP)));
|
|
paint.addCoverageFragmentProcessor(std::move(fp));
|
|
rtCtx->drawRect(GrNoClip(), std::move(paint), GrAA::kNo, SkMatrix::I(), bounds);
|
|
}
|
|
}
|
|
|