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

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

Issue 23018003: Rename GrGLUniformManager to GrGLUniform and ref GrGLUniforms directly Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 4 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/SkMagnifierImageFilter.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" 19 #include "gl/GrGLEffectMatrix.h"
20 #include "GrEffect.h" 20 #include "GrEffect.h"
21 #include "GrTBackendEffectFactory.h" 21 #include "GrTBackendEffectFactory.h"
22 22
23 class GrGLDiffuseLightingEffect; 23 class GrGLDiffuseLightingEffect;
24 class GrGLSpecularLightingEffect; 24 class GrGLSpecularLightingEffect;
25 25
26 // For brevity
27 typedef GrGLUniformManager::UniformHandle UniformHandle;
28 static const UniformHandle kInvalidUniformHandle = GrGLUniformManager::kInvalidU niformHandle;
29 #endif 26 #endif
30 27
31 namespace { 28 namespace {
32 29
33 const SkScalar gOneThird = SkScalarInvert(SkIntToScalar(3)); 30 const SkScalar gOneThird = SkScalarInvert(SkIntToScalar(3));
34 const SkScalar gTwoThirds = SkScalarDiv(SkIntToScalar(2), SkIntToScalar(3)); 31 const SkScalar gTwoThirds = SkScalarDiv(SkIntToScalar(2), SkIntToScalar(3));
35 const SkScalar gOneHalf = SkFloatToScalar(0.5f); 32 const SkScalar gOneHalf = SkFloatToScalar(0.5f);
36 const SkScalar gOneQuarter = SkFloatToScalar(0.25f); 33 const SkScalar gOneQuarter = SkFloatToScalar(0.25f);
37 34
38 #if SK_SUPPORT_GPU 35 #if SK_SUPPORT_GPU
39 void setUniformPoint3(const GrGLUniformManager& uman, UniformHandle uni, const S kPoint3& point) { 36 void setUniformPoint3(const GrGLContext& context, GrGLUniform* uni, const SkPoin t3& point) {
40 GR_STATIC_ASSERT(sizeof(SkPoint3) == 3 * sizeof(GrGLfloat)); 37 GR_STATIC_ASSERT(sizeof(SkPoint3) == 3 * sizeof(GrGLfloat));
41 uman.set3fv(uni, 0, 1, &point.fX); 38 uni->set3fv(context, 0, 1, &point.fX);
42 } 39 }
43 40
44 void setUniformNormal3(const GrGLUniformManager& uman, UniformHandle uni, const SkPoint3& point) { 41 void setUniformNormal3(const GrGLContext& context, GrGLUniform* uni, const SkPoi nt3& point) {
45 setUniformPoint3(uman, uni, SkPoint3(point.fX, point.fY, point.fZ)); 42 setUniformPoint3(context, uni, SkPoint3(point.fX, point.fY, point.fZ));
46 } 43 }
47 #endif 44 #endif
48 45
49 // Shift matrix components to the left, as we advance pixels to the right. 46 // Shift matrix components to the left, as we advance pixels to the right.
50 inline void shiftMatrixLeft(int m[9]) { 47 inline void shiftMatrixLeft(int m[9]) {
51 m[0] = m[1]; 48 m[0] = m[1];
52 m[3] = m[4]; 49 m[3] = m[4];
53 m[6] = m[7]; 50 m[6] = m[7];
54 m[1] = m[2]; 51 m[1] = m[2];
55 m[4] = m[5]; 52 m[4] = m[5];
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 /////////////////////////////////////////////////////////////////////////////// 409 ///////////////////////////////////////////////////////////////////////////////
413 410
414 class GrGLLight { 411 class GrGLLight {
415 public: 412 public:
416 virtual ~GrGLLight() {} 413 virtual ~GrGLLight() {}
417 414
418 /** 415 /**
419 * This is called by GrGLLightingEffect::emitCode() before either of the two virtual functions 416 * This is called by GrGLLightingEffect::emitCode() before either of the two virtual functions
420 * below. It adds a vec3f uniform visible in the FS that represents the cons tant light color. 417 * below. It adds a vec3f uniform visible in the FS that represents the cons tant light color.
421 */ 418 */
422 void emitLightColorUniform(GrGLShaderBuilder*); 419 GrGLShaderBuilder::Uniform* emitLightColorUniform(GrGLShaderBuilder*);
423 420
424 /** 421 /**
425 * These two functions are called from GrGLLightingEffect's emitCode() funct ion. 422 * These two functions are called from GrGLLightingEffect's emitCode() funct ion.
426 * emitSurfaceToLight places an expression in param out that is the vector f rom the surface to 423 * emitSurfaceToLight places an expression in param out that is the vector f rom the surface to
427 * the light. The expression will be used in the FS. emitLightColor writes a n expression into 424 * the light. The expression will be used in the FS. emitLightColor writes a n expression into
428 * the FS that is the color of the light. Either function may add functions and/or uniforms to 425 * the FS that is the color of the light. Either function may add functions and/or uniforms to
429 * the FS. The default of emitLightColor appends the name of the constant li ght color uniform 426 * the FS. The default of emitLightColor appends the name of the constant li ght color uniform
430 * and so this function only needs to be overridden if the light color varie s spatially. 427 * and so this function only needs to be overridden if the light color varie s spatially.
431 */ 428 */
432 virtual void emitSurfaceToLight(GrGLShaderBuilder*, const char* z) = 0; 429 virtual void emitSurfaceToLight(GrGLShaderBuilder*, const char* z) = 0;
433 virtual void emitLightColor(GrGLShaderBuilder*, const char *surfaceToLight); 430 virtual void emitLightColor(GrGLShaderBuilder*, GrGLShaderBuilder::Uniform*, const char *surfaceToLight);
434 431
435 // This is called from GrGLLightingEffect's setData(). Subclasses of GrGLLig ht must call 432 // This is called from GrGLLightingEffect's setData(). Subclasses of GrGLLig ht must call
436 // INHERITED::setData(). 433 // INHERITED::setData().
437 virtual void setData(const GrGLUniformManager&, 434 virtual void setData(const GrGLContext&,
438 const SkLight* light, 435 const SkLight* light,
439 const SkIPoint& offset) const; 436 const SkIPoint& offset) const;
440 437
441 protected: 438 protected:
442 /** 439 /**
443 * Gets the constant light color uniform. Subclasses can use this in their e mitLightColor 440 * Gets the constant light color uniform. Subclasses can use this in their e mitLightColor
444 * function. 441 * function.
445 */ 442 */
446 UniformHandle lightColorUni() const { return fColorUni; } 443 GrGLUniform* lightColorUni() const { return fColorUni; }
447 444
448 private: 445 private:
449 UniformHandle fColorUni; 446 GrGLUniform* fColorUni;
450 447
451 typedef SkRefCnt INHERITED; 448 typedef SkRefCnt INHERITED;
452 }; 449 };
453 450
454 /////////////////////////////////////////////////////////////////////////////// 451 ///////////////////////////////////////////////////////////////////////////////
455 452
456 class GrGLDistantLight : public GrGLLight { 453 class GrGLDistantLight : public GrGLLight {
457 public: 454 public:
458 virtual ~GrGLDistantLight() {} 455 virtual ~GrGLDistantLight() {}
459 virtual void setData(const GrGLUniformManager&, 456 virtual void setData(const GrGLContext&,
460 const SkLight* light, 457 const SkLight* light,
461 const SkIPoint& offset) const SK_OVERRIDE; 458 const SkIPoint& offset) const SK_OVERRIDE;
462 virtual void emitSurfaceToLight(GrGLShaderBuilder*, const char* z) SK_OVERRI DE; 459 virtual void emitSurfaceToLight(GrGLShaderBuilder*, const char* z) SK_OVERRI DE;
463 460
464 private: 461 private:
465 typedef GrGLLight INHERITED; 462 typedef GrGLLight INHERITED;
466 UniformHandle fDirectionUni; 463 GrGLUniform* fDirectionUni;
467 }; 464 };
468 465
469 /////////////////////////////////////////////////////////////////////////////// 466 ///////////////////////////////////////////////////////////////////////////////
470 467
471 class GrGLPointLight : public GrGLLight { 468 class GrGLPointLight : public GrGLLight {
472 public: 469 public:
473 virtual ~GrGLPointLight() {} 470 virtual ~GrGLPointLight() {}
474 virtual void setData(const GrGLUniformManager&, 471 virtual void setData(const GrGLContext&,
475 const SkLight* light, 472 const SkLight* light,
476 const SkIPoint& offset) const SK_OVERRIDE; 473 const SkIPoint& offset) const SK_OVERRIDE;
477 virtual void emitSurfaceToLight(GrGLShaderBuilder*, const char* z) SK_OVERRI DE; 474 virtual void emitSurfaceToLight(GrGLShaderBuilder*, const char* z) SK_OVERRI DE;
478 475
479 private: 476 private:
480 typedef GrGLLight INHERITED; 477 typedef GrGLLight INHERITED;
481 UniformHandle fLocationUni; 478 GrGLUniform* fLocationUni;
482 }; 479 };
483 480
484 /////////////////////////////////////////////////////////////////////////////// 481 ///////////////////////////////////////////////////////////////////////////////
485 482
486 class GrGLSpotLight : public GrGLLight { 483 class GrGLSpotLight : public GrGLLight {
487 public: 484 public:
488 virtual ~GrGLSpotLight() {} 485 virtual ~GrGLSpotLight() {}
489 virtual void setData(const GrGLUniformManager&, 486 virtual void setData(const GrGLContext&,
490 const SkLight* light, 487 const SkLight* light,
491 const SkIPoint& offset) const SK_OVERRIDE; 488 const SkIPoint& offset) const SK_OVERRIDE;
492 virtual void emitSurfaceToLight(GrGLShaderBuilder*, const char* z) SK_OVERRI DE; 489 virtual void emitSurfaceToLight(GrGLShaderBuilder*, const char* z) SK_OVERRI DE;
493 virtual void emitLightColor(GrGLShaderBuilder*, const char *surfaceToLight) SK_OVERRIDE; 490 virtual void emitLightColor(GrGLShaderBuilder*, GrGLShaderBuilder::Uniform*, const char *surfaceToLight) SK_OVERRIDE;
494 491
495 private: 492 private:
496 typedef GrGLLight INHERITED; 493 typedef GrGLLight INHERITED;
497 494
498 SkString fLightColorFunc; 495 SkString fLightColorFunc;
499 UniformHandle fLocationUni; 496 GrGLUniform* fLocationUni;
500 UniformHandle fExponentUni; 497 GrGLUniform* fExponentUni;
501 UniformHandle fCosOuterConeAngleUni; 498 GrGLUniform* fCosOuterConeAngleUni;
502 UniformHandle fCosInnerConeAngleUni; 499 GrGLUniform* fCosInnerConeAngleUni;
503 UniformHandle fConeScaleUni; 500 GrGLUniform* fConeScaleUni;
504 UniformHandle fSUni; 501 GrGLUniform* fSUni;
505 }; 502 };
506 #else 503 #else
507 504
508 class GrGLLight; 505 class GrGLLight;
509 506
510 #endif 507 #endif
511 508
512 }; 509 };
513 510
514 /////////////////////////////////////////////////////////////////////////////// 511 ///////////////////////////////////////////////////////////////////////////////
(...skipping 516 matching lines...) Expand 10 before | Expand all | Expand 10 after
1031 EffectKey, 1028 EffectKey,
1032 const char* outputColor, 1029 const char* outputColor,
1033 const char* inputColor, 1030 const char* inputColor,
1034 const TextureSamplerArray&) SK_OVERRIDE; 1031 const TextureSamplerArray&) SK_OVERRIDE;
1035 1032
1036 static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&); 1033 static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&);
1037 1034
1038 /** 1035 /**
1039 * Subclasses of GrGLLightingEffect must call INHERITED::setData(); 1036 * Subclasses of GrGLLightingEffect must call INHERITED::setData();
1040 */ 1037 */
1041 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER RIDE; 1038 virtual void setData(const GrGLContext&, const GrDrawEffect&) SK_OVERRIDE;
1042 1039
1043 protected: 1040 protected:
1044 virtual void emitLightFunc(GrGLShaderBuilder*, SkString* funcName) = 0; 1041 virtual void emitLightFunc(GrGLShaderBuilder*, SkString* funcName) = 0;
1045 1042
1046 private: 1043 private:
1047 typedef GrGLEffect INHERITED; 1044 typedef GrGLEffect INHERITED;
1048 1045
1049 UniformHandle fImageIncrementUni; 1046 GrGLUniform* fImageIncrementUni;
1050 UniformHandle fSurfaceScaleUni; 1047 GrGLUniform* fSurfaceScaleUni;
1051 GrGLLight* fLight; 1048 GrGLLight* fLight;
1052 GrGLEffectMatrix fEffectMatrix; 1049 GrGLEffectMatrix fEffectMatrix;
1053 }; 1050 };
1054 1051
1055 /////////////////////////////////////////////////////////////////////////////// 1052 ///////////////////////////////////////////////////////////////////////////////
1056 1053
1057 class GrGLDiffuseLightingEffect : public GrGLLightingEffect { 1054 class GrGLDiffuseLightingEffect : public GrGLLightingEffect {
1058 public: 1055 public:
1059 GrGLDiffuseLightingEffect(const GrBackendEffectFactory& factory, 1056 GrGLDiffuseLightingEffect(const GrBackendEffectFactory& factory,
1060 const GrDrawEffect& drawEffect); 1057 const GrDrawEffect& drawEffect);
1061 virtual void emitLightFunc(GrGLShaderBuilder*, SkString* funcName) SK_OVERRI DE; 1058 virtual void emitLightFunc(GrGLShaderBuilder*, SkString* funcName) SK_OVERRI DE;
1062 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER RIDE; 1059 virtual void setData(const GrGLContext&, const GrDrawEffect&) SK_OVERRIDE;
1063 1060
1064 private: 1061 private:
1065 typedef GrGLLightingEffect INHERITED; 1062 typedef GrGLLightingEffect INHERITED;
1066 1063
1067 UniformHandle fKDUni; 1064 GrGLUniform* fKDUni;
1068 }; 1065 };
1069 1066
1070 /////////////////////////////////////////////////////////////////////////////// 1067 ///////////////////////////////////////////////////////////////////////////////
1071 1068
1072 class GrGLSpecularLightingEffect : public GrGLLightingEffect { 1069 class GrGLSpecularLightingEffect : public GrGLLightingEffect {
1073 public: 1070 public:
1074 GrGLSpecularLightingEffect(const GrBackendEffectFactory& factory, 1071 GrGLSpecularLightingEffect(const GrBackendEffectFactory& factory,
1075 const GrDrawEffect& effect); 1072 const GrDrawEffect& effect);
1076 virtual void emitLightFunc(GrGLShaderBuilder*, SkString* funcName) SK_OVERRI DE; 1073 virtual void emitLightFunc(GrGLShaderBuilder*, SkString* funcName) SK_OVERRI DE;
1077 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER RIDE; 1074 virtual void setData(const GrGLContext&, const GrDrawEffect&) SK_OVERRIDE;
1078 1075
1079 private: 1076 private:
1080 typedef GrGLLightingEffect INHERITED; 1077 typedef GrGLLightingEffect INHERITED;
1081 1078
1082 UniformHandle fKSUni; 1079 GrGLUniform* fKSUni;
1083 UniformHandle fShininessUni; 1080 GrGLUniform* fShininessUni;
1084 }; 1081 };
1085 1082
1086 /////////////////////////////////////////////////////////////////////////////// 1083 ///////////////////////////////////////////////////////////////////////////////
1087 1084
1088 GrLightingEffect::GrLightingEffect(GrTexture* texture, 1085 GrLightingEffect::GrLightingEffect(GrTexture* texture,
1089 const SkLight* light, 1086 const SkLight* light,
1090 SkScalar surfaceScale, 1087 SkScalar surfaceScale,
1091 const SkIPoint& offset) 1088 const SkIPoint& offset)
1092 : INHERITED(texture, MakeDivByTextureWHMatrix(texture)) 1089 : INHERITED(texture, MakeDivByTextureWHMatrix(texture))
1093 , fLight(light) 1090 , fLight(light)
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1143 return GrDiffuseLightingEffect::Create(textures[GrEffectUnitTest::kAlphaText ureIdx], 1140 return GrDiffuseLightingEffect::Create(textures[GrEffectUnitTest::kAlphaText ureIdx],
1144 light, surfaceScale, offset, kd); 1141 light, surfaceScale, offset, kd);
1145 } 1142 }
1146 1143
1147 1144
1148 /////////////////////////////////////////////////////////////////////////////// 1145 ///////////////////////////////////////////////////////////////////////////////
1149 1146
1150 GrGLLightingEffect::GrGLLightingEffect(const GrBackendEffectFactory& factory, 1147 GrGLLightingEffect::GrGLLightingEffect(const GrBackendEffectFactory& factory,
1151 const GrDrawEffect& drawEffect) 1148 const GrDrawEffect& drawEffect)
1152 : INHERITED(factory) 1149 : INHERITED(factory)
1153 , fImageIncrementUni(kInvalidUniformHandle) 1150 , fImageIncrementUni(NULL)
1154 , fSurfaceScaleUni(kInvalidUniformHandle) 1151 , fSurfaceScaleUni(NULL)
1155 , fEffectMatrix(drawEffect.castEffect<GrLightingEffect>().coordsType()) { 1152 , fEffectMatrix(drawEffect.castEffect<GrLightingEffect>().coordsType()) {
1156 const GrLightingEffect& m = drawEffect.castEffect<GrLightingEffect>(); 1153 const GrLightingEffect& m = drawEffect.castEffect<GrLightingEffect>();
1157 fLight = m.light()->createGLLight(); 1154 fLight = m.light()->createGLLight();
1158 } 1155 }
1159 1156
1160 GrGLLightingEffect::~GrGLLightingEffect() { 1157 GrGLLightingEffect::~GrGLLightingEffect() {
1161 delete fLight; 1158 delete fLight;
1162 } 1159 }
1163 1160
1164 void GrGLLightingEffect::emitCode(GrGLShaderBuilder* builder, 1161 void GrGLLightingEffect::emitCode(GrGLShaderBuilder* builder,
1165 const GrDrawEffect&, 1162 const GrDrawEffect&,
1166 EffectKey key, 1163 EffectKey key,
1167 const char* outputColor, 1164 const char* outputColor,
1168 const char* inputColor, 1165 const char* inputColor,
1169 const TextureSamplerArray& samplers) { 1166 const TextureSamplerArray& samplers) {
1170 const char* coords; 1167 const char* coords;
1171 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &coords); 1168 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &coords);
1172 1169
1173 fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_Shader Type, 1170 GrGLShaderBuilder::Uniform* imageIncrementUni =
1174 kVec2f_GrSLType, 1171 builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kVec2f_GrSL Type,
1175 "ImageIncrement"); 1172 "ImageIncrement");
1176 fSurfaceScaleUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderTy pe, 1173 fImageIncrementUni = imageIncrementUni->glUniform();
1177 kFloat_GrSLType, 1174
1178 "SurfaceScale"); 1175 GrGLShaderBuilder::Uniform* surfaceScaleUni =
1179 fLight->emitLightColorUniform(builder); 1176 builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kFloat_GrSL Type, "SurfaceScale");
1177 fSurfaceScaleUni = surfaceScaleUni->glUniform();
1178
1179 GrGLShaderBuilder::Uniform* lightColorUni = fLight->emitLightColorUniform(bu ilder);
1180 SkString lightFunc; 1180 SkString lightFunc;
1181 this->emitLightFunc(builder, &lightFunc); 1181 this->emitLightFunc(builder, &lightFunc);
1182 static const GrGLShaderVar gSobelArgs[] = { 1182 static const GrGLShaderVar gSobelArgs[] = {
1183 GrGLShaderVar("a", kFloat_GrSLType), 1183 GrGLShaderVar("a", kFloat_GrSLType),
1184 GrGLShaderVar("b", kFloat_GrSLType), 1184 GrGLShaderVar("b", kFloat_GrSLType),
1185 GrGLShaderVar("c", kFloat_GrSLType), 1185 GrGLShaderVar("c", kFloat_GrSLType),
1186 GrGLShaderVar("d", kFloat_GrSLType), 1186 GrGLShaderVar("d", kFloat_GrSLType),
1187 GrGLShaderVar("e", kFloat_GrSLType), 1187 GrGLShaderVar("e", kFloat_GrSLType),
1188 GrGLShaderVar("f", kFloat_GrSLType), 1188 GrGLShaderVar("f", kFloat_GrSLType),
1189 GrGLShaderVar("scale", kFloat_GrSLType), 1189 GrGLShaderVar("scale", kFloat_GrSLType),
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1226 kVec3f_GrSLType, 1226 kVec3f_GrSLType,
1227 "interiorNormal", 1227 "interiorNormal",
1228 SK_ARRAY_COUNT(gInteriorNormalArgs), 1228 SK_ARRAY_COUNT(gInteriorNormalArgs),
1229 gInteriorNormalArgs, 1229 gInteriorNormalArgs,
1230 interiorNormalBody.c_str(), 1230 interiorNormalBody.c_str(),
1231 &interiorNormalName); 1231 &interiorNormalName);
1232 1232
1233 builder->fsCodeAppendf("\t\tvec2 coord = %s;\n", coords); 1233 builder->fsCodeAppendf("\t\tvec2 coord = %s;\n", coords);
1234 builder->fsCodeAppend("\t\tfloat m[9];\n"); 1234 builder->fsCodeAppend("\t\tfloat m[9];\n");
1235 1235
1236 const char* imgInc = builder->getUniformCStr(fImageIncrementUni);
1237 const char* surfScale = builder->getUniformCStr(fSurfaceScaleUni);
1238
1239 int index = 0; 1236 int index = 0;
1240 for (int dy = -1; dy <= 1; dy++) { 1237 for (int dy = -1; dy <= 1; dy++) {
1241 for (int dx = -1; dx <= 1; dx++) { 1238 for (int dx = -1; dx <= 1; dx++) {
1242 SkString texCoords; 1239 SkString texCoords;
1243 texCoords.appendf("coord + vec2(%d, %d) * %s", dx, dy, imgInc); 1240 texCoords.appendf("coord + vec2(%d, %d) * %s", dx, dy, imageIncremen tUni->c_str());
1244 builder->fsCodeAppendf("\t\tm[%d] = ", index++); 1241 builder->fsCodeAppendf("\t\tm[%d] = ", index++);
1245 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType , 1242 builder->appendTextureLookup(GrGLShaderBuilder::kFragment_ShaderType ,
1246 samplers[0], 1243 samplers[0],
1247 texCoords.c_str()); 1244 texCoords.c_str());
1248 builder->fsCodeAppend(".a;\n"); 1245 builder->fsCodeAppend(".a;\n");
1249 } 1246 }
1250 } 1247 }
1251 builder->fsCodeAppend("\t\tvec3 surfaceToLight = "); 1248 builder->fsCodeAppend("\t\tvec3 surfaceToLight = ");
1252 SkString arg; 1249 SkString arg;
1253 arg.appendf("%s * m[4]", surfScale); 1250 arg.appendf("%s * m[4]", surfaceScaleUni->c_str());
1254 fLight->emitSurfaceToLight(builder, arg.c_str()); 1251 fLight->emitSurfaceToLight(builder, arg.c_str());
1255 builder->fsCodeAppend(";\n"); 1252 builder->fsCodeAppend(";\n");
1256 builder->fsCodeAppendf("\t\t%s = %s(%s(m, %s), surfaceToLight, ", 1253 builder->fsCodeAppendf("\t\t%s = %s(%s(m, %s), surfaceToLight, ",
1257 outputColor, lightFunc.c_str(), interiorNormalName.c_ str(), surfScale); 1254 outputColor, lightFunc.c_str(), interiorNormalName.c_ str(), surfaceScaleUni->c_str());
1258 fLight->emitLightColor(builder, "surfaceToLight"); 1255 fLight->emitLightColor(builder, lightColorUni, "surfaceToLight");
1259 builder->fsCodeAppend(");\n"); 1256 builder->fsCodeAppend(");\n");
1260 SkString modulate; 1257 SkString modulate;
1261 GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor); 1258 GrGLSLMulVarBy4f(&modulate, 2, outputColor, inputColor);
1262 builder->fsCodeAppend(modulate.c_str()); 1259 builder->fsCodeAppend(modulate.c_str());
1263 } 1260 }
1264 1261
1265 GrGLEffect::EffectKey GrGLLightingEffect::GenKey(const GrDrawEffect& drawEffect, 1262 GrGLEffect::EffectKey GrGLLightingEffect::GenKey(const GrDrawEffect& drawEffect,
1266 const GrGLCaps& caps) { 1263 const GrGLCaps& caps) {
1267 const GrLightingEffect& lighting = drawEffect.castEffect<GrLightingEffect>() ; 1264 const GrLightingEffect& lighting = drawEffect.castEffect<GrLightingEffect>() ;
1268 EffectKey key = lighting.light()->type(); 1265 EffectKey key = lighting.light()->type();
1269 key <<= GrGLEffectMatrix::kKeyBits; 1266 key <<= GrGLEffectMatrix::kKeyBits;
1270 EffectKey matrixKey = GrGLEffectMatrix::GenKey(lighting.getMatrix(), 1267 EffectKey matrixKey = GrGLEffectMatrix::GenKey(lighting.getMatrix(),
1271 drawEffect, 1268 drawEffect,
1272 lighting.coordsType(), 1269 lighting.coordsType(),
1273 lighting.texture(0)); 1270 lighting.texture(0));
1274 return key | matrixKey; 1271 return key | matrixKey;
1275 } 1272 }
1276 1273
1277 void GrGLLightingEffect::setData(const GrGLUniformManager& uman, 1274 void GrGLLightingEffect::setData(const GrGLContext& context,
1278 const GrDrawEffect& drawEffect) { 1275 const GrDrawEffect& drawEffect) {
1279 const GrLightingEffect& lighting = drawEffect.castEffect<GrLightingEffect>() ; 1276 const GrLightingEffect& lighting = drawEffect.castEffect<GrLightingEffect>() ;
1280 GrTexture* texture = lighting.texture(0); 1277 GrTexture* texture = lighting.texture(0);
1281 float ySign = texture->origin() == kTopLeft_GrSurfaceOrigin ? -1.0f : 1.0f; 1278 float ySign = texture->origin() == kTopLeft_GrSurfaceOrigin ? -1.0f : 1.0f;
1282 uman.set2f(fImageIncrementUni, 1.0f / texture->width(), ySign / texture->hei ght()); 1279 fImageIncrementUni->set2f(context, 1.0f / texture->width(), ySign / texture- >height());
1283 uman.set1f(fSurfaceScaleUni, lighting.surfaceScale()); 1280 fSurfaceScaleUni->set1f(context, lighting.surfaceScale());
1284 fLight->setData(uman, lighting.light(), lighting.offset()); 1281 fLight->setData(context, lighting.light(), lighting.offset());
1285 fEffectMatrix.setData(uman, 1282 fEffectMatrix.setData(context,
1286 lighting.getMatrix(), 1283 lighting.getMatrix(),
1287 drawEffect, 1284 drawEffect,
1288 lighting.texture(0)); 1285 lighting.texture(0));
1289 } 1286 }
1290 1287
1291 /////////////////////////////////////////////////////////////////////////////// 1288 ///////////////////////////////////////////////////////////////////////////////
1292 1289
1293 /////////////////////////////////////////////////////////////////////////////// 1290 ///////////////////////////////////////////////////////////////////////////////
1294 1291
1295 GrGLDiffuseLightingEffect::GrGLDiffuseLightingEffect(const GrBackendEffectFactor y& factory, 1292 GrGLDiffuseLightingEffect::GrGLDiffuseLightingEffect(const GrBackendEffectFactor y& factory,
1296 const GrDrawEffect& drawEff ect) 1293 const GrDrawEffect& drawEff ect)
1297 : INHERITED(factory, drawEffect) 1294 : INHERITED(factory, drawEffect)
1298 , fKDUni(kInvalidUniformHandle) { 1295 , fKDUni(NULL) {
1299 } 1296 }
1300 1297
1301 void GrGLDiffuseLightingEffect::emitLightFunc(GrGLShaderBuilder* builder, SkStri ng* funcName) { 1298 void GrGLDiffuseLightingEffect::emitLightFunc(GrGLShaderBuilder* builder, SkStri ng* funcName) {
1302 const char* kd; 1299 const char* kd;
1303 fKDUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, 1300 fKDUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
1304 kFloat_GrSLType, 1301 kFloat_GrSLType,
1305 "KD", 1302 "KD",
1306 &kd); 1303 &kd)->glUniform();
1307 1304
1308 static const GrGLShaderVar gLightArgs[] = { 1305 static const GrGLShaderVar gLightArgs[] = {
1309 GrGLShaderVar("normal", kVec3f_GrSLType), 1306 GrGLShaderVar("normal", kVec3f_GrSLType),
1310 GrGLShaderVar("surfaceToLight", kVec3f_GrSLType), 1307 GrGLShaderVar("surfaceToLight", kVec3f_GrSLType),
1311 GrGLShaderVar("lightColor", kVec3f_GrSLType) 1308 GrGLShaderVar("lightColor", kVec3f_GrSLType)
1312 }; 1309 };
1313 SkString lightBody; 1310 SkString lightBody;
1314 lightBody.appendf("\tfloat colorScale = %s * dot(normal, surfaceToLight);\n" , kd); 1311 lightBody.appendf("\tfloat colorScale = %s * dot(normal, surfaceToLight);\n" , kd);
1315 lightBody.appendf("\treturn vec4(lightColor * clamp(colorScale, 0.0, 1.0), 1 .0);\n"); 1312 lightBody.appendf("\treturn vec4(lightColor * clamp(colorScale, 0.0, 1.0), 1 .0);\n");
1316 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, 1313 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType,
1317 kVec4f_GrSLType, 1314 kVec4f_GrSLType,
1318 "light", 1315 "light",
1319 SK_ARRAY_COUNT(gLightArgs), 1316 SK_ARRAY_COUNT(gLightArgs),
1320 gLightArgs, 1317 gLightArgs,
1321 lightBody.c_str(), 1318 lightBody.c_str(),
1322 funcName); 1319 funcName);
1323 } 1320 }
1324 1321
1325 void GrGLDiffuseLightingEffect::setData(const GrGLUniformManager& uman, 1322 void GrGLDiffuseLightingEffect::setData(const GrGLContext& context,
1326 const GrDrawEffect& drawEffect) { 1323 const GrDrawEffect& drawEffect) {
1327 INHERITED::setData(uman, drawEffect); 1324 INHERITED::setData(context, drawEffect);
1328 const GrDiffuseLightingEffect& diffuse = drawEffect.castEffect<GrDiffuseLigh tingEffect>(); 1325 const GrDiffuseLightingEffect& diffuse = drawEffect.castEffect<GrDiffuseLigh tingEffect>();
1329 uman.set1f(fKDUni, diffuse.kd()); 1326 fKDUni->set1f(context, diffuse.kd());
1330 } 1327 }
1331 1328
1332 /////////////////////////////////////////////////////////////////////////////// 1329 ///////////////////////////////////////////////////////////////////////////////
1333 1330
1334 GrSpecularLightingEffect::GrSpecularLightingEffect(GrTexture* texture, 1331 GrSpecularLightingEffect::GrSpecularLightingEffect(GrTexture* texture,
1335 const SkLight* light, 1332 const SkLight* light,
1336 SkScalar surfaceScale, 1333 SkScalar surfaceScale,
1337 const SkIPoint& offset, 1334 const SkIPoint& offset,
1338 SkScalar ks, 1335 SkScalar ks,
1339 SkScalar shininess) 1336 SkScalar shininess)
(...skipping 25 matching lines...) Expand all
1365 SkAutoTUnref<SkLight> light(create_random_light(random)); 1362 SkAutoTUnref<SkLight> light(create_random_light(random));
1366 SkIPoint offset = SkIPoint::Make(random->nextS(), random->nextS()); 1363 SkIPoint offset = SkIPoint::Make(random->nextS(), random->nextS());
1367 return GrSpecularLightingEffect::Create(textures[GrEffectUnitTest::kAlphaTex tureIdx], 1364 return GrSpecularLightingEffect::Create(textures[GrEffectUnitTest::kAlphaTex tureIdx],
1368 light, surfaceScale, offset, ks, shi niness); 1365 light, surfaceScale, offset, ks, shi niness);
1369 } 1366 }
1370 1367
1371 /////////////////////////////////////////////////////////////////////////////// 1368 ///////////////////////////////////////////////////////////////////////////////
1372 1369
1373 GrGLSpecularLightingEffect::GrGLSpecularLightingEffect(const GrBackendEffectFact ory& factory, 1370 GrGLSpecularLightingEffect::GrGLSpecularLightingEffect(const GrBackendEffectFact ory& factory,
1374 const GrDrawEffect& drawE ffect) 1371 const GrDrawEffect& drawE ffect)
1375 : GrGLLightingEffect(factory, drawEffect) 1372 : INHERITED(factory, drawEffect)
1376 , fKSUni(kInvalidUniformHandle) 1373 , fKSUni(NULL)
1377 , fShininessUni(kInvalidUniformHandle) { 1374 , fShininessUni(NULL) {
1378 } 1375 }
1379 1376
1380 void GrGLSpecularLightingEffect::emitLightFunc(GrGLShaderBuilder* builder, SkStr ing* funcName) { 1377 void GrGLSpecularLightingEffect::emitLightFunc(GrGLShaderBuilder* builder, SkStr ing* funcName) {
1381 const char* ks; 1378 const char* ks;
1382 const char* shininess; 1379 const char* shininess;
1383 1380
1384 fKSUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, 1381 fKSUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
1385 kFloat_GrSLType, "KS", &ks); 1382 kFloat_GrSLType, "KS", &ks)->glUniform();
1386 fShininessUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, 1383 fShininessUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
1387 kFloat_GrSLType, "Shininess", &shininess ); 1384 kFloat_GrSLType, "Shininess", &shininess )->glUniform();
1388 1385
1389 static const GrGLShaderVar gLightArgs[] = { 1386 static const GrGLShaderVar gLightArgs[] = {
1390 GrGLShaderVar("normal", kVec3f_GrSLType), 1387 GrGLShaderVar("normal", kVec3f_GrSLType),
1391 GrGLShaderVar("surfaceToLight", kVec3f_GrSLType), 1388 GrGLShaderVar("surfaceToLight", kVec3f_GrSLType),
1392 GrGLShaderVar("lightColor", kVec3f_GrSLType) 1389 GrGLShaderVar("lightColor", kVec3f_GrSLType)
1393 }; 1390 };
1394 SkString lightBody; 1391 SkString lightBody;
1395 lightBody.appendf("\tvec3 halfDir = vec3(normalize(surfaceToLight + vec3(0, 0, 1)));\n"); 1392 lightBody.appendf("\tvec3 halfDir = vec3(normalize(surfaceToLight + vec3(0, 0, 1)));\n");
1396 lightBody.appendf("\tfloat colorScale = %s * pow(dot(normal, halfDir), %s);\ n", ks, shininess); 1393 lightBody.appendf("\tfloat colorScale = %s * pow(dot(normal, halfDir), %s);\ n", ks, shininess);
1397 lightBody.appendf("\tvec3 color = lightColor * clamp(colorScale, 0.0, 1.0);\ n"); 1394 lightBody.appendf("\tvec3 color = lightColor * clamp(colorScale, 0.0, 1.0);\ n");
1398 lightBody.appendf("\treturn vec4(color, max(max(color.r, color.g), color.b)) ;\n"); 1395 lightBody.appendf("\treturn vec4(color, max(max(color.r, color.g), color.b)) ;\n");
1399 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, 1396 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType,
1400 kVec4f_GrSLType, 1397 kVec4f_GrSLType,
1401 "light", 1398 "light",
1402 SK_ARRAY_COUNT(gLightArgs), 1399 SK_ARRAY_COUNT(gLightArgs),
1403 gLightArgs, 1400 gLightArgs,
1404 lightBody.c_str(), 1401 lightBody.c_str(),
1405 funcName); 1402 funcName);
1406 } 1403 }
1407 1404
1408 void GrGLSpecularLightingEffect::setData(const GrGLUniformManager& uman, 1405 void GrGLSpecularLightingEffect::setData(const GrGLContext& context,
1409 const GrDrawEffect& drawEffect) { 1406 const GrDrawEffect& drawEffect) {
1410 INHERITED::setData(uman, drawEffect); 1407 INHERITED::setData(context, drawEffect);
1411 const GrSpecularLightingEffect& spec = drawEffect.castEffect<GrSpecularLight ingEffect>(); 1408 const GrSpecularLightingEffect& spec = drawEffect.castEffect<GrSpecularLight ingEffect>();
1412 uman.set1f(fKSUni, spec.ks()); 1409 fKSUni->set1f(context, spec.ks());
1413 uman.set1f(fShininessUni, spec.shininess()); 1410 fShininessUni->set1f(context, spec.shininess());
1414 } 1411 }
1415 1412
1416 /////////////////////////////////////////////////////////////////////////////// 1413 ///////////////////////////////////////////////////////////////////////////////
1417 void GrGLLight::emitLightColorUniform(GrGLShaderBuilder* builder) { 1414 GrGLShaderBuilder::Uniform* GrGLLight::emitLightColorUniform(GrGLShaderBuilder* builder) {
1418 fColorUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, 1415 GrGLShaderBuilder::Uniform* colorUni =
1419 kVec3f_GrSLType, "LightColor"); 1416 builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
1417 kVec3f_GrSLType, "LightColor");
1418 fColorUni = colorUni->glUniform();
1419 return colorUni;
1420 } 1420 }
1421 1421
1422 void GrGLLight::emitLightColor(GrGLShaderBuilder* builder, 1422 void GrGLLight::emitLightColor(GrGLShaderBuilder* builder,
1423 GrGLShaderBuilder::Uniform* colorUni,
1423 const char *surfaceToLight) { 1424 const char *surfaceToLight) {
1424 builder->fsCodeAppend(builder->getUniformCStr(this->lightColorUni())); 1425 builder->fsCodeAppend(colorUni->c_str());
1425 } 1426 }
1426 1427
1427 void GrGLLight::setData(const GrGLUniformManager& uman, 1428 void GrGLLight::setData(const GrGLContext& context,
1428 const SkLight* light, 1429 const SkLight* light,
1429 const SkIPoint&) const { 1430 const SkIPoint&) const {
1430 setUniformPoint3(uman, fColorUni, light->color() * SkScalarInvert(SkIntToSca lar(255))); 1431 setUniformPoint3(context, fColorUni, light->color() * SkScalarInvert(SkIntTo Scalar(255)));
1431 } 1432 }
1432 1433
1433 /////////////////////////////////////////////////////////////////////////////// 1434 ///////////////////////////////////////////////////////////////////////////////
1434 1435
1435 void GrGLDistantLight::setData(const GrGLUniformManager& uman, 1436 void GrGLDistantLight::setData(const GrGLContext& context,
1436 const SkLight* light, 1437 const SkLight* light,
1437 const SkIPoint& offset) const { 1438 const SkIPoint& offset) const {
1438 INHERITED::setData(uman, light, offset); 1439 INHERITED::setData(context, light, offset);
1439 SkASSERT(light->type() == SkLight::kDistant_LightType); 1440 SkASSERT(light->type() == SkLight::kDistant_LightType);
1440 const SkDistantLight* distantLight = static_cast<const SkDistantLight*>(ligh t); 1441 const SkDistantLight* distantLight = static_cast<const SkDistantLight*>(ligh t);
1441 setUniformNormal3(uman, fDirectionUni, distantLight->direction()); 1442 setUniformNormal3(context, fDirectionUni, distantLight->direction());
1442 } 1443 }
1443 1444
1444 void GrGLDistantLight::emitSurfaceToLight(GrGLShaderBuilder* builder, const char * z) { 1445 void GrGLDistantLight::emitSurfaceToLight(GrGLShaderBuilder* builder, const char * z) {
1445 const char* dir; 1446 const char* dir;
1446 fDirectionUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kVec3f_GrSLType, 1447 fDirectionUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kVec3f_GrSLType,
1447 "LightDirection", &dir); 1448 "LightDirection", &dir)->glUniform();
1448 builder->fsCodeAppend(dir); 1449 builder->fsCodeAppend(dir);
1449 } 1450 }
1450 1451
1451 /////////////////////////////////////////////////////////////////////////////// 1452 ///////////////////////////////////////////////////////////////////////////////
1452 1453
1453 void GrGLPointLight::setData(const GrGLUniformManager& uman, 1454 void GrGLPointLight::setData(const GrGLContext& context,
1454 const SkLight* light, 1455 const SkLight* light,
1455 const SkIPoint& offset) const { 1456 const SkIPoint& offset) const {
1456 INHERITED::setData(uman, light, offset); 1457 INHERITED::setData(context, light, offset);
1457 SkASSERT(light->type() == SkLight::kPoint_LightType); 1458 SkASSERT(light->type() == SkLight::kPoint_LightType);
1458 const SkPointLight* pointLight = static_cast<const SkPointLight*>(light); 1459 const SkPointLight* pointLight = static_cast<const SkPointLight*>(light);
1459 SkPoint3 location = pointLight->location(); 1460 SkPoint3 location = pointLight->location();
1460 location.fX -= offset.fX; 1461 location.fX -= offset.fX;
1461 location.fY -= offset.fY; 1462 location.fY -= offset.fY;
1462 setUniformPoint3(uman, fLocationUni, location); 1463 setUniformPoint3(context, fLocationUni, location);
1463 } 1464 }
1464 1465
1465 void GrGLPointLight::emitSurfaceToLight(GrGLShaderBuilder* builder, const char* z) { 1466 void GrGLPointLight::emitSurfaceToLight(GrGLShaderBuilder* builder, const char* z) {
1466 const char* loc; 1467 const char* loc;
1467 fLocationUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kVec3f_GrSLType, 1468 fLocationUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kVec3f_GrSLType,
1468 "LightLocation", &loc); 1469 "LightLocation", &loc)->glUniform();
1469 builder->fsCodeAppendf("normalize(%s - vec3(%s.xy, %s))", loc, builder->frag mentPosition(), z); 1470 builder->fsCodeAppendf("normalize(%s - vec3(%s.xy, %s))", loc, builder->frag mentPosition(), z);
1470 } 1471 }
1471 1472
1472 /////////////////////////////////////////////////////////////////////////////// 1473 ///////////////////////////////////////////////////////////////////////////////
1473 1474
1474 void GrGLSpotLight::setData(const GrGLUniformManager& uman, 1475 void GrGLSpotLight::setData(const GrGLContext& context,
1475 const SkLight* light, 1476 const SkLight* light,
1476 const SkIPoint& offset) const { 1477 const SkIPoint& offset) const {
1477 INHERITED::setData(uman, light, offset); 1478 INHERITED::setData(context, light, offset);
1478 SkASSERT(light->type() == SkLight::kSpot_LightType); 1479 SkASSERT(light->type() == SkLight::kSpot_LightType);
1479 const SkSpotLight* spotLight = static_cast<const SkSpotLight *>(light); 1480 const SkSpotLight* spotLight = static_cast<const SkSpotLight *>(light);
1480 SkPoint3 location = spotLight->location(); 1481 SkPoint3 location = spotLight->location();
1481 location.fX -= offset.fX; 1482 location.fX -= offset.fX;
1482 location.fY -= offset.fY; 1483 location.fY -= offset.fY;
1483 setUniformPoint3(uman, fLocationUni, location); 1484 setUniformPoint3(context, fLocationUni, location);
1484 uman.set1f(fExponentUni, spotLight->specularExponent()); 1485 fExponentUni->set1f(context, spotLight->specularExponent());
1485 uman.set1f(fCosInnerConeAngleUni, spotLight->cosInnerConeAngle()); 1486 fCosInnerConeAngleUni->set1f(context, spotLight->cosInnerConeAngle());
1486 uman.set1f(fCosOuterConeAngleUni, spotLight->cosOuterConeAngle()); 1487 fCosOuterConeAngleUni->set1f(context, spotLight->cosOuterConeAngle());
1487 uman.set1f(fConeScaleUni, spotLight->coneScale()); 1488 fConeScaleUni->set1f(context, spotLight->coneScale());
1488 setUniformNormal3(uman, fSUni, spotLight->s()); 1489 setUniformNormal3(context, fSUni, spotLight->s());
1489 } 1490 }
1490 1491
1491 void GrGLSpotLight::emitSurfaceToLight(GrGLShaderBuilder* builder, const char* z ) { 1492 void GrGLSpotLight::emitSurfaceToLight(GrGLShaderBuilder* builder, const char* z ) {
1492 const char* location; 1493 const char* location;
1493 fLocationUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, 1494 fLocationUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
1494 kVec3f_GrSLType, "LightLocation", &locati on); 1495 kVec3f_GrSLType, "LightLocation", &locati on)->glUniform();
1495 builder->fsCodeAppendf("normalize(%s - vec3(%s.xy, %s))", 1496 builder->fsCodeAppendf("normalize(%s - vec3(%s.xy, %s))",
1496 location, builder->fragmentPosition(), z); 1497 location, builder->fragmentPosition(), z);
1497 } 1498 }
1498 1499
1499 void GrGLSpotLight::emitLightColor(GrGLShaderBuilder* builder, 1500 void GrGLSpotLight::emitLightColor(GrGLShaderBuilder* builder,
1501 GrGLShaderBuilder::Uniform* lightUni,
1500 const char *surfaceToLight) { 1502 const char *surfaceToLight) {
1501 1503
1502 const char* color = builder->getUniformCStr(this->lightColorUni()); // creat ed by parent class. 1504 const char* color = lightUni->c_str(); // created by parent class.
1503 1505
1504 const char* exponent; 1506 const char* exponent;
1505 const char* cosInner; 1507 const char* cosInner;
1506 const char* cosOuter; 1508 const char* cosOuter;
1507 const char* coneScale; 1509 const char* coneScale;
1508 const char* s; 1510 const char* s;
1509 fExponentUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, 1511 fExponentUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
1510 kFloat_GrSLType, "Exponent", &exponent); 1512 kFloat_GrSLType, "Exponent", &exponent)-> glUniform();
1511 fCosInnerConeAngleUni = builder->addUniform(GrGLShaderBuilder::kFragment_Sha derType, 1513 fCosInnerConeAngleUni = builder->addUniform(GrGLShaderBuilder::kFragment_Sha derType,
1512 kFloat_GrSLType, "CosInnerConeAn gle", &cosInner); 1514 kFloat_GrSLType, "CosInnerConeAn gle", &cosInner)->glUniform();
1513 fCosOuterConeAngleUni = builder->addUniform(GrGLShaderBuilder::kFragment_Sha derType, 1515 fCosOuterConeAngleUni = builder->addUniform(GrGLShaderBuilder::kFragment_Sha derType,
1514 kFloat_GrSLType, "CosOuterConeAn gle", &cosOuter); 1516 kFloat_GrSLType, "CosOuterConeAn gle", &cosOuter)->glUniform();
1515 fConeScaleUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, 1517 fConeScaleUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
1516 kFloat_GrSLType, "ConeScale", &coneScale ); 1518 kFloat_GrSLType, "ConeScale", &coneScale )->glUniform();
1517 fSUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, 1519 fSUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
1518 kVec3f_GrSLType, "S", &s); 1520 kVec3f_GrSLType, "S", &s)->glUniform();
1519 1521
1520 static const GrGLShaderVar gLightColorArgs[] = { 1522 static const GrGLShaderVar gLightColorArgs[] = {
1521 GrGLShaderVar("surfaceToLight", kVec3f_GrSLType) 1523 GrGLShaderVar("surfaceToLight", kVec3f_GrSLType)
1522 }; 1524 };
1523 SkString lightColorBody; 1525 SkString lightColorBody;
1524 lightColorBody.appendf("\tfloat cosAngle = -dot(surfaceToLight, %s);\n", s); 1526 lightColorBody.appendf("\tfloat cosAngle = -dot(surfaceToLight, %s);\n", s);
1525 lightColorBody.appendf("\tif (cosAngle < %s) {\n", cosOuter); 1527 lightColorBody.appendf("\tif (cosAngle < %s) {\n", cosOuter);
1526 lightColorBody.appendf("\t\treturn vec3(0);\n"); 1528 lightColorBody.appendf("\t\treturn vec3(0);\n");
1527 lightColorBody.appendf("\t}\n"); 1529 lightColorBody.appendf("\t}\n");
1528 lightColorBody.appendf("\tfloat scale = pow(cosAngle, %s);\n", exponent); 1530 lightColorBody.appendf("\tfloat scale = pow(cosAngle, %s);\n", exponent);
(...skipping 15 matching lines...) Expand all
1544 1546
1545 #endif 1547 #endif
1546 1548
1547 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter) 1549 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkLightingImageFilter)
1548 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter) 1550 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDiffuseLightingImageFilter)
1549 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter) 1551 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpecularLightingImageFilter)
1550 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDistantLight) 1552 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkDistantLight)
1551 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkPointLight) 1553 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkPointLight)
1552 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpotLight) 1554 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkSpotLight)
1553 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 1555 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
OLDNEW
« no previous file with comments | « src/effects/SkDisplacementMapEffect.cpp ('k') | src/effects/SkMagnifierImageFilter.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698