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 |