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

Side by Side Diff: src/effects/SkLightingImageFilter.cpp

Issue 24853002: Make GPU coord transforms automatic (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: rebase Created 7 years, 2 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 | Annotate | Revision Log
« no previous file with comments | « src/effects/SkDisplacementMapEffect.cpp ('k') | src/effects/SkLumaXfermode.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/effects/SkDisplacementMapEffect.cpp ('k') | src/effects/SkLumaXfermode.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698