Index: src/gpu/gl/GrGLProgramDataManager.cpp |
diff --git a/src/gpu/gl/GrGLProgramDataManager.cpp b/src/gpu/gl/GrGLProgramDataManager.cpp |
index ed497bd1926b09343f1e761d1a6df648118ac3ae..4d5d711de48715bf8d8b184711f81d1cdfb9d0c1 100644 |
--- a/src/gpu/gl/GrGLProgramDataManager.cpp |
+++ b/src/gpu/gl/GrGLProgramDataManager.cpp |
@@ -13,8 +13,11 @@ |
SkASSERT(arrayCount <= uni.fArrayCount || \ |
(1 == arrayCount && GrGLShaderVar::kNonArray == uni.fArrayCount)) |
-GrGLProgramDataManager::GrGLProgramDataManager(GrGLGpu* gpu, const UniformInfoArray& uniforms) |
- : fGpu(gpu) { |
+GrGLProgramDataManager::GrGLProgramDataManager(GrGLGpu* gpu, GrGLuint programID, |
+ const UniformInfoArray& uniforms, |
+ const SeparableVaryingInfoArray& separableVaryings) |
+ : fGpu(gpu) |
+ , fProgramID(programID) { |
int count = uniforms.count(); |
fUniforms.push_back_n(count); |
for (int i = 0; i < count; i++) { |
@@ -39,6 +42,22 @@ GrGLProgramDataManager::GrGLProgramDataManager(GrGLGpu* gpu, const UniformInfoAr |
uniform.fFSLocation = kUnusedUniform; |
} |
} |
+ |
+ // NVPR programs have separable varyings |
+ count = separableVaryings.count(); |
+ fSeparableVaryings.push_back_n(count); |
+ for (int i = 0; i < count; i++) { |
+ SkASSERT(fGpu->glCaps().shaderCaps()->pathRenderingSupport()); |
+ SeparableVarying& separableVarying = fSeparableVaryings[i]; |
+ const SeparableVaryingInfo& builderSeparableVarying = separableVaryings[i]; |
+ SkASSERT(GrGLShaderVar::kNonArray == builderSeparableVarying.fVariable.getArrayCount() || |
+ builderSeparableVarying.fVariable.getArrayCount() > 0); |
+ SkDEBUGCODE( |
+ separableVarying.fArrayCount = builderSeparableVarying.fVariable.getArrayCount(); |
+ separableVarying.fType = builderSeparableVarying.fVariable.getType(); |
+ ); |
+ separableVarying.fLocation = builderSeparableVarying.fLocation; |
+ } |
} |
void GrGLProgramDataManager::setSampler(UniformHandle u, GrGLint texUnit) const { |
@@ -257,6 +276,22 @@ void GrGLProgramDataManager::setSkMatrix(UniformHandle u, const SkMatrix& matrix |
this->setMatrix3f(u, mt); |
} |
+void GrGLProgramDataManager::setPathFragmentInputTransform(SeparableVaryingHandle u, |
+ int components, |
+ const SkMatrix& matrix) const { |
+ SkASSERT(fGpu->glCaps().shaderCaps()->pathRenderingSupport()); |
+ const SeparableVarying& fragmentInput = fSeparableVaryings[u.toIndex()]; |
+ |
+ SkASSERT((components == 2 && fragmentInput.fType == kVec2f_GrSLType) || |
+ (components == 3 && fragmentInput.fType == kVec3f_GrSLType)); |
+ |
+ fGpu->glPathRendering()->setProgramPathFragmentInputTransform(fProgramID, |
+ fragmentInput.fLocation, |
+ GR_GL_OBJECT_LINEAR, |
+ components, |
+ matrix); |
+} |
+ |
#ifdef SK_DEBUG |
void GrGLProgramDataManager::printUnused(const Uniform& uni) const { |
if (kUnusedUniform == uni.fFSLocation && kUnusedUniform == uni.fVSLocation) { |