OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 The Android Open Source Project | 2 * Copyright 2012 The Android Open Source Project |
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 "SkLightingImageFilter.h" | 8 #include "SkLightingImageFilter.h" |
9 #include "SkBitmap.h" | 9 #include "SkBitmap.h" |
10 #include "SkColorPriv.h" | 10 #include "SkColorPriv.h" |
11 #include "SkFlattenableBuffers.h" | 11 #include "SkFlattenableBuffers.h" |
12 #include "SkOrderedReadBuffer.h" | 12 #include "SkOrderedReadBuffer.h" |
13 #include "SkOrderedWriteBuffer.h" | 13 #include "SkOrderedWriteBuffer.h" |
14 #include "SkTypes.h" | 14 #include "SkTypes.h" |
15 | 15 |
16 #if SK_SUPPORT_GPU | 16 #if SK_SUPPORT_GPU |
17 #include "effects/GrSingleTextureEffect.h" | 17 #include "effects/GrSingleTextureEffect.h" |
18 #include "gl/GrGLEffect.h" | 18 #include "gl/GrGLEffect.h" |
19 #include "gl/GrGLEffectMatrix.h" | |
20 #include "GrEffect.h" | 19 #include "GrEffect.h" |
21 #include "GrTBackendEffectFactory.h" | 20 #include "GrTBackendEffectFactory.h" |
22 | 21 |
23 class GrGLDiffuseLightingEffect; | 22 class GrGLDiffuseLightingEffect; |
24 class GrGLSpecularLightingEffect; | 23 class GrGLSpecularLightingEffect; |
25 | 24 |
26 // For brevity | 25 // For brevity |
27 typedef GrGLUniformManager::UniformHandle UniformHandle; | 26 typedef GrGLUniformManager::UniformHandle UniformHandle; |
28 #endif | 27 #endif |
29 | 28 |
(...skipping 1038 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1068 public: | 1067 public: |
1069 GrGLLightingEffect(const GrBackendEffectFactory& factory, | 1068 GrGLLightingEffect(const GrBackendEffectFactory& factory, |
1070 const GrDrawEffect& effect); | 1069 const GrDrawEffect& effect); |
1071 virtual ~GrGLLightingEffect(); | 1070 virtual ~GrGLLightingEffect(); |
1072 | 1071 |
1073 virtual void emitCode(GrGLShaderBuilder*, | 1072 virtual void emitCode(GrGLShaderBuilder*, |
1074 const GrDrawEffect&, | 1073 const GrDrawEffect&, |
1075 EffectKey, | 1074 EffectKey, |
1076 const char* outputColor, | 1075 const char* outputColor, |
1077 const char* inputColor, | 1076 const char* inputColor, |
| 1077 const TransformedCoordsArray&, |
1078 const TextureSamplerArray&) SK_OVERRIDE; | 1078 const TextureSamplerArray&) SK_OVERRIDE; |
1079 | 1079 |
1080 static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&); | 1080 static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&); |
1081 | 1081 |
1082 /** | 1082 /** |
1083 * Subclasses of GrGLLightingEffect must call INHERITED::setData(); | 1083 * Subclasses of GrGLLightingEffect must call INHERITED::setData(); |
1084 */ | 1084 */ |
1085 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER
RIDE; | 1085 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER
RIDE; |
1086 | 1086 |
1087 protected: | 1087 protected: |
1088 virtual void emitLightFunc(GrGLShaderBuilder*, SkString* funcName) = 0; | 1088 virtual void emitLightFunc(GrGLShaderBuilder*, SkString* funcName) = 0; |
1089 | 1089 |
1090 private: | 1090 private: |
1091 typedef GrGLEffect INHERITED; | 1091 typedef GrGLEffect INHERITED; |
1092 | 1092 |
1093 UniformHandle fImageIncrementUni; | 1093 UniformHandle fImageIncrementUni; |
1094 UniformHandle fSurfaceScaleUni; | 1094 UniformHandle fSurfaceScaleUni; |
1095 GrGLLight* fLight; | 1095 GrGLLight* fLight; |
1096 GrGLEffectMatrix fEffectMatrix; | |
1097 }; | 1096 }; |
1098 | 1097 |
1099 /////////////////////////////////////////////////////////////////////////////// | 1098 /////////////////////////////////////////////////////////////////////////////// |
1100 | 1099 |
1101 class GrGLDiffuseLightingEffect : public GrGLLightingEffect { | 1100 class GrGLDiffuseLightingEffect : public GrGLLightingEffect { |
1102 public: | 1101 public: |
1103 GrGLDiffuseLightingEffect(const GrBackendEffectFactory& factory, | 1102 GrGLDiffuseLightingEffect(const GrBackendEffectFactory& factory, |
1104 const GrDrawEffect& drawEffect); | 1103 const GrDrawEffect& drawEffect); |
1105 virtual void emitLightFunc(GrGLShaderBuilder*, SkString* funcName) SK_OVERRI
DE; | 1104 virtual void emitLightFunc(GrGLShaderBuilder*, SkString* funcName) SK_OVERRI
DE; |
1106 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER
RIDE; | 1105 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER
RIDE; |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1189 } | 1188 } |
1190 return GrDiffuseLightingEffect::Create(textures[GrEffectUnitTest::kAlphaText
ureIdx], | 1189 return GrDiffuseLightingEffect::Create(textures[GrEffectUnitTest::kAlphaText
ureIdx], |
1191 light, surfaceScale, matrix, kd); | 1190 light, surfaceScale, matrix, kd); |
1192 } | 1191 } |
1193 | 1192 |
1194 | 1193 |
1195 /////////////////////////////////////////////////////////////////////////////// | 1194 /////////////////////////////////////////////////////////////////////////////// |
1196 | 1195 |
1197 GrGLLightingEffect::GrGLLightingEffect(const GrBackendEffectFactory& factory, | 1196 GrGLLightingEffect::GrGLLightingEffect(const GrBackendEffectFactory& factory, |
1198 const GrDrawEffect& drawEffect) | 1197 const GrDrawEffect& drawEffect) |
1199 : INHERITED(factory) | 1198 : INHERITED(factory) { |
1200 , fEffectMatrix(drawEffect.castEffect<GrLightingEffect>().coordsType()) { | |
1201 const GrLightingEffect& m = drawEffect.castEffect<GrLightingEffect>(); | 1199 const GrLightingEffect& m = drawEffect.castEffect<GrLightingEffect>(); |
1202 fLight = m.light()->createGLLight(); | 1200 fLight = m.light()->createGLLight(); |
1203 } | 1201 } |
1204 | 1202 |
1205 GrGLLightingEffect::~GrGLLightingEffect() { | 1203 GrGLLightingEffect::~GrGLLightingEffect() { |
1206 delete fLight; | 1204 delete fLight; |
1207 } | 1205 } |
1208 | 1206 |
1209 void GrGLLightingEffect::emitCode(GrGLShaderBuilder* builder, | 1207 void GrGLLightingEffect::emitCode(GrGLShaderBuilder* builder, |
1210 const GrDrawEffect&, | 1208 const GrDrawEffect&, |
1211 EffectKey key, | 1209 EffectKey key, |
1212 const char* outputColor, | 1210 const char* outputColor, |
1213 const char* inputColor, | 1211 const char* inputColor, |
| 1212 const TransformedCoordsArray& coords, |
1214 const TextureSamplerArray& samplers) { | 1213 const TextureSamplerArray& samplers) { |
1215 SkString coords; | 1214 SkString coords2D = builder->ensureFSCoords2D(coords, 0); |
1216 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &coords); | |
1217 | 1215 |
1218 fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibi
lity, | 1216 fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibi
lity, |
1219 kVec2f_GrSLType, | 1217 kVec2f_GrSLType, |
1220 "ImageIncrement"); | 1218 "ImageIncrement"); |
1221 fSurfaceScaleUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibili
ty, | 1219 fSurfaceScaleUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibili
ty, |
1222 kFloat_GrSLType, | 1220 kFloat_GrSLType, |
1223 "SurfaceScale"); | 1221 "SurfaceScale"); |
1224 fLight->emitLightColorUniform(builder); | 1222 fLight->emitLightColorUniform(builder); |
1225 SkString lightFunc; | 1223 SkString lightFunc; |
1226 this->emitLightFunc(builder, &lightFunc); | 1224 this->emitLightFunc(builder, &lightFunc); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1265 sobelFuncName.c_str(), | 1263 sobelFuncName.c_str(), |
1266 sobelFuncName.c_str()); | 1264 sobelFuncName.c_str()); |
1267 SkString interiorNormalName; | 1265 SkString interiorNormalName; |
1268 builder->fsEmitFunction(kVec3f_GrSLType, | 1266 builder->fsEmitFunction(kVec3f_GrSLType, |
1269 "interiorNormal", | 1267 "interiorNormal", |
1270 SK_ARRAY_COUNT(gInteriorNormalArgs), | 1268 SK_ARRAY_COUNT(gInteriorNormalArgs), |
1271 gInteriorNormalArgs, | 1269 gInteriorNormalArgs, |
1272 interiorNormalBody.c_str(), | 1270 interiorNormalBody.c_str(), |
1273 &interiorNormalName); | 1271 &interiorNormalName); |
1274 | 1272 |
1275 builder->fsCodeAppendf("\t\tvec2 coord = %s;\n", coords.c_str()); | 1273 builder->fsCodeAppendf("\t\tvec2 coord = %s;\n", coords2D.c_str()); |
1276 builder->fsCodeAppend("\t\tfloat m[9];\n"); | 1274 builder->fsCodeAppend("\t\tfloat m[9];\n"); |
1277 | 1275 |
1278 const char* imgInc = builder->getUniformCStr(fImageIncrementUni); | 1276 const char* imgInc = builder->getUniformCStr(fImageIncrementUni); |
1279 const char* surfScale = builder->getUniformCStr(fSurfaceScaleUni); | 1277 const char* surfScale = builder->getUniformCStr(fSurfaceScaleUni); |
1280 | 1278 |
1281 int index = 0; | 1279 int index = 0; |
1282 for (int dy = -1; dy <= 1; dy++) { | 1280 for (int dy = -1; dy <= 1; dy++) { |
1283 for (int dx = -1; dx <= 1; dx++) { | 1281 for (int dx = -1; dx <= 1; dx++) { |
1284 SkString texCoords; | 1282 SkString texCoords; |
1285 texCoords.appendf("coord + vec2(%d, %d) * %s", dx, dy, imgInc); | 1283 texCoords.appendf("coord + vec2(%d, %d) * %s", dx, dy, imgInc); |
(...skipping 11 matching lines...) Expand all Loading... |
1297 outputColor, lightFunc.c_str(), interiorNormalName.c_
str(), surfScale); | 1295 outputColor, lightFunc.c_str(), interiorNormalName.c_
str(), surfScale); |
1298 fLight->emitLightColor(builder, "surfaceToLight"); | 1296 fLight->emitLightColor(builder, "surfaceToLight"); |
1299 builder->fsCodeAppend(");\n"); | 1297 builder->fsCodeAppend(");\n"); |
1300 SkString modulate; | 1298 SkString modulate; |
1301 GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor); | 1299 GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor); |
1302 builder->fsCodeAppend(modulate.c_str()); | 1300 builder->fsCodeAppend(modulate.c_str()); |
1303 } | 1301 } |
1304 | 1302 |
1305 GrGLEffect::EffectKey GrGLLightingEffect::GenKey(const GrDrawEffect& drawEffect, | 1303 GrGLEffect::EffectKey GrGLLightingEffect::GenKey(const GrDrawEffect& drawEffect, |
1306 const GrGLCaps& caps) { | 1304 const GrGLCaps& caps) { |
1307 const GrLightingEffect& lighting = drawEffect.castEffect<GrLightingEffect>()
; | 1305 return drawEffect.castEffect<GrLightingEffect>().light()->type(); |
1308 EffectKey key = lighting.light()->type(); | |
1309 key <<= GrGLEffectMatrix::kKeyBits; | |
1310 EffectKey matrixKey = GrGLEffectMatrix::GenKey(lighting.getMatrix(), | |
1311 drawEffect, | |
1312 lighting.coordsType(), | |
1313 lighting.texture(0)); | |
1314 return key | matrixKey; | |
1315 } | 1306 } |
1316 | 1307 |
1317 void GrGLLightingEffect::setData(const GrGLUniformManager& uman, | 1308 void GrGLLightingEffect::setData(const GrGLUniformManager& uman, |
1318 const GrDrawEffect& drawEffect) { | 1309 const GrDrawEffect& drawEffect) { |
1319 const GrLightingEffect& lighting = drawEffect.castEffect<GrLightingEffect>()
; | 1310 const GrLightingEffect& lighting = drawEffect.castEffect<GrLightingEffect>()
; |
1320 GrTexture* texture = lighting.texture(0); | 1311 GrTexture* texture = lighting.texture(0); |
1321 float ySign = texture->origin() == kTopLeft_GrSurfaceOrigin ? -1.0f : 1.0f; | 1312 float ySign = texture->origin() == kTopLeft_GrSurfaceOrigin ? -1.0f : 1.0f; |
1322 uman.set2f(fImageIncrementUni, 1.0f / texture->width(), ySign / texture->hei
ght()); | 1313 uman.set2f(fImageIncrementUni, 1.0f / texture->width(), ySign / texture->hei
ght()); |
1323 uman.set1f(fSurfaceScaleUni, lighting.surfaceScale()); | 1314 uman.set1f(fSurfaceScaleUni, lighting.surfaceScale()); |
1324 SkAutoTUnref<SkLight> transformedLight(lighting.light()->transform(lighting.
filterMatrix())); | 1315 SkAutoTUnref<SkLight> transformedLight(lighting.light()->transform(lighting.
filterMatrix())); |
1325 fLight->setData(uman, transformedLight); | 1316 fLight->setData(uman, transformedLight); |
1326 fEffectMatrix.setData(uman, | |
1327 lighting.getMatrix(), | |
1328 drawEffect, | |
1329 lighting.texture(0)); | |
1330 } | 1317 } |
1331 | 1318 |
1332 /////////////////////////////////////////////////////////////////////////////// | 1319 /////////////////////////////////////////////////////////////////////////////// |
1333 | 1320 |
1334 /////////////////////////////////////////////////////////////////////////////// | 1321 /////////////////////////////////////////////////////////////////////////////// |
1335 | 1322 |
1336 GrGLDiffuseLightingEffect::GrGLDiffuseLightingEffect(const GrBackendEffectFactor
y& factory, | 1323 GrGLDiffuseLightingEffect::GrGLDiffuseLightingEffect(const GrBackendEffectFactor
y& factory, |
1337 const GrDrawEffect& drawEff
ect) | 1324 const GrDrawEffect& drawEff
ect) |
1338 : INHERITED(factory, drawEffect) { | 1325 : INHERITED(factory, drawEffect) { |
1339 } | 1326 } |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1572 | 1559 |
1573 #endif | 1560 #endif |
1574 | 1561 |
1575 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) | 1562 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) |
1576 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) | 1563 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) |
1577 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) | 1564 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) |
1578 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDistantLight) | 1565 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDistantLight) |
1579 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkPointLight) | 1566 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkPointLight) |
1580 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpotLight) | 1567 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpotLight) |
1581 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1568 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |