/* * 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 "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: static bool IsSupported(const GrGLSLCaps&, const GrCaps&, AntialiasMode* lastSupportedAAMode); 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: const BatchInfo fBatchInfo; GrBufferAccess fParamsAccess; typedef GrGeometryProcessor INHERITED; }; } #endif