Chromium Code Reviews| Index: src/gpu/gl/GrGLProgramEffects.cpp |
| diff --git a/src/gpu/gl/GrGLProgramEffects.cpp b/src/gpu/gl/GrGLProgramEffects.cpp |
| index ee8bf60955515a5b0ae5b6441e95ee58b58231c8..7b597109efd4ef0ae582ce816a7b4fd88df24941 100644 |
| --- a/src/gpu/gl/GrGLProgramEffects.cpp |
| +++ b/src/gpu/gl/GrGLProgramEffects.cpp |
| @@ -284,6 +284,13 @@ void GrGLVertexProgramEffects::emitTransforms(GrGLFullShaderBuilder* builder, |
| EffectKey totalKey = GrBackendEffectFactory::GetTransformKey(effectKey); |
| int numTransforms = effect->numTransforms(); |
| transforms.push_back_n(numTransforms); |
| + |
| + SkTArray<FragmentInputTransform, true>* fragmentInputTransforms = NULL; |
| + if (builder->ctxInfo().caps()->pathRenderingSupport()) { |
| + fragmentInputTransforms = &fFragmentInputTransforms.push_back(); |
| + fragmentInputTransforms->push_back_n(numTransforms); |
| + } |
| + |
| for (int t = 0; t < numTransforms; t++) { |
| GrSLType varyingType = kVoid_GrSLType; |
| const char* uniName; |
| @@ -319,7 +326,13 @@ void GrGLVertexProgramEffects::emitTransforms(GrGLFullShaderBuilder* builder, |
| } |
| const char* vsVaryingName; |
| const char* fsVaryingName; |
| - builder->addVarying(varyingType, varyingName, &vsVaryingName, &fsVaryingName); |
| + GrGLUniformManager::FragmentInputHandle fragmentInputHandle = builder->addVarying( |
| + varyingType, varyingName, &vsVaryingName, &fsVaryingName); |
| + |
| + if (fragmentInputTransforms) { |
| + (*fragmentInputTransforms)[t].fHandle = fragmentInputHandle; |
| + (*fragmentInputTransforms)[t].fType = varyingType; |
| + } |
| const GrGLShaderVar& coords = kPosition_GrCoordSet == get_source_coords(totalKey, t) ? |
| builder->positionAttribute() : |
| @@ -339,6 +352,7 @@ void GrGLVertexProgramEffects::emitTransforms(GrGLFullShaderBuilder* builder, |
| } |
| void GrGLVertexProgramEffects::setData(GrGpuGL* gpu, |
| + GrGpu::DrawType drawType, |
| const GrGLUniformManager& uniformManager, |
| const GrEffectStage* effectStages[]) { |
|
Kimmo Kinnunen
2014/07/01 13:01:21
So here we would need a context which would point
|
| int numEffects = fGLEffects.count(); |
| @@ -347,12 +361,17 @@ void GrGLVertexProgramEffects::setData(GrGpuGL* gpu, |
| for (int e = 0; e < numEffects; ++e) { |
| GrDrawEffect drawEffect(*effectStages[e], fHasExplicitLocalCoords); |
| fGLEffects[e]->setData(uniformManager, drawEffect); |
| - this->setTransformData(uniformManager, drawEffect, e); |
| + if (GrGpu::IsPathRenderingDrawType(drawType)) { |
| + this->setFragmentInputTransformData(gpu, uniformManager, drawEffect, e); |
| + } else { |
| + this->setTransformData(gpu, uniformManager, drawEffect, e); |
| + } |
| this->bindTextures(gpu, *drawEffect.effect(), e); |
| } |
| } |
| -void GrGLVertexProgramEffects::setTransformData(const GrGLUniformManager& uniformManager, |
| +void GrGLVertexProgramEffects::setTransformData(GrGpuGL* gpu, |
| + const GrGLUniformManager& uniformManager, |
| const GrDrawEffect& drawEffect, |
| int effectIdx) { |
| SkTArray<Transform, true>& transforms = fTransforms[effectIdx]; |
| @@ -368,6 +387,35 @@ void GrGLVertexProgramEffects::setTransformData(const GrGLUniformManager& unifor |
| } |
| } |
| +void GrGLVertexProgramEffects::setFragmentInputTransformData( |
| + GrGpuGL* gpu, |
| + const GrGLUniformManager& uniformManager, |
| + const GrDrawEffect& drawEffect, |
| + int effectIdx) { |
| + SkTArray<FragmentInputTransform, true>& transforms = fFragmentInputTransforms[effectIdx]; |
| + int numTransforms = transforms.count(); |
| + SkASSERT(numTransforms == (*drawEffect.effect())->numTransforms()); |
| + for (int t = 0; t < numTransforms; ++t) { |
| + SkASSERT(transforms[t].fHandle.isValid()); |
| + const SkMatrix& transform = get_transform_matrix(drawEffect, t); |
| + if (transforms[t].fCurrentValue.cheapEqualTo(transform)) |
| + continue; |
| + transforms[t].fCurrentValue = transform; |
| + switch (transforms[t].fType) { |
| + case kVec2f_GrSLType: { |
| + uniformManager.setFragmentInput(transforms[t].fHandle, 2, transform); |
| + break; |
| + } |
| + case kVec3f_GrSLType: { |
| + uniformManager.setFragmentInput(transforms[t].fHandle, 3, transform); |
| + break; |
| + } |
| + default: |
| + SkFAIL("Unexpected matrixs type."); |
| + } |
| + } |
| +} |
| + |
| GrGLVertexProgramEffectsBuilder::GrGLVertexProgramEffectsBuilder(GrGLFullShaderBuilder* builder, |
| int reserveCount) |
| : fBuilder(builder) |
| @@ -434,6 +482,7 @@ void GrGLPathTexGenProgramEffects::setupPathTexGen(GrGLFragmentOnlyShaderBuilder |
| } |
| void GrGLPathTexGenProgramEffects::setData(GrGpuGL* gpu, |
| + GrGpu::DrawType, |
| const GrGLUniformManager& uniformManager, |
| const GrEffectStage* effectStages[]) { |
| int numEffects = fGLEffects.count(); |