OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 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 "GrGLSLFragmentShaderBuilder.h" | 8 #include "GrGLSLFragmentShaderBuilder.h" |
9 #include "GrRenderTarget.h" | 9 #include "GrRenderTarget.h" |
10 #include "glsl/GrGLSL.h" | 10 #include "glsl/GrGLSL.h" |
11 #include "glsl/GrGLSLCaps.h" | 11 #include "glsl/GrGLSLCaps.h" |
12 #include "glsl/GrGLSLProgramBuilder.h" | 12 #include "glsl/GrGLSLProgramBuilder.h" |
| 13 #include "glsl/GrGLSLUniformHandler.h" |
13 #include "glsl/GrGLSLVarying.h" | 14 #include "glsl/GrGLSLVarying.h" |
14 | 15 |
15 const char* GrGLSLFragmentShaderBuilder::kDstTextureColorName = "_dstColor"; | 16 const char* GrGLSLFragmentShaderBuilder::kDstTextureColorName = "_dstColor"; |
16 | 17 |
17 static const char* specific_layout_qualifier_name(GrBlendEquation equation) { | 18 static const char* specific_layout_qualifier_name(GrBlendEquation equation) { |
18 SkASSERT(GrBlendEquationIsAdvanced(equation)); | 19 SkASSERT(GrBlendEquationIsAdvanced(equation)); |
19 | 20 |
20 static const char* kLayoutQualifierNames[] = { | 21 static const char* kLayoutQualifierNames[] = { |
21 "blend_support_screen", | 22 "blend_support_screen", |
22 "blend_support_overlay", | 23 "blend_support_overlay", |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 "gl_FragCoord", | 130 "gl_FragCoord", |
130 kDefault_GrSLPrecision, | 131 kDefault_GrSLPrecision, |
131 GrGLSLShaderVar::kUpperLeft_Origin); | 132 GrGLSLShaderVar::kUpperLeft_Origin); |
132 fSetupFragPosition = true; | 133 fSetupFragPosition = true; |
133 } | 134 } |
134 return "gl_FragCoord"; | 135 return "gl_FragCoord"; |
135 } else { | 136 } else { |
136 static const char* kTempName = "tmpXYFragCoord"; | 137 static const char* kTempName = "tmpXYFragCoord"; |
137 static const char* kCoordName = "fragCoordYDown"; | 138 static const char* kCoordName = "fragCoordYDown"; |
138 if (!fSetupFragPosition) { | 139 if (!fSetupFragPosition) { |
139 SkASSERT(!fProgramBuilder->fUniformHandles.fRTHeightUni.isValid()); | |
140 const char* rtHeightName; | 140 const char* rtHeightName; |
141 | 141 |
142 fProgramBuilder->fUniformHandles.fRTHeightUni = | 142 fProgramBuilder->addRTHeightUniform("RTHeight", &rtHeightName); |
143 fProgramBuilder->addFragPosUniform(GrGLSLProgramBuilder::kFr
agment_Visibility, | |
144 kFloat_GrSLType, | |
145 kDefault_GrSLPrecision, | |
146 "RTHeight", | |
147 &rtHeightName); | |
148 | 143 |
149 // The Adreno compiler seems to be very touchy about access to "gl_F
ragCoord". | 144 // The Adreno compiler seems to be very touchy about access to "gl_F
ragCoord". |
150 // Accessing glFragCoord.zw can cause a program to fail to link. Add
itionally, | 145 // Accessing glFragCoord.zw can cause a program to fail to link. Add
itionally, |
151 // depending on the surrounding code, accessing .xy with a uniform i
nvolved can | 146 // depending on the surrounding code, accessing .xy with a uniform i
nvolved can |
152 // do the same thing. Copying gl_FragCoord.xy into a temp vec2 befor
ehand | 147 // do the same thing. Copying gl_FragCoord.xy into a temp vec2 befor
ehand |
153 // (and only accessing .xy) seems to "fix" things. | 148 // (and only accessing .xy) seems to "fix" things. |
154 this->codePrependf("\tvec4 %s = vec4(%s.x, %s - %s.y, 1.0, 1.0);\n", | 149 this->codePrependf("\tvec4 %s = vec4(%s.x, %s - %s.y, 1.0, 1.0);\n", |
155 kCoordName, kTempName, rtHeightName, kTempName); | 150 kCoordName, kTempName, rtHeightName, kTempName); |
156 this->codePrependf("vec2 %s = gl_FragCoord.xy;", kTempName); | 151 this->codePrependf("vec2 %s = gl_FragCoord.xy;", kTempName); |
157 fSetupFragPosition = true; | 152 fSetupFragPosition = true; |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
253 } | 248 } |
254 | 249 |
255 void GrGLSLFragmentBuilder::onAfterChildProcEmitCode() { | 250 void GrGLSLFragmentBuilder::onAfterChildProcEmitCode() { |
256 SkASSERT(fSubstageIndices.count() >= 2); | 251 SkASSERT(fSubstageIndices.count() >= 2); |
257 fSubstageIndices.pop_back(); | 252 fSubstageIndices.pop_back(); |
258 fSubstageIndices.back()++; | 253 fSubstageIndices.back()++; |
259 int removeAt = fMangleString.findLastOf('_'); | 254 int removeAt = fMangleString.findLastOf('_'); |
260 fMangleString.remove(removeAt, fMangleString.size() - removeAt); | 255 fMangleString.remove(removeAt, fMangleString.size() - removeAt); |
261 } | 256 } |
262 | 257 |
OLD | NEW |