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 GrConfigConversionEffect.fp; do not modify.
10 **************************************************************************************************/
11#include "GrConfigConversionEffect.h"
12#if SK_SUPPORT_GPU
13#include "glsl/GrGLSLFragmentProcessor.h"
14#include "glsl/GrGLSLFragmentShaderBuilder.h"
15#include "glsl/GrGLSLProgramBuilder.h"
16#include "GrTexture.h"
17#include "SkSLCPP.h"
18#include "SkSLUtil.h"
19class GrGLSLConfigConversionEffect : public GrGLSLFragmentProcessor {
20public:
21    GrGLSLConfigConversionEffect() {}
22    void emitCode(EmitArgs& args) override {
23        GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
24        const GrConfigConversionEffect& _outer = args.fFp.cast<GrConfigConversionEffect>();
25        (void)_outer;
26        auto pmConversion = _outer.pmConversion();
27        (void)pmConversion;
28
29        fragBuilder->forceHighPrecision();
30        fragBuilder->codeAppendf(
31                "%s = half4(floor(float4(float4(%s * 255.0) + 0.5)) / 255.0);\n@switch (%d) {\n    "
32                "case 0:\n        %s.xyz = half3(floor(float3(float3((%s.xyz * %s.w) * 255.0) + "
33                "0.5)) / 255.0);\n        break;\n    case 1:\n        %s.xyz = float(%s.w) <= 0.0 "
34                "? half3(0.0) : half3(floor(float3(float3((%s.xyz / %s.w) * 255.0) + 0.5)) / "
35                "255.0);\n        break;\n}\n",
36                args.fOutputColor, args.fInputColor ? args.fInputColor : "half4(1)",
37                (int)_outer.pmConversion(), args.fOutputColor, args.fOutputColor, args.fOutputColor,
38                args.fOutputColor, args.fOutputColor, args.fOutputColor, args.fOutputColor);
39    }
40
41private:
42    void onSetData(const GrGLSLProgramDataManager& pdman,
43                   const GrFragmentProcessor& _proc) override {}
44};
45GrGLSLFragmentProcessor* GrConfigConversionEffect::onCreateGLSLInstance() const {
46    return new GrGLSLConfigConversionEffect();
47}
48void GrConfigConversionEffect::onGetGLSLProcessorKey(const GrShaderCaps& caps,
49                                                     GrProcessorKeyBuilder* b) const {
50    b->add32((int32_t)fPmConversion);
51}
52bool GrConfigConversionEffect::onIsEqual(const GrFragmentProcessor& other) const {
53    const GrConfigConversionEffect& that = other.cast<GrConfigConversionEffect>();
54    (void)that;
55    if (fPmConversion != that.fPmConversion) return false;
56    return true;
57}
58GrConfigConversionEffect::GrConfigConversionEffect(const GrConfigConversionEffect& src)
59        : INHERITED(kGrConfigConversionEffect_ClassID, src.optimizationFlags())
60        , fPmConversion(src.fPmConversion) {}
61std::unique_ptr<GrFragmentProcessor> GrConfigConversionEffect::clone() const {
62    return std::unique_ptr<GrFragmentProcessor>(new GrConfigConversionEffect(*this));
63}
64GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrConfigConversionEffect);
65#if GR_TEST_UTILS
66std::unique_ptr<GrFragmentProcessor> GrConfigConversionEffect::TestCreate(
67        GrProcessorTestData* data) {
68    PMConversion pmConv = static_cast<PMConversion>(
69            data->fRandom->nextULessThan((int)PMConversion::kPMConversionCnt));
70    return std::unique_ptr<GrFragmentProcessor>(new GrConfigConversionEffect(pmConv));
71}
72#endif
73#endif
74