Index: src/gpu/glsl/GrGLSLPrimitiveProcessor.h |
diff --git a/src/gpu/glsl/GrGLSLPrimitiveProcessor.h b/src/gpu/glsl/GrGLSLPrimitiveProcessor.h |
index d270fa18fe37789e9c79feb01c3df08dcd860485..6f3381f996936df1eea5e4fd9da1701a24918184 100644 |
--- a/src/gpu/glsl/GrGLSLPrimitiveProcessor.h |
+++ b/src/gpu/glsl/GrGLSLPrimitiveProcessor.h |
@@ -8,7 +8,6 @@ |
#ifndef GrGLSLPrimitiveProcessor_DEFINED |
#define GrGLSLPrimitiveProcessor_DEFINED |
-#include "GrFragmentProcessor.h" |
#include "GrPrimitiveProcessor.h" |
#include "glsl/GrGLSLProgramDataManager.h" |
#include "glsl/GrGLSLSampler.h" |
@@ -24,45 +23,14 @@ |
class GrGLSLPrimitiveProcessor { |
public: |
- using FPCoordTransformIter = GrFragmentProcessor::CoordTransformIter; |
- |
virtual ~GrGLSLPrimitiveProcessor() {} |
typedef GrGLSLProgramDataManager::UniformHandle UniformHandle; |
typedef GrGLSLProgramDataManager::UniformHandle SamplerHandle; |
- /** |
- * 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; |
- }; |
+ typedef SkSTArray<2, const GrCoordTransform*, true> ProcCoords; |
+ typedef SkSTArray<8, ProcCoords> TransformsIn; |
+ typedef SkSTArray<8, SkTArray<GrShaderVar>> TransformsOut; |
struct EmitArgs { |
EmitArgs(GrGLSLVertexBuilder* vertBuilder, |
@@ -76,7 +44,8 @@ |
const char* distanceVectorName, |
const SamplerHandle* texSamplers, |
const SamplerHandle* bufferSamplers, |
- FPCoordTransformHandler* transformHandler) |
+ const TransformsIn& transformsIn, |
+ TransformsOut* transformsOut) |
: fVertBuilder(vertBuilder) |
, fFragBuilder(fragBuilder) |
, fVaryingHandler(varyingHandler) |
@@ -88,7 +57,8 @@ |
, fDistanceVectorName(distanceVectorName) |
, fTexSamplers(texSamplers) |
, fBufferSamplers(bufferSamplers) |
- , fFPCoordTransformHandler(transformHandler) {} |
+ , fTransformsIn(transformsIn) |
+ , fTransformsOut(transformsOut) {} |
GrGLSLVertexBuilder* fVertBuilder; |
GrGLSLPPFragmentBuilder* fFragBuilder; |
GrGLSLVaryingHandler* fVaryingHandler; |
@@ -100,7 +70,8 @@ |
const char* fDistanceVectorName; |
const SamplerHandle* fTexSamplers; |
const SamplerHandle* fBufferSamplers; |
- FPCoordTransformHandler* fFPCoordTransformHandler; |
+ const TransformsIn& fTransformsIn; |
+ TransformsOut* fTransformsOut; |
}; |
/** |
@@ -109,21 +80,20 @@ |
*/ |
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 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; |
+ /** 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; |
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, |