1 /*
2  * Copyright 2013 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef GrGLPrimitiveProcessor_DEFINED
9 #define GrGLPrimitiveProcessor_DEFINED
10 
11 #include "GrPrimitiveProcessor.h"
12 #include "GrGLProcessor.h"
13 
14 class GrBatchTracker;
15 class GrPrimitiveProcessor;
16 class GrGLGPBuilder;
17 
18 class GrGLPrimitiveProcessor {
19 public:
GrGLPrimitiveProcessor()20     GrGLPrimitiveProcessor() : fViewMatrixName(NULL) { fViewMatrix = SkMatrix::InvalidMatrix(); }
~GrGLPrimitiveProcessor()21     virtual ~GrGLPrimitiveProcessor() {}
22 
23     typedef GrGLProgramDataManager::UniformHandle UniformHandle;
24     typedef GrGLProcessor::TextureSamplerArray TextureSamplerArray;
25 
26     typedef SkSTArray<2, const GrCoordTransform*, true> ProcCoords;
27     typedef SkSTArray<8, ProcCoords> TransformsIn;
28     typedef SkSTArray<8, GrGLProcessor::TransformedCoordsArray> TransformsOut;
29 
30     struct EmitArgs {
EmitArgsEmitArgs31         EmitArgs(GrGLGPBuilder* pb,
32                  const GrPrimitiveProcessor& gp,
33                  const GrBatchTracker& bt,
34                  const char* outputColor,
35                  const char* outputCoverage,
36                  const TextureSamplerArray& samplers,
37                  const TransformsIn& transformsIn,
38                  TransformsOut* transformsOut)
39             : fPB(pb)
40             , fGP(gp)
41             , fBT(bt)
42             , fOutputColor(outputColor)
43             , fOutputCoverage(outputCoverage)
44             , fSamplers(samplers)
45             , fTransformsIn(transformsIn)
46             , fTransformsOut(transformsOut) {}
47         GrGLGPBuilder* fPB;
48         const GrPrimitiveProcessor& fGP;
49         const GrBatchTracker& fBT;
50         const char* fOutputColor;
51         const char* fOutputCoverage;
52         const TextureSamplerArray& fSamplers;
53         const TransformsIn& fTransformsIn;
54         TransformsOut* fTransformsOut;
55     };
56 
57     /**
58      * This is similar to emitCode() in the base class, except it takes a full shader builder.
59      * This allows the effect subclass to emit vertex code.
60      */
61     virtual void emitCode(EmitArgs&) = 0;
62 
63 
64     /** A GrGLPrimitiveProcessor instance can be reused with any GrGLPrimitiveProcessor that
65         produces the same stage key; this function reads data from a GrGLPrimitiveProcessor and
66         uploads any uniform variables required  by the shaders created in emitCode(). The
67         GrPrimitiveProcessor parameter is guaranteed to be of the same type that created this
68         GrGLPrimitiveProcessor and to have an identical processor key as the one that created this
69         GrGLPrimitiveProcessor.  */
70     virtual void setData(const GrGLProgramDataManager&,
71                          const GrPrimitiveProcessor&,
72                          const GrBatchTracker&) = 0;
73 
74     static SkMatrix GetTransformMatrix(const SkMatrix& localMatrix, const GrCoordTransform&);
75 
76 protected:
77     /** a helper which can setup vertex, constant, or uniform color depending on inputType.
78      *  This function will only do the minimum required to emit the correct shader code.  If
79      *  inputType == attribute, then colorAttr must not be NULL.  Likewise, if inputType == Uniform
80      *  then colorUniform must not be NULL.
81      */
82     void setupColorPassThrough(GrGLGPBuilder* pb,
83                                GrGPInput inputType,
84                                const char* inputName,
85                                const GrPrimitiveProcessor::Attribute* colorAttr,
86                                UniformHandle* colorUniform);
87 
uViewM()88     const char* uViewM() const { return fViewMatrixName; }
89 
90     /** a helper function to setup the uniform handle for the uniform view matrix */
91     void addUniformViewMatrix(GrGLGPBuilder*);
92 
93 
94     /** a helper function to upload a uniform viewmatrix.
95      * TODO we can remove this function when we have deferred geometry in place
96      */
97     void setUniformViewMatrix(const GrGLProgramDataManager&,
98                               const SkMatrix& viewMatrix);
99 
100     class ShaderVarHandle {
101     public:
isValid()102         bool isValid() const { return fHandle > -1; }
ShaderVarHandle()103         ShaderVarHandle() : fHandle(-1) {}
ShaderVarHandle(int value)104         ShaderVarHandle(int value) : fHandle(value) { SkASSERT(this->isValid()); }
handle()105         int handle() const { SkASSERT(this->isValid()); return fHandle; }
convertToUniformHandle()106         UniformHandle convertToUniformHandle() {
107             SkASSERT(this->isValid());
108             return GrGLProgramDataManager::UniformHandle::CreateFromUniformIndex(fHandle);
109         }
110 
111     private:
112         int fHandle;
113     };
114 
115     struct Transform {
TransformTransform116         Transform() : fType(kVoid_GrSLType) { fCurrentValue = SkMatrix::InvalidMatrix(); }
117         ShaderVarHandle fHandle;
118         SkMatrix       fCurrentValue;
119         GrSLType       fType;
120     };
121 
122     SkSTArray<8, SkSTArray<2, Transform, true> > fInstalledTransforms;
123 
124 private:
125     UniformHandle fViewMatrixUniform;
126     SkMatrix fViewMatrix;
127     const char* fViewMatrixName;
128 };
129 
130 #endif
131