OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 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 #include "GrGLPathProcessor.h" | 8 #include "GrGLPathProcessor.h" |
9 | 9 |
10 #include "GrPathProcessor.h" | 10 #include "GrPathProcessor.h" |
11 #include "GrGLGpu.h" | 11 #include "GrGLGpu.h" |
12 #include "GrGLPathRendering.h" | 12 #include "GrGLPathRendering.h" |
13 | 13 |
14 GrGLPathProcessor::GrGLPathProcessor(const GrPathProcessor&, const GrBatchTracke
r&) | 14 GrGLPathProcessor::GrGLPathProcessor(const GrPathProcessor&, const GrBatchTracke
r&) |
15 : fColor(GrColor_ILLEGAL) {} | 15 : fColor(GrColor_ILLEGAL) {} |
16 | 16 |
17 void GrGLPathProcessor::emitCode(EmitArgs& args) { | 17 void GrGLPathProcessor::emitCode(EmitArgs& args) { |
18 GrGLGPBuilder* pb = args.fPB; | 18 GrGLGPBuilder* pb = args.fPB; |
19 GrGLFragmentBuilder* fs = args.fPB->getFragmentShaderBuilder(); | 19 GrGLFragmentBuilder* fs = args.fPB->getFragmentShaderBuilder(); |
20 const PathBatchTracker& local = args.fBT.cast<PathBatchTracker>(); | 20 const GrPathProcessor& pathProc = args.fGP.cast<GrPathProcessor>(); |
21 | 21 |
22 // emit transforms | 22 // emit transforms |
23 this->emitTransforms(args.fPB, args.fTransformsIn, args.fTransformsOut); | 23 this->emitTransforms(args.fPB, args.fTransformsIn, args.fTransformsOut); |
24 | 24 |
25 // Setup uniform color | 25 // Setup uniform color |
26 if (kUniform_GrGPInput == local.fInputColorType) { | 26 if (pathProc.opts().readsColor()) { |
27 const char* stagedLocalVarName; | 27 const char* stagedLocalVarName; |
28 fColorUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility, | 28 fColorUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
29 kVec4f_GrSLType, | 29 kVec4f_GrSLType, |
30 kDefault_GrSLPrecision, | 30 kDefault_GrSLPrecision, |
31 "Color", | 31 "Color", |
32 &stagedLocalVarName); | 32 &stagedLocalVarName); |
33 fs->codeAppendf("%s = %s;", args.fOutputColor, stagedLocalVarName); | 33 fs->codeAppendf("%s = %s;", args.fOutputColor, stagedLocalVarName); |
34 } | 34 } |
35 | 35 |
36 // setup constant solid coverage | 36 // setup constant solid coverage |
37 if (kAllOnes_GrGPInput == local.fInputCoverageType) { | 37 if (pathProc.opts().readsCoverage()) { |
38 fs->codeAppendf("%s = vec4(1);", args.fOutputCoverage); | 38 fs->codeAppendf("%s = vec4(1);", args.fOutputCoverage); |
39 } | 39 } |
40 } | 40 } |
41 | 41 |
42 void GrGLPathProcessor::GenKey(const GrPathProcessor&, | 42 void GrGLPathProcessor::GenKey(const GrPathProcessor& pathProc, |
43 const GrBatchTracker& bt, | 43 const GrBatchTracker& bt, |
44 const GrGLSLCaps&, | 44 const GrGLSLCaps&, |
45 GrProcessorKeyBuilder* b) { | 45 GrProcessorKeyBuilder* b) { |
46 const PathBatchTracker& local = bt.cast<PathBatchTracker>(); | 46 b->add32(SkToInt(pathProc.opts().readsColor()) | |
47 b->add32(local.fInputColorType | local.fInputCoverageType << 16); | 47 SkToInt(pathProc.opts().readsCoverage()) << 16); |
48 } | 48 } |
49 | 49 |
50 void GrGLPathProcessor::setData(const GrGLProgramDataManager& pdman, | 50 void GrGLPathProcessor::setData(const GrGLProgramDataManager& pdman, |
51 const GrPrimitiveProcessor& primProc, | 51 const GrPrimitiveProcessor& primProc, |
52 const GrBatchTracker& bt) { | 52 const GrBatchTracker& bt) { |
53 const PathBatchTracker& local = bt.cast<PathBatchTracker>(); | 53 const GrPathProcessor& pathProc = primProc.cast<GrPathProcessor>(); |
54 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { | 54 if (pathProc.opts().readsColor() && pathProc.color() != fColor) { |
55 GrGLfloat c[4]; | 55 GrGLfloat c[4]; |
56 GrColorToRGBAFloat(local.fColor, c); | 56 GrColorToRGBAFloat(pathProc.color(), c); |
57 pdman.set4fv(fColorUniform, 1, c); | 57 pdman.set4fv(fColorUniform, 1, c); |
58 fColor = local.fColor; | 58 fColor = pathProc.color(); |
59 } | 59 } |
60 } | 60 } |
61 | 61 |
62 void GrGLPathProcessor::emitTransforms(GrGLGPBuilder* pb, const TransformsIn& ti
n, | 62 void GrGLPathProcessor::emitTransforms(GrGLGPBuilder* pb, const TransformsIn& ti
n, |
63 TransformsOut* tout) { | 63 TransformsOut* tout) { |
64 tout->push_back_n(tin.count()); | 64 tout->push_back_n(tin.count()); |
65 fInstalledTransforms.push_back_n(tin.count()); | 65 fInstalledTransforms.push_back_n(tin.count()); |
66 for (int i = 0; i < tin.count(); i++) { | 66 for (int i = 0; i < tin.count(); i++) { |
67 const ProcCoords& coordTransforms = tin[i]; | 67 const ProcCoords& coordTransforms = tin[i]; |
68 fInstalledTransforms[i].push_back_n(coordTransforms.count()); | 68 fInstalledTransforms[i].push_back_n(coordTransforms.count()); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
100 continue; | 100 continue; |
101 } | 101 } |
102 transforms[t].fCurrentValue = transform; | 102 transforms[t].fCurrentValue = transform; |
103 | 103 |
104 SkASSERT(transforms[t].fType == kVec2f_GrSLType || | 104 SkASSERT(transforms[t].fType == kVec2f_GrSLType || |
105 transforms[t].fType == kVec3f_GrSLType); | 105 transforms[t].fType == kVec3f_GrSLType); |
106 unsigned components = transforms[t].fType == kVec2f_GrSLType ? 2 : 3; | 106 unsigned components = transforms[t].fType == kVec2f_GrSLType ? 2 : 3; |
107 pdman.setPathFragmentInputTransform(transforms[t].fHandle.handle(), comp
onents, transform); | 107 pdman.setPathFragmentInputTransform(transforms[t].fHandle.handle(), comp
onents, transform); |
108 } | 108 } |
109 } | 109 } |
OLD | NEW |