Index: src/gpu/gl/GrGLUniformHandler.cpp |
diff --git a/src/gpu/gl/GrGLUniformHandler.cpp b/src/gpu/gl/GrGLUniformHandler.cpp |
index 94da1f177686b535e3a2a1a27262a46ef6a48089..c4189267f10a144fb02c50df6ef9c9c94998a985 100644 |
--- a/src/gpu/gl/GrGLUniformHandler.cpp |
+++ b/src/gpu/gl/GrGLUniformHandler.cpp |
@@ -52,6 +52,22 @@ GrGLSLUniformHandler::UniformHandle GrGLUniformHandler::internalAddUniformArray( |
return GrGLSLUniformHandler::UniformHandle(fUniforms.count() - 1); |
} |
+GrGLSLUniformHandler::SamplerHandle GrGLUniformHandler::internalAddSampler(uint32_t visibility, |
+ GrPixelConfig config, |
+ GrSLType type, |
+ GrSLPrecision precision, |
+ const char* name) { |
+ SkASSERT(name && strlen(name)); |
+ SkDEBUGCODE(static const uint32_t kVisMask = kVertex_GrShaderFlag | kFragment_GrShaderFlag); |
+ SkASSERT(0 == (~kVisMask & visibility)); |
+ SkASSERT(0 != visibility); |
+ SkString mangleName; |
+ char prefix = 'u'; |
+ fProgramBuilder->nameVariable(&mangleName, prefix, name, true); |
+ fSamplers.emplace_back(visibility, config, type, precision, mangleName.c_str()); |
+ return GrGLSLUniformHandler::SamplerHandle(fSamplers.count() - 1); |
+} |
+ |
void GrGLUniformHandler::appendUniformDecls(GrShaderFlags visibility, SkString* out) const { |
for (int i = 0; i < fUniforms.count(); ++i) { |
if (fUniforms[i].fVisibility & visibility) { |
@@ -59,6 +75,12 @@ void GrGLUniformHandler::appendUniformDecls(GrShaderFlags visibility, SkString* |
out->append(";\n"); |
} |
} |
+ for (int i = 0; i < fSamplers.count(); ++i) { |
+ if (fSamplers[i].visibility() & visibility) { |
+ fSamplers[i].fShaderVar.appendDecl(fProgramBuilder->glslCaps(), out); |
+ out->append(";\n"); |
+ } |
+ } |
} |
void GrGLUniformHandler::bindUniformLocations(GrGLuint programID, const GrGLCaps& caps) { |
@@ -68,6 +90,10 @@ void GrGLUniformHandler::bindUniformLocations(GrGLuint programID, const GrGLCaps |
GL_CALL(BindUniformLocation(programID, i, fUniforms[i].fVariable.c_str())); |
fUniforms[i].fLocation = i; |
} |
+ for (int i = 0; i < fSamplers.count(); ++i) { |
+ GL_CALL(BindUniformLocation(programID, i, fSamplers[i].fShaderVar.c_str())); |
+ fSamplers[i].fLocation = i; |
+ } |
} |
} |
@@ -79,6 +105,11 @@ void GrGLUniformHandler::getUniformLocations(GrGLuint programID, const GrGLCaps& |
GL_CALL_RET(location, GetUniformLocation(programID, fUniforms[i].fVariable.c_str())); |
fUniforms[i].fLocation = location; |
} |
+ for (int i = 0; i < fSamplers.count(); ++i) { |
+ GrGLint location; |
+ GL_CALL_RET(location, GetUniformLocation(programID, fSamplers[i].fShaderVar.c_str())); |
+ fSamplers[i].fLocation = location; |
+ } |
} |
} |