1 /* 2 * Copyright 2018 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 /************************************************************************************************** 9 *** This file was autogenerated from GrConstColorProcessor.fp; do not modify. 10 **************************************************************************************************/ 11 #include "GrConstColorProcessor.h" 12 #include "glsl/GrGLSLFragmentProcessor.h" 13 #include "glsl/GrGLSLFragmentShaderBuilder.h" 14 #include "glsl/GrGLSLProgramBuilder.h" 15 #include "GrTexture.h" 16 #include "SkSLCPP.h" 17 #include "SkSLUtil.h" 18 class GrGLSLConstColorProcessor : public GrGLSLFragmentProcessor { 19 public: 20 GrGLSLConstColorProcessor() {} 21 void emitCode(EmitArgs& args) override { 22 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder; 23 const GrConstColorProcessor& _outer = args.fFp.cast<GrConstColorProcessor>(); 24 (void)_outer; 25 auto color = _outer.color(); 26 (void)color; 27 auto mode = _outer.mode(); 28 (void)mode; 29 fColorVar = 30 args.fUniformHandler->addUniform(kFragment_GrShaderFlag, kHalf4_GrSLType, "color"); 31 fragBuilder->codeAppendf( 32 "@switch (%d) {\n case 0:\n %s = %s;\n break;\n case 1:\n " 33 " %s = %s * %s;\n break;\n case 2:\n %s = %s.w * %s;\n " 34 "break;\n}\n", 35 (int)_outer.mode(), args.fOutputColor, 36 args.fUniformHandler->getUniformCStr(fColorVar), args.fOutputColor, 37 args.fInputColor, args.fUniformHandler->getUniformCStr(fColorVar), 38 args.fOutputColor, args.fInputColor, 39 args.fUniformHandler->getUniformCStr(fColorVar)); 40 } 41 42 private: 43 void onSetData(const GrGLSLProgramDataManager& pdman, 44 const GrFragmentProcessor& _proc) override { 45 const GrConstColorProcessor& _outer = _proc.cast<GrConstColorProcessor>(); 46 { 47 const SkPMColor4f& colorValue = _outer.color(); 48 if (fColorPrev != colorValue) { 49 fColorPrev = colorValue; 50 pdman.set4fv(fColorVar, 1, colorValue.vec()); 51 } 52 } 53 } 54 SkPMColor4f fColorPrev = {SK_FloatNaN, SK_FloatNaN, SK_FloatNaN, SK_FloatNaN}; 55 UniformHandle fColorVar; 56 }; 57 GrGLSLFragmentProcessor* GrConstColorProcessor::onCreateGLSLInstance() const { 58 return new GrGLSLConstColorProcessor(); 59 } 60 void GrConstColorProcessor::onGetGLSLProcessorKey(const GrShaderCaps& caps, 61 GrProcessorKeyBuilder* b) const { 62 b->add32((int32_t)fMode); 63 } 64 bool GrConstColorProcessor::onIsEqual(const GrFragmentProcessor& other) const { 65 const GrConstColorProcessor& that = other.cast<GrConstColorProcessor>(); 66 (void)that; 67 if (fColor != that.fColor) return false; 68 if (fMode != that.fMode) return false; 69 return true; 70 } 71 GrConstColorProcessor::GrConstColorProcessor(const GrConstColorProcessor& src) 72 : INHERITED(kGrConstColorProcessor_ClassID, src.optimizationFlags()) 73 , fColor(src.fColor) 74 , fMode(src.fMode) {} 75 std::unique_ptr<GrFragmentProcessor> GrConstColorProcessor::clone() const { 76 return std::unique_ptr<GrFragmentProcessor>(new GrConstColorProcessor(*this)); 77 } 78 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrConstColorProcessor); 79 #if GR_TEST_UTILS 80 std::unique_ptr<GrFragmentProcessor> GrConstColorProcessor::TestCreate(GrProcessorTestData* d) { 81 SkPMColor4f color; 82 int colorPicker = d->fRandom->nextULessThan(3); 83 switch (colorPicker) { 84 case 0: { 85 uint32_t a = d->fRandom->nextULessThan(0x100); 86 uint32_t r = d->fRandom->nextULessThan(a + 1); 87 uint32_t g = d->fRandom->nextULessThan(a + 1); 88 uint32_t b = d->fRandom->nextULessThan(a + 1); 89 color = SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(r, g, b, a)); 90 break; 91 } 92 case 1: 93 color = SK_PMColor4fTRANSPARENT; 94 break; 95 case 2: 96 uint32_t c = d->fRandom->nextULessThan(0x100); 97 color = SkPMColor4f::FromBytes_RGBA(c | (c << 8) | (c << 16) | (c << 24)); 98 break; 99 } 100 InputMode mode = static_cast<InputMode>(d->fRandom->nextULessThan(kInputModeCnt)); 101 return GrConstColorProcessor::Make(color, mode); 102 } 103 #endif 104