| 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 "gl/builders/GrGLProgramBuilder.h" | 8 #include "gl/builders/GrGLProgramBuilder.h" |
| 9 #include "GrConvexPolyEffect.h" | 9 #include "GrConvexPolyEffect.h" |
| 10 | 10 |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 } while (NULL == fp); | 82 } while (NULL == fp); |
| 83 return fp; | 83 return fp; |
| 84 } | 84 } |
| 85 | 85 |
| 86 ////////////////////////////////////////////////////////////////////////////// | 86 ////////////////////////////////////////////////////////////////////////////// |
| 87 | 87 |
| 88 class GLAARectEffect : public GrGLFragmentProcessor { | 88 class GLAARectEffect : public GrGLFragmentProcessor { |
| 89 public: | 89 public: |
| 90 GLAARectEffect(const GrBackendProcessorFactory&, const GrProcessor&); | 90 GLAARectEffect(const GrBackendProcessorFactory&, const GrProcessor&); |
| 91 | 91 |
| 92 virtual void emitCode(GrGLProgramBuilder* builder, | 92 virtual void emitCode(GrGLFPBuilder* builder, |
| 93 const GrFragmentProcessor& fp, | 93 const GrFragmentProcessor& fp, |
| 94 const GrProcessorKey& key, | 94 const GrProcessorKey& key, |
| 95 const char* outputColor, | 95 const char* outputColor, |
| 96 const char* inputColor, | 96 const char* inputColor, |
| 97 const TransformedCoordsArray&, | 97 const TransformedCoordsArray&, |
| 98 const TextureSamplerArray&) SK_OVERRIDE; | 98 const TextureSamplerArray&) SK_OVERRIDE; |
| 99 | 99 |
| 100 static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKe
yBuilder*); | 100 static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKe
yBuilder*); |
| 101 | 101 |
| 102 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; | 102 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; |
| 103 | 103 |
| 104 private: | 104 private: |
| 105 GrGLProgramDataManager::UniformHandle fRectUniform; | 105 GrGLProgramDataManager::UniformHandle fRectUniform; |
| 106 SkRect fPrevRect; | 106 SkRect fPrevRect; |
| 107 typedef GrGLFragmentProcessor INHERITED; | 107 typedef GrGLFragmentProcessor INHERITED; |
| 108 }; | 108 }; |
| 109 | 109 |
| 110 GLAARectEffect::GLAARectEffect(const GrBackendProcessorFactory& factory, | 110 GLAARectEffect::GLAARectEffect(const GrBackendProcessorFactory& factory, |
| 111 const GrProcessor& effect) | 111 const GrProcessor& effect) |
| 112 : INHERITED (factory) { | 112 : INHERITED (factory) { |
| 113 fPrevRect.fLeft = SK_ScalarNaN; | 113 fPrevRect.fLeft = SK_ScalarNaN; |
| 114 } | 114 } |
| 115 | 115 |
| 116 void GLAARectEffect::emitCode(GrGLProgramBuilder* builder, | 116 void GLAARectEffect::emitCode(GrGLFPBuilder* builder, |
| 117 const GrFragmentProcessor& fp, | 117 const GrFragmentProcessor& fp, |
| 118 const GrProcessorKey& key, | 118 const GrProcessorKey& key, |
| 119 const char* outputColor, | 119 const char* outputColor, |
| 120 const char* inputColor, | 120 const char* inputColor, |
| 121 const TransformedCoordsArray&, | 121 const TransformedCoordsArray&, |
| 122 const TextureSamplerArray& samplers) { | 122 const TextureSamplerArray& samplers) { |
| 123 const AARectEffect& aare = fp.cast<AARectEffect>(); | 123 const AARectEffect& aare = fp.cast<AARectEffect>(); |
| 124 const char *rectName; | 124 const char *rectName; |
| 125 // The rect uniform's xyzw refer to (left + 0.5, top + 0.5, right - 0.5, bot
tom - 0.5), | 125 // The rect uniform's xyzw refer to (left + 0.5, top + 0.5, right - 0.5, bot
tom - 0.5), |
| 126 // respectively. | 126 // respectively. |
| 127 fRectUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, | 127 fRectUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
| 128 kVec4f_GrSLType, | 128 kVec4f_GrSLType, |
| 129 "rect", | 129 "rect", |
| 130 &rectName); | 130 &rectName); |
| 131 | 131 |
| 132 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder(); | 132 GrGLFPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); |
| 133 const char* fragmentPos = fsBuilder->fragmentPosition(); | 133 const char* fragmentPos = fsBuilder->fragmentPosition(); |
| 134 if (GrProcessorEdgeTypeIsAA(aare.getEdgeType())) { | 134 if (GrProcessorEdgeTypeIsAA(aare.getEdgeType())) { |
| 135 // The amount of coverage removed in x and y by the edges is computed as
a pair of negative | 135 // The amount of coverage removed in x and y by the edges is computed as
a pair of negative |
| 136 // numbers, xSub and ySub. | 136 // numbers, xSub and ySub. |
| 137 fsBuilder->codeAppend("\t\tfloat xSub, ySub;\n"); | 137 fsBuilder->codeAppend("\t\tfloat xSub, ySub;\n"); |
| 138 fsBuilder->codeAppendf("\t\txSub = min(%s.x - %s.x, 0.0);\n", fragmentPo
s, rectName); | 138 fsBuilder->codeAppendf("\t\txSub = min(%s.x - %s.x, 0.0);\n", fragmentPo
s, rectName); |
| 139 fsBuilder->codeAppendf("\t\txSub += min(%s.z - %s.x, 0.0);\n", rectName,
fragmentPos); | 139 fsBuilder->codeAppendf("\t\txSub += min(%s.z - %s.x, 0.0);\n", rectName,
fragmentPos); |
| 140 fsBuilder->codeAppendf("\t\tySub = min(%s.y - %s.y, 0.0);\n", fragmentPo
s, rectName); | 140 fsBuilder->codeAppendf("\t\tySub = min(%s.y - %s.y, 0.0);\n", fragmentPo
s, rectName); |
| 141 fsBuilder->codeAppendf("\t\tySub += min(%s.w - %s.y, 0.0);\n", rectName,
fragmentPos); | 141 fsBuilder->codeAppendf("\t\tySub += min(%s.w - %s.y, 0.0);\n", rectName,
fragmentPos); |
| 142 // Now compute coverage in x and y and multiply them to get the fraction
of the pixel | 142 // Now compute coverage in x and y and multiply them to get the fraction
of the pixel |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 176 const GrBackendFragmentProcessorFactory& AARectEffect::getFactory() const { | 176 const GrBackendFragmentProcessorFactory& AARectEffect::getFactory() const { |
| 177 return GrTBackendFragmentProcessorFactory<AARectEffect>::getInstance(); | 177 return GrTBackendFragmentProcessorFactory<AARectEffect>::getInstance(); |
| 178 } | 178 } |
| 179 | 179 |
| 180 ////////////////////////////////////////////////////////////////////////////// | 180 ////////////////////////////////////////////////////////////////////////////// |
| 181 | 181 |
| 182 class GrGLConvexPolyEffect : public GrGLFragmentProcessor { | 182 class GrGLConvexPolyEffect : public GrGLFragmentProcessor { |
| 183 public: | 183 public: |
| 184 GrGLConvexPolyEffect(const GrBackendProcessorFactory&, const GrProcessor&); | 184 GrGLConvexPolyEffect(const GrBackendProcessorFactory&, const GrProcessor&); |
| 185 | 185 |
| 186 virtual void emitCode(GrGLProgramBuilder* builder, | 186 virtual void emitCode(GrGLFPBuilder* builder, |
| 187 const GrFragmentProcessor& fp, | 187 const GrFragmentProcessor& fp, |
| 188 const GrProcessorKey& key, | 188 const GrProcessorKey& key, |
| 189 const char* outputColor, | 189 const char* outputColor, |
| 190 const char* inputColor, | 190 const char* inputColor, |
| 191 const TransformedCoordsArray&, | 191 const TransformedCoordsArray&, |
| 192 const TextureSamplerArray&) SK_OVERRIDE; | 192 const TextureSamplerArray&) SK_OVERRIDE; |
| 193 | 193 |
| 194 static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKe
yBuilder*); | 194 static inline void GenKey(const GrProcessor&, const GrGLCaps&, GrProcessorKe
yBuilder*); |
| 195 | 195 |
| 196 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; | 196 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_O
VERRIDE; |
| 197 | 197 |
| 198 private: | 198 private: |
| 199 GrGLProgramDataManager::UniformHandle fEdgeUniform; | 199 GrGLProgramDataManager::UniformHandle fEdgeUniform; |
| 200 SkScalar fPrevEdges[3 * GrConvexPolyEffect::kMa
xEdges]; | 200 SkScalar fPrevEdges[3 * GrConvexPolyEffect::kMa
xEdges]; |
| 201 typedef GrGLFragmentProcessor INHERITED; | 201 typedef GrGLFragmentProcessor INHERITED; |
| 202 }; | 202 }; |
| 203 | 203 |
| 204 GrGLConvexPolyEffect::GrGLConvexPolyEffect(const GrBackendProcessorFactory& fact
ory, | 204 GrGLConvexPolyEffect::GrGLConvexPolyEffect(const GrBackendProcessorFactory& fact
ory, |
| 205 const GrProcessor&) | 205 const GrProcessor&) |
| 206 : INHERITED (factory) { | 206 : INHERITED (factory) { |
| 207 fPrevEdges[0] = SK_ScalarNaN; | 207 fPrevEdges[0] = SK_ScalarNaN; |
| 208 } | 208 } |
| 209 | 209 |
| 210 void GrGLConvexPolyEffect::emitCode(GrGLProgramBuilder* builder, | 210 void GrGLConvexPolyEffect::emitCode(GrGLFPBuilder* builder, |
| 211 const GrFragmentProcessor& fp, | 211 const GrFragmentProcessor& fp, |
| 212 const GrProcessorKey& key, | 212 const GrProcessorKey& key, |
| 213 const char* outputColor, | 213 const char* outputColor, |
| 214 const char* inputColor, | 214 const char* inputColor, |
| 215 const TransformedCoordsArray&, | 215 const TransformedCoordsArray&, |
| 216 const TextureSamplerArray& samplers) { | 216 const TextureSamplerArray& samplers) { |
| 217 const GrConvexPolyEffect& cpe = fp.cast<GrConvexPolyEffect>(); | 217 const GrConvexPolyEffect& cpe = fp.cast<GrConvexPolyEffect>(); |
| 218 | 218 |
| 219 const char *edgeArrayName; | 219 const char *edgeArrayName; |
| 220 fEdgeUniform = builder->addUniformArray(GrGLProgramBuilder::kFragment_Visibi
lity, | 220 fEdgeUniform = builder->addUniformArray(GrGLProgramBuilder::kFragment_Visibi
lity, |
| 221 kVec3f_GrSLType, | 221 kVec3f_GrSLType, |
| 222 "edges", | 222 "edges", |
| 223 cpe.getEdgeCount(), | 223 cpe.getEdgeCount(), |
| 224 &edgeArrayName); | 224 &edgeArrayName); |
| 225 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder(); | 225 GrGLFPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder(); |
| 226 fsBuilder->codeAppend("\t\tfloat alpha = 1.0;\n"); | 226 fsBuilder->codeAppend("\t\tfloat alpha = 1.0;\n"); |
| 227 fsBuilder->codeAppend("\t\tfloat edge;\n"); | 227 fsBuilder->codeAppend("\t\tfloat edge;\n"); |
| 228 const char* fragmentPos = fsBuilder->fragmentPosition(); | 228 const char* fragmentPos = fsBuilder->fragmentPosition(); |
| 229 for (int i = 0; i < cpe.getEdgeCount(); ++i) { | 229 for (int i = 0; i < cpe.getEdgeCount(); ++i) { |
| 230 fsBuilder->codeAppendf("\t\tedge = dot(%s[%d], vec3(%s.x, %s.y, 1));\n", | 230 fsBuilder->codeAppendf("\t\tedge = dot(%s[%d], vec3(%s.x, %s.y, 1));\n", |
| 231 edgeArrayName, i, fragmentPos, fragmentPos); | 231 edgeArrayName, i, fragmentPos, fragmentPos); |
| 232 if (GrProcessorEdgeTypeIsAA(cpe.getEdgeType())) { | 232 if (GrProcessorEdgeTypeIsAA(cpe.getEdgeType())) { |
| 233 fsBuilder->codeAppend("\t\tedge = clamp(edge, 0.0, 1.0);\n"); | 233 fsBuilder->codeAppend("\t\tedge = clamp(edge, 0.0, 1.0);\n"); |
| 234 } else { | 234 } else { |
| 235 fsBuilder->codeAppend("\t\tedge = edge >= 0.5 ? 1.0 : 0.0;\n"); | 235 fsBuilder->codeAppend("\t\tedge = edge >= 0.5 ? 1.0 : 0.0;\n"); |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 373 } | 373 } |
| 374 | 374 |
| 375 GrFragmentProcessor* fp; | 375 GrFragmentProcessor* fp; |
| 376 do { | 376 do { |
| 377 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>( | 377 GrPrimitiveEdgeType edgeType = static_cast<GrPrimitiveEdgeType>( |
| 378 random->nextULessThan(kGrProcessorEdgeTy
peCnt)); | 378 random->nextULessThan(kGrProcessorEdgeTy
peCnt)); |
| 379 fp = GrConvexPolyEffect::Create(edgeType, count, edges); | 379 fp = GrConvexPolyEffect::Create(edgeType, count, edges); |
| 380 } while (NULL == fp); | 380 } while (NULL == fp); |
| 381 return fp; | 381 return fp; |
| 382 } | 382 } |
| OLD | NEW |