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

#ifndef gr_instanced_InstanceProcessor_DEFINED
#define gr_instanced_InstanceProcessor_DEFINED

#include "GrCaps.h"
#include "GrGeometryProcessor.h"
#include "instanced/InstancedRenderingTypes.h"

namespace gr_instanced {

/**
 * This class provides a GP implementation that uses instanced rendering. Is sends geometry in as
 * basic, pre-baked canonical shapes, and uses instanced vertex attribs to control how these shapes
 * are transformed and drawn. MSAA is accomplished with the sample mask rather than finely
 * tesselated geometry.
 */
class InstanceProcessor : public GrGeometryProcessor {
public:
    InstanceProcessor(OpInfo, GrBuffer* paramsBuffer);

    const char* name() const override { return "Instance Processor"; }
    OpInfo opInfo() const { return fOpInfo; }

    void getGLSLProcessorKey(const GrShaderCaps&, GrProcessorKeyBuilder* b) const override {
        b->add32(fOpInfo.fData);
    }
    GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps&) const override;

    /**
     * Returns a buffer of ShapeVertex that defines the canonical instanced geometry.
     */
    static const GrBuffer* SK_WARN_UNUSED_RESULT FindOrCreateVertexBuffer(GrGpu*);

    /**
     * Returns a buffer of 8-bit indices for the canonical instanced geometry. The client can call
     * GetIndexRangeForXXX to know which indices to use for a specific shape.
     */
    static const GrBuffer* SK_WARN_UNUSED_RESULT FindOrCreateIndex8Buffer(GrGpu*);

    static IndexRange GetIndexRangeForRect(GrAAType);
    static IndexRange GetIndexRangeForOval(GrAAType, const SkRect& devBounds);
    static IndexRange GetIndexRangeForRRect(GrAAType);

    static const char* GetNameOfIndexRange(IndexRange);

private:
    /**
     * Called by the platform-specific instanced rendering implementation to determine the level of
     * support this class can offer on the given GLSL platform.
     */
    static GrCaps::InstancedSupport CheckSupport(const GrShaderCaps&, const GrCaps&);

    const OpInfo fOpInfo;
    BufferAccess fParamsAccess;

    friend class GLInstancedRendering; // For CheckSupport.

    typedef GrGeometryProcessor INHERITED;
};

}

#endif
