diff options
Diffstat (limited to 'src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp')
-rw-r--r-- | src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp | 59 |
1 files changed, 39 insertions, 20 deletions
diff --git a/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp b/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp index 2bef113410..7af5ce9843 100644 --- a/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp +++ b/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp @@ -20,6 +20,7 @@ GrGLVertexBuilder::GrGLVertexBuilder(GrGLProgramBuilder* program) : INHERITED(program) , fPositionVar(NULL) , fLocalCoordsVar(NULL) + , fRtAdjustName(NULL) , fEffectAttribOffset(0) { } @@ -31,9 +32,22 @@ void GrGLVertexBuilder::addVarying(const char* name, GrGLVarying* v) { v->fVsOut = fOutputs.back().getName().c_str(); } -void GrGLVertexBuilder::setupLocalCoords() { +void GrGLVertexBuilder::setupUniformViewMatrix() { + fProgramBuilder->fUniformHandles.fViewMatrixUni = + fProgramBuilder->addUniform(GrGLProgramBuilder::kVertex_Visibility, + kMat33f_GrSLType, + this->uViewM()); +} + +void GrGLVertexBuilder::setupPositionAndLocalCoords() { + // Setup position + this->codeAppendf("vec3 %s;", this->glPosition()); + + // setup position and local coords attribute fPositionVar = &fInputs.push_back(); - fPositionVar->set(kVec2f_GrSLType, GrGLShaderVar::kAttribute_TypeModifier, "inPosition"); + fPositionVar->set(kVec2f_GrSLType, + GrGLShaderVar::kAttribute_TypeModifier, + this->inPosition()); if (-1 != fProgramBuilder->header().fLocalCoordAttributeIndex) { fLocalCoordsVar = &fInputs.push_back(); fLocalCoordsVar->set(kVec2f_GrSLType, @@ -45,18 +59,6 @@ void GrGLVertexBuilder::setupLocalCoords() { fEffectAttribOffset = fInputs.count(); } -void GrGLVertexBuilder::transformGLToSkiaCoords() { - const char* viewMName; - fProgramBuilder->fUniformHandles.fViewMatrixUni = - fProgramBuilder->addUniform(GrGLProgramBuilder::kVertex_Visibility, - kMat33f_GrSLType, - "ViewM", - &viewMName); - - // Transform the position into Skia's device coords. - this->codeAppendf("vec3 pos3 = %s * vec3(%s, 1);", viewMName, fPositionVar->c_str()); -} - void GrGLVertexBuilder::setupBuiltinVertexAttribute(const char* inName, GrGLSLExpr1* out) { GrGLVertToFrag v(kFloat_GrSLType); fProgramBuilder->addVarying(inName, &v); @@ -91,17 +93,34 @@ void GrGLVertexBuilder::emitAttributes(const GrGeometryProcessor& gp) { } } -void GrGLVertexBuilder::transformSkiaToGLCoords() { - const char* rtAdjustName; +void GrGLVertexBuilder::transformToNormalizedDeviceSpace() { + // setup RT Uniform fProgramBuilder->fUniformHandles.fRTAdjustmentUni = fProgramBuilder->addUniform(GrGLProgramBuilder::kVertex_Visibility, kVec4f_GrSLType, - "rtAdjustment", - &rtAdjustName); + fProgramBuilder->rtAdjustment(), + &fRtAdjustName); + // Wire transforms + SkTArray<GrGLProgramBuilder::TransformVarying, true>& transVs = fProgramBuilder->fCoordVaryings; + int transformCount = transVs.count(); + for (int i = 0; i < transformCount; i++) { + const char* coords = transVs[i].fSourceCoords.c_str(); + + // varying = matrix * coords (logically) + const GrGLVarying& v = transVs[i].fV; + if (kVec2f_GrSLType == v.fType) { + this->codeAppendf("%s = (%s * vec3(%s, 1)).xy;", v.fVsOut, transVs[i].fUniName.c_str(), + coords); + } else { + this->codeAppendf("%s = %s * vec3(%s, 1);", v.fVsOut, transVs[i].fUniName.c_str(), + coords); + } + } // Transform from Skia's device coords to GL's normalized device coords. - this->codeAppendf("gl_Position = vec4(dot(pos3.xz, %s.xy), dot(pos3.yz, %s.zw), 0, pos3.z);", - rtAdjustName, rtAdjustName); + this->codeAppendf("gl_Position = vec4(dot(%s.xz, %s.xy), dot(%s.yz, %s.zw), 0, %s.z);", + this->glPosition(), fRtAdjustName, this->glPosition(), fRtAdjustName, + this->glPosition()); } void GrGLVertexBuilder::bindVertexAttributes(GrGLuint programID) { |