1c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth/* 2c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth * Copyright 2016 Google Inc. 3c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth * 4c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth * Use of this source code is governed by a BSD-style license that can be 5c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth * found in the LICENSE file. 6c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth */ 7c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth 8c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth#include "GrShadowGeoProc.h" 9c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth 10c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth#include "glsl/GrGLSLFragmentShaderBuilder.h" 11c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth#include "glsl/GrGLSLGeometryProcessor.h" 12c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth#include "glsl/GrGLSLUniformHandler.h" 13c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth#include "glsl/GrGLSLVarying.h" 14c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth#include "glsl/GrGLSLVertexShaderBuilder.h" 15c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth 16c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verthclass GrGLSLRRectShadowGeoProc : public GrGLSLGeometryProcessor { 17c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verthpublic: 18c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth GrGLSLRRectShadowGeoProc() {} 19c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth 20c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override { 21c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth const GrRRectShadowGeoProc& rsgp = args.fGP.cast<GrRRectShadowGeoProc>(); 22c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; 23c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; 24c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; 25c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth GrGLSLPPFragmentBuilder* fragBuilder = args.fFragBuilder; 26c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth 27c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth // emit attributes 28c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth varyingHandler->emitAttributes(rsgp); 29a8b5cf3550fd3d843f075cae6b82cd342e32981bJim Van Verth fragBuilder->codeAppend("vec4 shadowParams;"); 30c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth varyingHandler->addPassThroughAttribute(rsgp.inShadowParams(), "shadowParams"); 31c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth 32c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth // setup pass through color 33c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth varyingHandler->addPassThroughAttribute(rsgp.inColor(), args.fOutputColor); 34c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth 35c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth // Setup position 36c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth this->setupPosition(vertBuilder, gpArgs, rsgp.inPosition()->fName); 37c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth 38c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth // emit transforms 39c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth this->emitTransforms(vertBuilder, 40c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth varyingHandler, 41c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth uniformHandler, 42c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth gpArgs->fPositionVar, 43c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth rsgp.inPosition()->fName, 44c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth args.fFPCoordTransformHandler); 45c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth 46c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth fragBuilder->codeAppend("float d = length(shadowParams.xy);"); 47c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth fragBuilder->codeAppend("float distance = shadowParams.z * (1.0 - d);"); 48c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth 49a8b5cf3550fd3d843f075cae6b82cd342e32981bJim Van Verth fragBuilder->codeAppend("float factor = 1.0 - clamp(distance, 0.0, shadowParams.w);"); 50c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth fragBuilder->codeAppend("factor = exp(-factor * factor * 4.0) - 0.018;"); 51c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth fragBuilder->codeAppendf("%s = vec4(factor);", 52c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth args.fOutputCoverage); 53c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth } 54c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth 55c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth void setData(const GrGLSLProgramDataManager& pdman, const GrPrimitiveProcessor& proc, 56c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth FPCoordTransformIter&& transformIter) override { 570596909b055eb9493ba429cc09eae4a2ec53f158Brian Salomon this->setTransformDataHelper(SkMatrix::I(), pdman, &transformIter); 58c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth } 59c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth 60c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verthprivate: 61c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth typedef GrGLSLGeometryProcessor INHERITED; 62c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth}; 63c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth 64c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth/////////////////////////////////////////////////////////////////////////////// 65c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth 660596909b055eb9493ba429cc09eae4a2ec53f158Brian SalomonGrRRectShadowGeoProc::GrRRectShadowGeoProc() { 67c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth this->initClassID<GrRRectShadowGeoProc>(); 68c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth fInPosition = &this->addVertexAttrib("inPosition", kVec2f_GrVertexAttribType, 69c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth kHigh_GrSLPrecision); 70c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth fInColor = &this->addVertexAttrib("inColor", kVec4ub_GrVertexAttribType); 71a8b5cf3550fd3d843f075cae6b82cd342e32981bJim Van Verth fInShadowParams = &this->addVertexAttrib("inShadowParams", kVec4f_GrVertexAttribType); 72c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth} 73c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth 7494efbf51f5a88d9e8aa961d3fbe38c5e335d6108Brian SalomonGrGLSLPrimitiveProcessor* GrRRectShadowGeoProc::createGLSLInstance(const GrShaderCaps&) const { 75c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth return new GrGLSLRRectShadowGeoProc(); 76c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth} 77c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth 78c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth/////////////////////////////////////////////////////////////////////////////// 79c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth 80c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van VerthGR_DEFINE_GEOMETRY_PROCESSOR_TEST(GrRRectShadowGeoProc); 81c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth 826f6961ebad65c582318564b3688e78e5c99f3935Hal Canary#if GR_TEST_UTILS 83c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verthsk_sp<GrGeometryProcessor> GrRRectShadowGeoProc::TestCreate(GrProcessorTestData* d) { 840596909b055eb9493ba429cc09eae4a2ec53f158Brian Salomon return GrRRectShadowGeoProc::Make(); 85c59034145862bf6dc0c503cb1e47eecd321ffa8cJim Van Verth} 866f6961ebad65c582318564b3688e78e5c99f3935Hal Canary#endif 87