| 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 "gl/GrGLGeometryProcessor.h" | 10 #include "gl/GrGLGeometryProcessor.h" |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 GrGLNvprProgramBuilder(GrGLGpu* gpu, const DrawArgs& args) | 31 GrGLNvprProgramBuilder(GrGLGpu* gpu, const DrawArgs& args) |
| 32 : INHERITED(gpu, args) {} | 32 : INHERITED(gpu, args) {} |
| 33 | 33 |
| 34 GrGLProgram* createProgram(GrGLuint programID) override { | 34 GrGLProgram* createProgram(GrGLuint programID) override { |
| 35 // this is just for nvpr es, which has separable varyings that are plugg
ed in after | 35 // this is just for nvpr es, which has separable varyings that are plugg
ed in after |
| 36 // building | 36 // building |
| 37 GrGLPathProcessor* pathProc = | 37 GrGLPathProcessor* pathProc = |
| 38 static_cast<GrGLPathProcessor*>(fGeometryProcessor->fGLProc.get(
)); | 38 static_cast<GrGLPathProcessor*>(fGeometryProcessor->fGLProc.get(
)); |
| 39 pathProc->resolveSeparableVaryings(fGpu, programID); | 39 pathProc->resolveSeparableVaryings(fGpu, programID); |
| 40 return SkNEW_ARGS(GrGLNvprProgram, (fGpu, this->desc(), fUniformHandles,
programID, | 40 return SkNEW_ARGS(GrGLNvprProgram, (fGpu, this->desc(), fUniformHandles,
programID, |
| 41 fUniforms, | 41 fUniforms, fGeometryProcessor, fXfer
Processor, |
| 42 fGeometryProcessor, | 42 fFragmentProcessors.get(), &fSampler
Uniforms)); |
| 43 fXferProcessor, fFragmentProcessors.
get())); | |
| 44 } | 43 } |
| 45 | 44 |
| 46 private: | 45 private: |
| 47 typedef GrGLProgramBuilder INHERITED; | 46 typedef GrGLProgramBuilder INHERITED; |
| 48 }; | 47 }; |
| 49 | 48 |
| 50 | 49 |
| 51 | 50 |
| 52 ////////////////////////////////////////////////////////////////////////////// | 51 ////////////////////////////////////////////////////////////////////////////// |
| 53 | 52 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 GrGLProgramBuilder::GrGLProgramBuilder(GrGLGpu* gpu, const DrawArgs& args) | 90 GrGLProgramBuilder::GrGLProgramBuilder(GrGLGpu* gpu, const DrawArgs& args) |
| 92 : fVS(this) | 91 : fVS(this) |
| 93 , fGS(this) | 92 , fGS(this) |
| 94 , fFS(this, args.fDesc->header().fFragPosKey) | 93 , fFS(this, args.fDesc->header().fFragPosKey) |
| 95 , fOutOfStage(true) | 94 , fOutOfStage(true) |
| 96 , fStageIndex(-1) | 95 , fStageIndex(-1) |
| 97 , fGeometryProcessor(NULL) | 96 , fGeometryProcessor(NULL) |
| 98 , fXferProcessor(NULL) | 97 , fXferProcessor(NULL) |
| 99 , fArgs(args) | 98 , fArgs(args) |
| 100 , fGpu(gpu) | 99 , fGpu(gpu) |
| 101 , fUniforms(kVarsPerBlock) { | 100 , fUniforms(kVarsPerBlock) |
| 101 , fSamplerUniforms(4) { |
| 102 } | 102 } |
| 103 | 103 |
| 104 void GrGLProgramBuilder::addVarying(const char* name, | 104 void GrGLProgramBuilder::addVarying(const char* name, |
| 105 GrGLVarying* varying, | 105 GrGLVarying* varying, |
| 106 GrSLPrecision fsPrecision) { | 106 GrSLPrecision fsPrecision) { |
| 107 SkASSERT(varying); | 107 SkASSERT(varying); |
| 108 if (varying->vsVarying()) { | 108 if (varying->vsVarying()) { |
| 109 fVS.addVarying(name, varying); | 109 fVS.addVarying(name, varying); |
| 110 } | 110 } |
| 111 if (this->primitiveProcessor().willUseGeoShader()) { | 111 if (this->primitiveProcessor().willUseGeoShader()) { |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 374 } | 374 } |
| 375 | 375 |
| 376 void GrGLProgramBuilder::verify(const GrFragmentProcessor& fp) { | 376 void GrGLProgramBuilder::verify(const GrFragmentProcessor& fp) { |
| 377 SkASSERT(fFS.hasReadFragmentPosition() == fp.willReadFragmentPosition()); | 377 SkASSERT(fFS.hasReadFragmentPosition() == fp.willReadFragmentPosition()); |
| 378 } | 378 } |
| 379 | 379 |
| 380 template <class Proc> | 380 template <class Proc> |
| 381 void GrGLProgramBuilder::emitSamplers(const GrProcessor& processor, | 381 void GrGLProgramBuilder::emitSamplers(const GrProcessor& processor, |
| 382 GrGLProcessor::TextureSamplerArray* outSam
plers, | 382 GrGLProcessor::TextureSamplerArray* outSam
plers, |
| 383 GrGLInstalledProc<Proc>* ip) { | 383 GrGLInstalledProc<Proc>* ip) { |
| 384 SkDEBUGCODE(ip->fSamplersIdx = fSamplerUniforms.count();) |
| 384 int numTextures = processor.numTextures(); | 385 int numTextures = processor.numTextures(); |
| 385 ip->fSamplers.push_back_n(numTextures); | 386 UniformHandle* localSamplerUniforms = fSamplerUniforms.push_back_n(numTextur
es); |
| 386 SkString name; | 387 SkString name; |
| 387 for (int t = 0; t < numTextures; ++t) { | 388 for (int t = 0; t < numTextures; ++t) { |
| 388 name.printf("Sampler%d", t); | 389 name.printf("Sampler%d", t); |
| 389 ip->fSamplers[t].fUniform = this->addUniform(GrGLProgramBuilder::kFragme
nt_Visibility, | 390 localSamplerUniforms[t] = this->addUniform(GrGLProgramBuilder::kFragment
_Visibility, |
| 390 kSampler2D_GrSLType, kDefau
lt_GrSLPrecision, | 391 kSampler2D_GrSLType, kDefault
_GrSLPrecision, |
| 391 name.c_str()); | 392 name.c_str()); |
| 392 SkNEW_APPEND_TO_TARRAY(outSamplers, GrGLProcessor::TextureSampler, | 393 SkNEW_APPEND_TO_TARRAY(outSamplers, GrGLProcessor::TextureSampler, |
| 393 (ip->fSamplers[t].fUniform, processor.textureAcce
ss(t))); | 394 (localSamplerUniforms[t], processor.textureAccess
(t))); |
| 394 } | 395 } |
| 395 } | 396 } |
| 396 | 397 |
| 397 GrGLProgram* GrGLProgramBuilder::finalize() { | 398 GrGLProgram* GrGLProgramBuilder::finalize() { |
| 398 // verify we can get a program id | 399 // verify we can get a program id |
| 399 GrGLuint programID; | 400 GrGLuint programID; |
| 400 GL_CALL_RET(programID, CreateProgram()); | 401 GL_CALL_RET(programID, CreateProgram()); |
| 401 if (0 == programID) { | 402 if (0 == programID) { |
| 402 return NULL; | 403 return NULL; |
| 403 } | 404 } |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 491 cleanupShaders(shaderIDs); | 492 cleanupShaders(shaderIDs); |
| 492 } | 493 } |
| 493 void GrGLProgramBuilder::cleanupShaders(const SkTDArray<GrGLuint>& shaderIDs) { | 494 void GrGLProgramBuilder::cleanupShaders(const SkTDArray<GrGLuint>& shaderIDs) { |
| 494 for (int i = 0; i < shaderIDs.count(); ++i) { | 495 for (int i = 0; i < shaderIDs.count(); ++i) { |
| 495 GL_CALL(DeleteShader(shaderIDs[i])); | 496 GL_CALL(DeleteShader(shaderIDs[i])); |
| 496 } | 497 } |
| 497 } | 498 } |
| 498 | 499 |
| 499 GrGLProgram* GrGLProgramBuilder::createProgram(GrGLuint programID) { | 500 GrGLProgram* GrGLProgramBuilder::createProgram(GrGLuint programID) { |
| 500 return SkNEW_ARGS(GrGLProgram, (fGpu, this->desc(), fUniformHandles, program
ID, fUniforms, | 501 return SkNEW_ARGS(GrGLProgram, (fGpu, this->desc(), fUniformHandles, program
ID, fUniforms, |
| 501 fGeometryProcessor, fXferProcessor, fFragmen
tProcessors.get())); | 502 fGeometryProcessor, fXferProcessor, fFragmen
tProcessors.get(), |
| 503 &fSamplerUniforms)); |
| 502 } | 504 } |
| 503 | 505 |
| 504 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 506 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
| 505 | 507 |
| 506 GrGLInstalledFragProcs::~GrGLInstalledFragProcs() { | 508 GrGLInstalledFragProcs::~GrGLInstalledFragProcs() { |
| 507 int numProcs = fProcs.count(); | 509 int numProcs = fProcs.count(); |
| 508 for (int e = 0; e < numProcs; ++e) { | 510 for (int e = 0; e < numProcs; ++e) { |
| 509 SkDELETE(fProcs[e]); | 511 SkDELETE(fProcs[e]); |
| 510 } | 512 } |
| 511 } | 513 } |
| OLD | NEW |