1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2013 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifndef GrGLSLPrimitiveProcessor_DEFINED
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define GrGLSLPrimitiveProcessor_DEFINED
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrFragmentProcessor.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrPrimitiveProcessor.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "glsl/GrGLSLProgramDataManager.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "glsl/GrGLSLUniformHandler.h"
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrPrimitiveProcessor;
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrGLSLPPFragmentBuilder;
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrGLSLGeometryBuilder;
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrGLSLGPBuilder;
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrGLSLVaryingHandler;
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrGLSLVertexBuilder;
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrShaderCaps;
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrGLSLPrimitiveProcessor {
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    using FPCoordTransformIter = GrFragmentProcessor::CoordTransformIter;
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual ~GrGLSLPrimitiveProcessor() {}
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    using UniformHandle      = GrGLSLProgramDataManager::UniformHandle;
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    using SamplerHandle      = GrGLSLUniformHandler::SamplerHandle;
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    using TexelBufferHandle  = GrGLSLUniformHandler::TexelBufferHandle;
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * This class provides access to the GrCoordTransforms across all GrFragmentProcessors in a
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * GrPipeline. It is also used by the primitive processor to specify the fragment shader
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * variable that will hold the transformed coords for each GrCoordTransform. It is required that
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * the primitive processor iterate over each coord transform and insert a shader var result for
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * each. The GrGLSLFragmentProcessors will reference these variables in their fragment code.
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    class FPCoordTransformHandler : public SkNoncopyable {
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    public:
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        FPCoordTransformHandler(const GrPipeline& pipeline,
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                SkTArray<GrShaderVar>* transformedCoordVars)
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                : fIter(pipeline)
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                , fTransformedCoordVars(transformedCoordVars) {}
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        ~FPCoordTransformHandler() { SkASSERT(!this->nextCoordTransform());}
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const GrCoordTransform* nextCoordTransform();
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // 'args' are constructor params to GrShaderVar.
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        template<typename... Args>
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        void specifyCoordsForCurrCoordTransform(Args&&... args) {
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkASSERT(!fAddedCoord);
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fTransformedCoordVars->emplace_back(std::forward<Args>(args)...);
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkDEBUGCODE(fAddedCoord = true;)
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    private:
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        GrFragmentProcessor::CoordTransformIter fIter;
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkDEBUGCODE(bool                        fAddedCoord = false;)
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkDEBUGCODE(const GrCoordTransform*     fCurr = nullptr;)
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkTArray<GrShaderVar>*                  fTransformedCoordVars;
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    struct EmitArgs {
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        EmitArgs(GrGLSLVertexBuilder* vertBuilder,
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                 GrGLSLGeometryBuilder* geomBuilder,
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                 GrGLSLPPFragmentBuilder* fragBuilder,
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                 GrGLSLVaryingHandler* varyingHandler,
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                 GrGLSLUniformHandler* uniformHandler,
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                 const GrShaderCaps* caps,
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                 const GrPrimitiveProcessor& gp,
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                 const char* outputColor,
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                 const char* outputCoverage,
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                 const char* rtAdjustName,
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                 const SamplerHandle* texSamplers,
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                 const TexelBufferHandle* texelBuffers,
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                 FPCoordTransformHandler* transformHandler)
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            : fVertBuilder(vertBuilder)
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            , fGeomBuilder(geomBuilder)
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            , fFragBuilder(fragBuilder)
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            , fVaryingHandler(varyingHandler)
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            , fUniformHandler(uniformHandler)
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            , fShaderCaps(caps)
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            , fGP(gp)
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            , fOutputColor(outputColor)
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            , fOutputCoverage(outputCoverage)
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            , fRTAdjustName(rtAdjustName)
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            , fTexSamplers(texSamplers)
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            , fTexelBuffers(texelBuffers)
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            , fFPCoordTransformHandler(transformHandler) {}
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        GrGLSLVertexBuilder* fVertBuilder;
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        GrGLSLGeometryBuilder* fGeomBuilder;
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        GrGLSLPPFragmentBuilder* fFragBuilder;
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        GrGLSLVaryingHandler* fVaryingHandler;
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        GrGLSLUniformHandler* fUniformHandler;
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const GrShaderCaps* fShaderCaps;
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const GrPrimitiveProcessor& fGP;
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const char* fOutputColor;
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const char* fOutputCoverage;
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const char* fRTAdjustName;
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const SamplerHandle* fTexSamplers;
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const TexelBufferHandle* fTexelBuffers;
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        FPCoordTransformHandler* fFPCoordTransformHandler;
107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * This is similar to emitCode() in the base class, except it takes a full shader builder.
111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * This allows the effect subclass to emit vertex code.
112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual void emitCode(EmitArgs&) = 0;
114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * A GrGLSLPrimitiveProcessor instance can be reused with any GrGLSLPrimitiveProcessor that
117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * produces the same stage key; this function reads data from a GrGLSLPrimitiveProcessor and
118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * uploads any uniform variables required  by the shaders created in emitCode(). The
119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * GrPrimitiveProcessor parameter is guaranteed to be of the same type and to have an
120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * identical processor key as the GrPrimitiveProcessor that created this
121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * GrGLSLPrimitiveProcessor.
122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * The subclass may use the transform iterator to perform any setup required for the particular
123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * set of fp transform matrices, such as uploading via uniforms. The iterator will iterate over
124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * the transforms in the same order as the TransformHandler passed to emitCode.
125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    virtual void setData(const GrGLSLProgramDataManager&, const GrPrimitiveProcessor&,
127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                         FPCoordTransformIter&&) = 0;
128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static SkMatrix GetTransformMatrix(const SkMatrix& localMatrix, const GrCoordTransform&);
130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void setupUniformColor(GrGLSLPPFragmentBuilder* fragBuilder,
133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                           GrGLSLUniformHandler* uniformHandler,
134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                           const char* outputName,
135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                           UniformHandle* colorUniform);
136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
139