/*
 * Copyright 2013 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef GrGeometryProcessor_DEFINED
#define GrGeometryProcessor_DEFINED

#include "src/gpu/GrPrimitiveProcessor.h"

/**
 * A GrGeometryProcessor is a flexible method for rendering a primitive.  The GrGeometryProcessor
 * has complete control over vertex attributes and uniforms (aside from the render target) but it
 * must obey the same contract as any GrPrimitiveProcessor, specifically it must emit a color and
 * coverage into the fragment shader.  Where this color and coverage come from is completely the
 * responsibility of the GrGeometryProcessor.
 *
 * Note that all derived classes should hide their constructors and provide a Make factory
 * function that takes an arena (except for CCPR-specific classes). This is because
 * GrGeometryProcessor's are not ref-counted to must have some other mechanism for managing
 * their lifetime. In particular, geometry processors can be created in either the
 * record-time or flush-time arenas which defined their lifetimes (i.e., a DDLs life time in
 * the first case and a single flush in the second case).
 */
class GrGeometryProcessor : public GrPrimitiveProcessor {
public:
    GrGeometryProcessor(ClassID classID)
        : INHERITED(classID)
        , fWillUseGeoShader(false) {}

    bool willUseGeoShader() const final { return fWillUseGeoShader; }

protected:
    void setWillUseGeoShader() { fWillUseGeoShader = true; }

    // GPs that need to use either half-float or ubyte colors can just call this to get a correctly
    // configured Attribute struct
    static Attribute MakeColorAttribute(const char* name, bool wideColor) {
        return { name,
                 wideColor ? kHalf4_GrVertexAttribType : kUByte4_norm_GrVertexAttribType,
                 kHalf4_GrSLType };
    }

private:
    bool fWillUseGeoShader;

    typedef GrPrimitiveProcessor INHERITED;
};

#endif
