aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/GrGeometryProcessor.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpu/GrGeometryProcessor.h')
-rw-r--r--src/gpu/GrGeometryProcessor.h78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/gpu/GrGeometryProcessor.h b/src/gpu/GrGeometryProcessor.h
new file mode 100644
index 0000000000..01401ae797
--- /dev/null
+++ b/src/gpu/GrGeometryProcessor.h
@@ -0,0 +1,78 @@
+/*
+ * 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 "GrProcessor.h"
+#include "GrShaderVar.h"
+
+/**
+ * A GrGeomteryProcessor is used to perform computation in the vertex shader and
+ * add support for custom vertex attributes. A GrGemeotryProcessor is typically
+ * tied to the code that does a specific type of high-level primitive rendering
+ * (e.g. anti-aliased circle rendering). The GrGeometryProcessor used for a draw is
+ * specified using GrDrawState. There can only be one geometry processor active for
+ * a draw. The custom vertex attributes required by the geometry processor must be
+ * added to the vertex attribute array specified on the GrDrawState.
+ * GrGeometryProcessor subclasses should be immutable after construction.
+ */
+class GrGeometryProcessor : public GrProcessor {
+public:
+ GrGeometryProcessor()
+ : fWillUseGeoShader(false) {}
+
+ virtual const GrBackendGeometryProcessorFactory& getFactory() const = 0;
+
+ /*
+ * This only has a max because GLProgramsTest needs to generate test arrays, and these have to
+ * be static
+ * TODO make this truly dynamic
+ */
+ static const int kMaxVertexAttribs = 2;
+ typedef SkTArray<GrShaderVar, true> VertexAttribArray;
+
+ const VertexAttribArray& getVertexAttribs() const { return fVertexAttribs; }
+
+ bool willUseGeoShader() const { return fWillUseGeoShader; }
+
+ /** Returns true if this and other processor conservatively draw identically. It can only return
+ true when the two prcoessors are of the same subclass (i.e. they return the same object from
+ from getFactory()).
+ A return value of true from isEqual() should not be used to test whether the processors
+ would generate the same shader code. To test for identical code generation use the
+ processors' keys computed by the GrBackendEffectFactory. */
+ bool isEqual(const GrGeometryProcessor& that) const {
+ if (&this->getFactory() != &that.getFactory() || !this->hasSameTextureAccesses(that)) {
+ return false;
+ }
+ return this->onIsEqual(that);
+ }
+
+protected:
+ /**
+ * Subclasses call this from their constructor to register vertex attributes (at most
+ * kMaxVertexAttribs). This must only be called from the constructor because GrProcessors are
+ * immutable.
+ */
+ const GrShaderVar& addVertexAttrib(const GrShaderVar& var) {
+ SkASSERT(fVertexAttribs.count() < kMaxVertexAttribs);
+ return fVertexAttribs.push_back(var);
+ }
+
+ void setWillUseGeoShader() { fWillUseGeoShader = true; }
+
+private:
+ virtual bool onIsEqual(const GrGeometryProcessor&) const = 0;
+
+ SkSTArray<kMaxVertexAttribs, GrShaderVar, true> fVertexAttribs;
+ bool fWillUseGeoShader;
+
+ typedef GrProcessor INHERITED;
+};
+
+#endif