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 "GrGLProgramBuilder.h" | 8 #include "GrGLProgramBuilder.h" |
9 | 9 |
10 #include "GrAutoLocaleSetter.h" | 10 #include "GrAutoLocaleSetter.h" |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 | 50 |
51 ///////////////////////////////////////////////////////////////////////////// | 51 ///////////////////////////////////////////////////////////////////////////// |
52 | 52 |
53 GrGLProgramBuilder::GrGLProgramBuilder(GrGLGpu* gpu, const DrawArgs& args) | 53 GrGLProgramBuilder::GrGLProgramBuilder(GrGLGpu* gpu, const DrawArgs& args) |
54 : INHERITED(args) | 54 : INHERITED(args) |
55 , fGeometryProcessor(nullptr) | 55 , fGeometryProcessor(nullptr) |
56 , fXferProcessor(nullptr) | 56 , fXferProcessor(nullptr) |
57 , fGpu(gpu) | 57 , fGpu(gpu) |
58 , fUniforms(kVarsPerBlock) | 58 , fUniforms(kVarsPerBlock) |
59 , fSamplerUniforms(4) | 59 , fSamplerUniforms(4) |
60 , fSeparableVaryingInfos(kVarsPerBlock) { | 60 , fVaryingHandler(this) { |
61 } | |
62 | |
63 void GrGLProgramBuilder::addVarying(const char* name, | |
64 GrGLSLVarying* varying, | |
65 GrSLPrecision precision) { | |
66 SkASSERT(varying); | |
67 if (varying->vsVarying()) { | |
68 fVS.addVarying(name, precision, varying); | |
69 } | |
70 if (this->primitiveProcessor().willUseGeoShader()) { | |
71 fGS.addVarying(name, precision, varying); | |
72 } | |
73 if (varying->fsVarying()) { | |
74 fFS.addVarying(varying, precision); | |
75 } | |
76 } | |
77 | |
78 void GrGLProgramBuilder::addPassThroughAttribute(const GrPrimitiveProcessor::Att
ribute* input, | |
79 const char* output) { | |
80 GrSLType type = GrVertexAttribTypeToSLType(input->fType); | |
81 GrGLSLVertToFrag v(type); | |
82 this->addVarying(input->fName, &v); | |
83 fVS.codeAppendf("%s = %s;", v.vsOut(), input->fName); | |
84 fFS.codeAppendf("%s = %s;", output, v.fsIn()); | |
85 } | |
86 | |
87 GrGLProgramBuilder::SeparableVaryingHandle GrGLProgramBuilder::addSeparableVaryi
ng( | |
88 const ch
ar* name, | |
89 GrGLSLVe
rtToFrag* v, | |
90 GrSLPrec
ision fsPrecision) { | |
91 // This call is not used for non-NVPR backends. | |
92 SkASSERT(fGpu->glCaps().shaderCaps()->pathRenderingSupport() && | |
93 fArgs.fPrimitiveProcessor->isPathRendering() && | |
94 !fArgs.fPrimitiveProcessor->willUseGeoShader() && | |
95 fArgs.fPrimitiveProcessor->numAttribs() == 0); | |
96 this->addVarying(name, v, fsPrecision); | |
97 SeparableVaryingInfo& varyingInfo = fSeparableVaryingInfos.push_back(); | |
98 varyingInfo.fVariable = fFS.fInputs.back(); | |
99 varyingInfo.fLocation = fSeparableVaryingInfos.count() - 1; | |
100 return SeparableVaryingHandle(varyingInfo.fLocation); | |
101 } | 61 } |
102 | 62 |
103 GrGLSLProgramDataManager::UniformHandle GrGLProgramBuilder::internalAddUniformAr
ray( | 63 GrGLSLProgramDataManager::UniformHandle GrGLProgramBuilder::internalAddUniformAr
ray( |
104 uint32_t visibil
ity, | 64 uint32_t visibil
ity, |
105 GrSLType type, | 65 GrSLType type, |
106 GrSLPrecision pr
ecision, | 66 GrSLPrecision pr
ecision, |
107 const char* name
, | 67 const char* name
, |
108 bool mangleName, | 68 bool mangleName, |
109 int count, | 69 int count, |
110 const char** out
Name) { | 70 const char** out
Name) { |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
282 fGeometryProcessor = new GrGLInstalledGeoProc; | 242 fGeometryProcessor = new GrGLInstalledGeoProc; |
283 | 243 |
284 fGeometryProcessor->fGLProc.reset(gp.createGLSLInstance(*fGpu->glCaps().glsl
Caps())); | 244 fGeometryProcessor->fGLProc.reset(gp.createGLSLInstance(*fGpu->glCaps().glsl
Caps())); |
285 | 245 |
286 SkSTArray<4, GrGLSLTextureSampler> samplers(gp.numTextures()); | 246 SkSTArray<4, GrGLSLTextureSampler> samplers(gp.numTextures()); |
287 this->emitSamplers(gp, &samplers, fGeometryProcessor); | 247 this->emitSamplers(gp, &samplers, fGeometryProcessor); |
288 | 248 |
289 GrGLSLGeometryProcessor::EmitArgs args(this, | 249 GrGLSLGeometryProcessor::EmitArgs args(this, |
290 &fVS, | 250 &fVS, |
291 &fFS, | 251 &fFS, |
| 252 &fVaryingHandler, |
292 this->glslCaps(), | 253 this->glslCaps(), |
293 gp, | 254 gp, |
294 outColor, | 255 outColor, |
295 outCoverage, | 256 outCoverage, |
296 samplers, | 257 samplers, |
297 fCoordTransforms, | 258 fCoordTransforms, |
298 &fOutCoords); | 259 &fOutCoords); |
299 fGeometryProcessor->fGLProc->emitCode(args); | 260 fGeometryProcessor->fGLProc->emitCode(args); |
300 | 261 |
301 // We have to check that effects and the code they emit are consistent, ie i
f an effect | 262 // We have to check that effects and the code they emit are consistent, ie i
f an effect |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
467 if (fFS.hasSecondaryOutput() && caps.glslCaps()->mustDeclareFragmentShaderOu
tput()) { | 428 if (fFS.hasSecondaryOutput() && caps.glslCaps()->mustDeclareFragmentShaderOu
tput()) { |
468 GL_CALL(BindFragDataLocationIndexed(programID, 0, 1, | 429 GL_CALL(BindFragDataLocationIndexed(programID, 0, 1, |
469 GrGLSLFragmentShaderBuilder::DeclaredSecondary
ColorOutputName())); | 430 GrGLSLFragmentShaderBuilder::DeclaredSecondary
ColorOutputName())); |
470 } | 431 } |
471 | 432 |
472 // handle NVPR separable varyings | 433 // handle NVPR separable varyings |
473 if (!fGpu->glCaps().shaderCaps()->pathRenderingSupport() || | 434 if (!fGpu->glCaps().shaderCaps()->pathRenderingSupport() || |
474 !fGpu->glPathRendering()->shouldBindFragmentInputs()) { | 435 !fGpu->glPathRendering()->shouldBindFragmentInputs()) { |
475 return; | 436 return; |
476 } | 437 } |
477 int count = fSeparableVaryingInfos.count(); | 438 int count = fVaryingHandler.fPathProcVaryingInfos.count(); |
478 for (int i = 0; i < count; ++i) { | 439 for (int i = 0; i < count; ++i) { |
479 GL_CALL(BindFragmentInputLocation(programID, | 440 GL_CALL(BindFragmentInputLocation(programID, i, |
480 i, | 441 fVaryingHandler.fPathProcVaryingInfos[i].
fVariable.c_str())); |
481 fSeparableVaryingInfos[i].fVariable.c_
str())); | 442 fVaryingHandler.fPathProcVaryingInfos[i].fLocation = i; |
482 fSeparableVaryingInfos[i].fLocation = i; | |
483 } | 443 } |
484 } | 444 } |
485 | 445 |
486 bool GrGLProgramBuilder::checkLinkStatus(GrGLuint programID) { | 446 bool GrGLProgramBuilder::checkLinkStatus(GrGLuint programID) { |
487 GrGLint linked = GR_GL_INIT_ZERO; | 447 GrGLint linked = GR_GL_INIT_ZERO; |
488 GL_CALL(GetProgramiv(programID, GR_GL_LINK_STATUS, &linked)); | 448 GL_CALL(GetProgramiv(programID, GR_GL_LINK_STATUS, &linked)); |
489 if (!linked) { | 449 if (!linked) { |
490 GrGLint infoLen = GR_GL_INIT_ZERO; | 450 GrGLint infoLen = GR_GL_INIT_ZERO; |
491 GL_CALL(GetProgramiv(programID, GR_GL_INFO_LOG_LENGTH, &infoLen)); | 451 GL_CALL(GetProgramiv(programID, GR_GL_INFO_LOG_LENGTH, &infoLen)); |
492 SkAutoMalloc log(sizeof(char)*(infoLen+1)); // outside if for debugger | 452 SkAutoMalloc log(sizeof(char)*(infoLen+1)); // outside if for debugger |
(...skipping 22 matching lines...) Expand all Loading... |
515 GL_CALL_RET(location, GetUniformLocation(programID, fUniforms[i].fVa
riable.c_str())); | 475 GL_CALL_RET(location, GetUniformLocation(programID, fUniforms[i].fVa
riable.c_str())); |
516 fUniforms[i].fLocation = location; | 476 fUniforms[i].fLocation = location; |
517 } | 477 } |
518 } | 478 } |
519 | 479 |
520 // handle NVPR separable varyings | 480 // handle NVPR separable varyings |
521 if (!fGpu->glCaps().shaderCaps()->pathRenderingSupport() || | 481 if (!fGpu->glCaps().shaderCaps()->pathRenderingSupport() || |
522 !fGpu->glPathRendering()->shouldBindFragmentInputs()) { | 482 !fGpu->glPathRendering()->shouldBindFragmentInputs()) { |
523 return; | 483 return; |
524 } | 484 } |
525 int count = fSeparableVaryingInfos.count(); | 485 int count = fVaryingHandler.fPathProcVaryingInfos.count(); |
526 for (int i = 0; i < count; ++i) { | 486 for (int i = 0; i < count; ++i) { |
527 GrGLint location; | 487 GrGLint location; |
528 GL_CALL_RET(location, | 488 GL_CALL_RET(location, GetProgramResourceLocation( |
529 GetProgramResourceLocation(programID, | 489 programID, |
530 GR_GL_FRAGMENT_INPUT, | 490 GR_GL_FRAGMENT_INPUT, |
531 fSeparableVaryingInfos[i].fVariab
le.c_str())); | 491 fVaryingHandler.fPathProcVaryingInfos[i].
fVariable.c_str())); |
532 fSeparableVaryingInfos[i].fLocation = location; | 492 fVaryingHandler.fPathProcVaryingInfos[i].fLocation = location; |
533 } | 493 } |
534 } | 494 } |
535 | 495 |
536 void GrGLProgramBuilder::cleanupProgram(GrGLuint programID, const SkTDArray<GrGL
uint>& shaderIDs) { | 496 void GrGLProgramBuilder::cleanupProgram(GrGLuint programID, const SkTDArray<GrGL
uint>& shaderIDs) { |
537 GL_CALL(DeleteProgram(programID)); | 497 GL_CALL(DeleteProgram(programID)); |
538 cleanupShaders(shaderIDs); | 498 cleanupShaders(shaderIDs); |
539 } | 499 } |
540 void GrGLProgramBuilder::cleanupShaders(const SkTDArray<GrGLuint>& shaderIDs) { | 500 void GrGLProgramBuilder::cleanupShaders(const SkTDArray<GrGLuint>& shaderIDs) { |
541 for (int i = 0; i < shaderIDs.count(); ++i) { | 501 for (int i = 0; i < shaderIDs.count(); ++i) { |
542 GL_CALL(DeleteShader(shaderIDs[i])); | 502 GL_CALL(DeleteShader(shaderIDs[i])); |
543 } | 503 } |
544 } | 504 } |
545 | 505 |
546 GrGLProgram* GrGLProgramBuilder::createProgram(GrGLuint programID) { | 506 GrGLProgram* GrGLProgramBuilder::createProgram(GrGLuint programID) { |
547 return new GrGLProgram(fGpu, this->desc(), fUniformHandles, programID, fUnif
orms, | 507 return new GrGLProgram(fGpu, this->desc(), fUniformHandles, programID, fUnif
orms, |
548 fSeparableVaryingInfos, | 508 fVaryingHandler.fPathProcVaryingInfos, |
549 fGeometryProcessor, fXferProcessor, fFragmentProcesso
rs.get(), | 509 fGeometryProcessor, fXferProcessor, fFragmentProcesso
rs.get(), |
550 &fSamplerUniforms); | 510 &fSamplerUniforms); |
551 } | 511 } |
552 | 512 |
553 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 513 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
554 | 514 |
555 GrGLInstalledFragProcs::~GrGLInstalledFragProcs() { | 515 GrGLInstalledFragProcs::~GrGLInstalledFragProcs() { |
556 int numProcs = fProcs.count(); | 516 int numProcs = fProcs.count(); |
557 for (int i = 0; i < numProcs; ++i) { | 517 for (int i = 0; i < numProcs; ++i) { |
558 delete fProcs[i]; | 518 delete fProcs[i]; |
559 } | 519 } |
560 } | 520 } |
OLD | NEW |