aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/GrGeometryProcessor.h
diff options
context:
space:
mode:
authorGravatar joshualitt <joshualitt@chromium.org>2015-02-12 14:20:52 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2015-02-12 14:20:52 -0800
commit8072caa80384292858d31ae34b7e19768875866b (patch)
tree540934943305cb0aa1e73bfa836e260cab8b45b0 /src/gpu/GrGeometryProcessor.h
parentb0fb935bd544b0c6f68c692c7e1ee40876184a1a (diff)
A simple change to move a bunch of stuff out of Gr*Geometry.h
Diffstat (limited to 'src/gpu/GrGeometryProcessor.h')
-rw-r--r--src/gpu/GrGeometryProcessor.h264
1 files changed, 1 insertions, 263 deletions
diff --git a/src/gpu/GrGeometryProcessor.h b/src/gpu/GrGeometryProcessor.h
index a7fea765ab..7f8d041af8 100644
--- a/src/gpu/GrGeometryProcessor.h
+++ b/src/gpu/GrGeometryProcessor.h
@@ -8,224 +8,7 @@
#ifndef GrGeometryProcessor_DEFINED
#define GrGeometryProcessor_DEFINED
-#include "GrColor.h"
-#include "GrProcessor.h"
-#include "GrShaderVar.h"
-
-/*
- * The GrPrimitiveProcessor represents some kind of geometric primitive. This includes the shape
- * of the primitive and the inherent color of the primitive. The GrPrimitiveProcessor is
- * responsible for providing a color and coverage input into the Ganesh rendering pipeline. Through
- * optimization, Ganesh may decide a different color, no color, and / or no coverage are required
- * from the GrPrimitiveProcessor, so the GrPrimitiveProcessor must be able to support this
- * functionality. We also use the GrPrimitiveProcessor to make batching decisions.
- *
- * There are two feedback loops between the GrFragmentProcessors, the GrXferProcessor, and the
- * GrPrimitiveProcessor. These loops run on the CPU and compute any invariant components which
- * might be useful for correctness / optimization decisions. The GrPrimitiveProcessor seeds these
- * loops, one with initial color and one with initial coverage, in its
- * onComputeInvariantColor / Coverage calls. These seed values are processed by the subsequent
- * stages of the rendering pipeline and the output is then fed back into the GrPrimitiveProcessor in
- * the initBatchTracker call, where the GrPrimitiveProcessor can then initialize the GrBatchTracker
- * struct with the appropriate values.
- *
- * We are evolving this system to move towards generating geometric meshes and their associated
- * vertex data after we have batched and reordered draws. This system, known as 'deferred geometry'
- * will allow the GrPrimitiveProcessor much greater control over how data is transmitted to shaders.
- *
- * In a deferred geometry world, the GrPrimitiveProcessor can always 'batch' To do this, each
- * primitive type is associated with one GrPrimitiveProcessor, who has complete control of how
- * it draws. Each primitive draw will bundle all required data to perform the draw, and these
- * bundles of data will be owned by an instance of the associated GrPrimitiveProcessor. Bundles
- * can be updated alongside the GrBatchTracker struct itself, ultimately allowing the
- * GrPrimitiveProcessor complete control of how it gets data into the fragment shader as long as
- * it emits the appropriate color, or none at all, as directed.
- */
-
-/*
- * A struct for tracking batching decisions. While this lives on GrOptState, it is managed
- * entirely by the derived classes of the GP.
- * // TODO this was an early attempt at handling out of order batching. It should be
- * used carefully as it is being replaced by GrBatch
- */
-class GrBatchTracker {
-public:
- template <typename T> const T& cast() const {
- SkASSERT(sizeof(T) <= kMaxSize);
- return *reinterpret_cast<const T*>(fData.get());
- }
-
- template <typename T> T* cast() {
- SkASSERT(sizeof(T) <= kMaxSize);
- return reinterpret_cast<T*>(fData.get());
- }
-
- static const size_t kMaxSize = 32;
-
-private:
- SkAlignedSStorage<kMaxSize> fData;
-};
-
-class GrIndexBufferAllocPool;
-class GrGLCaps;
-class GrGLPrimitiveProcessor;
-class GrVertexBufferAllocPool;
-
-struct GrInitInvariantOutput;
-
-/*
- * This struct allows the GrPipeline to communicate information about the pipeline. Most of this
- * is overrides, but some of it is general information. Logically it should live in GrPipeline.h,
- * but this is problematic due to circular dependencies.
- */
-struct GrPipelineInfo {
- bool fColorIgnored;
- bool fCoverageIgnored;
- GrColor fOverrideColor;
- bool fUsesLocalCoords;
-};
-
-/*
- * This enum is shared by GrPrimitiveProcessors and GrGLPrimitiveProcessors to coordinate shaders
- * with vertex attributes / uniforms.
- */
-enum GrGPInput {
- kAllOnes_GrGPInput,
- kAttribute_GrGPInput,
- kUniform_GrGPInput,
- kIgnored_GrGPInput,
-};
-
-/*
- * GrPrimitiveProcessor defines an interface which all subclasses must implement. All
- * GrPrimitiveProcessors must proivide seed color and coverage for the Ganesh color / coverage
- * pipelines, and they must provide some notion of equality
- */
-class GrPrimitiveProcessor : public GrProcessor {
-public:
- // TODO let the PrimProc itself set this in its setData call, this should really live on the
- // bundle of primitive data
- const SkMatrix& viewMatrix() const { return fViewMatrix; }
- const SkMatrix& localMatrix() const { return fLocalMatrix; }
-
- virtual void initBatchTracker(GrBatchTracker*, const GrPipelineInfo&) const = 0;
-
- virtual bool canMakeEqual(const GrBatchTracker& mine,
- const GrPrimitiveProcessor& that,
- const GrBatchTracker& theirs) const = 0;
-
- virtual void getInvariantOutputColor(GrInitInvariantOutput* out) const = 0;
- virtual void getInvariantOutputCoverage(GrInitInvariantOutput* out) const = 0;
-
- // Only the GrGeometryProcessor subclass actually has a geo shader or vertex attributes, but
- // we put these calls on the base class to prevent having to cast
- virtual bool willUseGeoShader() const = 0;
-
- /*
- * This is a safeguard to prevent GrPrimitiveProcessor's from going beyond platform specific
- * attribute limits. This number can almost certainly be raised if required.
- */
- static const int kMaxVertexAttribs = 6;
-
- struct Attribute {
- Attribute()
- : fName(NULL)
- , fType(kFloat_GrVertexAttribType)
- , fOffset(0) {}
- Attribute(const char* name, GrVertexAttribType type)
- : fName(name)
- , fType(type)
- , fOffset(SkAlign4(GrVertexAttribTypeSize(type))) {}
- const char* fName;
- GrVertexAttribType fType;
- size_t fOffset;
- };
-
- int numAttribs() const { return fNumAttribs; }
- const Attribute& getAttrib(int index) const {
- SkASSERT(index < fNumAttribs);
- return fAttribs[index];
- }
-
- // Returns the vertex stride of the GP. A common use case is to request geometry from a
- // drawtarget based off of the stride, and to populate this memory using an implicit array of
- // structs. In this case, it is best to assert the vertexstride == sizeof(VertexStruct).
- size_t getVertexStride() const { return fVertexStride; }
-
- /**
- * Gets a transformKey from an array of coord transforms
- */
- uint32_t getTransformKey(const SkTArray<const GrCoordTransform*, true>&) const;
-
- /**
- * Sets a unique key on the GrProcessorKeyBuilder that is directly associated with this geometry
- * processor's GL backend implementation.
- */
- virtual void getGLProcessorKey(const GrBatchTracker& bt,
- const GrGLCaps& caps,
- GrProcessorKeyBuilder* b) const = 0;
-
-
- /** Returns a new instance of the appropriate *GL* implementation class
- for the given GrProcessor; caller is responsible for deleting
- the object. */
- virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt,
- const GrGLCaps& caps) const = 0;
-
- bool isPathRendering() const { return fIsPathRendering; }
-
-protected:
- GrPrimitiveProcessor(const SkMatrix& viewMatrix, const SkMatrix& localMatrix,
- bool isPathRendering)
- : fNumAttribs(0)
- , fVertexStride(0)
- , fViewMatrix(viewMatrix)
- , fLocalMatrix(localMatrix)
- , fIsPathRendering(isPathRendering) {}
-
- /*
- * CanCombineOutput will return true if two draws are 'batchable' from a color perspective.
- * TODO remove this when GPs can upgrade to attribute color
- */
- static bool CanCombineOutput(GrGPInput left, GrColor lColor, GrGPInput right, GrColor rColor) {
- if (left != right) {
- return false;
- }
-
- if (kUniform_GrGPInput == left && lColor != rColor) {
- return false;
- }
-
- return true;
- }
-
- static bool CanCombineLocalMatrices(const GrPrimitiveProcessor& left,
- bool leftUsesLocalCoords,
- const GrPrimitiveProcessor& right,
- bool rightUsesLocalCoords) {
- if (leftUsesLocalCoords != rightUsesLocalCoords) {
- return false;
- }
-
- if (leftUsesLocalCoords && !left.localMatrix().cheapEqualTo(right.localMatrix())) {
- return false;
- }
- return true;
- }
-
- Attribute fAttribs[kMaxVertexAttribs];
- int fNumAttribs;
- size_t fVertexStride;
-
-private:
- virtual bool hasExplicitLocalCoords() const = 0;
-
- const SkMatrix fViewMatrix;
- SkMatrix fLocalMatrix;
- bool fIsPathRendering;
-
- typedef GrProcessor INHERITED;
-};
+#include "GrPrimitiveProcessor.h"
/**
* A GrGeometryProcessor is a flexible method for rendering a primitive. The GrGeometryProcessor
@@ -370,49 +153,4 @@ private:
typedef GrPrimitiveProcessor INHERITED;
};
-/*
- * The path equivalent of the GP. For now this just manages color. In the long term we plan on
- * extending this class to handle all nvpr uniform / varying / program work.
- */
-class GrPathProcessor : public GrPrimitiveProcessor {
-public:
- static GrPathProcessor* Create(GrColor color,
- const SkMatrix& viewMatrix = SkMatrix::I(),
- const SkMatrix& localMatrix = SkMatrix::I()) {
- return SkNEW_ARGS(GrPathProcessor, (color, viewMatrix, localMatrix));
- }
-
- void initBatchTracker(GrBatchTracker*, const GrPipelineInfo&) const SK_OVERRIDE;
-
- bool canMakeEqual(const GrBatchTracker& mine,
- const GrPrimitiveProcessor& that,
- const GrBatchTracker& theirs) const SK_OVERRIDE;
-
- const char* name() const SK_OVERRIDE { return "PathProcessor"; }
-
- GrColor color() const { return fColor; }
-
- void getInvariantOutputColor(GrInitInvariantOutput* out) const SK_OVERRIDE;
- void getInvariantOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRIDE;
-
- bool willUseGeoShader() const SK_OVERRIDE { return false; }
-
- virtual void getGLProcessorKey(const GrBatchTracker& bt,
- const GrGLCaps& caps,
- GrProcessorKeyBuilder* b) const SK_OVERRIDE;
-
- virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt,
- const GrGLCaps& caps) const SK_OVERRIDE;
-
-protected:
- GrPathProcessor(GrColor color, const SkMatrix& viewMatrix, const SkMatrix& localMatrix);
-
-private:
- bool hasExplicitLocalCoords() const SK_OVERRIDE { return false; }
-
- GrColor fColor;
-
- typedef GrPrimitiveProcessor INHERITED;
-};
-
#endif