/* * Copyright 2017 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrGLSLVertexGeoBuilder_DEFINED #define GrGLSLVertexGeoBuilder_DEFINED #include "GrGLSLShaderBuilder.h" /** * Base class for vertex and geometry shader builders. This is the stage that computes input * geometry for the rasterizer. */ class GrGLSLVertexGeoBuilder : public GrGLSLShaderBuilder { protected: GrGLSLVertexGeoBuilder(GrGLSLProgramBuilder* program) : INHERITED(program) {} void emitNormalizedSkPosition(const char* devPos, const char* rtAdjustName, GrSLType devPosType = GrSLType::kFloat2_GrSLType) { this->emitNormalizedSkPosition(&this->code(), devPos, rtAdjustName, devPosType); } void emitNormalizedSkPosition(SkString* out, const char* devPos, const char* rtAdjustName, GrSLType devPosType = GrSLType::kFloat2_GrSLType); friend class GrGLSLGeometryProcessor; typedef GrGLSLShaderBuilder INHERITED; }; class GrGLSLVertexBuilder : public GrGLSLVertexGeoBuilder { public: GrGLSLVertexBuilder(GrGLSLProgramBuilder* program) : INHERITED(program) {} private: void onFinalize() override; friend class GrGLProgramBuilder; typedef GrGLSLVertexGeoBuilder INHERITED; }; class GrGLSLGeometryBuilder : public GrGLSLVertexGeoBuilder { public: GrGLSLGeometryBuilder(GrGLSLProgramBuilder* program) : INHERITED(program) {} enum class InputType { kPoints, kLines, kLinesAdjacency, kTriangles, kTrianglesAdjacency }; enum class OutputType { kPoints, kLineStrip, kTriangleStrip }; void configure(InputType, OutputType, int maxVertices, int numInvocations = 1); bool isConfigured() const { return fNumInvocations; } void emitVertex(const char* devPos, const char* rtAdjustName, GrSLType devPosType = GrSLType::kFloat2_GrSLType) { this->emitVertex(&this->code(), devPos, rtAdjustName, devPosType); } void emitVertex(SkString* out, const char* devPos, const char* rtAdjustName, GrSLType devPosType = GrSLType::kFloat2_GrSLType); void endPrimitive(); private: void onFinalize() override; int fNumInvocations = 0; friend class GrGLProgramBuilder; typedef GrGLSLVertexGeoBuilder INHERITED; }; #endif