Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(114)

Unified Diff: src/gpu/gl/GrGLProgramEffects.cpp

Issue 367643004: Implement NVPR on GLES (Closed) Base URL: https://skia.googlesource.com/skia.git@02-path-program-fragment
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();

Powered by Google App Engine
This is Rietveld 408576698