fbe28593e5
At this point, every created instance of GrCoordTransform is an identity so can be removed. Adding it manually using addCoordTransforms() is no different than relying on the (current) implicitly returned coord transform if the FP calls setUsesSampleCoordsDirectly(). Removing the addCoordTransform() lets us enforce that this remains the case and this CL also deletes all of those members that were previously used to provide access to the sample coordinates. As part of this, GrFragmentProcessor.h and many other files no longer need to include GrCoordTransform.h. This exposed a surprising popularity on SkMatrixPriv.h so I updated those files to include that header directly. Technically, a .fp file can still have an @coordTransform section and the sksl generator will try and call addCoordTransform, which will then fail to build. A follow up CL removes that support in .fp generation. Bug: skia:10416 Change-Id: I5e4d2bb49ee6d7e56ac75ca00be5631106fec20b Reviewed-on: https://skia-review.googlesource.com/c/skia/+/299291 Reviewed-by: Brian Osman <brianosman@google.com> Commit-Queue: Michael Ludwig <michaelludwig@google.com>
100 lines
3.5 KiB
C++
100 lines
3.5 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/core/SkCanvas.h"
|
|
#include "include/core/SkColor.h"
|
|
#include "include/core/SkImageInfo.h"
|
|
#include "include/core/SkMatrix.h"
|
|
#include "include/core/SkPaint.h"
|
|
#include "include/core/SkRect.h"
|
|
#include "include/core/SkShader.h"
|
|
#include "include/core/SkSize.h"
|
|
#include "include/core/SkString.h"
|
|
#include "include/core/SkTileMode.h"
|
|
#include "include/core/SkTypes.h"
|
|
#include "include/gpu/GrContext.h"
|
|
#include "src/gpu/GrBitmapTextureMaker.h"
|
|
#include "src/gpu/GrCaps.h"
|
|
#include "src/gpu/GrContextPriv.h"
|
|
#include "src/gpu/GrFragmentProcessor.h"
|
|
#include "src/gpu/GrRenderTargetContext.h"
|
|
#include "src/gpu/GrRenderTargetContextPriv.h"
|
|
#include "src/gpu/effects/GrRRectEffect.h"
|
|
#include "src/gpu/effects/GrSkSLFP.h"
|
|
#include "src/gpu/glsl/GrGLSLFragmentShaderBuilder.h"
|
|
#include "src/gpu/ops/GrFillRectOp.h"
|
|
#include "tools/Resources.h"
|
|
#include "tools/ToolUtils.h"
|
|
|
|
class SampleCoordEffect : public GrFragmentProcessor {
|
|
public:
|
|
static constexpr GrProcessor::ClassID CLASS_ID = (GrProcessor::ClassID) 0;
|
|
|
|
SampleCoordEffect(std::unique_ptr<GrFragmentProcessor> child)
|
|
: INHERITED(CLASS_ID, kNone_OptimizationFlags) {
|
|
this->registerExplicitlySampledChild(std::move(child));
|
|
}
|
|
|
|
const char* name() const override { return "SampleCoordEffect"; }
|
|
|
|
std::unique_ptr<GrFragmentProcessor> clone() const override {
|
|
SkASSERT(false);
|
|
return nullptr;
|
|
}
|
|
|
|
void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override {
|
|
}
|
|
|
|
bool onIsEqual(const GrFragmentProcessor&) const override {
|
|
SkASSERT(false);
|
|
return true;
|
|
}
|
|
|
|
private:
|
|
GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
|
|
typedef GrFragmentProcessor INHERITED;
|
|
};
|
|
|
|
class GLSLSampleCoordEffect : public GrGLSLFragmentProcessor {
|
|
void emitCode(EmitArgs& args) override {
|
|
GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
|
|
SkString sample1 = this->invokeChild(0, args, "float2(sk_FragCoord.x, sk_FragCoord.y)");
|
|
SkString sample2 = this->invokeChild(0, args, "float2(sk_FragCoord.x, 512-sk_FragCoord.y)");
|
|
fragBuilder->codeAppendf("%s = (%s + %s) / 2;\n", args.fOutputColor, sample1.c_str(),
|
|
sample2.c_str());
|
|
}
|
|
};
|
|
|
|
GrGLSLFragmentProcessor* SampleCoordEffect::onCreateGLSLInstance() const {
|
|
return new GLSLSampleCoordEffect();
|
|
}
|
|
|
|
DEF_SIMPLE_GPU_GM_BG(fpcoordinateoverride, ctx, rtCtx, canvas, 512, 512,
|
|
ToolUtils::color_to_565(0xFF66AA99)) {
|
|
SkRect bounds = SkRect::MakeIWH(512, 512);
|
|
|
|
SkBitmap bmp;
|
|
GetResourceAsBitmap("images/mandrill_512_q075.jpg", &bmp);
|
|
GrBitmapTextureMaker maker(ctx, bmp, GrImageTexGenPolicy::kDraw);
|
|
auto view = maker.view(GrMipMapped::kNo);
|
|
if (!view) {
|
|
return;
|
|
}
|
|
std::unique_ptr<GrFragmentProcessor> imgFP =
|
|
GrTextureEffect::Make(std::move(view), bmp.alphaType(), SkMatrix());
|
|
auto fp = std::unique_ptr<GrFragmentProcessor>(new SampleCoordEffect(std::move(imgFP)));
|
|
|
|
GrPaint grPaint;
|
|
grPaint.addCoverageFragmentProcessor(std::move(fp));
|
|
|
|
rtCtx->priv().testingOnly_addDrawOp(GrFillRectOp::MakeNonAARect(ctx,
|
|
std::move(grPaint),
|
|
SkMatrix::I(),
|
|
bounds));
|
|
}
|