• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2017 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #include "src/gpu/glsl/GrGLSLVertexGeoBuilder.h"
9 
10 #include "include/gpu/GrTypes.h"
11 #include "src/gpu/glsl/GrGLSLProgramBuilder.h"
12 #include "src/gpu/glsl/GrGLSLVarying.h"
13 
emitNormalizedSkPosition(SkString * out,const char * devPos,const char * rtAdjustName,GrSLType devPosType)14 void GrGLSLVertexGeoBuilder::emitNormalizedSkPosition(SkString* out, const char* devPos,
15                                                       const char* rtAdjustName,
16                                                       GrSLType devPosType) {
17     if (this->getProgramBuilder()->desc()->header().fSnapVerticesToPixelCenters) {
18         if (kFloat3_GrSLType == devPosType) {
19             const char* p = devPos;
20             out->appendf("{float2 _posTmp = float2(%s.x/%s.z, %s.y/%s.z);", p, p, p, p);
21         } else {
22             SkASSERT(kFloat2_GrSLType == devPosType);
23             out->appendf("{float2 _posTmp = %s;", devPos);
24         }
25         out->appendf("_posTmp = floor(_posTmp) + half2(0.5, 0.5);"
26                      "sk_Position = float4(_posTmp, 0, 1);}");
27     } else if (kFloat3_GrSLType == devPosType) {
28         out->appendf("sk_Position = float4(%s.x , %s.y, 0, %s.z);",
29                      devPos, devPos, devPos);
30     } else {
31         SkASSERT(kFloat2_GrSLType == devPosType);
32         out->appendf("sk_Position = float4(%s.x , %s.y, 0, 1);",
33                      devPos, devPos);
34     }
35 }
36 
onFinalize()37 void GrGLSLVertexBuilder::onFinalize() {
38     // We could have the GrGeometryProcessor do this, but its just easier to have it performed
39     // here. If we ever need to set variable pointsize, then we can reinvestigate.
40     if (this->getProgramBuilder()->desc()->header().fHasPointSize) {
41         this->codeAppend("sk_PointSize = 1.0;");
42     }
43     fProgramBuilder->varyingHandler()->getVertexDecls(&this->inputs(), &this->outputs());
44 }
45 
input_type_name(GrGLSLGeometryBuilder::InputType in)46 static const char* input_type_name(GrGLSLGeometryBuilder::InputType in) {
47     using InputType = GrGLSLGeometryBuilder::InputType;
48     switch (in) {
49         case InputType::kPoints: return "points";
50         case InputType::kLines: return "lines";
51         case InputType::kLinesAdjacency: return "lines_adjacency";
52         case InputType::kTriangles: return "triangles";
53         case InputType::kTrianglesAdjacency: return "triangles_adjacency";
54     }
55     SK_ABORT("invalid input type");
56 }
57 
output_type_name(GrGLSLGeometryBuilder::OutputType out)58 static const char* output_type_name(GrGLSLGeometryBuilder::OutputType out) {
59     using OutputType = GrGLSLGeometryBuilder::OutputType;
60     switch (out) {
61         case OutputType::kPoints: return "points";
62         case OutputType::kLineStrip: return "line_strip";
63         case OutputType::kTriangleStrip: return "triangle_strip";
64     }
65     SK_ABORT("invalid output type");
66 }
67 
configure(InputType inputType,OutputType outputType,int maxVertices,int numInvocations)68 void GrGLSLGeometryBuilder::configure(InputType inputType, OutputType outputType, int maxVertices,
69                                       int numInvocations) {
70     SkASSERT(!this->isConfigured());
71     fNumInvocations = numInvocations;
72     this->addLayoutQualifier(input_type_name(inputType), kIn_InterfaceQualifier);
73     this->addLayoutQualifier(SkStringPrintf("invocations = %i", numInvocations).c_str(),
74                              kIn_InterfaceQualifier);
75     this->addLayoutQualifier(output_type_name(outputType), kOut_InterfaceQualifier);
76     this->addLayoutQualifier(SkStringPrintf("max_vertices = %i", maxVertices).c_str(),
77                              kOut_InterfaceQualifier);
78 }
79 
emitVertex(SkString * out,const char * devPos,const char * rtAdjustName,GrSLType devPosType)80 void GrGLSLGeometryBuilder::emitVertex(SkString* out, const char* devPos, const char* rtAdjustName,
81                                        GrSLType devPosType) {
82     this->emitNormalizedSkPosition(out, devPos, rtAdjustName, devPosType);
83     out->append("EmitVertex();");
84 }
85 
endPrimitive()86 void GrGLSLGeometryBuilder::endPrimitive() {
87     this->codeAppend("EndPrimitive();");
88 }
89 
onFinalize()90 void GrGLSLGeometryBuilder::onFinalize() {
91     SkASSERT(this->isConfigured());
92     fProgramBuilder->varyingHandler()->getGeomDecls(&this->inputs(), &this->outputs());
93 }
94