blob: 788833ed8c9a493859ad2edf40087ca2582297ec [file] [log] [blame]
joshualitt4973d9d2014-11-08 09:24:25 -08001/*
2 * Copyright 2014 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
8#include "GrDefaultGeoProcFactory.h"
9
bungeman06ca8ec2016-06-09 08:01:03 -070010#include "SkRefCnt.h"
Brian Osmanfa6d8652017-05-31 09:37:27 -040011#include "glsl/GrGLSLColorSpaceXformHelper.h"
egdaniel2d721d32015-11-11 13:06:05 -080012#include "glsl/GrGLSLFragmentShaderBuilder.h"
egdaniele659a582015-11-13 09:55:43 -080013#include "glsl/GrGLSLGeometryProcessor.h"
Chris Daltonc17bf322017-10-24 10:59:03 -060014#include "glsl/GrGLSLVertexGeoBuilder.h"
egdaniel0eafe792015-11-20 14:01:22 -080015#include "glsl/GrGLSLVarying.h"
egdaniel7ea439b2015-12-03 09:20:44 -080016#include "glsl/GrGLSLUniformHandler.h"
egdaniel64c47282015-11-13 06:54:19 -080017#include "glsl/GrGLSLUtil.h"
joshualitt4973d9d2014-11-08 09:24:25 -080018
19/*
20 * The default Geometry Processor simply takes position and multiplies it by the uniform view
21 * matrix. It also leaves coverage untouched. Behind the scenes, we may add per vertex color or
22 * local coords.
23 */
joshualittb2aa7cb2015-08-05 11:05:22 -070024
25enum GPFlag {
Brian Salomon3de0aee2017-01-29 09:34:17 -050026 kColorAttribute_GPFlag = 0x1,
27 kColorAttributeIsSkColor_GPFlag = 0x2,
28 kLocalCoordAttribute_GPFlag = 0x4,
29 kCoverageAttribute_GPFlag = 0x8,
Ruiqi Maod275ef52018-07-10 13:08:32 -040030 kBonesAttribute_GPFlag = 0x10,
joshualittb2aa7cb2015-08-05 11:05:22 -070031};
32
Ruiqi Maod275ef52018-07-10 13:08:32 -040033static constexpr int kNumFloatsPerSkMatrix = 9;
34static constexpr int kMaxBones = 100; // Due to GPU memory limitations, only up to 100 bone
35 // matrices are accepted.
36
joshualitt4973d9d2014-11-08 09:24:25 -080037class DefaultGeoProc : public GrGeometryProcessor {
38public:
bungeman06ca8ec2016-06-09 08:01:03 -070039 static sk_sp<GrGeometryProcessor> Make(uint32_t gpTypeFlags,
Brian Salomon3de0aee2017-01-29 09:34:17 -050040 GrColor color,
Brian Osmanfa6d8652017-05-31 09:37:27 -040041 sk_sp<GrColorSpaceXform> colorSpaceXform,
Brian Salomon3de0aee2017-01-29 09:34:17 -050042 const SkMatrix& viewMatrix,
43 const SkMatrix& localMatrix,
44 bool localCoordsWillBeRead,
Ruiqi Maod275ef52018-07-10 13:08:32 -040045 uint8_t coverage,
46 const float* bones,
47 int boneCount) {
bungeman06ca8ec2016-06-09 08:01:03 -070048 return sk_sp<GrGeometryProcessor>(new DefaultGeoProc(
Brian Osmanfa6d8652017-05-31 09:37:27 -040049 gpTypeFlags, color, std::move(colorSpaceXform), viewMatrix, localMatrix, coverage,
Ruiqi Maod275ef52018-07-10 13:08:32 -040050 localCoordsWillBeRead, bones, boneCount));
joshualitt4973d9d2014-11-08 09:24:25 -080051 }
52
mtklein36352bf2015-03-25 18:17:31 -070053 const char* name() const override { return "DefaultGeometryProcessor"; }
joshualitt4973d9d2014-11-08 09:24:25 -080054
joshualitt88c23fc2015-05-13 14:18:07 -070055 GrColor color() const { return fColor; }
Brian Salomon92be2f72018-06-19 14:33:47 -040056 bool hasVertexColor() const { return fInColor.isInitialized(); }
joshualitte578a952015-05-14 10:09:13 -070057 const SkMatrix& viewMatrix() const { return fViewMatrix; }
joshualitte3ababe2015-05-15 07:56:07 -070058 const SkMatrix& localMatrix() const { return fLocalMatrix; }
bsalomon7765a472015-07-08 11:26:37 -070059 bool localCoordsWillBeRead() const { return fLocalCoordsWillBeRead; }
joshualitt9b989322014-12-15 14:16:27 -080060 uint8_t coverage() const { return fCoverage; }
Brian Salomon92be2f72018-06-19 14:33:47 -040061 bool hasVertexCoverage() const { return fInCoverage.isInitialized(); }
Ruiqi Maod275ef52018-07-10 13:08:32 -040062 const float* bones() const { return fBones; }
63 int boneCount() const { return fBoneCount; }
64 bool hasBones() const { return SkToBool(fBones); }
joshualitt9b989322014-12-15 14:16:27 -080065
egdaniel57d3b032015-11-13 11:57:27 -080066 class GLSLProcessor : public GrGLSLGeometryProcessor {
joshualitt4973d9d2014-11-08 09:24:25 -080067 public:
egdaniel57d3b032015-11-13 11:57:27 -080068 GLSLProcessor()
joshualitt5559ca22015-05-21 15:50:36 -070069 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL), fCoverage(0xff) {}
joshualitt4973d9d2014-11-08 09:24:25 -080070
mtklein36352bf2015-03-25 18:17:31 -070071 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override {
joshualitt2dd1ae02014-12-03 06:24:10 -080072 const DefaultGeoProc& gp = args.fGP.cast<DefaultGeoProc>();
egdaniel4ca2e602015-11-18 08:01:26 -080073 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder;
Chris Dalton60283612018-02-14 13:38:14 -070074 GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
egdaniel0eafe792015-11-20 14:01:22 -080075 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler;
egdaniel7ea439b2015-12-03 09:20:44 -080076 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler;
joshualitt4973d9d2014-11-08 09:24:25 -080077
joshualittabb52a12015-01-13 15:02:10 -080078 // emit attributes
egdaniel0eafe792015-11-20 14:01:22 -080079 varyingHandler->emitAttributes(gp);
joshualitt2dd1ae02014-12-03 06:24:10 -080080
81 // Setup pass through color
Brian Salomonbfd51832017-01-04 13:22:08 -050082 if (gp.hasVertexColor()) {
Chris Dalton27372882017-12-08 13:34:21 -070083 GrGLSLVarying varying(kHalf4_GrSLType);
Brian Salomon3de0aee2017-01-29 09:34:17 -050084 varyingHandler->addVarying("color", &varying);
Brian Osmanfa6d8652017-05-31 09:37:27 -040085
86 // There are several optional steps to process the color. Start with the attribute:
Brian Salomon92be2f72018-06-19 14:33:47 -040087 vertBuilder->codeAppendf("half4 color = %s;", gp.fInColor.name());
Brian Osmanfa6d8652017-05-31 09:37:27 -040088
Brian Osman08a50e02018-06-15 15:06:48 -040089 // For SkColor, do a red/blue swap, possible color space conversion, and premul
Brian Osmanfa6d8652017-05-31 09:37:27 -040090 if (gp.fFlags & kColorAttributeIsSkColor_GPFlag) {
Brian Osman08a50e02018-06-15 15:06:48 -040091 vertBuilder->codeAppend("color = color.bgra;");
92
93 if (gp.fColorSpaceXform) {
94 fColorSpaceHelper.emitCode(uniformHandler, gp.fColorSpaceXform.get(),
95 kVertex_GrShaderFlag);
96 SkString xformedColor;
97 vertBuilder->appendColorGamutXform(&xformedColor, "color",
98 &fColorSpaceHelper);
99 vertBuilder->codeAppendf("color = %s;", xformedColor.c_str());
100 }
101
102 vertBuilder->codeAppend("color = half4(color.rgb * color.a, color.a);");
Brian Osmanfa6d8652017-05-31 09:37:27 -0400103 }
104
Brian Osmanfa6d8652017-05-31 09:37:27 -0400105 vertBuilder->codeAppendf("%s = color;\n", varying.vsOut());
Brian Salomon3de0aee2017-01-29 09:34:17 -0500106 fragBuilder->codeAppendf("%s = %s;", args.fOutputColor, varying.fsIn());
Brian Salomonbfd51832017-01-04 13:22:08 -0500107 } else {
108 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutputColor,
109 &fColorUniform);
joshualittb8c241a2015-05-19 08:23:30 -0700110 }
111
Ruiqi Maod275ef52018-07-10 13:08:32 -0400112 // Setup bone transforms
113 const char* transformedPositionName = gp.fInPosition.name();
114 if (gp.hasBones()) {
115 const char* vertBonesUniformName;
116 fBonesUniform = uniformHandler->addUniformArray(kVertex_GrShaderFlag,
117 kFloat3x3_GrSLType,
118 "Bones",
119 kMaxBones,
120 &vertBonesUniformName);
121 vertBuilder->codeAppendf(
122 "float2 transformedPosition = (%s[0] * float3(%s, 1)).xy;"
123 "float3x3 influence = float3x3(0);"
124 "for (int i = 0; i < 4; i++) {"
125 " int index = %s[i];"
126 " float weight = %s[i];"
127 " influence += %s[index] * weight;"
128 "}"
129 "transformedPosition = (influence * float3(transformedPosition, 1)).xy;",
130 vertBonesUniformName,
131 gp.fInPosition.name(),
132 gp.fInBoneIndices.name(),
133 gp.fInBoneWeights.name(),
134 vertBonesUniformName);
135 transformedPositionName = "transformedPosition";
136 }
137
joshualittabb52a12015-01-13 15:02:10 -0800138 // Setup position
Brian Salomon7f235432017-08-16 09:41:48 -0400139 this->writeOutputPosition(vertBuilder,
140 uniformHandler,
141 gpArgs,
Ruiqi Maod275ef52018-07-10 13:08:32 -0400142 transformedPositionName,
Brian Salomon7f235432017-08-16 09:41:48 -0400143 gp.viewMatrix(),
144 &fViewMatrixUniform);
joshualitt4973d9d2014-11-08 09:24:25 -0800145
Brian Salomon92be2f72018-06-19 14:33:47 -0400146 if (gp.fInLocalCoords.isInitialized()) {
joshualittabb52a12015-01-13 15:02:10 -0800147 // emit transforms with explicit local coords
egdaniel7ea439b2015-12-03 09:20:44 -0800148 this->emitTransforms(vertBuilder,
egdaniel0eafe792015-11-20 14:01:22 -0800149 varyingHandler,
egdaniel7ea439b2015-12-03 09:20:44 -0800150 uniformHandler,
Brian Salomon92be2f72018-06-19 14:33:47 -0400151 gp.fInLocalCoords.asShaderVar(),
egdaniel4ca2e602015-11-18 08:01:26 -0800152 gp.localMatrix(),
bsalomona624bf32016-09-20 09:12:47 -0700153 args.fFPCoordTransformHandler);
joshualittabb52a12015-01-13 15:02:10 -0800154 } else {
155 // emit transforms with position
egdaniel7ea439b2015-12-03 09:20:44 -0800156 this->emitTransforms(vertBuilder,
egdaniel0eafe792015-11-20 14:01:22 -0800157 varyingHandler,
egdaniel7ea439b2015-12-03 09:20:44 -0800158 uniformHandler,
Brian Salomon92be2f72018-06-19 14:33:47 -0400159 gp.fInPosition.asShaderVar(),
egdaniel4ca2e602015-11-18 08:01:26 -0800160 gp.localMatrix(),
bsalomona624bf32016-09-20 09:12:47 -0700161 args.fFPCoordTransformHandler);
joshualittabb52a12015-01-13 15:02:10 -0800162 }
163
joshualitt2dd1ae02014-12-03 06:24:10 -0800164 // Setup coverage as pass through
Brian Salomon8c852be2017-01-04 10:44:42 -0500165 if (gp.hasVertexCoverage()) {
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400166 fragBuilder->codeAppendf("half alpha = 1.0;");
Brian Salomon92be2f72018-06-19 14:33:47 -0400167 varyingHandler->addPassThroughAttribute(gp.fInCoverage, "alpha");
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400168 fragBuilder->codeAppendf("%s = half4(alpha);", args.fOutputCoverage);
Brian Salomon8c852be2017-01-04 10:44:42 -0500169 } else if (gp.coverage() == 0xff) {
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400170 fragBuilder->codeAppendf("%s = half4(1);", args.fOutputCoverage);
Brian Salomon8c852be2017-01-04 10:44:42 -0500171 } else {
172 const char* fragCoverage;
173 fCoverageUniform = uniformHandler->addUniform(kFragment_GrShaderFlag,
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400174 kHalf_GrSLType,
Brian Salomon8c852be2017-01-04 10:44:42 -0500175 "Coverage",
176 &fragCoverage);
Ethan Nicholasf7b88202017-09-18 14:10:39 -0400177 fragBuilder->codeAppendf("%s = half4(%s);", args.fOutputCoverage, fragCoverage);
joshualitt2dd1ae02014-12-03 06:24:10 -0800178 }
joshualitt4973d9d2014-11-08 09:24:25 -0800179 }
180
joshualitt87f48d92014-12-04 10:41:40 -0800181 static inline void GenKey(const GrGeometryProcessor& gp,
Brian Salomon94efbf52016-11-29 13:43:05 -0500182 const GrShaderCaps&,
joshualitt87f48d92014-12-04 10:41:40 -0800183 GrProcessorKeyBuilder* b) {
joshualitt2dd1ae02014-12-03 06:24:10 -0800184 const DefaultGeoProc& def = gp.cast<DefaultGeoProc>();
joshualitt8fc6c2d2014-12-22 15:27:05 -0800185 uint32_t key = def.fFlags;
Ruiqi Maod275ef52018-07-10 13:08:32 -0400186 key |= (def.coverage() == 0xff) ? 0x20 : 0;
187 key |= (def.localCoordsWillBeRead() && def.localMatrix().hasPerspective()) ? 0x40 : 0x0;
Brian Salomon3de0aee2017-01-29 09:34:17 -0500188 key |= ComputePosKey(def.viewMatrix()) << 20;
joshualitt8fc6c2d2014-12-22 15:27:05 -0800189 b->add32(key);
Brian Osman08a50e02018-06-15 15:06:48 -0400190 b->add32(GrColorSpaceXform::XformKey(def.fColorSpaceXform.get()));
joshualitt2dd1ae02014-12-03 06:24:10 -0800191 }
joshualitt4973d9d2014-11-08 09:24:25 -0800192
egdaniel018fb622015-10-28 07:26:40 -0700193 void setData(const GrGLSLProgramDataManager& pdman,
bsalomona624bf32016-09-20 09:12:47 -0700194 const GrPrimitiveProcessor& gp,
195 FPCoordTransformIter&& transformIter) override {
joshualitte578a952015-05-14 10:09:13 -0700196 const DefaultGeoProc& dgp = gp.cast<DefaultGeoProc>();
joshualitt5559ca22015-05-21 15:50:36 -0700197
198 if (!dgp.viewMatrix().isIdentity() && !fViewMatrix.cheapEqualTo(dgp.viewMatrix())) {
199 fViewMatrix = dgp.viewMatrix();
egdaniel018fb622015-10-28 07:26:40 -0700200 float viewMatrix[3 * 3];
egdaniel64c47282015-11-13 06:54:19 -0800201 GrGLSLGetMatrix<3>(viewMatrix, fViewMatrix);
joshualitt5559ca22015-05-21 15:50:36 -0700202 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
203 }
joshualittee2af952014-12-30 09:04:15 -0800204
joshualittb8c241a2015-05-19 08:23:30 -0700205 if (dgp.color() != fColor && !dgp.hasVertexColor()) {
egdaniel018fb622015-10-28 07:26:40 -0700206 float c[4];
joshualittb8c241a2015-05-19 08:23:30 -0700207 GrColorToRGBAFloat(dgp.color(), c);
joshualitt9b989322014-12-15 14:16:27 -0800208 pdman.set4fv(fColorUniform, 1, c);
joshualittb8c241a2015-05-19 08:23:30 -0700209 fColor = dgp.color();
joshualitt9b989322014-12-15 14:16:27 -0800210 }
joshualittb8c241a2015-05-19 08:23:30 -0700211
Brian Salomon8c852be2017-01-04 10:44:42 -0500212 if (dgp.coverage() != fCoverage && !dgp.hasVertexCoverage()) {
joshualittb8c241a2015-05-19 08:23:30 -0700213 pdman.set1f(fCoverageUniform, GrNormalizeByteToFloat(dgp.coverage()));
214 fCoverage = dgp.coverage();
joshualitt9b989322014-12-15 14:16:27 -0800215 }
bsalomona624bf32016-09-20 09:12:47 -0700216 this->setTransformDataHelper(dgp.fLocalMatrix, pdman, &transformIter);
Brian Osmanfa6d8652017-05-31 09:37:27 -0400217
Brian Osman08a50e02018-06-15 15:06:48 -0400218 fColorSpaceHelper.setData(pdman, dgp.fColorSpaceXform.get());
Ruiqi Maod275ef52018-07-10 13:08:32 -0400219
220 if (dgp.hasBones()) {
221 pdman.setMatrix3fv(fBonesUniform, dgp.boneCount(), dgp.bones());
222 }
joshualitte3ababe2015-05-15 07:56:07 -0700223 }
224
joshualitt4973d9d2014-11-08 09:24:25 -0800225 private:
joshualitt5559ca22015-05-21 15:50:36 -0700226 SkMatrix fViewMatrix;
joshualitt9b989322014-12-15 14:16:27 -0800227 GrColor fColor;
228 uint8_t fCoverage;
joshualitt5559ca22015-05-21 15:50:36 -0700229 UniformHandle fViewMatrixUniform;
joshualitt9b989322014-12-15 14:16:27 -0800230 UniformHandle fColorUniform;
231 UniformHandle fCoverageUniform;
Ruiqi Maod275ef52018-07-10 13:08:32 -0400232 UniformHandle fBonesUniform;
Brian Osmanfa6d8652017-05-31 09:37:27 -0400233 GrGLSLColorSpaceXformHelper fColorSpaceHelper;
joshualitt9b989322014-12-15 14:16:27 -0800234
egdaniele659a582015-11-13 09:55:43 -0800235 typedef GrGLSLGeometryProcessor INHERITED;
joshualitt4973d9d2014-11-08 09:24:25 -0800236 };
237
Brian Salomon94efbf52016-11-29 13:43:05 -0500238 void getGLSLProcessorKey(const GrShaderCaps& caps, GrProcessorKeyBuilder* b) const override {
egdaniel57d3b032015-11-13 11:57:27 -0800239 GLSLProcessor::GenKey(*this, caps, b);
joshualitteb2a6762014-12-04 11:35:33 -0800240 }
241
Brian Salomon94efbf52016-11-29 13:43:05 -0500242 GrGLSLPrimitiveProcessor* createGLSLInstance(const GrShaderCaps&) const override {
egdaniel57d3b032015-11-13 11:57:27 -0800243 return new GLSLProcessor();
joshualitteb2a6762014-12-04 11:35:33 -0800244 }
245
joshualitt4973d9d2014-11-08 09:24:25 -0800246private:
joshualitt8059eb92014-12-29 15:10:07 -0800247 DefaultGeoProc(uint32_t gpTypeFlags,
248 GrColor color,
Brian Osmanfa6d8652017-05-31 09:37:27 -0400249 sk_sp<GrColorSpaceXform> colorSpaceXform,
joshualitt8059eb92014-12-29 15:10:07 -0800250 const SkMatrix& viewMatrix,
251 const SkMatrix& localMatrix,
joshualittb8c241a2015-05-19 08:23:30 -0700252 uint8_t coverage,
Ruiqi Maod275ef52018-07-10 13:08:32 -0400253 bool localCoordsWillBeRead,
254 const float* bones,
255 int boneCount)
Ethan Nicholasabff9562017-10-09 10:54:08 -0400256 : INHERITED(kDefaultGeoProc_ClassID)
257 , fColor(color)
Brian Salomon8c852be2017-01-04 10:44:42 -0500258 , fViewMatrix(viewMatrix)
259 , fLocalMatrix(localMatrix)
260 , fCoverage(coverage)
261 , fFlags(gpTypeFlags)
Brian Osmanfa6d8652017-05-31 09:37:27 -0400262 , fLocalCoordsWillBeRead(localCoordsWillBeRead)
Ruiqi Maod275ef52018-07-10 13:08:32 -0400263 , fColorSpaceXform(std::move(colorSpaceXform))
264 , fBones(bones)
265 , fBoneCount(boneCount) {
Brian Salomon92be2f72018-06-19 14:33:47 -0400266 fInPosition = {"inPosition", kFloat2_GrVertexAttribType};
267 int cnt = 1;
Brian Salomon3de0aee2017-01-29 09:34:17 -0500268 if (fFlags & kColorAttribute_GPFlag) {
Brian Salomon92be2f72018-06-19 14:33:47 -0400269 fInColor = {"inColor", kUByte4_norm_GrVertexAttribType};
270 ++cnt;
joshualitt2dd1ae02014-12-03 06:24:10 -0800271 }
Brian Salomon3de0aee2017-01-29 09:34:17 -0500272 if (fFlags & kLocalCoordAttribute_GPFlag) {
Brian Salomon92be2f72018-06-19 14:33:47 -0400273 fInLocalCoords = {"inLocalCoord", kFloat2_GrVertexAttribType};
274 ++cnt;
joshualitt2dd1ae02014-12-03 06:24:10 -0800275 }
Brian Salomon3de0aee2017-01-29 09:34:17 -0500276 if (fFlags & kCoverageAttribute_GPFlag) {
Brian Salomon92be2f72018-06-19 14:33:47 -0400277 fInCoverage = {"inCoverage", kHalf_GrVertexAttribType};
278 ++cnt;
joshualitt2dd1ae02014-12-03 06:24:10 -0800279 }
Ruiqi Maod275ef52018-07-10 13:08:32 -0400280 if (fFlags & kBonesAttribute_GPFlag) {
281 SkASSERT(bones && (boneCount > 0));
282 fInBoneIndices = {"inBoneIndices", kInt4_GrVertexAttribType};
283 ++cnt;
284 fInBoneWeights = {"inBoneWeights", kFloat4_GrVertexAttribType};
285 ++cnt;
286 }
Brian Salomon92be2f72018-06-19 14:33:47 -0400287 this->setVertexAttributeCnt(cnt);
joshualitt2dd1ae02014-12-03 06:24:10 -0800288 }
joshualitt4973d9d2014-11-08 09:24:25 -0800289
Brian Salomon92be2f72018-06-19 14:33:47 -0400290 const Attribute& onVertexAttribute(int i) const override {
Ruiqi Maod275ef52018-07-10 13:08:32 -0400291 return IthInitializedAttribute(i,
292 fInPosition,
293 fInColor,
294 fInLocalCoords,
295 fInCoverage,
296 fInBoneIndices,
297 fInBoneWeights);
Brian Salomon92be2f72018-06-19 14:33:47 -0400298 }
299
300 Attribute fInPosition;
301 Attribute fInColor;
302 Attribute fInLocalCoords;
303 Attribute fInCoverage;
Ruiqi Maod275ef52018-07-10 13:08:32 -0400304 Attribute fInBoneIndices;
305 Attribute fInBoneWeights;
joshualitt88c23fc2015-05-13 14:18:07 -0700306 GrColor fColor;
joshualitte578a952015-05-14 10:09:13 -0700307 SkMatrix fViewMatrix;
joshualitte3ababe2015-05-15 07:56:07 -0700308 SkMatrix fLocalMatrix;
joshualitt9b989322014-12-15 14:16:27 -0800309 uint8_t fCoverage;
joshualitt2dd1ae02014-12-03 06:24:10 -0800310 uint32_t fFlags;
bsalomon7765a472015-07-08 11:26:37 -0700311 bool fLocalCoordsWillBeRead;
Brian Osmanfa6d8652017-05-31 09:37:27 -0400312 sk_sp<GrColorSpaceXform> fColorSpaceXform;
Ruiqi Maod275ef52018-07-10 13:08:32 -0400313 const float* fBones;
314 int fBoneCount;
joshualitt4973d9d2014-11-08 09:24:25 -0800315
Brian Salomon0c26a9d2017-07-06 10:09:38 -0400316 GR_DECLARE_GEOMETRY_PROCESSOR_TEST
joshualitt5478d422014-11-14 16:00:38 -0800317
joshualitt2e3b3e32014-12-09 13:31:14 -0800318 typedef GrGeometryProcessor INHERITED;
joshualitt4973d9d2014-11-08 09:24:25 -0800319};
320
321GR_DEFINE_GEOMETRY_PROCESSOR_TEST(DefaultGeoProc);
322
Hal Canary6f6961e2017-01-31 13:50:44 -0500323#if GR_TEST_UTILS
Ruiqi Maod275ef52018-07-10 13:08:32 -0400324static constexpr int kTestBoneCount = 4;
325static constexpr float kTestBones[kTestBoneCount * kNumFloatsPerSkMatrix] = {
326 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
327 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
328 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
329 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
330};
331
bungeman06ca8ec2016-06-09 08:01:03 -0700332sk_sp<GrGeometryProcessor> DefaultGeoProc::TestCreate(GrProcessorTestData* d) {
joshualitt2dd1ae02014-12-03 06:24:10 -0800333 uint32_t flags = 0;
joshualitt0067ff52015-07-08 14:26:19 -0700334 if (d->fRandom->nextBool()) {
Brian Salomon3de0aee2017-01-29 09:34:17 -0500335 flags |= kColorAttribute_GPFlag;
joshualitt4973d9d2014-11-08 09:24:25 -0800336 }
joshualitt0067ff52015-07-08 14:26:19 -0700337 if (d->fRandom->nextBool()) {
Brian Salomon3de0aee2017-01-29 09:34:17 -0500338 flags |= kColorAttributeIsSkColor_GPFlag;
joshualitt4973d9d2014-11-08 09:24:25 -0800339 }
joshualitt0067ff52015-07-08 14:26:19 -0700340 if (d->fRandom->nextBool()) {
Brian Salomon3de0aee2017-01-29 09:34:17 -0500341 flags |= kCoverageAttribute_GPFlag;
342 }
343 if (d->fRandom->nextBool()) {
344 flags |= kLocalCoordAttribute_GPFlag;
joshualittb2aa7cb2015-08-05 11:05:22 -0700345 }
Ruiqi Maod275ef52018-07-10 13:08:32 -0400346 if (d->fRandom->nextBool()) {
347 flags |= kBonesAttribute_GPFlag;
348 }
joshualitt2dd1ae02014-12-03 06:24:10 -0800349
bungeman06ca8ec2016-06-09 08:01:03 -0700350 return DefaultGeoProc::Make(flags,
351 GrRandomColor(d->fRandom),
Brian Osmanfa6d8652017-05-31 09:37:27 -0400352 GrTest::TestColorXform(d->fRandom),
bungeman06ca8ec2016-06-09 08:01:03 -0700353 GrTest::TestMatrix(d->fRandom),
354 GrTest::TestMatrix(d->fRandom),
355 d->fRandom->nextBool(),
Ruiqi Maod275ef52018-07-10 13:08:32 -0400356 GrRandomCoverage(d->fRandom),
357 kTestBones,
358 kTestBoneCount);
joshualitt4973d9d2014-11-08 09:24:25 -0800359}
Hal Canary6f6961e2017-01-31 13:50:44 -0500360#endif
joshualitt4973d9d2014-11-08 09:24:25 -0800361
bungeman06ca8ec2016-06-09 08:01:03 -0700362sk_sp<GrGeometryProcessor> GrDefaultGeoProcFactory::Make(const Color& color,
363 const Coverage& coverage,
364 const LocalCoords& localCoords,
365 const SkMatrix& viewMatrix) {
joshualitte9d60952015-07-27 12:13:14 -0700366 uint32_t flags = 0;
Brian Salomon3de0aee2017-01-29 09:34:17 -0500367 if (Color::kPremulGrColorAttribute_Type == color.fType) {
368 flags |= kColorAttribute_GPFlag;
369 } else if (Color::kUnpremulSkColorAttribute_Type == color.fType) {
370 flags |= kColorAttribute_GPFlag | kColorAttributeIsSkColor_GPFlag;
371 }
372 flags |= coverage.fType == Coverage::kAttribute_Type ? kCoverageAttribute_GPFlag : 0;
373 flags |= localCoords.fType == LocalCoords::kHasExplicit_Type ? kLocalCoordAttribute_GPFlag : 0;
joshualitte9d60952015-07-27 12:13:14 -0700374
375 uint8_t inCoverage = coverage.fCoverage;
joshualitt0d986d82015-07-28 10:01:18 -0700376 bool localCoordsWillBeRead = localCoords.fType != LocalCoords::kUnused_Type;
joshualitte9d60952015-07-27 12:13:14 -0700377
378 GrColor inColor = color.fColor;
bungeman06ca8ec2016-06-09 08:01:03 -0700379 return DefaultGeoProc::Make(flags,
380 inColor,
Brian Osmanfa6d8652017-05-31 09:37:27 -0400381 color.fColorSpaceXform,
bungeman06ca8ec2016-06-09 08:01:03 -0700382 viewMatrix,
383 localCoords.fMatrix ? *localCoords.fMatrix : SkMatrix::I(),
384 localCoordsWillBeRead,
Ruiqi Maod275ef52018-07-10 13:08:32 -0400385 inCoverage,
386 nullptr,
387 0);
joshualitte9d60952015-07-27 12:13:14 -0700388}
joshualitt0d986d82015-07-28 10:01:18 -0700389
bungeman06ca8ec2016-06-09 08:01:03 -0700390sk_sp<GrGeometryProcessor> GrDefaultGeoProcFactory::MakeForDeviceSpace(
joshualitt0d986d82015-07-28 10:01:18 -0700391 const Color& color,
392 const Coverage& coverage,
393 const LocalCoords& localCoords,
394 const SkMatrix& viewMatrix) {
joshualitt0d986d82015-07-28 10:01:18 -0700395 SkMatrix invert = SkMatrix::I();
joshualittdf0c5572015-08-03 11:35:28 -0700396 if (LocalCoords::kUnused_Type != localCoords.fType) {
397 SkASSERT(LocalCoords::kUsePosition_Type == localCoords.fType);
398 if (!viewMatrix.isIdentity() && !viewMatrix.invert(&invert)) {
halcanary96fcdcc2015-08-27 07:41:13 -0700399 return nullptr;
joshualittdf0c5572015-08-03 11:35:28 -0700400 }
joshualitt0d986d82015-07-28 10:01:18 -0700401
joshualittdf0c5572015-08-03 11:35:28 -0700402 if (localCoords.hasLocalMatrix()) {
403 invert.preConcat(*localCoords.fMatrix);
404 }
joshualitt0d986d82015-07-28 10:01:18 -0700405 }
406
407 LocalCoords inverted(LocalCoords::kUsePosition_Type, &invert);
bungeman06ca8ec2016-06-09 08:01:03 -0700408 return Make(color, coverage, inverted, SkMatrix::I());
joshualitt0d986d82015-07-28 10:01:18 -0700409}
Ruiqi Maod275ef52018-07-10 13:08:32 -0400410
411sk_sp<GrGeometryProcessor> GrDefaultGeoProcFactory::MakeWithBones(const Color& color,
412 const Coverage& coverage,
413 const LocalCoords& localCoords,
414 const Bones& bones,
415 const SkMatrix& viewMatrix) {
416 uint32_t flags = 0;
417 if (Color::kPremulGrColorAttribute_Type == color.fType) {
418 flags |= kColorAttribute_GPFlag;
419 } else if (Color::kUnpremulSkColorAttribute_Type == color.fType) {
420 flags |= kColorAttribute_GPFlag | kColorAttributeIsSkColor_GPFlag;
421 }
422 flags |= coverage.fType == Coverage::kAttribute_Type ? kCoverageAttribute_GPFlag : 0;
423 flags |= localCoords.fType == LocalCoords::kHasExplicit_Type ? kLocalCoordAttribute_GPFlag : 0;
424 flags |= kBonesAttribute_GPFlag;
425
426 uint8_t inCoverage = coverage.fCoverage;
427 bool localCoordsWillBeRead = localCoords.fType != LocalCoords::kUnused_Type;
428
429 GrColor inColor = color.fColor;
430 return DefaultGeoProc::Make(flags,
431 inColor,
432 color.fColorSpaceXform,
433 viewMatrix,
434 localCoords.fMatrix ? *localCoords.fMatrix : SkMatrix::I(),
435 localCoordsWillBeRead,
436 inCoverage,
437 bones.fBones,
438 bones.fBoneCount);
439}