| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 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 "SkDither.h" | 8 #include "SkDither.h" |
| 9 #include "SkPerlinNoiseShader2.h" | 9 #include "SkPerlinNoiseShader2.h" |
| 10 #include "SkColorFilter.h" | 10 #include "SkColorFilter.h" |
| 11 #include "SkReadBuffer.h" | 11 #include "SkReadBuffer.h" |
| 12 #include "SkWriteBuffer.h" | 12 #include "SkWriteBuffer.h" |
| 13 #include "SkShader.h" | 13 #include "SkShader.h" |
| 14 #include "SkUnPreMultiply.h" | 14 #include "SkUnPreMultiply.h" |
| 15 #include "SkString.h" | 15 #include "SkString.h" |
| 16 | 16 |
| 17 #if SK_SUPPORT_GPU | 17 #if SK_SUPPORT_GPU |
| 18 #include "GrContext.h" | 18 #include "GrContext.h" |
| 19 #include "GrCoordTransform.h" | 19 #include "GrCoordTransform.h" |
| 20 #include "GrInvariantOutput.h" | 20 #include "GrInvariantOutput.h" |
| 21 #include "SkGr.h" | 21 #include "SkGr.h" |
| 22 #include "effects/GrConstColorProcessor.h" | 22 #include "effects/GrConstColorProcessor.h" |
| 23 #include "gl/GrGLFragmentProcessor.h" | 23 #include "gl/GrGLFragmentProcessor.h" |
| 24 #include "gl/builders/GrGLProgramBuilder.h" | 24 #include "glsl/GrGLSLFragmentShaderBuilder.h" |
| 25 #include "glsl/GrGLSLProgramBuilder.h" |
| 25 #include "glsl/GrGLSLProgramDataManager.h" | 26 #include "glsl/GrGLSLProgramDataManager.h" |
| 26 #endif | 27 #endif |
| 27 | 28 |
| 28 static const int kBlockSize = 256; | 29 static const int kBlockSize = 256; |
| 29 static const int kBlockMask = kBlockSize - 1; | 30 static const int kBlockMask = kBlockSize - 1; |
| 30 static const int kPerlinNoise = 4096; | 31 static const int kPerlinNoise = 4096; |
| 31 static const int kRandMaximum = SK_MaxS32; // 2**31 - 1 | 32 static const int kRandMaximum = SK_MaxS32; // 2**31 - 1 |
| 32 | 33 |
| 33 static uint8_t improved_noise_permutations[] = { | 34 static uint8_t improved_noise_permutations[] = { |
| 34 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 2
25, 140, 36, 103, | 35 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 2
25, 140, 36, 103, |
| (...skipping 714 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 749 kNone_SkFilterQuality); | 750 kNone_SkFilterQuality); |
| 750 } | 751 } |
| 751 | 752 |
| 752 GrGLPerlinNoise2::GrGLPerlinNoise2(const GrProcessor& processor) | 753 GrGLPerlinNoise2::GrGLPerlinNoise2(const GrProcessor& processor) |
| 753 : fType(processor.cast<GrPerlinNoise2Effect>().type()) | 754 : fType(processor.cast<GrPerlinNoise2Effect>().type()) |
| 754 , fStitchTiles(processor.cast<GrPerlinNoise2Effect>().stitchTiles()) | 755 , fStitchTiles(processor.cast<GrPerlinNoise2Effect>().stitchTiles()) |
| 755 , fNumOctaves(processor.cast<GrPerlinNoise2Effect>().numOctaves()) { | 756 , fNumOctaves(processor.cast<GrPerlinNoise2Effect>().numOctaves()) { |
| 756 } | 757 } |
| 757 | 758 |
| 758 void GrGLPerlinNoise2::emitCode(EmitArgs& args) { | 759 void GrGLPerlinNoise2::emitCode(EmitArgs& args) { |
| 759 GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder(); | 760 GrGLSLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder()
; |
| 760 SkString vCoords = fsBuilder->ensureFSCoords2D(args.fCoords, 0); | 761 SkString vCoords = fsBuilder->ensureFSCoords2D(args.fCoords, 0); |
| 761 | 762 |
| 762 fBaseFrequencyUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_
Visibility, | 763 fBaseFrequencyUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragmen
t_Visibility, |
| 763 kVec2f_GrSLType, kDefault_GrSLPrecis
ion, | 764 kVec2f_GrSLType, kDefault_GrSLPrecis
ion, |
| 764 "baseFrequency"); | 765 "baseFrequency"); |
| 765 const char* baseFrequencyUni = args.fBuilder->getUniformCStr(fBaseFrequencyU
ni); | 766 const char* baseFrequencyUni = args.fBuilder->getUniformCStr(fBaseFrequencyU
ni); |
| 766 | 767 |
| 767 const char* stitchDataUni = nullptr; | 768 const char* stitchDataUni = nullptr; |
| 768 if (fStitchTiles) { | 769 if (fStitchTiles) { |
| 769 fStitchDataUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment
_Visibility, | 770 fStitchDataUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragme
nt_Visibility, |
| 770 kVec2f_GrSLType, kDefault_GrSLPreci
sion, | 771 kVec2f_GrSLType, kDefault_GrSLPreci
sion, |
| 771 "stitchData"); | 772 "stitchData"); |
| 772 stitchDataUni = args.fBuilder->getUniformCStr(fStitchDataUni); | 773 stitchDataUni = args.fBuilder->getUniformCStr(fStitchDataUni); |
| 773 } | 774 } |
| 774 | 775 |
| 775 // There are 4 lines, so the center of each line is 1/8, 3/8, 5/8 and 7/8 | 776 // There are 4 lines, so the center of each line is 1/8, 3/8, 5/8 and 7/8 |
| 776 const char* chanCoordR = "0.125"; | 777 const char* chanCoordR = "0.125"; |
| 777 const char* chanCoordG = "0.375"; | 778 const char* chanCoordG = "0.375"; |
| 778 const char* chanCoordB = "0.625"; | 779 const char* chanCoordB = "0.625"; |
| 779 const char* chanCoordA = "0.875"; | 780 const char* chanCoordA = "0.875"; |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 998 // Clamp values | 999 // Clamp values |
| 999 fsBuilder->codeAppendf("\n\t\t%s = clamp(%s, 0.0, 1.0);", args.fOutputColor,
args.fOutputColor); | 1000 fsBuilder->codeAppendf("\n\t\t%s = clamp(%s, 0.0, 1.0);", args.fOutputColor,
args.fOutputColor); |
| 1000 | 1001 |
| 1001 // Pre-multiply the result | 1002 // Pre-multiply the result |
| 1002 fsBuilder->codeAppendf("\n\t\t%s = vec4(%s.rgb * %s.aaa, %s.a);\n", | 1003 fsBuilder->codeAppendf("\n\t\t%s = vec4(%s.rgb * %s.aaa, %s.a);\n", |
| 1003 args.fOutputColor, args.fOutputColor, | 1004 args.fOutputColor, args.fOutputColor, |
| 1004 args.fOutputColor, args.fOutputColor); | 1005 args.fOutputColor, args.fOutputColor); |
| 1005 } | 1006 } |
| 1006 | 1007 |
| 1007 void GrGLPerlinNoise2::GenKey(const GrProcessor& processor, const GrGLSLCaps&, | 1008 void GrGLPerlinNoise2::GenKey(const GrProcessor& processor, const GrGLSLCaps&, |
| 1008 GrProcessorKeyBuilder* b) { | 1009 GrProcessorKeyBuilder* b) { |
| 1009 const GrPerlinNoise2Effect& turbulence = processor.cast<GrPerlinNoise2Effect
>(); | 1010 const GrPerlinNoise2Effect& turbulence = processor.cast<GrPerlinNoise2Effect
>(); |
| 1010 | 1011 |
| 1011 uint32_t key = turbulence.numOctaves(); | 1012 uint32_t key = turbulence.numOctaves(); |
| 1012 | 1013 |
| 1013 key = key << 3; // Make room for next 3 bits | 1014 key = key << 3; // Make room for next 3 bits |
| 1014 | 1015 |
| 1015 switch (turbulence.type()) { | 1016 switch (turbulence.type()) { |
| 1016 case SkPerlinNoiseShader2::kFractalNoise_Type: | 1017 case SkPerlinNoiseShader2::kFractalNoise_Type: |
| 1017 key |= 0x1; | 1018 key |= 0x1; |
| 1018 break; | 1019 break; |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1162 return shader->asFragmentProcessor(d->fContext, | 1163 return shader->asFragmentProcessor(d->fContext, |
| 1163 GrTest::TestMatrix(d->fRandom), nullptr, | 1164 GrTest::TestMatrix(d->fRandom), nullptr, |
| 1164 kNone_SkFilterQuality); | 1165 kNone_SkFilterQuality); |
| 1165 } | 1166 } |
| 1166 | 1167 |
| 1167 GrGLImprovedPerlinNoise::GrGLImprovedPerlinNoise(const GrProcessor& processor) | 1168 GrGLImprovedPerlinNoise::GrGLImprovedPerlinNoise(const GrProcessor& processor) |
| 1168 : fZ(processor.cast<GrImprovedPerlinNoiseEffect>().z()) { | 1169 : fZ(processor.cast<GrImprovedPerlinNoiseEffect>().z()) { |
| 1169 } | 1170 } |
| 1170 | 1171 |
| 1171 void GrGLImprovedPerlinNoise::emitCode(EmitArgs& args) { | 1172 void GrGLImprovedPerlinNoise::emitCode(EmitArgs& args) { |
| 1172 GrGLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder(); | 1173 GrGLSLFragmentBuilder* fsBuilder = args.fBuilder->getFragmentShaderBuilder()
; |
| 1173 SkString vCoords = fsBuilder->ensureFSCoords2D(args.fCoords, 0); | 1174 SkString vCoords = fsBuilder->ensureFSCoords2D(args.fCoords, 0); |
| 1174 | 1175 |
| 1175 fBaseFrequencyUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_
Visibility, | 1176 fBaseFrequencyUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragmen
t_Visibility, |
| 1176 kVec2f_GrSLType, kDefault_GrSLPrecis
ion, | 1177 kVec2f_GrSLType, kDefault_GrSLPrecis
ion, |
| 1177 "baseFrequency"); | 1178 "baseFrequency"); |
| 1178 const char* baseFrequencyUni = args.fBuilder->getUniformCStr(fBaseFrequencyU
ni); | 1179 const char* baseFrequencyUni = args.fBuilder->getUniformCStr(fBaseFrequencyU
ni); |
| 1179 | 1180 |
| 1180 fOctavesUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_Visibi
lity, | 1181 fOctavesUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragment_Visi
bility, |
| 1181 kFloat_GrSLType, kDefault_GrSLPrecision, | 1182 kFloat_GrSLType, kDefault_GrSLPrecision, |
| 1182 "octaves"); | 1183 "octaves"); |
| 1183 const char* octavesUni = args.fBuilder->getUniformCStr(fOctavesUni); | 1184 const char* octavesUni = args.fBuilder->getUniformCStr(fOctavesUni); |
| 1184 | 1185 |
| 1185 fZUni = args.fBuilder->addUniform(GrGLProgramBuilder::kFragment_Visibility, | 1186 fZUni = args.fBuilder->addUniform(GrGLSLProgramBuilder::kFragment_Visibility
, |
| 1186 kFloat_GrSLType, kDefault_GrSLPrecision, | 1187 kFloat_GrSLType, kDefault_GrSLPrecision, |
| 1187 "z"); | 1188 "z"); |
| 1188 const char* zUni = args.fBuilder->getUniformCStr(fZUni); | 1189 const char* zUni = args.fBuilder->getUniformCStr(fZUni); |
| 1189 | 1190 |
| 1190 // fade function | 1191 // fade function |
| 1191 static const GrGLSLShaderVar fadeArgs[] = { | 1192 static const GrGLSLShaderVar fadeArgs[] = { |
| 1192 GrGLSLShaderVar("t", kVec3f_GrSLType) | 1193 GrGLSLShaderVar("t", kVec3f_GrSLType) |
| 1193 }; | 1194 }; |
| 1194 SkString fadeFuncName; | 1195 SkString fadeFuncName; |
| 1195 fsBuilder->emitFunction(kVec3f_GrSLType, "fade", SK_ARRAY_COUNT(fadeArgs), | 1196 fsBuilder->emitFunction(kVec3f_GrSLType, "fade", SK_ARRAY_COUNT(fadeArgs), |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1426 str->append(" seed: "); | 1427 str->append(" seed: "); |
| 1427 str->appendScalar(fSeed); | 1428 str->appendScalar(fSeed); |
| 1428 str->append(" stitch tiles: "); | 1429 str->append(" stitch tiles: "); |
| 1429 str->append(fStitchTiles ? "true " : "false "); | 1430 str->append(fStitchTiles ? "true " : "false "); |
| 1430 | 1431 |
| 1431 this->INHERITED::toString(str); | 1432 this->INHERITED::toString(str); |
| 1432 | 1433 |
| 1433 str->append(")"); | 1434 str->append(")"); |
| 1434 } | 1435 } |
| 1435 #endif | 1436 #endif |
| OLD | NEW |