diff options
-rw-r--r-- | gn/gpu.gni | 2 | ||||
-rw-r--r-- | gn/sksl.gni | 1 | ||||
-rw-r--r-- | src/effects/SkLumaColorFilter.cpp | 63 | ||||
-rw-r--r-- | src/gpu/GrProcessor.h | 1 | ||||
-rw-r--r-- | src/gpu/effects/GrLumaColorFilterEffect.cpp | 50 | ||||
-rw-r--r-- | src/gpu/effects/GrLumaColorFilterEffect.fp | 16 | ||||
-rw-r--r-- | src/gpu/effects/GrLumaColorFilterEffect.h | 44 | ||||
-rw-r--r-- | src/sksl/SkSLGLSLCodeGenerator.cpp | 4 | ||||
-rw-r--r-- | src/sksl/sksl_fp.include | 1 |
9 files changed, 120 insertions, 62 deletions
diff --git a/gn/gpu.gni b/gn/gpu.gni index e67b2acb85..185d6d899e 100644 --- a/gn/gpu.gni +++ b/gn/gpu.gni @@ -347,6 +347,8 @@ skia_gpu_sources = [ "$_src/gpu/effects/GrGaussianConvolutionFragmentProcessor.h", "$_src/gpu/effects/GrMatrixConvolutionEffect.cpp", "$_src/gpu/effects/GrMatrixConvolutionEffect.h", + "$_src/gpu/effects/GrLumaColorFilterEffect.cpp", + "$_src/gpu/effects/GrLumaColorFilterEffect.h", "$_src/gpu/effects/GrNonlinearColorSpaceXformEffect.cpp", "$_src/gpu/effects/GrNonlinearColorSpaceXformEffect.h", "$_src/gpu/effects/GrOverdrawFragmentProcessor.cpp", diff --git a/gn/sksl.gni b/gn/sksl.gni index 5eef5b1cb8..ca6abcff09 100644 --- a/gn/sksl.gni +++ b/gn/sksl.gni @@ -34,6 +34,7 @@ skia_gpu_processor_sources = [ "$_src/gpu/effects/GrConfigConversionEffect.fp", "$_src/gpu/effects/GrDitherEffect.fp", "$_src/gpu/effects/GrEllipseEffect.fp", + "$_src/gpu/effects/GrLumaColorFilterEffect.fp", "$_src/gpu/effects/GrRectBlurEffect.fp", "$_src/gpu/effects/GrOverdrawFragmentProcessor.fp", "$_src/gpu/effects/GrSimpleTextureEffect.fp", diff --git a/src/effects/SkLumaColorFilter.cpp b/src/effects/SkLumaColorFilter.cpp index 22c0285a1e..6b7564b51a 100644 --- a/src/effects/SkLumaColorFilter.cpp +++ b/src/effects/SkLumaColorFilter.cpp @@ -13,6 +13,7 @@ #if SK_SUPPORT_GPU #include "GrContext.h" +#include "effects/GrLumaColorFilterEffect.h" #include "glsl/GrGLSLFragmentProcessor.h" #include "glsl/GrGLSLFragmentShaderBuilder.h" #endif @@ -43,68 +44,8 @@ void SkLumaColorFilter::toString(SkString* str) const { #endif #if SK_SUPPORT_GPU -class LumaColorFilterEffect : public GrFragmentProcessor { -public: - static std::unique_ptr<GrFragmentProcessor> Make() { - return std::unique_ptr<GrFragmentProcessor>(new LumaColorFilterEffect); - } - - const char* name() const override { return "Luminance-to-Alpha"; } - - std::unique_ptr<GrFragmentProcessor> clone() const override { return Make(); } - -private: - class GLSLProcessor : public GrGLSLFragmentProcessor { - public: - static void GenKey(const GrProcessor&, const GrShaderCaps&, GrProcessorKeyBuilder*) {} - - void emitCode(EmitArgs& args) override { - if (nullptr == args.fInputColor) { - args.fInputColor = "half4(1)"; - } - - GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder; - fragBuilder->codeAppendf("\thalf luma = dot(half3(%f, %f, %f), %s.rgb);\n", - SK_ITU_BT709_LUM_COEFF_R, - SK_ITU_BT709_LUM_COEFF_G, - SK_ITU_BT709_LUM_COEFF_B, - args.fInputColor); - fragBuilder->codeAppendf("\t%s = half4(0, 0, 0, luma);\n", - args.fOutputColor); - - } - - private: - typedef GrGLSLFragmentProcessor INHERITED; - }; - - LumaColorFilterEffect() - : INHERITED(kLumaColorFilterEffect_ClassID, kConstantOutputForConstantInput_OptimizationFlag) { - } - - GrGLSLFragmentProcessor* onCreateGLSLInstance() const override { - return new GLSLProcessor; - } - - virtual void onGetGLSLProcessorKey(const GrShaderCaps& caps, - GrProcessorKeyBuilder* b) const override { - GLSLProcessor::GenKey(*this, caps, b); - } - - bool onIsEqual(const GrFragmentProcessor&) const override { return true; } - - GrColor4f constantOutputForConstantInput(GrColor4f input) const override { - float luma = SK_ITU_BT709_LUM_COEFF_R * input.fRGBA[0] + - SK_ITU_BT709_LUM_COEFF_G * input.fRGBA[1] + - SK_ITU_BT709_LUM_COEFF_B * input.fRGBA[2]; - return GrColor4f(0, 0, 0, luma); - } - - typedef GrFragmentProcessor INHERITED; -}; - std::unique_ptr<GrFragmentProcessor> SkLumaColorFilter::asFragmentProcessor( GrContext*, const GrColorSpaceInfo&) const { - return LumaColorFilterEffect::Make(); + return GrLumaColorFilterEffect::Make(); } #endif diff --git a/src/gpu/GrProcessor.h b/src/gpu/GrProcessor.h index d8e4f2d94c..cd11ac4ac2 100644 --- a/src/gpu/GrProcessor.h +++ b/src/gpu/GrProcessor.h @@ -116,6 +116,7 @@ public: kGrImprovedPerlinNoiseEffect_ClassID, kGrLightingEffect_ClassID, kGrLinearGradient_ClassID, + kGrLumaColorFilterEffect_ClassID, kGrMagnifierEffect_ClassID, kGrMatrixConvolutionEffect_ClassID, kGrMeshTestProcessor_ClassID, diff --git a/src/gpu/effects/GrLumaColorFilterEffect.cpp b/src/gpu/effects/GrLumaColorFilterEffect.cpp new file mode 100644 index 0000000000..e09751d9b6 --- /dev/null +++ b/src/gpu/effects/GrLumaColorFilterEffect.cpp @@ -0,0 +1,50 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/* + * This file was autogenerated from GrLumaColorFilterEffect.fp; do not modify. + */ +#include "GrLumaColorFilterEffect.h" +#if SK_SUPPORT_GPU +#include "glsl/GrGLSLFragmentProcessor.h" +#include "glsl/GrGLSLFragmentShaderBuilder.h" +#include "glsl/GrGLSLProgramBuilder.h" +#include "SkSLCPP.h" +#include "SkSLUtil.h" +class GrGLSLLumaColorFilterEffect : public GrGLSLFragmentProcessor { +public: + GrGLSLLumaColorFilterEffect() {} + void emitCode(EmitArgs& args) override { + GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder; + const GrLumaColorFilterEffect& _outer = args.fFp.cast<GrLumaColorFilterEffect>(); + (void)_outer; + fragBuilder->codeAppendf( + "\nhalf luma = dot(half3(0.21260000000000001, 0.71519999999999995, 0.0722), " + "%s.xyz);\n%s = half4(0.0, 0.0, 0.0, luma);\n", + args.fInputColor ? args.fInputColor : "half4(1)", args.fOutputColor); + } + +private: + void onSetData(const GrGLSLProgramDataManager& pdman, + const GrFragmentProcessor& _proc) override {} +}; +GrGLSLFragmentProcessor* GrLumaColorFilterEffect::onCreateGLSLInstance() const { + return new GrGLSLLumaColorFilterEffect(); +} +void GrLumaColorFilterEffect::onGetGLSLProcessorKey(const GrShaderCaps& caps, + GrProcessorKeyBuilder* b) const {} +bool GrLumaColorFilterEffect::onIsEqual(const GrFragmentProcessor& other) const { + const GrLumaColorFilterEffect& that = other.cast<GrLumaColorFilterEffect>(); + (void)that; + return true; +} +GrLumaColorFilterEffect::GrLumaColorFilterEffect(const GrLumaColorFilterEffect& src) + : INHERITED(kGrLumaColorFilterEffect_ClassID, src.optimizationFlags()) {} +std::unique_ptr<GrFragmentProcessor> GrLumaColorFilterEffect::clone() const { + return std::unique_ptr<GrFragmentProcessor>(new GrLumaColorFilterEffect(*this)); +} +#endif diff --git a/src/gpu/effects/GrLumaColorFilterEffect.fp b/src/gpu/effects/GrLumaColorFilterEffect.fp new file mode 100644 index 0000000000..b8b9fe047f --- /dev/null +++ b/src/gpu/effects/GrLumaColorFilterEffect.fp @@ -0,0 +1,16 @@ +@class { + #include "SkColorData.h" + + GrColor4f constantOutputForConstantInput(GrColor4f input) const override { + float luma = SK_ITU_BT709_LUM_COEFF_R * input.fRGBA[0] + + SK_ITU_BT709_LUM_COEFF_G * input.fRGBA[1] + + SK_ITU_BT709_LUM_COEFF_B * input.fRGBA[2]; + return GrColor4f(0, 0, 0, luma); + } +} + +void main() { + const half3 SK_ITU_BT709_LUM_COEFF = half3(0.2126, 0.7152, 0.0722); + half luma = dot(SK_ITU_BT709_LUM_COEFF, sk_InColor.rgb); + sk_OutColor = half4(0, 0, 0, luma); +}
\ No newline at end of file diff --git a/src/gpu/effects/GrLumaColorFilterEffect.h b/src/gpu/effects/GrLumaColorFilterEffect.h new file mode 100644 index 0000000000..e77aeed532 --- /dev/null +++ b/src/gpu/effects/GrLumaColorFilterEffect.h @@ -0,0 +1,44 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/* + * This file was autogenerated from GrLumaColorFilterEffect.fp; do not modify. + */ +#ifndef GrLumaColorFilterEffect_DEFINED +#define GrLumaColorFilterEffect_DEFINED +#include "SkTypes.h" +#if SK_SUPPORT_GPU +#include "GrFragmentProcessor.h" +#include "GrCoordTransform.h" +class GrLumaColorFilterEffect : public GrFragmentProcessor { +public: +#include "SkColorData.h" + + GrColor4f constantOutputForConstantInput(GrColor4f input) const override { + float luma = SK_ITU_BT709_LUM_COEFF_R * input.fRGBA[0] + + SK_ITU_BT709_LUM_COEFF_G * input.fRGBA[1] + + SK_ITU_BT709_LUM_COEFF_B * input.fRGBA[2]; + return GrColor4f(0, 0, 0, luma); + } + static std::unique_ptr<GrFragmentProcessor> Make() { + return std::unique_ptr<GrFragmentProcessor>(new GrLumaColorFilterEffect()); + } + GrLumaColorFilterEffect(const GrLumaColorFilterEffect& src); + std::unique_ptr<GrFragmentProcessor> clone() const override; + const char* name() const override { return "LumaColorFilterEffect"; } + +private: + GrLumaColorFilterEffect() + : INHERITED(kGrLumaColorFilterEffect_ClassID, kNone_OptimizationFlags) {} + GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; + void onGetGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder*) const override; + bool onIsEqual(const GrFragmentProcessor&) const override; + GR_DECLARE_FRAGMENT_PROCESSOR_TEST + typedef GrFragmentProcessor INHERITED; +}; +#endif +#endif diff --git a/src/sksl/SkSLGLSLCodeGenerator.cpp b/src/sksl/SkSLGLSLCodeGenerator.cpp index 22331cdc80..2cbc023212 100644 --- a/src/sksl/SkSLGLSLCodeGenerator.cpp +++ b/src/sksl/SkSLGLSLCodeGenerator.cpp @@ -787,7 +787,9 @@ void GLSLCodeGenerator::writeTypePrecision(const Type& type) { } void GLSLCodeGenerator::writeVarDeclarations(const VarDeclarations& decl, bool global) { - ASSERT(decl.fVars.size() > 0); + if (!decl.fVars.size()) { + return; + } bool wroteType = false; for (const auto& stmt : decl.fVars) { VarDeclaration& var = (VarDeclaration&) *stmt; diff --git a/src/sksl/sksl_fp.include b/src/sksl/sksl_fp.include index d407fd08f6..5f8c7ea9a7 100644 --- a/src/sksl/sksl_fp.include +++ b/src/sksl/sksl_fp.include @@ -22,4 +22,5 @@ layout(builtin=10005) float2[] sk_TransformedCoords2D; layout(builtin=10006) sampler2D[] sk_TextureSamplers; half4 process(fragmentProcessor fp); + ) |