Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(102)

Unified Diff: src/gpu/gl/GrGLProgramEffects.h

Issue 25846002: Use vertexless shaders when NVpr is available (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Oops, make all the tests pass Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gpu/gl/GrGLProgramDesc.h ('k') | src/gpu/gl/GrGLProgramEffects.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/gl/GrGLProgramEffects.h
diff --git a/src/gpu/gl/GrGLProgramEffects.h b/src/gpu/gl/GrGLProgramEffects.h
index f6f975ae4e76106a4c342e6b70d02248392657dc..837398b38f6cb9ce56e2f5b3c49c95954015e738 100644
--- a/src/gpu/gl/GrGLProgramEffects.h
+++ b/src/gpu/gl/GrGLProgramEffects.h
@@ -18,6 +18,7 @@ class GrGLProgramEffectsBuilder;
class GrGLVertexProgramEffectsBuilder;
class GrGLShaderBuilder;
class GrGLFullShaderBuilder;
+class GrGLFragmentOnlyShaderBuilder;
/**
* This class encapsulates an array of GrGLEffects and their supporting data (coord transforms
@@ -56,7 +57,7 @@ public:
*/
class TransformedCoords {
public:
- TransformedCoords(const char* name, GrSLType type)
+ TransformedCoords(const SkString& name, GrSLType type)
: fName(name), fType(type) {
}
@@ -155,6 +156,43 @@ private:
typedef GrGLProgramEffects INHERITED;
};
+/**
+ * This is a GrGLProgramEffects implementation that does coord transforms with the the built-in GL
+ * TexGen functionality.
+ */
+class GrGLTexGenProgramEffects : public GrGLProgramEffects {
+public:
+ virtual void setData(GrGpuGL*,
+ const GrGLUniformManager&,
+ const GrEffectStage* effectStages[]) SK_OVERRIDE;
+
+private:
+ friend class GrGLTexGenProgramEffectsBuilder;
+
+ GrGLTexGenProgramEffects(int reserveCount)
+ : INHERITED(reserveCount)
+#ifdef SK_DEBUG
+ , fFirstTexCoordIdx(0)
Kimmo Kinnunen 2013/10/04 11:02:33 This variable is never set in release mode. Causes
+ , fNumTexCoordSets(0)
+#endif
+ , fTransformKeys(reserveCount) {
+ }
+
+ /**
+ * Helper for setData(). Sets the TexGen state for each transform in an effect. The transforms
+ * use adjacent texture units, starting with *texCoordIdx. Increments *texCoordIdx by the number
+ * of transforms before returning.
+ */
+ void setTexGenState(GrGpuGL*, const GrDrawEffect&, int* texCoordIdx, int effectIdx);
+
+ int fFirstTexCoordIdx;
+ SkDEBUGCODE(int fNumTexCoordSets;)
+ SkTArray<EffectKey, true> fTransformKeys;
+
+ typedef GrGLProgramEffects INHERITED;
+};
+
+
////////////////////////////////////////////////////////////////////////////////
/**
@@ -224,4 +262,42 @@ private:
typedef GrGLProgramEffectsBuilder INHERITED;
};
+/**
+ * This class is used by GrGLFragmentOnlyBuilder to construct a GrGLTexGenProgramEffects.
+ */
+class GrGLTexGenProgramEffectsBuilder : public GrGLProgramEffectsBuilder {
+public:
+ GrGLTexGenProgramEffectsBuilder(GrGLFragmentOnlyShaderBuilder*, int reserveCount);
+
+ virtual void emitEffect(const GrEffectStage&,
+ GrGLProgramEffects::EffectKey,
+ const char* outColor,
+ const char* inColor,
+ int stageIndex) SK_OVERRIDE;
+
+ /**
+ * Finalizes the building process and returns the effect array. After this call, the builder
+ * becomes invalid.
+ */
+ GrGLProgramEffects* finish() { return fProgramEffects.detach(); }
+
+private:
+ /**
+ * Helper for emitEffect(). Allocates texture units from the builder for each transform in an
+ * effect. The transforms all use adjacent texture units. They either use two or three of the
+ * coordinates at a given texture unit, depending on if they need perspective interpolation.
+ * The expressions to access the transformed coords (i.e. 'vec2(gl_TexCoord[0])') as well as the
+ * types are appended to the TransformedCoordsArray* object, which is in turn passed to the
+ * effect's emitCode() function.
+ */
+ void setupTexGen(const GrEffectRef&,
+ GrGLProgramEffects::EffectKey,
+ GrGLProgramEffects::TransformedCoordsArray*);
+
+ GrGLFragmentOnlyShaderBuilder* fBuilder;
+ SkAutoTDelete<GrGLTexGenProgramEffects> fProgramEffects;
+
+ typedef GrGLProgramEffectsBuilder INHERITED;
+};
+
#endif
« no previous file with comments | « src/gpu/gl/GrGLProgramDesc.h ('k') | src/gpu/gl/GrGLProgramEffects.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698