| /* |
| * Copyright 2017 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "src/gpu/glsl/GrGLSLVertexGeoBuilder.h" |
| |
| #include "include/gpu/GrTypes.h" |
| #include "src/gpu/glsl/GrGLSLProgramBuilder.h" |
| #include "src/gpu/glsl/GrGLSLVarying.h" |
| |
| void GrGLSLVertexGeoBuilder::emitNormalizedSkPosition(SkString* out, const char* devPos, |
| GrSLType devPosType) { |
| if (this->getProgramBuilder()->snapVerticesToPixelCenters()) { |
| if (kFloat3_GrSLType == devPosType) { |
| const char* p = devPos; |
| out->appendf("{float2 _posTmp = %s.xy / %s.z;", p, p); |
| } else { |
| SkASSERT(kFloat2_GrSLType == devPosType); |
| out->appendf("{float2 _posTmp = %s;", devPos); |
| } |
| out->appendf("_posTmp = floor(_posTmp) + float2(0.5);" |
| "sk_Position = _posTmp.xy01;}"); |
| } else if (kFloat3_GrSLType == devPosType) { |
| out->appendf("sk_Position = %s.xy0z;", devPos); |
| } else { |
| SkASSERT(kFloat2_GrSLType == devPosType); |
| out->appendf("sk_Position = %s.xy01;", devPos); |
| } |
| } |
| |
| void GrGLSLVertexBuilder::onFinalize() { |
| // We could have the GrGeometryProcessor do this, but its just easier to have it performed |
| // here. If we ever need to set variable pointsize, then we can reinvestigate. |
| if (this->getProgramBuilder()->hasPointSize()) { |
| this->codeAppend("sk_PointSize = 1.0;"); |
| } |
| fProgramBuilder->varyingHandler()->getVertexDecls(&this->inputs(), &this->outputs()); |
| } |