| Index: src/gpu/gl/builders/GrGLProgramBuilder.cpp
|
| diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.cpp b/src/gpu/gl/builders/GrGLProgramBuilder.cpp
|
| index e253ab233bd3200bb7316a87cc6f6d740169b1a4..a07bd732af43d8ae0fc9e8e6e4850be8036fae36 100644
|
| --- a/src/gpu/gl/builders/GrGLProgramBuilder.cpp
|
| +++ b/src/gpu/gl/builders/GrGLProgramBuilder.cpp
|
| @@ -17,6 +17,7 @@
|
| #include "glsl/GrGLSLCaps.h"
|
| #include "GrAutoLocaleSetter.h"
|
| #include "GrCoordTransform.h"
|
| +#include "GrGLPathProgramBuilder.h"
|
| #include "GrGLProgramBuilder.h"
|
| #include "GrTexture.h"
|
| #include "SkRTConf.h"
|
| @@ -25,32 +26,6 @@
|
| #define GL_CALL(X) GR_GL_CALL(this->gpu()->glInterface(), X)
|
| #define GL_CALL_RET(R, X) GR_GL_CALL_RET(this->gpu()->glInterface(), R, X)
|
|
|
| -///////////////////////////////////////////////////////////////////////////////////////////////////
|
| -
|
| -class GrGLNvprProgramBuilder : public GrGLProgramBuilder {
|
| -public:
|
| - GrGLNvprProgramBuilder(GrGLGpu* gpu, const DrawArgs& args)
|
| - : INHERITED(gpu, args) {}
|
| -
|
| - GrGLProgram* createProgram(GrGLuint programID) override {
|
| - // this is just for nvpr es, which has separable varyings that are plugged in after
|
| - // building
|
| - GrGLPathProcessor* pathProc =
|
| - static_cast<GrGLPathProcessor*>(fGeometryProcessor->fGLProc.get());
|
| - pathProc->resolveSeparableVaryings(fGpu, programID);
|
| - return SkNEW_ARGS(GrGLNvprProgram, (fGpu, this->desc(), fUniformHandles, programID,
|
| - fUniforms, fGeometryProcessor, fXferProcessor,
|
| - fFragmentProcessors.get(), &fSamplerUniforms));
|
| - }
|
| -
|
| -private:
|
| - typedef GrGLProgramBuilder INHERITED;
|
| -};
|
| -
|
| -
|
| -
|
| -//////////////////////////////////////////////////////////////////////////////
|
| -
|
| const int GrGLProgramBuilder::kVarsPerBlock = 8;
|
|
|
| GrGLProgram* GrGLProgramBuilder::CreateProgram(const DrawArgs& args, GrGLGpu* gpu) {
|
| @@ -80,7 +55,7 @@ GrGLProgramBuilder* GrGLProgramBuilder::CreateProgramBuilder(const DrawArgs& arg
|
| SkASSERT(gpu->glCaps().shaderCaps()->pathRenderingSupport() &&
|
| !args.fPrimitiveProcessor->willUseGeoShader() &&
|
| args.fPrimitiveProcessor->numAttribs() == 0);
|
| - return SkNEW_ARGS(GrGLNvprProgramBuilder, (gpu, args));
|
| + return SkNEW_ARGS(GrGLPathProgramBuilder, (gpu, args));
|
| } else {
|
| return SkNEW_ARGS(GrGLProgramBuilder, (gpu, args));
|
| }
|
| @@ -126,6 +101,18 @@ void GrGLProgramBuilder::addPassThroughAttribute(const GrPrimitiveProcessor::Att
|
| fFS.codeAppendf("%s = %s;", output, v.fsIn());
|
| }
|
|
|
| +GrGLProgramBuilder::SeparableVaryingHandle GrGLProgramBuilder::addSeparableVarying(const char*,
|
| + GrGLVertToFrag*,
|
| + GrSLPrecision) {
|
| + // This call is not used for non-NVPR backends. However, the polymorphism between
|
| + // GrPrimitiveProcessor, GrGLPrimitiveProcessor and GrGLProgramBuilder does not allow for
|
| + // a system where GrGLPathProcessor would be able to refer to a primitive-specific builder
|
| + // that would understand separable varyings. Thus separable varyings need to be present
|
| + // early in the inheritance chain of builders.
|
| + SkASSERT(false);
|
| + return SeparableVaryingHandle();
|
| +}
|
| +
|
| void GrGLProgramBuilder::nameVariable(SkString* out, char prefix, const char* name) {
|
| if ('\0' == prefix) {
|
| *out = name;
|
| @@ -423,11 +410,8 @@ GrGLProgram* GrGLProgramBuilder::finalize() {
|
| return NULL;
|
| }
|
|
|
| - bool usingBindUniform = fGpu->glInterface()->fFunctions.fBindUniformLocation != NULL;
|
| - if (usingBindUniform) {
|
| - this->bindUniformLocations(programID);
|
| - }
|
| - fFS.bindFragmentShaderLocations(programID);
|
| + this->bindProgramResourceLocations(programID);
|
| +
|
| GL_CALL(LinkProgram(programID));
|
|
|
| // Calling GetProgramiv is expensive in Chromium. Assume success in release builds.
|
| @@ -438,21 +422,24 @@ GrGLProgram* GrGLProgramBuilder::finalize() {
|
| if (checkLinked) {
|
| checkLinkStatus(programID);
|
| }
|
| - if (!usingBindUniform) {
|
| - this->resolveUniformLocations(programID);
|
| - }
|
| + this->resolveProgramResourceLocations(programID);
|
|
|
| this->cleanupShaders(shadersToDelete);
|
|
|
| return this->createProgram(programID);
|
| }
|
|
|
| -void GrGLProgramBuilder::bindUniformLocations(GrGLuint programID) {
|
| - int count = fUniforms.count();
|
| - for (int i = 0; i < count; ++i) {
|
| - GL_CALL(BindUniformLocation(programID, i, fUniforms[i].fVariable.c_str()));
|
| - fUniforms[i].fLocation = i;
|
| +void GrGLProgramBuilder::bindProgramResourceLocations(GrGLuint programID) {
|
| + bool usingBindUniform = fGpu->glInterface()->fFunctions.fBindUniformLocation != NULL;
|
| + if (usingBindUniform) {
|
| + int count = fUniforms.count();
|
| + for (int i = 0; i < count; ++i) {
|
| + GL_CALL(BindUniformLocation(programID, i, fUniforms[i].fVariable.c_str()));
|
| + fUniforms[i].fLocation = i;
|
| + }
|
| }
|
| +
|
| + fFS.bindFragmentShaderLocations(programID);
|
| }
|
|
|
| bool GrGLProgramBuilder::checkLinkStatus(GrGLuint programID) {
|
| @@ -479,12 +466,15 @@ bool GrGLProgramBuilder::checkLinkStatus(GrGLuint programID) {
|
| return SkToBool(linked);
|
| }
|
|
|
| -void GrGLProgramBuilder::resolveUniformLocations(GrGLuint programID) {
|
| - int count = fUniforms.count();
|
| - for (int i = 0; i < count; ++i) {
|
| - GrGLint location;
|
| - GL_CALL_RET(location, GetUniformLocation(programID, fUniforms[i].fVariable.c_str()));
|
| - fUniforms[i].fLocation = location;
|
| +void GrGLProgramBuilder::resolveProgramResourceLocations(GrGLuint programID) {
|
| + bool usingBindUniform = fGpu->glInterface()->fFunctions.fBindUniformLocation != NULL;
|
| + if (!usingBindUniform) {
|
| + int count = fUniforms.count();
|
| + for (int i = 0; i < count; ++i) {
|
| + GrGLint location;
|
| + GL_CALL_RET(location, GetUniformLocation(programID, fUniforms[i].fVariable.c_str()));
|
| + fUniforms[i].fLocation = location;
|
| + }
|
| }
|
| }
|
|
|
|
|