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 #ifndef GrGLSLVertexGeoBuilder_DEFINED 9 #define GrGLSLVertexGeoBuilder_DEFINED 10 11 #include "src/gpu/glsl/GrGLSLShaderBuilder.h" 12 13 /** 14 * Base class for vertex and geometry shader builders. This is the stage that computes input 15 * geometry for the rasterizer. 16 */ 17 class GrGLSLVertexGeoBuilder : public GrGLSLShaderBuilder { 18 protected: GrGLSLVertexGeoBuilder(GrGLSLProgramBuilder * program)19 GrGLSLVertexGeoBuilder(GrGLSLProgramBuilder* program) : INHERITED(program) {} 20 21 void emitNormalizedSkPosition(const char* devPos, const char* rtAdjustName, 22 GrSLType devPosType = GrSLType::kFloat2_GrSLType) { 23 this->emitNormalizedSkPosition(&this->code(), devPos, rtAdjustName, devPosType); 24 } 25 26 void emitNormalizedSkPosition(SkString* out, const char* devPos, const char* rtAdjustName, 27 GrSLType devPosType = GrSLType::kFloat2_GrSLType); 28 29 friend class GrGLSLGeometryProcessor; 30 31 typedef GrGLSLShaderBuilder INHERITED; 32 }; 33 34 35 class GrGLSLVertexBuilder : public GrGLSLVertexGeoBuilder { 36 public: GrGLSLVertexBuilder(GrGLSLProgramBuilder * program)37 GrGLSLVertexBuilder(GrGLSLProgramBuilder* program) : INHERITED(program) {} 38 39 private: 40 void onFinalize() override; 41 42 friend class GrGLProgramBuilder; 43 44 typedef GrGLSLVertexGeoBuilder INHERITED; 45 }; 46 47 48 class GrGLSLGeometryBuilder : public GrGLSLVertexGeoBuilder { 49 public: GrGLSLGeometryBuilder(GrGLSLProgramBuilder * program)50 GrGLSLGeometryBuilder(GrGLSLProgramBuilder* program) : INHERITED(program) {} 51 52 enum class InputType { 53 kPoints, 54 kLines, 55 kTriangles, 56 }; 57 58 enum class OutputType { 59 kPoints, 60 kLineStrip, 61 kTriangleStrip 62 }; 63 64 void configure(InputType, OutputType, int maxVertices, int numInvocations = 1); isConfigured()65 bool isConfigured() const { return fNumInvocations; } 66 67 void emitVertex(const char* devPos, const char* rtAdjustName, 68 GrSLType devPosType = GrSLType::kFloat2_GrSLType) { 69 this->emitVertex(&this->code(), devPos, rtAdjustName, devPosType); 70 } 71 void emitVertex(SkString* out, const char* devPos, const char* rtAdjustName, 72 GrSLType devPosType = GrSLType::kFloat2_GrSLType); 73 74 void endPrimitive(); 75 76 private: 77 void onFinalize() override; 78 79 int fNumInvocations = 0; 80 81 friend class GrGLProgramBuilder; 82 83 typedef GrGLSLVertexGeoBuilder INHERITED; 84 }; 85 86 #endif 87