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

Unified Diff: src/gpu/gl/builders/GrGLFragmentShaderBuilder.h

Issue 1288723002: Added mangleString member and onBefore*, onAfter* functions to GrGLFragmentShaderBuilder (Closed) Base URL: https://skia.googlesource.com/skia@cs3_flatten
Patch Set: Added a missing brace Created 5 years, 4 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/GrProcessor.cpp ('k') | src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/gl/builders/GrGLFragmentShaderBuilder.h
diff --git a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.h b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.h
index 2b3e18d763dcc946a784f714f7167a97e23ca308..8746fffb8b101f75cb3d637045b2fa736bfd6bfd 100644
--- a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.h
+++ b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.h
@@ -17,7 +17,10 @@ class GrGLVarying;
*/
class GrGLFragmentBuilder : public GrGLShaderBuilder {
public:
- GrGLFragmentBuilder(GrGLProgramBuilder* program) : INHERITED(program) {}
+ GrGLFragmentBuilder(GrGLProgramBuilder* program)
+ : INHERITED(program) {
+ fSubstageIndices.push_back(0);
+ }
virtual ~GrGLFragmentBuilder() {}
/**
* Use of these features may require a GLSL extension to be enabled. Shaders may not compile
@@ -47,7 +50,54 @@ public:
is in device space (e.g. 0,0 is the top left and pixel centers are at half-integers). */
virtual const char* fragmentPosition() = 0;
+ /**
+ * Fragment procs with child procs should call these functions before/after calling emitCode
+ * on a child proc.
+ */
+ void onBeforeChildProcEmitCode();
+ void onAfterChildProcEmitCode();
+
+ int getChildNumberThisLevel() const {
+ if (fSubstageIndices.count() > 1) {
+ // second-to-last value in the fSubstageIndices stack is the index of the child proc
+ // at that level which is currently emitting code.
+ return fSubstageIndices[fSubstageIndices.count() - 2];
+ }
+ return -1;
+ }
+
+ const SkString& getMangleString() const { return fMangleString; }
+
+ SkString getMangleStringThisLevel() const {
+ SkString ret;
+ int childNumber = this->getChildNumberThisLevel();
+ if (childNumber >= 0) {
+ ret.printf("_c%d", childNumber);
+ }
+ return ret;
+ }
+
private:
+ /*
+ * State that tracks which child proc in the proc tree is currently emitting code. This is
+ * used to update the fMangleString, which is used to mangle the names of uniforms and functions
+ * emitted by the proc. fSubstageIndices is a stack: its count indicates how many levels deep
+ * we are in the tree, and its second-to-last value is the index of the child proc at that
+ * level which is currently emitting code. For example, if fSubstageIndices = [3, 1, 2, 0], that
+ * means we're currently emitting code for the base proc's 3rd child's 1st child's 2nd child.
+ */
+ SkTArray<int> fSubstageIndices;
+
+ /*
+ * The mangle string is used to mangle the names of uniforms/functions emitted by the child
+ * procs so no duplicate uniforms/functions appear in the generated shader program. The mangle
+ * string is simply based on fSubstageIndices. For example, if fSubstageIndices = [3, 1, 2, 0],
+ * then the manglestring will be "_c3_c1_c2", and any uniform/function emitted by that proc will
+ * have "_c3_c1_c2" appended to its name, which can be interpreted as "base proc's 3rd child's
+ * 1st child's 2nd child".
+ */
+ SkString fMangleString;
+
friend class GrGLPathProcessor;
typedef GrGLShaderBuilder INHERITED;
« no previous file with comments | « src/gpu/GrProcessor.cpp ('k') | src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698