OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 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 "GrDefaultGeoProcFactory.h" | 8 #include "GrDefaultGeoProcFactory.h" |
9 | 9 |
10 #include "gl/builders/GrGLProgramBuilder.h" | 10 #include "gl/builders/GrGLProgramBuilder.h" |
11 #include "gl/GrGLGeometryProcessor.h" | 11 #include "gl/GrGLGeometryProcessor.h" |
12 #include "GrDrawState.h" | 12 #include "GrDrawState.h" |
13 #include "GrTBackendProcessorFactory.h" | 13 #include "GrTBackendProcessorFactory.h" |
14 | 14 |
15 /* | 15 /* |
16 * The default Geometry Processor simply takes position and multiplies it by the
uniform view | 16 * The default Geometry Processor simply takes position and multiplies it by the
uniform view |
17 * matrix. It also leaves coverage untouched. Behind the scenes, we may add per
vertex color or | 17 * matrix. It also leaves coverage untouched. Behind the scenes, we may add per
vertex color or |
18 * local coords. | 18 * local coords. |
19 */ | 19 */ |
20 class DefaultGeoProc : public GrGeometryProcessor { | 20 class DefaultGeoProc : public GrGeometryProcessor { |
21 public: | 21 public: |
22 static GrGeometryProcessor* Create() { | 22 static GrGeometryProcessor* Create(bool hasCoverage) { |
23 GR_CREATE_STATIC_PROCESSOR(gDefaultGeoProc, DefaultGeoProc, ()); | 23 GR_CREATE_STATIC_PROCESSOR(gDefaultGeoProc, DefaultGeoProc, (hasCoverage
)); |
24 return SkRef(gDefaultGeoProc); | 24 return SkRef(gDefaultGeoProc); |
25 } | 25 } |
26 | 26 |
27 static const char* Name() { return "DefaultGeometryProcessor"; } | 27 static const char* Name() { return "DefaultGeometryProcessor"; } |
28 | 28 |
29 virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERR
IDE { | 29 virtual const GrBackendGeometryProcessorFactory& getFactory() const SK_OVERR
IDE { |
30 return GrTBackendGeometryProcessorFactory<DefaultGeoProc>::getInstance()
; | 30 return GrTBackendGeometryProcessorFactory<DefaultGeoProc>::getInstance()
; |
31 } | 31 } |
32 | 32 |
33 class GLProcessor : public GrGLGeometryProcessor { | 33 class GLProcessor : public GrGLGeometryProcessor { |
(...skipping 15 matching lines...) Expand all Loading... |
49 | 49 |
50 static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcess
orKeyBuilder*) {} | 50 static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcess
orKeyBuilder*) {} |
51 | 51 |
52 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&)
SK_OVERRIDE {} | 52 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&)
SK_OVERRIDE {} |
53 | 53 |
54 private: | 54 private: |
55 typedef GrGLGeometryProcessor INHERITED; | 55 typedef GrGLGeometryProcessor INHERITED; |
56 }; | 56 }; |
57 | 57 |
58 private: | 58 private: |
59 DefaultGeoProc() {} | 59 DefaultGeoProc(bool hasCoverageAttribute) : fHasCoverageAttribute(hasCoverag
eAttribute) {} |
60 | 60 |
61 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE { | 61 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE { |
62 return true; | 62 return true; |
63 } | 63 } |
64 | 64 |
65 virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERR
IDE { | 65 virtual void onComputeInvariantOutput(InvariantOutput* inout) const SK_OVERR
IDE { |
66 inout->mulByUnknownAlpha(); | 66 if (fHasCoverageAttribute) { |
| 67 inout->mulByUnknownAlpha(); |
| 68 } else { |
| 69 inout->mulByKnownAlpha(255); |
| 70 } |
67 } | 71 } |
68 | 72 |
69 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; | 73 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; |
70 | 74 |
| 75 bool fHasCoverageAttribute; |
| 76 |
71 typedef GrFragmentProcessor INHERITED; | 77 typedef GrFragmentProcessor INHERITED; |
72 }; | 78 }; |
73 | 79 |
74 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(DefaultGeoProc); | 80 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(DefaultGeoProc); |
75 | 81 |
76 GrGeometryProcessor* DefaultGeoProc::TestCreate(SkRandom* random, | 82 GrGeometryProcessor* DefaultGeoProc::TestCreate(SkRandom* random, |
77 GrContext*, | 83 GrContext*, |
78 const GrDrawTargetCaps& caps, | 84 const GrDrawTargetCaps& caps, |
79 GrTexture*[]) { | 85 GrTexture*[]) { |
80 return DefaultGeoProc::Create(); | 86 return DefaultGeoProc::Create(random->nextBool()); |
81 } | 87 } |
82 | 88 |
83 // We use these arrays to customize our default GP. We only need 4 because we o
mit coverage if | 89 // We use these arrays to customize our default GP. We only need 4 because we o
mit coverage if |
84 // coverage is not requested in the flags to the create function. | 90 // coverage is not requested in the flags to the create function. |
85 GrVertexAttrib kDefaultPositionGeoProc[] = { | 91 GrVertexAttrib kDefaultPositionGeoProc[] = { |
86 { kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBindi
ng }, | 92 { kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBindin
g }, |
87 { kVec4ub_GrVertexAttribType, sizeof(SkPoint), kCoverage_GrVertexAttribBindi
ng }, | 93 { kFloat_GrVertexAttribType, sizeof(SkPoint), kCoverage_GrVertexAttribBindin
g }, |
88 }; | 94 }; |
89 | 95 |
90 GrVertexAttrib kDefaultPosColorGeoProc[] = { | 96 GrVertexAttrib kDefaultPosColorGeoProc[] = { |
91 { kVec2f_GrVertexAttribType, 0, kPosition_G
rVertexAttribBinding }, | 97 { kVec2f_GrVertexAttribType, 0, kPosition_Gr
VertexAttribBinding }, |
92 { kVec4ub_GrVertexAttribType, sizeof(SkPoint), kColor_GrVe
rtexAttribBinding }, | 98 { kVec4ub_GrVertexAttribType, sizeof(SkPoint), kColor_GrVer
texAttribBinding }, |
93 { kVec4ub_GrVertexAttribType, sizeof(SkPoint) + sizeof(GrColor), kCoverage_G
rVertexAttribBinding }, | 99 { kFloat_GrVertexAttribType, sizeof(SkPoint) + sizeof(GrColor), kCoverage_Gr
VertexAttribBinding }, |
94 }; | 100 }; |
95 | 101 |
96 GrVertexAttrib kDefaultPosUVGeoProc[] = { | 102 GrVertexAttrib kDefaultPosLocalCoordGeoProc[] = { |
97 { kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribB
inding }, | 103 { kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBi
nding }, |
98 { kVec2f_GrVertexAttribType, sizeof(SkPoint), kLocalCoord_GrVertexAttri
bBinding }, | 104 { kVec2f_GrVertexAttribType, sizeof(SkPoint), kLocalCoord_GrVertexAttrib
Binding }, |
99 { kVec4ub_GrVertexAttribType, 2 * sizeof(SkPoint), kCoverage_GrVertexAttribB
inding }, | 105 { kFloat_GrVertexAttribType, 2 * sizeof(SkPoint), kCoverage_GrVertexAttribBi
nding }, |
100 }; | 106 }; |
101 | 107 |
102 GrVertexAttrib kDefaultPosColUVGeoProc[] = { | 108 GrVertexAttrib kDefaultPosColLocalCoordGeoProc[] = { |
103 { kVec2f_GrVertexAttribType, 0, kPositi
on_GrVertexAttribBinding }, | 109 { kVec2f_GrVertexAttribType, 0, kPositio
n_GrVertexAttribBinding }, |
104 { kVec4ub_GrVertexAttribType, sizeof(SkPoint), kColor_
GrVertexAttribBinding }, | 110 { kVec4ub_GrVertexAttribType, sizeof(SkPoint), kColor_G
rVertexAttribBinding }, |
105 { kVec2f_GrVertexAttribType, sizeof(SkPoint) + sizeof(GrColor), kLocalC
oord_GrVertexAttribBinding }, | 111 { kVec2f_GrVertexAttribType, sizeof(SkPoint) + sizeof(GrColor), kLocalCo
ord_GrVertexAttribBinding }, |
106 { kVec4ub_GrVertexAttribType, 2 * sizeof(SkPoint) + sizeof(GrColor), kCovera
ge_GrVertexAttribBinding }, | 112 { kFloat_GrVertexAttribType, 2 * sizeof(SkPoint) + sizeof(GrColor), kCoverag
e_GrVertexAttribBinding }, |
107 }; | 113 }; |
108 | 114 |
109 static size_t get_size(GrDefaultGeoProcFactory::GPType flag) { | 115 static size_t get_size(GrDefaultGeoProcFactory::GPType flag) { |
110 switch (flag) { | 116 switch (flag) { |
111 case GrDefaultGeoProcFactory::kPosition_GPType: | 117 case GrDefaultGeoProcFactory::kPosition_GPType: |
112 return GrVertexAttribTypeSize(kVec2f_GrVertexAttribType); | 118 return GrVertexAttribTypeSize(kVec2f_GrVertexAttribType); |
113 case GrDefaultGeoProcFactory::kColor_GPType: | 119 case GrDefaultGeoProcFactory::kColor_GPType: |
114 return GrVertexAttribTypeSize(kVec4ub_GrVertexAttribType); | 120 return GrVertexAttribTypeSize(kVec4ub_GrVertexAttribType); |
115 case GrDefaultGeoProcFactory::kLocalCoord_GPType: | 121 case GrDefaultGeoProcFactory::kLocalCoord_GPType: |
116 return GrVertexAttribTypeSize(kVec2f_GrVertexAttribType); | 122 return GrVertexAttribTypeSize(kVec2f_GrVertexAttribType); |
117 case GrDefaultGeoProcFactory::kCoverage_GPType: | 123 case GrDefaultGeoProcFactory::kCoverage_GPType: |
118 return GrVertexAttribTypeSize(kVec4ub_GrVertexAttribType); | 124 return GrVertexAttribTypeSize(kFloat_GrVertexAttribType); |
119 default: | 125 default: |
120 SkFAIL("Should never get here"); | 126 SkFAIL("Should never get here"); |
121 return 0; | 127 return 0; |
122 } | 128 } |
123 } | 129 } |
124 | 130 |
125 const GrGeometryProcessor* | 131 void GrDefaultGeoProcFactory::SetAttribs(GrDrawState* ds, uint32_t gpTypeFlags)
{ |
126 GrDefaultGeoProcFactory::CreateAndSetAttribs(GrDrawState* ds, uint32_t gpTypeFla
gs) { | |
127 SkASSERT(ds); | 132 SkASSERT(ds); |
128 // always atleast position in the GP | 133 // always atleast position in the GP |
129 size_t size = get_size(kPosition_GPType); | 134 size_t size = get_size(kPosition_GPType); |
130 int count = 1; | 135 int count = 1; |
131 | 136 |
132 bool hasColor = SkToBool(gpTypeFlags & kColor_GPType); | 137 bool hasColor = SkToBool(gpTypeFlags & kColor_GPType); |
133 bool hasLocalCoord = SkToBool(gpTypeFlags & kLocalCoord_GPType); | 138 bool hasLocalCoord = SkToBool(gpTypeFlags & kLocalCoord_GPType); |
134 bool hasCoverage = SkToBool(gpTypeFlags & kCoverage_GPType); | 139 bool hasCoverage = SkToBool(gpTypeFlags & kCoverage_GPType); |
135 | 140 |
136 if (hasColor) { | 141 if (hasColor) { |
137 size += get_size(kColor_GPType); | 142 size += get_size(kColor_GPType); |
138 count++; | 143 count++; |
139 if (hasLocalCoord) { | 144 if (hasLocalCoord) { |
140 size += get_size(kLocalCoord_GPType); | 145 size += get_size(kLocalCoord_GPType); |
141 count++; | 146 count++; |
142 if (hasCoverage) { | 147 if (hasCoverage) { |
143 size += get_size(kCoverage_GPType); | 148 size += get_size(kCoverage_GPType); |
144 count++; | 149 count++; |
145 ds->setVertexAttribs<kDefaultPosColUVGeoProc>(count, size); | 150 ds->setVertexAttribs<kDefaultPosColLocalCoordGeoProc>(count, siz
e); |
146 } else { | 151 } else { |
147 ds->setVertexAttribs<kDefaultPosColUVGeoProc>(count, size); | 152 ds->setVertexAttribs<kDefaultPosColLocalCoordGeoProc>(count, siz
e); |
148 | 153 |
149 } | 154 } |
150 } else { | 155 } else { |
151 if (hasCoverage) { | 156 if (hasCoverage) { |
152 size += get_size(kCoverage_GPType); | 157 size += get_size(kCoverage_GPType); |
153 count++; | 158 count++; |
154 ds->setVertexAttribs<kDefaultPosColorGeoProc>(count, size); | 159 ds->setVertexAttribs<kDefaultPosColorGeoProc>(count, size); |
155 } else { | 160 } else { |
156 ds->setVertexAttribs<kDefaultPosColorGeoProc>(count, size); | 161 ds->setVertexAttribs<kDefaultPosColorGeoProc>(count, size); |
157 } | 162 } |
158 } | 163 } |
159 } else if (hasLocalCoord) { | 164 } else if (hasLocalCoord) { |
160 size += get_size(kLocalCoord_GPType); | 165 size += get_size(kLocalCoord_GPType); |
161 count++; | 166 count++; |
162 if (hasCoverage) { | 167 if (hasCoverage) { |
163 size += get_size(kCoverage_GPType); | 168 size += get_size(kCoverage_GPType); |
164 count++; | 169 count++; |
165 ds->setVertexAttribs<kDefaultPosUVGeoProc>(count, size); | 170 ds->setVertexAttribs<kDefaultPosLocalCoordGeoProc>(count, size); |
166 } else { | 171 } else { |
167 ds->setVertexAttribs<kDefaultPosUVGeoProc>(count, size); | 172 ds->setVertexAttribs<kDefaultPosLocalCoordGeoProc>(count, size); |
168 } | 173 } |
169 } else if (hasCoverage) { | 174 } else if (hasCoverage) { |
170 size += get_size(kCoverage_GPType); | 175 size += get_size(kCoverage_GPType); |
171 count++; | 176 count++; |
172 ds->setVertexAttribs<kDefaultPositionGeoProc>(count, size); | 177 ds->setVertexAttribs<kDefaultPositionGeoProc>(count, size); |
173 } else { | 178 } else { |
174 // Just position | 179 // Just position |
175 ds->setVertexAttribs<kDefaultPositionGeoProc>(count, size); | 180 ds->setVertexAttribs<kDefaultPositionGeoProc>(count, size); |
176 } | 181 } |
177 return DefaultGeoProc::Create(); | |
178 } | 182 } |
179 | 183 |
180 const GrGeometryProcessor* GrDefaultGeoProcFactory::Create() { | 184 const GrGeometryProcessor* |
181 return DefaultGeoProc::Create(); | 185 GrDefaultGeoProcFactory::CreateAndSetAttribs(GrDrawState* ds, uint32_t gpTypeFla
gs) { |
| 186 SetAttribs(ds, gpTypeFlags); |
| 187 |
| 188 bool hasCoverage = SkToBool(gpTypeFlags & kCoverage_GPType); |
| 189 return DefaultGeoProc::Create(hasCoverage); |
182 } | 190 } |
| 191 |
| 192 const GrGeometryProcessor* GrDefaultGeoProcFactory::Create(bool hasAttributeCove
rage) { |
| 193 return DefaultGeoProc::Create(hasAttributeCoverage); |
| 194 } |
OLD | NEW |