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 "gl/GrGLProgram.h" | 8 #include "gl/GrGLProgram.h" |
9 #include "gl/GrGLSLPrettyPrint.h" | 9 #include "gl/GrGLSLPrettyPrint.h" |
10 #include "gl/GrGLUniformHandle.h" | 10 #include "gl/GrGLUniformHandle.h" |
(...skipping 12 matching lines...) Expand all Loading... |
23 | 23 |
24 // number of each input/output type in a single allocation block | 24 // number of each input/output type in a single allocation block |
25 static const int kVarsPerBlock = 8; | 25 static const int kVarsPerBlock = 8; |
26 | 26 |
27 // ES2 FS only guarantees mediump and lowp support | 27 // ES2 FS only guarantees mediump and lowp support |
28 static const GrGLShaderVar::Precision kDefaultFragmentPrecision = GrGLShaderVar:
:kMedium_Precision; | 28 static const GrGLShaderVar::Precision kDefaultFragmentPrecision = GrGLShaderVar:
:kMedium_Precision; |
29 } | 29 } |
30 | 30 |
31 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 31 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
32 | 32 |
33 bool GrGLProgramBuilder::genProgram(const GrGeometryStage* geometryProcessor, | 33 bool GrGLProgramBuilder::genProgram(const GrOptDrawState& optState, |
| 34 const GrGeometryStage* geometryProcessor, |
34 const GrFragmentStage* colorStages[], | 35 const GrFragmentStage* colorStages[], |
35 const GrFragmentStage* coverageStages[]) { | 36 const GrFragmentStage* coverageStages[]) { |
36 const GrGLProgramDesc::KeyHeader& header = this->desc().getHeader(); | 37 const GrGLProgramDesc::KeyHeader& header = this->desc().getHeader(); |
37 | 38 |
38 fFS.emitCodeBeforeEffects(); | 39 fFS.emitCodeBeforeEffects(); |
39 | 40 |
40 /////////////////////////////////////////////////////////////////////////// | 41 /////////////////////////////////////////////////////////////////////////// |
41 // get the initial color and coverage to feed into the first effect in each
effect chain | 42 // get the initial color and coverage to feed into the first effect in each
effect chain |
42 | 43 |
43 GrGLSLExpr4 inputColor; | 44 GrGLSLExpr4 inputColor; |
(...skipping 22 matching lines...) Expand all Loading... |
66 } else if (GrGLProgramDesc::kAllOnes_ColorInput == header.fCoverageInput) { | 67 } else if (GrGLProgramDesc::kAllOnes_ColorInput == header.fCoverageInput) { |
67 inputCoverage = GrGLSLExpr4(1); | 68 inputCoverage = GrGLSLExpr4(1); |
68 } | 69 } |
69 | 70 |
70 // Subclasses drive effect emitting | 71 // Subclasses drive effect emitting |
71 this->createAndEmitEffects(geometryProcessor, colorStages, coverageStages, &
inputColor, | 72 this->createAndEmitEffects(geometryProcessor, colorStages, coverageStages, &
inputColor, |
72 &inputCoverage); | 73 &inputCoverage); |
73 | 74 |
74 fFS.emitCodeAfterEffects(inputColor, inputCoverage); | 75 fFS.emitCodeAfterEffects(inputColor, inputCoverage); |
75 | 76 |
76 if (!this->finish()) { | 77 if (!this->finish(optState)) { |
77 return false; | 78 return false; |
78 } | 79 } |
79 | 80 |
80 return true; | 81 return true; |
81 } | 82 } |
82 | 83 |
83 ////////////////////////////////////////////////////////////////////////////// | 84 ////////////////////////////////////////////////////////////////////////////// |
84 | 85 |
85 GrGLProgramBuilder::GrGLProgramBuilder(GrGpuGL* gpu, | 86 GrGLProgramBuilder::GrGLProgramBuilder(GrGpuGL* gpu, |
86 const GrGLProgramDesc& desc) | 87 const GrGLProgramDesc& desc) |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
220 for (int t = 0; t < numTextures; ++t) { | 221 for (int t = 0; t < numTextures; ++t) { |
221 name.printf("Sampler%d", t); | 222 name.printf("Sampler%d", t); |
222 samplers[t].fUniform = this->addUniform(GrGLProgramBuilder::kFragment_Vi
sibility, | 223 samplers[t].fUniform = this->addUniform(GrGLProgramBuilder::kFragment_Vi
sibility, |
223 kSampler2D_GrSLType, | 224 kSampler2D_GrSLType, |
224 name.c_str()); | 225 name.c_str()); |
225 SkNEW_APPEND_TO_TARRAY(outSamplers, GrGLProcessor::TextureSampler, | 226 SkNEW_APPEND_TO_TARRAY(outSamplers, GrGLProcessor::TextureSampler, |
226 (samplers[t].fUniform, effect.textureAccess(t))); | 227 (samplers[t].fUniform, effect.textureAccess(t))); |
227 } | 228 } |
228 } | 229 } |
229 | 230 |
230 bool GrGLProgramBuilder::finish() { | 231 bool GrGLProgramBuilder::finish(const GrOptDrawState& optState) { |
231 SkASSERT(0 == fProgramID); | 232 SkASSERT(0 == fProgramID); |
232 GL_CALL_RET(fProgramID, CreateProgram()); | 233 GL_CALL_RET(fProgramID, CreateProgram()); |
233 if (!fProgramID) { | 234 if (!fProgramID) { |
234 return false; | 235 return false; |
235 } | 236 } |
236 | 237 |
237 SkTDArray<GrGLuint> shadersToDelete; | 238 SkTDArray<GrGLuint> shadersToDelete; |
238 | 239 |
239 if (!this->compileAndAttachShaders(fProgramID, &shadersToDelete)) { | 240 if (!this->compileAndAttachShaders(fProgramID, &shadersToDelete)) { |
240 GL_CALL(DeleteProgram(fProgramID)); | 241 GL_CALL(DeleteProgram(fProgramID)); |
241 return false; | 242 return false; |
242 } | 243 } |
243 | 244 |
244 this->bindProgramLocations(fProgramID); | 245 this->bindProgramLocations(optState, fProgramID); |
245 | 246 |
246 GL_CALL(LinkProgram(fProgramID)); | 247 GL_CALL(LinkProgram(fProgramID)); |
247 | 248 |
248 // Calling GetProgramiv is expensive in Chromium. Assume success in release
builds. | 249 // Calling GetProgramiv is expensive in Chromium. Assume success in release
builds. |
249 bool checkLinked = !fGpu->ctxInfo().isChromium(); | 250 bool checkLinked = !fGpu->ctxInfo().isChromium(); |
250 #ifdef SK_DEBUG | 251 #ifdef SK_DEBUG |
251 checkLinked = true; | 252 checkLinked = true; |
252 #endif | 253 #endif |
253 if (checkLinked) { | 254 if (checkLinked) { |
254 GrGLint linked = GR_GL_INIT_ZERO; | 255 GrGLint linked = GR_GL_INIT_ZERO; |
(...skipping 26 matching lines...) Expand all Loading... |
281 } | 282 } |
282 | 283 |
283 return true; | 284 return true; |
284 } | 285 } |
285 | 286 |
286 bool GrGLProgramBuilder::compileAndAttachShaders(GrGLuint programId, | 287 bool GrGLProgramBuilder::compileAndAttachShaders(GrGLuint programId, |
287 SkTDArray<GrGLuint>* shaderIds)
const { | 288 SkTDArray<GrGLuint>* shaderIds)
const { |
288 return fFS.compileAndAttachShaders(programId, shaderIds); | 289 return fFS.compileAndAttachShaders(programId, shaderIds); |
289 } | 290 } |
290 | 291 |
291 void GrGLProgramBuilder::bindProgramLocations(GrGLuint programId) { | 292 void GrGLProgramBuilder::bindProgramLocations(const GrOptDrawState& optState, |
| 293 GrGLuint programId) { |
292 fFS.bindProgramLocations(programId); | 294 fFS.bindProgramLocations(programId); |
293 | 295 |
294 // skbug.com/2056 | 296 // skbug.com/2056 |
295 bool usingBindUniform = fGpu->glInterface()->fFunctions.fBindUniformLocation
!= NULL; | 297 bool usingBindUniform = fGpu->glInterface()->fFunctions.fBindUniformLocation
!= NULL; |
296 if (usingBindUniform) { | 298 if (usingBindUniform) { |
297 int count = fUniforms.count(); | 299 int count = fUniforms.count(); |
298 for (int i = 0; i < count; ++i) { | 300 for (int i = 0; i < count; ++i) { |
299 GL_CALL(BindUniformLocation(programId, i, fUniforms[i].fVariable.c_s
tr())); | 301 GL_CALL(BindUniformLocation(programId, i, fUniforms[i].fVariable.c_s
tr())); |
300 fUniforms[i].fLocation = i; | 302 fUniforms[i].fLocation = i; |
301 } | 303 } |
(...skipping 19 matching lines...) Expand all Loading... |
321 GetProgramResourceLocation(programId, | 323 GetProgramResourceLocation(programId, |
322 GR_GL_FRAGMENT_INPUT, | 324 GR_GL_FRAGMENT_INPUT, |
323 fSeparableVaryingInfos[i].fVariab
le.c_str())); | 325 fSeparableVaryingInfos[i].fVariab
le.c_str())); |
324 fSeparableVaryingInfos[i].fLocation = location; | 326 fSeparableVaryingInfos[i].fLocation = location; |
325 } | 327 } |
326 } | 328 } |
327 | 329 |
328 const GrGLContextInfo& GrGLProgramBuilder::ctxInfo() const { | 330 const GrGLContextInfo& GrGLProgramBuilder::ctxInfo() const { |
329 return fGpu->ctxInfo(); | 331 return fGpu->ctxInfo(); |
330 } | 332 } |
OLD | NEW |