blob: 0b3a16d5a4b3fc1b769982592cb7f3f5e0b685a7 [file] [log] [blame]
/*
* 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 "GrBufferAccess.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(BatchInfo, GrBuffer* paramsBuffer);
const char* name() const override { return "Instance Processor"; }
BatchInfo batchInfo() const { return fBatchInfo; }
void getGLSLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder* b) const override {
b->add32(fBatchInfo.fData);
}
GrGLSLPrimitiveProcessor* createGLSLInstance(const GrGLSLCaps&) 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(AntialiasMode);
static IndexRange GetIndexRangeForOval(AntialiasMode, const SkRect& devBounds);
static IndexRange GetIndexRangeForRRect(AntialiasMode);
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 GrGLSLCaps&, const GrCaps&);
const BatchInfo fBatchInfo;
GrBufferAccess fParamsAccess;
friend class GLInstancedRendering; // For CheckSupport.
typedef GrGeometryProcessor INHERITED;
};
}
#endif