blob: 52bf287bea458fa8ecc25bf5c57d6afb1ae7acd3 [file] [log] [blame]
Jim Van Verthc5903412016-11-17 15:27:09 -05001/*
2 * Copyright 2016 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "GrShadowGeoProc.h"
9
10#include "glsl/GrGLSLFragmentShaderBuilder.h"
11#include "glsl/GrGLSLGeometryProcessor.h"
12#include "glsl/GrGLSLUniformHandler.h"
13#include "glsl/GrGLSLVarying.h"
Chris Daltonc17bf322017-10-24 10:59:03 -060014#include "glsl/GrGLSLVertexGeoBuilder.h"
Jim Van Verthc5903412016-11-17 15:27:09 -050015
16class GrGLSLRRectShadowGeoProc : public GrGLSLGeometryProcessor {
17public:
18 GrGLSLRRectShadowGeoProc() {}
19
20 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override {
21 const GrRRectShadowGeoProc& rsgp = args.fGP.cast<GrRRectShadowGeoProc>();
22 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
23 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler;
24 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
Chris Dalton60283612018-02-14 13:38:14 -070025 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
Jim Van Verthc5903412016-11-17 15:27:09 -050026
27 // emit attributes
28 varyingHandler->emitAttributes(rsgp);
Ethan Nicholasf7b88202017-09-18 14:10:39 -040029 fragBuilder->codeAppend("half4 shadowParams;");
Jim Van Verthc5903412016-11-17 15:27:09 -050030 varyingHandler->addPassThroughAttribute(rsgp.inShadowParams(), "shadowParams");
31
32 // setup pass through color
33 varyingHandler->addPassThroughAttribute(rsgp.inColor(), args.fOutputColor);
34
35 // Setup position
Brian Salomon70132d02018-05-29 15:33:06 -040036 this->writeOutputPosition(vertBuilder, gpArgs, rsgp.inPosition()->name());
Jim Van Verthc5903412016-11-17 15:27:09 -050037
38 // emit transforms
39 this->emitTransforms(vertBuilder,
40 varyingHandler,
41 uniformHandler,
Brian Salomon04460cc2017-12-06 14:47:42 -050042 rsgp.inPosition()->asShaderVar(),
Jim Van Verthc5903412016-11-17 15:27:09 -050043 args.fFPCoordTransformHandler);
44
Ethan Nicholasf7b88202017-09-18 14:10:39 -040045 fragBuilder->codeAppend("half d = length(shadowParams.xy);");
46 fragBuilder->codeAppend("half distance = shadowParams.z * (1.0 - d);");
Jim Van Verthc5903412016-11-17 15:27:09 -050047
Jim Van Verth39e71652018-04-23 18:08:45 +000048 fragBuilder->codeAppend("half factor = 1.0 - clamp(distance, 0.0, shadowParams.w);");
Jim Van Verthc5903412016-11-17 15:27:09 -050049 fragBuilder->codeAppend("factor = exp(-factor * factor * 4.0) - 0.018;");
Ethan Nicholasf7b88202017-09-18 14:10:39 -040050 fragBuilder->codeAppendf("%s = half4(factor);",
Jim Van Verthc5903412016-11-17 15:27:09 -050051 args.fOutputCoverage);
52 }
53
54 void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& proc,
55 FPCoordTransformIter&& transformIter) override {
Brian Salomon05969092017-07-13 11:20:51 -040056 this->setTransformDataHelper(SkMatrix::I(), pdman, &transformIter);
Jim Van Verthc5903412016-11-17 15:27:09 -050057 }
58
59private:
60 typedef GrGLSLGeometryProcessor INHERITED;
61};
62
63///////////////////////////////////////////////////////////////////////////////
64
Ethan Nicholasabff9562017-10-09 10:54:08 -040065GrRRectShadowGeoProc::GrRRectShadowGeoProc()
66: INHERITED(kGrRRectShadowGeoProc_ClassID) {
Ethan Nicholasfa7ee242017-09-25 09:52:04 -040067 fInPosition = &this->addVertexAttrib("inPosition", kFloat2_GrVertexAttribType);
68 fInColor = &this->addVertexAttrib("inColor", kUByte4_norm_GrVertexAttribType);
69 fInShadowParams = &this->addVertexAttrib("inShadowParams", kHalf4_GrVertexAttribType);
Jim Van Verthc5903412016-11-17 15:27:09 -050070}
71
Brian Salomon94efbf52016-11-29 13:43:05 -050072GrGLSLPrimitiveProcessor* GrRRectShadowGeoProc::createGLSLInstance(const GrShaderCaps&) const {
Jim Van Verthc5903412016-11-17 15:27:09 -050073 return new GrGLSLRRectShadowGeoProc();
74}
75
76///////////////////////////////////////////////////////////////////////////////
77
78GR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrRRectShadowGeoProc);
79
Hal Canary6f6961e2017-01-31 13:50:44 -050080#if GR_TEST_UTILS
Jim Van Verthc5903412016-11-17 15:27:09 -050081sk_sp<GrGeometryProcessor> GrRRectShadowGeoProc::TestCreate(GrProcessorTestData* d) {
Brian Salomon05969092017-07-13 11:20:51 -040082 return GrRRectShadowGeoProc::Make();
Jim Van Verthc5903412016-11-17 15:27:09 -050083}
Hal Canary6f6961e2017-01-31 13:50:44 -050084#endif