Index: src/gpu/glsl/GrGLSLPrimitiveProcessor.h |
diff --git a/src/gpu/glsl/GrGLSLPrimitiveProcessor.h b/src/gpu/glsl/GrGLSLPrimitiveProcessor.h |
index 6f3381f996936df1eea5e4fd9da1701a24918184..d270fa18fe37789e9c79feb01c3df08dcd860485 100644 |
--- a/src/gpu/glsl/GrGLSLPrimitiveProcessor.h |
+++ b/src/gpu/glsl/GrGLSLPrimitiveProcessor.h |
@@ -8,6 +8,7 @@ |
#ifndef GrGLSLPrimitiveProcessor_DEFINED |
#define GrGLSLPrimitiveProcessor_DEFINED |
+#include "GrFragmentProcessor.h" |
#include "GrPrimitiveProcessor.h" |
#include "glsl/GrGLSLProgramDataManager.h" |
#include "glsl/GrGLSLSampler.h" |
@@ -23,14 +24,45 @@ class GrGLSLVertexBuilder; |
class GrGLSLPrimitiveProcessor { |
public: |
+ using FPCoordTransformIter = GrFragmentProcessor::CoordTransformIter; |
+ |
virtual ~GrGLSLPrimitiveProcessor() {} |
typedef GrGLSLProgramDataManager::UniformHandle UniformHandle; |
typedef GrGLSLProgramDataManager::UniformHandle SamplerHandle; |
- typedef SkSTArray<2, const GrCoordTransform*, true> ProcCoords; |
- typedef SkSTArray<8, ProcCoords> TransformsIn; |
- typedef SkSTArray<8, SkTArray<GrShaderVar>> TransformsOut; |
+ /** |
+ * This class provides access to the GrCoordTransforms across all GrFragmentProcessors in a |
+ * GrPipeline. It is also used by the primitive processor to specify the fragment shader |
+ * variable that will hold the transformed coords for each GrCoordTransform. It is required that |
+ * the primitive processor iterate over each coord transform and insert a shader var result for |
+ * each. The GrGLSLFragmentProcessors will reference these variables in their fragment code. |
+ */ |
+ class FPCoordTransformHandler : public SkNoncopyable { |
+ public: |
+ FPCoordTransformHandler(const GrPipeline& pipeline, |
+ SkTArray<GrShaderVar>* transformedCoordVars) |
+ : fIter(pipeline) |
+ , fTransformedCoordVars(transformedCoordVars) {} |
+ |
+ ~FPCoordTransformHandler() { SkASSERT(!this->nextCoordTransform());} |
+ |
+ const GrCoordTransform* nextCoordTransform(); |
+ |
+ // 'args' are constructor params to GrShaderVar. |
+ template<typename... Args> |
+ void specifyCoordsForCurrCoordTransform(Args&&... args) { |
+ SkASSERT(!fAddedCoord); |
+ fTransformedCoordVars->emplace_back(std::forward<Args>(args)...); |
+ SkDEBUGCODE(fAddedCoord = true;) |
+ } |
+ |
+ private: |
+ GrFragmentProcessor::CoordTransformIter fIter; |
+ SkDEBUGCODE(bool fAddedCoord = false;) |
+ SkDEBUGCODE(const GrCoordTransform* fCurr = nullptr;) |
+ SkTArray<GrShaderVar>* fTransformedCoordVars; |
+ }; |
struct EmitArgs { |
EmitArgs(GrGLSLVertexBuilder* vertBuilder, |
@@ -44,8 +76,7 @@ public: |
const char* distanceVectorName, |
const SamplerHandle* texSamplers, |
const SamplerHandle* bufferSamplers, |
- const TransformsIn& transformsIn, |
- TransformsOut* transformsOut) |
+ FPCoordTransformHandler* transformHandler) |
: fVertBuilder(vertBuilder) |
, fFragBuilder(fragBuilder) |
, fVaryingHandler(varyingHandler) |
@@ -57,8 +88,7 @@ public: |
, fDistanceVectorName(distanceVectorName) |
, fTexSamplers(texSamplers) |
, fBufferSamplers(bufferSamplers) |
- , fTransformsIn(transformsIn) |
- , fTransformsOut(transformsOut) {} |
+ , fFPCoordTransformHandler(transformHandler) {} |
GrGLSLVertexBuilder* fVertBuilder; |
GrGLSLPPFragmentBuilder* fFragBuilder; |
GrGLSLVaryingHandler* fVaryingHandler; |
@@ -70,8 +100,7 @@ public: |
const char* fDistanceVectorName; |
const SamplerHandle* fTexSamplers; |
const SamplerHandle* fBufferSamplers; |
- const TransformsIn& fTransformsIn; |
- TransformsOut* fTransformsOut; |
+ FPCoordTransformHandler* fFPCoordTransformHandler; |
}; |
/** |
@@ -80,21 +109,22 @@ public: |
*/ |
virtual void emitCode(EmitArgs&) = 0; |
- /** A GrGLSLPrimitiveProcessor instance can be reused with any GrGLSLPrimitiveProcessor that |
- produces the same stage key; this function reads data from a GrGLSLPrimitiveProcessor and |
- uploads any uniform variables required by the shaders created in emitCode(). The |
- GrPrimitiveProcessor parameter is guaranteed to be of the same type that created this |
- GrGLSLPrimitiveProcessor and to have an identical processor key as the one that created this |
- GrGLSLPrimitiveProcessor. */ |
- virtual void setData(const GrGLSLProgramDataManager&, const GrPrimitiveProcessor&) = 0; |
+ /** |
+ * A GrGLSLPrimitiveProcessor instance can be reused with any GrGLSLPrimitiveProcessor that |
+ * produces the same stage key; this function reads data from a GrGLSLPrimitiveProcessor and |
+ * uploads any uniform variables required by the shaders created in emitCode(). The |
+ * GrPrimitiveProcessor parameter is guaranteed to be of the same type and to have an |
+ * identical processor key as the GrPrimitiveProcessor that created this |
+ * GrGLSLPrimitiveProcessor. |
+ * The subclass may use the transform iterator to perform any setup required for the particular |
+ * set of fp transform matrices, such as uploading via uniforms. The iterator will iterate over |
+ * the transforms in the same order as the TransformHandler passed to emitCode. |
+ */ |
+ virtual void setData(const GrGLSLProgramDataManager&, const GrPrimitiveProcessor&, |
+ FPCoordTransformIter&&) = 0; |
static SkMatrix GetTransformMatrix(const SkMatrix& localMatrix, const GrCoordTransform&); |
- virtual void setTransformData(const GrPrimitiveProcessor&, |
- const GrGLSLProgramDataManager& pdman, |
- int index, |
- const SkTArray<const GrCoordTransform*, true>& transforms) = 0; |
- |
protected: |
void setupUniformColor(GrGLSLPPFragmentBuilder* fragBuilder, |
GrGLSLUniformHandler* uniformHandler, |