| /* | |
| * Copyright 2017 Google LLC | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "src/gpu/ganesh/glsl/GrGLSLVertexGeoBuilder.h" | |
| #include "include/private/SkAssert.h" | |
| #include "src/gpu/ganesh/glsl/GrGLSLProgramBuilder.h" | |
| #include "src/gpu/ganesh/glsl/GrGLSLVarying.h" | |
| void GrGLSLVertexGeoBuilder::emitNormalizedSkPosition(SkString* out, const char* devPos, | |
| SkSLType devPosType) { | |
| if (this->getProgramBuilder()->snapVerticesToPixelCenters()) { | |
| if (SkSLType::kFloat3 == devPosType) { | |
| const char* p = devPos; | |
| out->appendf("{float2 _posTmp = %s.xy / %s.z;", p, p); | |
| } else { | |
| SkASSERT(SkSLType::kFloat2 == devPosType); | |
| out->appendf("{float2 _posTmp = %s;", devPos); | |
| } | |
| out->appendf("_posTmp = floor(_posTmp) + float2(0.5);" | |
| "sk_Position = _posTmp.xy01;}"); | |
| } else if (SkSLType::kFloat3 == devPosType) { | |
| out->appendf("sk_Position = %s.xy0z;", devPos); | |
| } else { | |
| SkASSERT(SkSLType::kFloat2 == 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()); | |
| } |