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

Unified Diff: src/core/SkShadowShader.cpp

Issue 2287553002: Moved ambient lights out of SkLight's light array (Closed) Base URL: https://skia.googlesource.com/skia@master
Patch Set: made req changes Created 4 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 side-by-side diff with in-line comments
Download patch
Index: src/core/SkShadowShader.cpp
diff --git a/src/core/SkShadowShader.cpp b/src/core/SkShadowShader.cpp
index 49f1b01b32bed14bec12782e514cbe5fa02f3a40..9055fa058db5a717d3a5bb4e3c29f03f5e1fa7bb 100644
--- a/src/core/SkShadowShader.cpp
+++ b/src/core/SkShadowShader.cpp
@@ -111,38 +111,26 @@ public:
const SkShadowParams& params,
GrContext* context) {
- // fuse all ambient lights into a single one
- fAmbientColor.set(0.0f, 0.0f, 0.0f);
+ fAmbientColor = lights->ambientLightColor();
robertphillips 2016/08/26 17:31:28 the old name was more descriptive of what is going
vjiaoblack 2016/08/26 18:10:38 Done.
- fNumNonAmbLights = 0; // count of non-ambient lights
+ fNumLights = 0; // count of non-ambient lights
for (int i = 0; i < lights->numLights(); ++i) {
- if (SkLights::Light::kAmbient_LightType == lights->light(i).type()) {
- fAmbientColor += lights->light(i).color();
- } else if (fNumNonAmbLights < SkShadowShader::kMaxNonAmbientLights) {
- fLightColor[fNumNonAmbLights] = lights->light(i).color();
- if (lights->light(i).type() == SkLights::Light::kPoint_LightType) {
- fLightDirOrPos[fNumNonAmbLights] = lights->light(i).pos();
- fLightIntensity[fNumNonAmbLights] = lights->light(i).intensity();
- } else {
- fLightDirOrPos[fNumNonAmbLights] = lights->light(i).dir();
- fLightIntensity[fNumNonAmbLights] = 0.0f;
- }
- fIsPointLight[fNumNonAmbLights] =
- SkLights::Light::kPoint_LightType == lights->light(i).type();
-
+ if (fNumLights < SkShadowShader::kMaxLights) {
+ fLightColor[fNumLights] = lights->light(i).color();
robertphillips 2016/08/26 17:31:29 Won't this fail an assert ?
vjiaoblack 2016/08/26 18:10:38 Done.
+ fLightDirOrPos[fNumLights] = lights->light(i).dir();
SkImage_Base* shadowMap = ((SkImage_Base*)lights->light(i).getShadowMap());
// gets deleted when the ShadowFP is destroyed, and frees the GrTexture*
- fTexture[fNumNonAmbLights] = sk_sp<GrTexture>(shadowMap->asTextureRef(context,
+ fTexture[fNumLights] = sk_sp<GrTexture>(shadowMap->asTextureRef(context,
GrTextureParams::ClampNoFilter(),
SkSourceGammaTreatment::kIgnore));
- fDepthMapAccess[fNumNonAmbLights].reset(fTexture[fNumNonAmbLights].get());
- this->addTextureAccess(&fDepthMapAccess[fNumNonAmbLights]);
+ fDepthMapAccess[fNumLights].reset(fTexture[fNumLights].get());
+ this->addTextureAccess(&fDepthMapAccess[fNumLights]);
- fDepthMapHeight[fNumNonAmbLights] = shadowMap->height();
- fDepthMapWidth[fNumNonAmbLights] = shadowMap->width();
+ fDepthMapHeight[fNumLights] = shadowMap->height();
+ fDepthMapWidth[fNumLights] = shadowMap->width();
- fNumNonAmbLights++;
+ fNumLights++;
}
}
@@ -165,22 +153,22 @@ public:
GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
const ShadowFP& shadowFP = args.fFp.cast<ShadowFP>();
- SkASSERT(shadowFP.fNumNonAmbLights <= SkShadowShader::kMaxNonAmbientLights);
+ SkASSERT(shadowFP.fNumLights <= SkShadowShader::kMaxLights);
// add uniforms
- int32_t numLights = shadowFP.fNumNonAmbLights;
- SkASSERT(numLights <= SkShadowShader::kMaxNonAmbientLights);
+ int32_t numLights = shadowFP.fNumLights;
+ SkASSERT(numLights <= SkShadowShader::kMaxLights);
int blurAlgorithm = shadowFP.fShadowParams.fType;
- const char* lightDirOrPosUniName[SkShadowShader::kMaxNonAmbientLights] = {nullptr};
- const char* lightColorUniName[SkShadowShader::kMaxNonAmbientLights] = {nullptr};
- const char* lightIntensityUniName[SkShadowShader::kMaxNonAmbientLights] = {nullptr};
+ const char* lightDirOrPosUniName[SkShadowShader::kMaxLights] = {nullptr};
+ const char* lightColorUniName[SkShadowShader::kMaxLights] = {nullptr};
+ const char* lightIntensityUniName[SkShadowShader::kMaxLights] = {nullptr};
- const char* depthMapWidthUniName[SkShadowShader::kMaxNonAmbientLights] = {nullptr};
- const char* depthMapHeightUniName[SkShadowShader::kMaxNonAmbientLights] = {nullptr};
+ const char* depthMapWidthUniName[SkShadowShader::kMaxLights] = {nullptr};
+ const char* depthMapHeightUniName[SkShadowShader::kMaxLights] = {nullptr};
- for (int i = 0; i < shadowFP.fNumNonAmbLights; i++) {
+ for (int i = 0; i < shadowFP.fNumLights; i++) {
SkString lightDirOrPosUniNameStr("lightDir");
lightDirOrPosUniNameStr.appendf("%d", i);
SkString lightColorUniNameStr("lightColor");
@@ -252,7 +240,7 @@ public:
SkString diffuseColor("inDiffuseColor");
this->emitChild(1, nullptr, &diffuseColor, args);
- SkString depthMaps[SkShadowShader::kMaxNonAmbientLights];
+ SkString depthMaps[SkShadowShader::kMaxLights];
// Multiply by 255 to transform from sampler coordinates to world
// coordinates (since 1 channel is 0xFF)
@@ -261,7 +249,7 @@ public:
widthUniName, heightUniName, povDepth.c_str());
// Applies the offset indexing that goes from our view space into the light's space.
- for (int i = 0; i < shadowFP.fNumNonAmbLights; i++) {
+ for (int i = 0; i < shadowFP.fNumLights; i++) {
SkString povCoord("povCoord");
povCoord.appendf("%d", i);
@@ -399,9 +387,9 @@ public:
static void GenKey(const GrProcessor& proc, const GrGLSLCaps&,
GrProcessorKeyBuilder* b) {
const ShadowFP& shadowFP = proc.cast<ShadowFP>();
- b->add32(shadowFP.fNumNonAmbLights);
+ b->add32(shadowFP.fNumLights);
int isPL = 0;
- for (int i = 0; i < SkShadowShader::kMaxNonAmbientLights; i++) {
+ for (int i = 0; i < SkShadowShader::kMaxLights; i++) {
isPL = isPL | ((shadowFP.fIsPointLight[i] ? 1 : 0) << i);
}
b->add32(isPL);
@@ -474,25 +462,25 @@ public:
}
private:
- SkVector3 fLightDirOrPos[SkShadowShader::kMaxNonAmbientLights];
+ SkVector3 fLightDirOrPos[SkShadowShader::kMaxLights];
GrGLSLProgramDataManager::UniformHandle
- fLightDirOrPosUni[SkShadowShader::kMaxNonAmbientLights];
+ fLightDirOrPosUni[SkShadowShader::kMaxLights];
- SkColor3f fLightColor[SkShadowShader::kMaxNonAmbientLights];
+ SkColor3f fLightColor[SkShadowShader::kMaxLights];
GrGLSLProgramDataManager::UniformHandle
- fLightColorUni[SkShadowShader::kMaxNonAmbientLights];
+ fLightColorUni[SkShadowShader::kMaxLights];
- SkScalar fLightIntensity[SkShadowShader::kMaxNonAmbientLights];
+ SkScalar fLightIntensity[SkShadowShader::kMaxLights];
GrGLSLProgramDataManager::UniformHandle
- fLightIntensityUni[SkShadowShader::kMaxNonAmbientLights];
+ fLightIntensityUni[SkShadowShader::kMaxLights];
- int fDepthMapWidth[SkShadowShader::kMaxNonAmbientLights];
+ int fDepthMapWidth[SkShadowShader::kMaxLights];
GrGLSLProgramDataManager::UniformHandle
- fDepthMapWidthUni[SkShadowShader::kMaxNonAmbientLights];
+ fDepthMapWidthUni[SkShadowShader::kMaxLights];
- int fDepthMapHeight[SkShadowShader::kMaxNonAmbientLights];
+ int fDepthMapHeight[SkShadowShader::kMaxLights];
GrGLSLProgramDataManager::UniformHandle
- fDepthMapHeightUni[SkShadowShader::kMaxNonAmbientLights];
+ fDepthMapHeightUni[SkShadowShader::kMaxLights];
int fWidth;
GrGLSLProgramDataManager::UniformHandle fWidthUni;
@@ -517,31 +505,31 @@ public:
void onComputeInvariantOutput(GrInvariantOutput* inout) const override {
inout->mulByUnknownFourComponents();
}
- int32_t numLights() const { return fNumNonAmbLights; }
+ int32_t numLights() const { return fNumLights; }
const SkColor3f& ambientColor() const { return fAmbientColor; }
bool isPointLight(int i) const {
- SkASSERT(i < fNumNonAmbLights);
+ SkASSERT(i < fNumLights);
return fIsPointLight[i];
}
const SkVector3& lightDirOrPos(int i) const {
- SkASSERT(i < fNumNonAmbLights);
+ SkASSERT(i < fNumLights);
return fLightDirOrPos[i];
}
const SkVector3& lightColor(int i) const {
- SkASSERT(i < fNumNonAmbLights);
+ SkASSERT(i < fNumLights);
return fLightColor[i];
}
SkScalar lightIntensity(int i) const {
- SkASSERT(i < fNumNonAmbLights);
+ SkASSERT(i < fNumLights);
return fLightIntensity[i];
}
int depthMapWidth(int i) const {
- SkASSERT(i < fNumNonAmbLights);
+ SkASSERT(i < fNumLights);
return fDepthMapWidth[i];
}
int depthMapHeight(int i) const {
- SkASSERT(i < fNumNonAmbLights);
+ SkASSERT(i < fNumLights);
return fDepthMapHeight[i];
}
int width() const {return fWidth; }
@@ -555,7 +543,7 @@ private:
bool onIsEqual(const GrFragmentProcessor& proc) const override {
const ShadowFP& shadowFP = proc.cast<ShadowFP>();
if (fAmbientColor != shadowFP.fAmbientColor ||
- fNumNonAmbLights != shadowFP.fNumNonAmbLights) {
+ fNumLights != shadowFP.fNumLights) {
return false;
}
@@ -563,7 +551,7 @@ private:
return false;
}
- for (int i = 0; i < fNumNonAmbLights; i++) {
+ for (int i = 0; i < fNumLights; i++) {
if (fLightDirOrPos[i] != shadowFP.fLightDirOrPos[i] ||
fLightColor[i] != shadowFP.fLightColor[i] ||
fLightIntensity[i] != shadowFP.fLightIntensity[i] ||
@@ -580,17 +568,17 @@ private:
return true;
}
- int fNumNonAmbLights;
+ int fNumLights;
- bool fIsPointLight[SkShadowShader::kMaxNonAmbientLights];
- SkVector3 fLightDirOrPos[SkShadowShader::kMaxNonAmbientLights];
- SkColor3f fLightColor[SkShadowShader::kMaxNonAmbientLights];
- SkScalar fLightIntensity[SkShadowShader::kMaxNonAmbientLights];
- GrTextureAccess fDepthMapAccess[SkShadowShader::kMaxNonAmbientLights];
- sk_sp<GrTexture> fTexture[SkShadowShader::kMaxNonAmbientLights];
+ bool fIsPointLight[SkShadowShader::kMaxLights];
+ SkVector3 fLightDirOrPos[SkShadowShader::kMaxLights];
+ SkColor3f fLightColor[SkShadowShader::kMaxLights];
+ SkScalar fLightIntensity[SkShadowShader::kMaxLights];
+ GrTextureAccess fDepthMapAccess[SkShadowShader::kMaxLights];
+ sk_sp<GrTexture> fTexture[SkShadowShader::kMaxLights];
- int fDepthMapWidth[SkShadowShader::kMaxNonAmbientLights];
- int fDepthMapHeight[SkShadowShader::kMaxNonAmbientLights];
+ int fDepthMapWidth[SkShadowShader::kMaxLights];
+ int fDepthMapHeight[SkShadowShader::kMaxLights];
int fHeight;
int fWidth;
@@ -697,27 +685,18 @@ void SkShadowShaderImpl::ShadowShaderContext::shadeSpan(int x, int y,
robertphillips 2016/08/26 17:31:29 Again, where does the ambient contribution get add
vjiaoblack 2016/08/26 18:10:38 right at the beginning?
SkColor3f accum = SkColor3f::Make(0.0f, 0.0f, 0.0f);
// This is all done in linear unpremul color space (each component 0..255.0f though)
+
+ accum.fX += lightShader.fLights->ambientLightColor().fX * SkColorGetR(diffColor);
+ accum.fY += lightShader.fLights->ambientLightColor().fY * SkColorGetG(diffColor);
+ accum.fZ += lightShader.fLights->ambientLightColor().fZ * SkColorGetB(diffColor);
+
for (int l = 0; l < lightShader.fLights->numLights(); ++l) {
const SkLights::Light& light = lightShader.fLights->light(l);
- if (SkLights::Light::kAmbient_LightType == light.type()) {
- accum.fX += light.color().fX * SkColorGetR(diffColor);
- accum.fY += light.color().fY * SkColorGetG(diffColor);
- accum.fZ += light.color().fZ * SkColorGetB(diffColor);
- } else if (SkLights::Light::kDirectional_LightType == light.type()) {
- // scaling by fZ accounts for lighting direction
- accum.fX += light.color().makeScale(light.dir().fZ).fX *
- SkColorGetR(diffColor);
- accum.fY += light.color().makeScale(light.dir().fZ).fY *
- SkColorGetG(diffColor);
- accum.fZ += light.color().makeScale(light.dir().fZ).fZ *
- SkColorGetB(diffColor);
- } else {
- // TODO: do point lights for raster, currently treated like ambient
- accum.fX += light.color().fX * SkColorGetR(diffColor);
- accum.fY += light.color().fY * SkColorGetG(diffColor);
- accum.fZ += light.color().fZ * SkColorGetB(diffColor);
- }
+ // scaling by fZ accounts for lighting direction
+ accum.fX += light.color().makeScale(light.dir().fZ).fX * SkColorGetR(diffColor);
+ accum.fY += light.color().makeScale(light.dir().fZ).fY * SkColorGetG(diffColor);
+ accum.fZ += light.color().makeScale(light.dir().fZ).fZ * SkColorGetB(diffColor);
}
result[i] = convert(accum, SkColorGetA(diffColor));

Powered by Google App Engine
This is Rietveld 408576698