Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Side by Side Diff: src/gpu/effects/GrGammaEffect.cpp

Issue 1919993002: Added --deepColor option to SampleApp, triggers creation of a ten-bit/channel buffer on Windows. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Unit tests Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 /*
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 "GrGammaEffect.h"
9
10 #include "GrContext.h"
11 #include "GrCoordTransform.h"
12 #include "GrFragmentProcessor.h"
13 #include "GrInvariantOutput.h"
14 #include "GrProcessor.h"
15 #include "glsl/GrGLSLFragmentProcessor.h"
16 #include "glsl/GrGLSLFragmentShaderBuilder.h"
17
18 class GrGLGammaEffect : public GrGLSLFragmentProcessor {
19 public:
20 void emitCode(EmitArgs& args) override {
21 const GrGammaEffect& ge = args.fFp.cast<GrGammaEffect>();
22 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
23 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
24
25 const char* gammaUniName = nullptr;
26 if (!ge.gammaIsSRGB()) {
27 fGammaUni = uniformHandler->addUniform(kFragment_GrShaderFlag, kFloa t_GrSLType,
28 kDefault_GrSLPrecision, "Gamm a", &gammaUniName);
29 }
30
31 GrGLSLShaderVar tmpVar("tmpColor", kVec4f_GrSLType, 0, kHigh_GrSLPrecisi on);
32 SkString tmpDecl;
33 tmpVar.appendDecl(args.fGLSLCaps, &tmpDecl);
34
35 SkString srgbFuncName;
36 if (ge.gammaIsSRGB()) {
37 static const GrGLSLShaderVar gSrgbArgs[] = {
38 GrGLSLShaderVar("x", kFloat_GrSLType),
39 };
40
41 fragBuilder->emitFunction(kFloat_GrSLType,
42 "linear_to_srgb",
43 SK_ARRAY_COUNT(gSrgbArgs),
44 gSrgbArgs,
45 "return (x <= 0.0031308) ? (x * 12.92) "
46 ": (1.055 * pow(x, 0.416666667) - 0.055) ;",
47 &srgbFuncName);
48 }
49
50 fragBuilder->codeAppendf("%s;", tmpDecl.c_str());
51
52 fragBuilder->codeAppendf("%s = ", tmpVar.c_str());
53 fragBuilder->appendTextureLookup(args.fTexSamplers[0], args.fCoords[0].c _str(),
54 args.fCoords[0].getType());
55 fragBuilder->codeAppend(";");
56
57 if (ge.gammaIsSRGB()) {
58 fragBuilder->codeAppendf("%s = vec4(%s(%s.r), %s(%s.g), %s(%s.b), %s .a);",
59 args.fOutputColor,
60 srgbFuncName.c_str(), tmpVar.c_str(),
61 srgbFuncName.c_str(), tmpVar.c_str(),
62 srgbFuncName.c_str(), tmpVar.c_str(),
63 tmpVar.c_str());
64 } else {
65 fragBuilder->codeAppendf("%s = vec4(pow(%s.rgb, vec3(%s)), %s.a);",
66 args.fOutputColor, tmpVar.c_str(), gamma UniName,
67 tmpVar.c_str());
68 }
69 }
70
71 void onSetData(const GrGLSLProgramDataManager& pdman, const GrProcessor& pro c) override {
72 const GrGammaEffect& ge = proc.cast<GrGammaEffect>();
73 if (!ge.gammaIsSRGB()) {
74 pdman.set1f(fGammaUni, ge.gamma());
75 }
76 }
77
78 static inline void GenKey(const GrProcessor& processor, const GrGLSLCaps&,
79 GrProcessorKeyBuilder* b) {
80 const GrGammaEffect& ge = processor.cast<GrGammaEffect>();
81 uint32_t key = ge.gammaIsSRGB() ? 0x1 : 0x0;
82 b->add32(key);
83 }
84
85 private:
86 GrGLSLProgramDataManager::UniformHandle fGammaUni;
87
88 typedef GrGLSLFragmentProcessor INHERITED;
89 };
90
91 ///////////////////////////////////////////////////////////////////////////////
92
93 static inline float invert_gamma(float x) {
94 return SkScalarNearlyZero(x) ? 1.0f : (1.0f / x);
95 }
96
97 GrGammaEffect::GrGammaEffect(GrTexture* texture, SkScalar gamma)
98 : INHERITED(texture, GrCoordTransform::MakeDivByTextureWHMatrix(texture)) {
99 this->initClassID<GrGammaEffect>();
100
101 // Store inverse destination gamma, for use in shader
102 fGamma = invert_gamma(gamma);
103 fGammaIsSRGB = SkScalarNearlyEqual(gamma, 2.2f);
104 }
105
106 bool GrGammaEffect::onIsEqual(const GrFragmentProcessor& s) const {
107 const GrGammaEffect& other = s.cast<GrGammaEffect>();
108 // Conservative implemenation. Gamma doesn't matter if manual-gamma flag isn 't set.
109 return
110 other.fGammaIsSRGB == fGammaIsSRGB &&
111 other.fGamma == fGamma;
112 }
113
114 void GrGammaEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
115 inout->setToUnknown(GrInvariantOutput::kWill_ReadInput);
116 }
117
118 ///////////////////////////////////////////////////////////////////////////////
119
120 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrGammaEffect);
121
122 const GrFragmentProcessor* GrGammaEffect::TestCreate(GrProcessorTestData* d) {
123 // We want to be sure and test sRGB sometimes
124 bool srgb = d->fRandom->nextBool();
125 return new GrGammaEffect(d->fTextures[GrProcessorUnitTest::kSkiaPMTextureIdx ],
126 srgb ? 2.2f : d->fRandom->nextRangeScalar(1.0f, 2.4 f));
127 }
128
129 ///////////////////////////////////////////////////////////////////////////////
130
131 void GrGammaEffect::onGetGLSLProcessorKey(const GrGLSLCaps& caps,
132 GrProcessorKeyBuilder* b) const {
133 GrGLGammaEffect::GenKey(*this, caps, b);
134 }
135
136 GrGLSLFragmentProcessor* GrGammaEffect::onCreateGLSLInstance() const {
137 return new GrGLGammaEffect();
138 }
139
140 const GrFragmentProcessor* GrGammaEffect::Create(GrTexture* texture, SkScalar ga mma) {
141 return new GrGammaEffect(texture, gamma);
142 }
OLDNEW
« no previous file with comments | « src/gpu/effects/GrGammaEffect.h ('k') | src/utils/win/SkWGL.h » ('j') | tests/ApplyGammaTest.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698