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

Side by Side Diff: src/core/SkNormalSource.h

Issue 2114993002: GrFP can express distance vector field req., program builder declares variable for it (Closed) Base URL: https://skia.googlesource.com/skia@dvonbeck-bevel-api-change
Patch Set: Quick rebase fix Created 4 years, 5 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
1 /* 1 /*
2 * Copyright 2016 Google Inc. 2 * Copyright 2016 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef SkNormalSource_DEFINED 8 #ifndef SkNormalSource_DEFINED
9 #define SkNormalSource_DEFINED 9 #define SkNormalSource_DEFINED
10 10
11 #include "SkFlattenable.h" 11 #include "SkFlattenable.h"
12 #include "SkShader.h" 12 #include "SkShader.h"
13 13
14 class SkMatrix; 14 class SkMatrix;
15 class SkPoint3; 15 class SkPoint3;
16 16
17 #if SK_SUPPORT_GPU 17 #if SK_SUPPORT_GPU
18 class GrFragmentProcessor; 18 #include "glsl/GrGLSLFragmentProcessor.h"
19 class GrContext; 19 #include "glsl/GrGLSLFragmentShaderBuilder.h"
20 enum SkFilterQuality;
21 enum SkSourceGammaTreatment;
22 #endif 20 #endif
23 21
24 /** Abstract class that generates or reads in normals for use by SkLightingShade r. 22 /** Abstract class that generates or reads in normals for use by SkLightingShade r.
25 */ 23 */
26 class SK_API SkNormalSource : public SkFlattenable { 24 class SK_API SkNormalSource : public SkFlattenable {
27 public: 25 public:
28 virtual ~SkNormalSource() override; 26 virtual ~SkNormalSource() override;
29 27
30 #if SK_SUPPORT_GPU 28 #if SK_SUPPORT_GPU
31 /** Returns a fragment processor that takes no input and outputs a normal (a lready rotated) 29 /** Returns a fragment processor that takes no input and outputs a normal (a lready rotated)
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 * This bevel follows the only quadratic bezier curve whose start point is at (w, 0, 0) and 113 * This bevel follows the only quadratic bezier curve whose start point is at (w, 0, 0) and
116 * has a perpendicular normal vector of <0,0,1>, and whose end point is at (0, 0, h) and has 114 * has a perpendicular normal vector of <0,0,1>, and whose end point is at (0, 0, h) and has
117 * a perpendicular normal vector of <1,0,0>. 115 * a perpendicular normal vector of <1,0,0>.
118 */ 116 */
119 kRoundedIn 117 kRoundedIn
120 }; 118 };
121 /** Returns a normal source that generates a bevel for the given shape. UNIM PLEMENTED: Will 119 /** Returns a normal source that generates a bevel for the given shape. UNIM PLEMENTED: Will
122 return straight-up normals only. 120 return straight-up normals only.
123 121
124 @param type the type of bevel to add 122 @param type the type of bevel to add
125 @param width the width of the bevel, in source space. Must be positive . 123 @param width the width of the bevel, in source space
126 @param height the height of the plateau, in source space. Can be positi ve, negative, 124 @param height the height of the plateau, in source space
127 or zero. A negative height means the simulated bevels slo pe downwards.
128 */ 125 */
129 static sk_sp<SkNormalSource> MakeBevel(BevelType, SkScalar width, SkScalar h eight); 126 static sk_sp<SkNormalSource> MakeBevel(BevelType, SkScalar width, SkScalar h eight);
130 127
131 SK_DEFINE_FLATTENABLE_TYPE(SkNormalSource) 128 SK_DEFINE_FLATTENABLE_TYPE(SkNormalSource)
132 SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP() 129 SK_DECLARE_FLATTENABLE_REGISTRAR_GROUP()
133 }; 130 };
134 131
132 #if SK_SUPPORT_GPU
133 /* GLSLFragmentProcessors for NormalSourceImpls must sub-class this class and ov erride onEmitCode,
134 * and setNormalData calls, as well as all other calls FPs normally override, ex cept for the 2
135 * defined in this superclass.
136 * This class exists to intercept emitCode calls and emit <0, 0, 1> if the FP re quires a distance
137 * vector but the GP doesn't provide it. onSetData calls need to be intercepted too because
138 * uniform handlers will be invalid in subclasses where onEmitCode isn't called.
139 * We don't need to adjust the key here since the use of a given GP (through its class ID already in
140 * the key), will determine what code gets emitted here.
141 */
142 class GLSLNormalFP : public GrGLSLFragmentProcessor {
143 public:
144 GLSLNormalFP()
145 : fDidIntercept(false) {}
146
147 void emitCode(EmitArgs& args) final override {
148 if (args.fFp.usesDistanceVectorField() && !args.fGpImplementsDistanceVec tor) {
149 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
150 fragBuilder->codeAppendf("// GLSLNormalFP intercepted emitCode call, GP does not "
151 "implement required distance vector feature\n");
152 fragBuilder->codeAppendf("%s = vec4(0, 0, 1, 0);", args.fOutputColor );
153
154 fDidIntercept = true;
155 } else {
156 this->onEmitCode(args);
157 }
158 }
159
160 void onSetData(const GrGLSLProgramDataManager& pdman, const GrProcessor& pro c) final override {
161 if (!fDidIntercept) {
162 this->setNormalData(pdman, proc);
163 }
164 }
165
166 protected:
167 virtual void onEmitCode(EmitArgs& args) = 0;
168 virtual void setNormalData(const GrGLSLProgramDataManager& pdman, const GrPr ocessor& proc) = 0;
169
170 private:
171 bool fDidIntercept;
172 };
135 #endif 173 #endif
174
175 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698