blob: 12fb74f11421479464405990778c2f984fdcee20 [file] [log] [blame]
joshualitt8072caa2015-02-12 14:20:52 -08001/*
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
egdaniele659a582015-11-13 09:55:43 -08008#ifndef GrGLSLPrimitiveProcessor_DEFINED
9#define GrGLSLPrimitiveProcessor_DEFINED
joshualitt8072caa2015-02-12 14:20:52 -080010
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "src/gpu/GrFragmentProcessor.h"
12#include "src/gpu/GrPrimitiveProcessor.h"
13#include "src/gpu/glsl/GrGLSLProgramDataManager.h"
14#include "src/gpu/glsl/GrGLSLUniformHandler.h"
joshualitt8072caa2015-02-12 14:20:52 -080015
joshualitt8072caa2015-02-12 14:20:52 -080016class GrPrimitiveProcessor;
Chris Dalton60283612018-02-14 13:38:14 -070017class GrGLSLFPFragmentBuilder;
csmartdalton276cc412016-11-21 11:55:00 -070018class GrGLSLGeometryBuilder;
egdaniel8dcdedc2015-11-11 06:27:20 -080019class GrGLSLGPBuilder;
egdaniel0eafe792015-11-20 14:01:22 -080020class GrGLSLVaryingHandler;
egdaniela2e3e0f2015-11-19 07:23:45 -080021class GrGLSLVertexBuilder;
Brian Salomon94efbf52016-11-29 13:43:05 -050022class GrShaderCaps;
joshualitt8072caa2015-02-12 14:20:52 -080023
egdaniele659a582015-11-13 09:55:43 -080024class GrGLSLPrimitiveProcessor {
joshualitt8072caa2015-02-12 14:20:52 -080025public:
Ethan Nicholasd4efe682019-08-29 16:10:13 -040026 using UniformHandle = GrGLSLProgramDataManager::UniformHandle;
27 using SamplerHandle = GrGLSLUniformHandler::SamplerHandle;
bsalomona624bf32016-09-20 09:12:47 -070028 using FPCoordTransformIter = GrFragmentProcessor::CoordTransformIter;
29
Ethan Nicholasd4efe682019-08-29 16:10:13 -040030 struct TransformVar {
31 TransformVar() = default;
joshualitt8072caa2015-02-12 14:20:52 -080032
Ethan Nicholasd4efe682019-08-29 16:10:13 -040033 TransformVar(SkString matrixCode, UniformHandle uniformMatrix, GrShaderVar varyingPoint)
34 : fMatrixCode(std::move(matrixCode))
35 , fUniformMatrix(uniformMatrix)
36 , fVaryingPoint(varyingPoint) {}
37
38 // a string of SkSL code which resolves to the transformation matrix
39 SkString fMatrixCode;
40 // the variable containing the matrix, if any, otherwise an invalid handle
41 UniformHandle fUniformMatrix;
42 // the transformed coordinate output by the vertex shader and consumed by the fragment
43 // shader
44 GrShaderVar fVaryingPoint;
45 };
46
47
48 virtual ~GrGLSLPrimitiveProcessor() {}
joshualitt8072caa2015-02-12 14:20:52 -080049
bsalomona624bf32016-09-20 09:12:47 -070050 /**
51 * This class provides access to the GrCoordTransforms across all GrFragmentProcessors in a
52 * GrPipeline. It is also used by the primitive processor to specify the fragment shader
53 * variable that will hold the transformed coords for each GrCoordTransform. It is required that
54 * the primitive processor iterate over each coord transform and insert a shader var result for
55 * each. The GrGLSLFragmentProcessors will reference these variables in their fragment code.
56 */
57 class FPCoordTransformHandler : public SkNoncopyable {
58 public:
59 FPCoordTransformHandler(const GrPipeline& pipeline,
Ethan Nicholasd4efe682019-08-29 16:10:13 -040060 SkTArray<TransformVar>* transformedCoordVars)
bsalomona624bf32016-09-20 09:12:47 -070061 : fIter(pipeline)
62 , fTransformedCoordVars(transformedCoordVars) {}
63
64 ~FPCoordTransformHandler() { SkASSERT(!this->nextCoordTransform());}
65
66 const GrCoordTransform* nextCoordTransform();
67
68 // 'args' are constructor params to GrShaderVar.
69 template<typename... Args>
70 void specifyCoordsForCurrCoordTransform(Args&&... args) {
71 SkASSERT(!fAddedCoord);
72 fTransformedCoordVars->emplace_back(std::forward<Args>(args)...);
73 SkDEBUGCODE(fAddedCoord = true;)
74 }
75
76 private:
77 GrFragmentProcessor::CoordTransformIter fIter;
78 SkDEBUGCODE(bool fAddedCoord = false;)
79 SkDEBUGCODE(const GrCoordTransform* fCurr = nullptr;)
Ethan Nicholasd4efe682019-08-29 16:10:13 -040080 SkTArray<TransformVar>* fTransformedCoordVars;
bsalomona624bf32016-09-20 09:12:47 -070081 };
joshualitt8072caa2015-02-12 14:20:52 -080082
83 struct EmitArgs {
egdaniel7ea439b2015-12-03 09:20:44 -080084 EmitArgs(GrGLSLVertexBuilder* vertBuilder,
csmartdalton276cc412016-11-21 11:55:00 -070085 GrGLSLGeometryBuilder* geomBuilder,
Chris Dalton60283612018-02-14 13:38:14 -070086 GrGLSLFPFragmentBuilder* fragBuilder,
egdaniel0eafe792015-11-20 14:01:22 -080087 GrGLSLVaryingHandler* varyingHandler,
egdaniel7ea439b2015-12-03 09:20:44 -080088 GrGLSLUniformHandler* uniformHandler,
Brian Salomon94efbf52016-11-29 13:43:05 -050089 const GrShaderCaps* caps,
joshualitt8072caa2015-02-12 14:20:52 -080090 const GrPrimitiveProcessor& gp,
joshualitt8072caa2015-02-12 14:20:52 -080091 const char* outputColor,
92 const char* outputCoverage,
csmartdalton936f81b2017-02-13 15:45:35 -070093 const char* rtAdjustName,
egdaniel09aa1fc2016-04-20 07:09:46 -070094 const SamplerHandle* texSamplers,
bsalomona624bf32016-09-20 09:12:47 -070095 FPCoordTransformHandler* transformHandler)
egdaniel7ea439b2015-12-03 09:20:44 -080096 : fVertBuilder(vertBuilder)
csmartdalton276cc412016-11-21 11:55:00 -070097 , fGeomBuilder(geomBuilder)
egdaniel4ca2e602015-11-18 08:01:26 -080098 , fFragBuilder(fragBuilder)
egdaniel0eafe792015-11-20 14:01:22 -080099 , fVaryingHandler(varyingHandler)
egdaniel7ea439b2015-12-03 09:20:44 -0800100 , fUniformHandler(uniformHandler)
Brian Salomon1edc5b92016-11-29 13:43:46 -0500101 , fShaderCaps(caps)
joshualitt8072caa2015-02-12 14:20:52 -0800102 , fGP(gp)
joshualitt8072caa2015-02-12 14:20:52 -0800103 , fOutputColor(outputColor)
104 , fOutputCoverage(outputCoverage)
csmartdalton936f81b2017-02-13 15:45:35 -0700105 , fRTAdjustName(rtAdjustName)
cdalton3f6f76f2016-04-11 12:18:09 -0700106 , fTexSamplers(texSamplers)
bsalomona624bf32016-09-20 09:12:47 -0700107 , fFPCoordTransformHandler(transformHandler) {}
egdaniel4ca2e602015-11-18 08:01:26 -0800108 GrGLSLVertexBuilder* fVertBuilder;
csmartdalton276cc412016-11-21 11:55:00 -0700109 GrGLSLGeometryBuilder* fGeomBuilder;
Chris Dalton60283612018-02-14 13:38:14 -0700110 GrGLSLFPFragmentBuilder* fFragBuilder;
egdaniel0eafe792015-11-20 14:01:22 -0800111 GrGLSLVaryingHandler* fVaryingHandler;
egdaniel7ea439b2015-12-03 09:20:44 -0800112 GrGLSLUniformHandler* fUniformHandler;
Brian Salomon1edc5b92016-11-29 13:43:46 -0500113 const GrShaderCaps* fShaderCaps;
joshualitt8072caa2015-02-12 14:20:52 -0800114 const GrPrimitiveProcessor& fGP;
joshualitt8072caa2015-02-12 14:20:52 -0800115 const char* fOutputColor;
116 const char* fOutputCoverage;
csmartdalton936f81b2017-02-13 15:45:35 -0700117 const char* fRTAdjustName;
egdaniel09aa1fc2016-04-20 07:09:46 -0700118 const SamplerHandle* fTexSamplers;
bsalomona624bf32016-09-20 09:12:47 -0700119 FPCoordTransformHandler* fFPCoordTransformHandler;
joshualitt8072caa2015-02-12 14:20:52 -0800120 };
121
122 /**
123 * This is similar to emitCode() in the base class, except it takes a full shader builder.
124 * This allows the effect subclass to emit vertex code.
125 */
126 virtual void emitCode(EmitArgs&) = 0;
127
bsalomona624bf32016-09-20 09:12:47 -0700128 /**
129 * A GrGLSLPrimitiveProcessor instance can be reused with any GrGLSLPrimitiveProcessor that
130 * produces the same stage key; this function reads data from a GrGLSLPrimitiveProcessor and
131 * uploads any uniform variables required by the shaders created in emitCode(). The
132 * GrPrimitiveProcessor parameter is guaranteed to be of the same type and to have an
133 * identical processor key as the GrPrimitiveProcessor that created this
134 * GrGLSLPrimitiveProcessor.
135 * The subclass may use the transform iterator to perform any setup required for the particular
136 * set of fp transform matrices, such as uploading via uniforms. The iterator will iterate over
137 * the transforms in the same order as the TransformHandler passed to emitCode.
138 */
139 virtual void setData(const GrGLSLProgramDataManager&, const GrPrimitiveProcessor&,
140 FPCoordTransformIter&&) = 0;
joshualitt8072caa2015-02-12 14:20:52 -0800141
142 static SkMatrix GetTransformMatrix(const SkMatrix& localMatrix, const GrCoordTransform&);
143
144protected:
Chris Dalton60283612018-02-14 13:38:14 -0700145 void setupUniformColor(GrGLSLFPFragmentBuilder* fragBuilder,
egdaniel7ea439b2015-12-03 09:20:44 -0800146 GrGLSLUniformHandler* uniformHandler,
egdaniel8dcdedc2015-11-11 06:27:20 -0800147 const char* outputName,
148 UniformHandle* colorUniform);
joshualitt8072caa2015-02-12 14:20:52 -0800149};
150
151#endif