blob: 6c3d3a89632a19ec4504297fa5f6d3de37c4ced3 [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
bsalomona624bf32016-09-20 09:12:47 -070011#include "GrFragmentProcessor.h"
joshualitt8072caa2015-02-12 14:20:52 -080012#include "GrPrimitiveProcessor.h"
egdaniel018fb622015-10-28 07:26:40 -070013#include "glsl/GrGLSLProgramDataManager.h"
Brian Salomonf9f45122016-11-29 11:59:17 -050014#include "glsl/GrGLSLUniformHandler.h"
joshualitt8072caa2015-02-12 14:20:52 -080015
16class GrBatchTracker;
17class GrPrimitiveProcessor;
cdalton85285412016-02-18 12:37:07 -080018class GrGLSLPPFragmentBuilder;
csmartdalton276cc412016-11-21 11:55:00 -070019class GrGLSLGeometryBuilder;
egdaniel8dcdedc2015-11-11 06:27:20 -080020class GrGLSLGPBuilder;
egdaniel0eafe792015-11-20 14:01:22 -080021class GrGLSLVaryingHandler;
egdaniela2e3e0f2015-11-19 07:23:45 -080022class GrGLSLVertexBuilder;
Brian Salomon94efbf52016-11-29 13:43:05 -050023class GrShaderCaps;
joshualitt8072caa2015-02-12 14:20:52 -080024
egdaniele659a582015-11-13 09:55:43 -080025class GrGLSLPrimitiveProcessor {
joshualitt8072caa2015-02-12 14:20:52 -080026public:
bsalomona624bf32016-09-20 09:12:47 -070027 using FPCoordTransformIter = GrFragmentProcessor::CoordTransformIter;
28
egdaniele659a582015-11-13 09:55:43 -080029 virtual ~GrGLSLPrimitiveProcessor() {}
joshualitt8072caa2015-02-12 14:20:52 -080030
Brian Salomonf9f45122016-11-29 11:59:17 -050031 using UniformHandle = GrGLSLProgramDataManager::UniformHandle;
32 using SamplerHandle = GrGLSLUniformHandler::SamplerHandle;
33 using ImageStorageHandle = GrGLSLUniformHandler::ImageStorageHandle;
joshualitt8072caa2015-02-12 14:20:52 -080034
bsalomona624bf32016-09-20 09:12:47 -070035 /**
36 * This class provides access to the GrCoordTransforms across all GrFragmentProcessors in a
37 * GrPipeline. It is also used by the primitive processor to specify the fragment shader
38 * variable that will hold the transformed coords for each GrCoordTransform. It is required that
39 * the primitive processor iterate over each coord transform and insert a shader var result for
40 * each. The GrGLSLFragmentProcessors will reference these variables in their fragment code.
41 */
42 class FPCoordTransformHandler : public SkNoncopyable {
43 public:
44 FPCoordTransformHandler(const GrPipeline& pipeline,
45 SkTArray<GrShaderVar>* transformedCoordVars)
46 : fIter(pipeline)
47 , fTransformedCoordVars(transformedCoordVars) {}
48
49 ~FPCoordTransformHandler() { SkASSERT(!this->nextCoordTransform());}
50
51 const GrCoordTransform* nextCoordTransform();
52
53 // 'args' are constructor params to GrShaderVar.
54 template<typename... Args>
55 void specifyCoordsForCurrCoordTransform(Args&&... args) {
56 SkASSERT(!fAddedCoord);
57 fTransformedCoordVars->emplace_back(std::forward<Args>(args)...);
58 SkDEBUGCODE(fAddedCoord = true;)
59 }
60
61 private:
62 GrFragmentProcessor::CoordTransformIter fIter;
63 SkDEBUGCODE(bool fAddedCoord = false;)
64 SkDEBUGCODE(const GrCoordTransform* fCurr = nullptr;)
65 SkTArray<GrShaderVar>* fTransformedCoordVars;
66 };
joshualitt8072caa2015-02-12 14:20:52 -080067
68 struct EmitArgs {
egdaniel7ea439b2015-12-03 09:20:44 -080069 EmitArgs(GrGLSLVertexBuilder* vertBuilder,
csmartdalton276cc412016-11-21 11:55:00 -070070 GrGLSLGeometryBuilder* geomBuilder,
cdalton85285412016-02-18 12:37:07 -080071 GrGLSLPPFragmentBuilder* fragBuilder,
egdaniel0eafe792015-11-20 14:01:22 -080072 GrGLSLVaryingHandler* varyingHandler,
egdaniel7ea439b2015-12-03 09:20:44 -080073 GrGLSLUniformHandler* uniformHandler,
Brian Salomon94efbf52016-11-29 13:43:05 -050074 const GrShaderCaps* caps,
joshualitt8072caa2015-02-12 14:20:52 -080075 const GrPrimitiveProcessor& gp,
joshualitt8072caa2015-02-12 14:20:52 -080076 const char* outputColor,
77 const char* outputCoverage,
dvonbeck9b03e7b2016-08-01 11:01:56 -070078 const char* distanceVectorName,
egdaniel09aa1fc2016-04-20 07:09:46 -070079 const SamplerHandle* texSamplers,
80 const SamplerHandle* bufferSamplers,
Brian Salomonf9f45122016-11-29 11:59:17 -050081 const ImageStorageHandle* imageStorages,
bsalomona624bf32016-09-20 09:12:47 -070082 FPCoordTransformHandler* transformHandler)
egdaniel7ea439b2015-12-03 09:20:44 -080083 : fVertBuilder(vertBuilder)
csmartdalton276cc412016-11-21 11:55:00 -070084 , fGeomBuilder(geomBuilder)
egdaniel4ca2e602015-11-18 08:01:26 -080085 , fFragBuilder(fragBuilder)
egdaniel0eafe792015-11-20 14:01:22 -080086 , fVaryingHandler(varyingHandler)
egdaniel7ea439b2015-12-03 09:20:44 -080087 , fUniformHandler(uniformHandler)
egdaniela2e3e0f2015-11-19 07:23:45 -080088 , fGLSLCaps(caps)
joshualitt8072caa2015-02-12 14:20:52 -080089 , fGP(gp)
joshualitt8072caa2015-02-12 14:20:52 -080090 , fOutputColor(outputColor)
91 , fOutputCoverage(outputCoverage)
dvonbeck9b03e7b2016-08-01 11:01:56 -070092 , fDistanceVectorName(distanceVectorName)
cdalton3f6f76f2016-04-11 12:18:09 -070093 , fTexSamplers(texSamplers)
cdalton74b8d322016-04-11 14:47:28 -070094 , fBufferSamplers(bufferSamplers)
Brian Salomonf9f45122016-11-29 11:59:17 -050095 , fImageStorages(imageStorages)
bsalomona624bf32016-09-20 09:12:47 -070096 , fFPCoordTransformHandler(transformHandler) {}
egdaniel4ca2e602015-11-18 08:01:26 -080097 GrGLSLVertexBuilder* fVertBuilder;
csmartdalton276cc412016-11-21 11:55:00 -070098 GrGLSLGeometryBuilder* fGeomBuilder;
cdalton85285412016-02-18 12:37:07 -080099 GrGLSLPPFragmentBuilder* fFragBuilder;
egdaniel0eafe792015-11-20 14:01:22 -0800100 GrGLSLVaryingHandler* fVaryingHandler;
egdaniel7ea439b2015-12-03 09:20:44 -0800101 GrGLSLUniformHandler* fUniformHandler;
Brian Salomon94efbf52016-11-29 13:43:05 -0500102 const GrShaderCaps* fGLSLCaps;
joshualitt8072caa2015-02-12 14:20:52 -0800103 const GrPrimitiveProcessor& fGP;
joshualitt8072caa2015-02-12 14:20:52 -0800104 const char* fOutputColor;
105 const char* fOutputCoverage;
dvonbeck9b03e7b2016-08-01 11:01:56 -0700106 const char* fDistanceVectorName;
egdaniel09aa1fc2016-04-20 07:09:46 -0700107 const SamplerHandle* fTexSamplers;
108 const SamplerHandle* fBufferSamplers;
Brian Salomonf9f45122016-11-29 11:59:17 -0500109 const ImageStorageHandle* fImageStorages;
bsalomona624bf32016-09-20 09:12:47 -0700110 FPCoordTransformHandler* fFPCoordTransformHandler;
joshualitt8072caa2015-02-12 14:20:52 -0800111 };
112
113 /**
114 * This is similar to emitCode() in the base class, except it takes a full shader builder.
115 * This allows the effect subclass to emit vertex code.
116 */
117 virtual void emitCode(EmitArgs&) = 0;
118
bsalomona624bf32016-09-20 09:12:47 -0700119 /**
120 * A GrGLSLPrimitiveProcessor instance can be reused with any GrGLSLPrimitiveProcessor that
121 * produces the same stage key; this function reads data from a GrGLSLPrimitiveProcessor and
122 * uploads any uniform variables required by the shaders created in emitCode(). The
123 * GrPrimitiveProcessor parameter is guaranteed to be of the same type and to have an
124 * identical processor key as the GrPrimitiveProcessor that created this
125 * GrGLSLPrimitiveProcessor.
126 * The subclass may use the transform iterator to perform any setup required for the particular
127 * set of fp transform matrices, such as uploading via uniforms. The iterator will iterate over
128 * the transforms in the same order as the TransformHandler passed to emitCode.
129 */
130 virtual void setData(const GrGLSLProgramDataManager&, const GrPrimitiveProcessor&,
131 FPCoordTransformIter&&) = 0;
joshualitt8072caa2015-02-12 14:20:52 -0800132
133 static SkMatrix GetTransformMatrix(const SkMatrix& localMatrix, const GrCoordTransform&);
134
135protected:
cdalton85285412016-02-18 12:37:07 -0800136 void setupUniformColor(GrGLSLPPFragmentBuilder* fragBuilder,
egdaniel7ea439b2015-12-03 09:20:44 -0800137 GrGLSLUniformHandler* uniformHandler,
egdaniel8dcdedc2015-11-11 06:27:20 -0800138 const char* outputName,
139 UniformHandle* colorUniform);
joshualitt8072caa2015-02-12 14:20:52 -0800140};
141
142#endif